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/es/_wikihistory.json | 23774 ------------------- files/es/administrador_de_perfiles/index.html | 52 - files/es/almacenamiento/index.html | 204 - files/es/api_de_acceso_a_canales/index.html | 166 - files/es/api_del_toolkit/index.html | 34 - .../index.html" | 66 - files/es/archive/add-ons/index.html | 8 - .../add-ons/observer_notifications/index.html | 155 - .../index.html" | 54 - .../index.html" | 295 - files/es/archive/api/index.html | 13 - files/es/archive/api/navigator/index.html | 8 - .../api/navigator/moznotification/index.html | 64 - files/es/archive/apps/advanced_topics/index.html | 74 - files/es/archive/apps/index.html | 8 - files/es/archive/b2g_os/api/callevent/index.html | 117 - .../b2g_os/api/cameramanager/getcamera/index.html | 126 - .../es/archive/b2g_os/api/cameramanager/index.html | 62 - files/es/archive/b2g_os/api/index.html | 120 - files/es/archive/b2g_os/api/mozactivity/index.html | 69 - .../b2g_os/api/mozvoicemailstatus/index.html | 67 - files/es/archive/b2g_os/api/navigator/index.html | 12 - .../b2g_os/api/navigator/mozalarms/index.html | 116 - .../b2g_os/api/navigator/mozapps/index.html | 96 - .../b2g_os/api/navigator/moztelephony/index.html | 83 - files/es/archive/b2g_os/api/telephony/index.html | 141 - .../b2g_os/api/telephonycall/hangup/index.html | 118 - .../es/archive/b2g_os/api/telephonycall/index.html | 185 - .../b2g_os/api/telephonycall/number/index.html | 125 - .../b2g_os/api/telephonycall/onincoming/index.html | 120 - files/es/archive/b2g_os/api/window/index.html | 27 - .../b2g_os/application_development/index.html | 11 - .../index.html | 29 - files/es/archive/b2g_os/apps/index.html | 62 - files/es/archive/b2g_os/architecture/index.html | 759 - .../dispositivos_compatibles/index.html | 360 - .../firefox_os_build_process_summary/index.html | 109 - .../index.html | 82 - .../building_b2g_for_qemu_emulator/index.html | 37 - .../b2g_os/compilar_boot_to_gecko/index.html | 123 - files/es/archive/b2g_os/complementos/index.html | 58 - .../b2g_os/consejos_uso_firefox_os/index.html | 21 - .../debugging/depurar_b2g_usando_gdb/index.html | 79 - .../b2g_os/debugging/developer_settings/index.html | 194 - files/es/archive/b2g_os/debugging/index.html | 74 - .../personalizando_el_script_b2g.sh/index.html | 42 - .../archive/b2g_os/debugging/setting_up/index.html | 37 - .../entendiendo_el_codigo_base_de_gaia/index.html | 104 - files/es/archive/b2g_os/developing_gaia/index.html | 61 - .../running_the_gaia_codebase/index.html | 47 - .../elegir_como_ejecutar_gaia_o_b2g/index.html | 61 - .../firefox_os_apps/building_blocks/index.html | 195 - files/es/archive/b2g_os/firefox_os_apps/index.html | 85 - .../firefox_os_build_prerequisites/index.html | 204 - .../archive/b2g_os/gaia_hacking_guide/index.html | 6 - files/es/archive/b2g_os/gonk/index.html | 23 - files/es/archive/b2g_os/index.html | 94 - .../installing_on_a_mobile_device/index.html | 79 - files/es/archive/b2g_os/introduction/index.html | 27 - .../b2g_os/phone_guide/fairphone/index.html | 186 - .../flame/configuracion_inicial/index.html | 122 - .../es/archive/b2g_os/phone_guide/flame/index.html | 78 - .../flame/updating_your_flame/index.html | 301 - files/es/archive/b2g_os/phone_guide/fx0/index.html | 51 - .../b2g_os/phone_guide/geeksphone/index.html | 124 - files/es/archive/b2g_os/phone_guide/index.html | 43 - .../phone_guide/lista_dispositivos/index.html | 712 - .../archive/b2g_os/phone_guide/zte_open/index.html | 287 - .../b2g_os/phone_guide/zte_open_c/index.html | 226 - .../b2g_os/platform/gaia/hacking/index.html | 226 - files/es/archive/b2g_os/platform/gaia/index.html | 61 - .../platform/gaia/introduction_to_gaia/index.html | 13 - files/es/archive/b2g_os/platform/index.html | 94 - .../b2g_os/platform/settings_list/index.html | 709 - files/es/archive/b2g_os/portando/index.html | 369 - .../archive/b2g_os/porting_firefox_os/index.html | 71 - .../portando_de_cyanogenmod/index.html | 239 - .../preparing_for_your_first_b2g_build/index.html | 151 - .../archive/b2g_os/probando_firefox_os/index.html | 81 - .../archive/b2g_os/quickstart/app_tools/index.html | 16 - files/es/archive/b2g_os/quickstart/index.html | 49 - .../quickstart/intro_to_manifests/index.html | 90 - .../introduccion_a_las_open_web_apps/index.html | 108 - .../quickstart/tu_primera_aplicacion/index.html | 257 - files/es/archive/b2g_os/releases/2.0/index.html | 116 - files/es/archive/b2g_os/releases/2.1/index.html | 40 - files/es/archive/b2g_os/releases/index.html | 24 - .../index.html | 228 - .../security/application_security/index.html | 118 - files/es/archive/b2g_os/security/index.html | 72 - .../b2g_os/security/modelo_seguridad/index.html | 255 - files/es/archive/b2g_os/simulator/index.html | 258 - .../usando_el_b2g_escritorio_cliente/index.html | 134 - .../b2g_os/using_firefox_os_simulator/index.html | 57 - .../b2g_os/using_the_app_manager/index.html | 179 - .../building_blocks/action_menu/coding/index.html | 80 - .../ux/building_blocks/action_menu/index.html | 46 - .../b2g_os/ux/building_blocks/button/index.html | 231 - .../archive/b2g_os/ux/building_blocks/index.html | 268 - files/es/archive/b2g_os/ux/guia_estilo/index.html | 62 - .../es/archive/b2g_os/web_telephony_api/index.html | 28 - .../introduccion_a_la_webtelephony/index.html | 64 - files/es/archive/css3/index.html | 822 - .../index.html" | 201 - .../crear_microformatos_en_javascript/index.html" | 111 - .../es/archive/est\303\241ndares_web/index.html" | 64 - .../index.html" | 446 - .../index.html" | 268 - .../index.html" | 62 - files/es/archive/index.html | 21 - files/es/archive/jxon/index.html | 1509 -- files/es/archive/mdn/index.html | 16 - files/es/archive/meta_docs/index.html | 15 - .../mdn_content_on_webplatform.org/index.html | 19 - .../meta_docs/mdn_page_layout_guide/index.html | 10 - .../index.html" | 97 - files/es/archive/misc_top_level/index.html | 8 - .../usar_las_preferencias_de_contenido/index.html | 38 - .../firefox/el_uso_de_microformatos/index.html | 218 - files/es/archive/mozilla/firefox/index.html | 8 - .../index.html | 264 - files/es/archive/mozilla/index.html | 10 - files/es/archive/mozilla/jetpack/index.html | 39 - .../table_layout_regression_tests/index.html | 204 - files/es/archive/mozilla/xbl/index.html | 27 - files/es/archive/mozilla/xul/action/index.html | 87 - files/es/archive/mozilla/xul/attribute/index.html | 304 - .../archive/mozilla/xul/bestiario_xul/index.html | 186 - .../index.html" | 187 - files/es/archive/mozilla/xul/dialog/index.html | 383 - files/es/archive/mozilla/xul/elementos/index.html | 323 - files/es/archive/mozilla/xul/events/index.html | 460 - .../xul/gu\303\255a_de_plantillas/index.html" | 6 - .../ordenar_resultados/index.html" | 100 - files/es/archive/mozilla/xul/index.html | 28 - files/es/archive/mozilla/xul/method/index.html | 174 - .../archive/mozilla/xul/property/align/index.html | 12 - .../mozilla/xul/property/buttons/index.html | 21 - files/es/archive/mozilla/xul/property/index.html | 273 - files/es/archive/mozilla/xul/style/index.html | 31 - .../tutorial_de_xul/actualizar_comandos/index.html | 62 - .../tutorial_de_xul/archivos_manifest/index.html | 155 - .../tutorial_de_xul/atajos_de_teclado/index.html | 376 - .../a\303\261adiendo_botones/index.html" | 111 - .../a\303\261adiendo_elementos_html/index.html" | 106 - .../index.html" | 54 - .../index.html" | 133 - .../index.html" | 98 - .../barra_de_herramientas/index.html | 60 - .../barras_de_desplazamiento/index.html | 74 - .../xul/tutorial_de_xul/cajas_de_grupo/index.html | 61 - .../index.html" | 39 - .../index.html" | 106 - .../xul/tutorial_de_xul/comandos/index.html | 171 - .../controles_de_entrada/index.html | 86 - .../tutorial_de_xul/controles_de_listas/index.html | 171 - .../creando_un_asistente/index.html | 138 - .../creando_un_instalador/index.html | 95 - .../tutorial_de_xul/creando_una_ventana/index.html | 105 - .../index.html" | 108 - .../detalles_del_modelo_de_caja/index.html | 89 - .../xul/tutorial_de_xul/divisores/index.html | 136 - .../di\303\241logos_abrir_y_guardar/index.html" | 85 - .../tutorial_de_xul/el_modelo_de_caja/index.html | 192 - .../emisores_y_receptores/index.html | 118 - .../xul/tutorial_de_xul/estructura_xul/index.html | 159 - .../foco_y_selecci\303\263n/index.html" | 179 - .../index.html | 44 - .../archive/mozilla/xul/tutorial_de_xul/index.html | 123 - .../tutorial_de_xul/instalando_scripts/index.html | 80 - .../tutorial_de_xul/interfaces_xpcom/index.html | 132 - .../introducci\303\263n/index.html" | 75 - .../introducci\303\263n_a_rdf/index.html" | 136 - .../xul/tutorial_de_xul/la_url_chrome/index.html | 59 - .../tutorial_de_xul/manipulando_listas/index.html | 168 - .../medidores_de_progreso/index.html | 41 - .../men\303\272s_con_desplazamiento/index.html" | 56 - .../men\303\272s_de_barras_simples/index.html" | 168 - .../men\303\272s_emergentes/index.html" | 228 - .../modelo_de_objeto_de_documento/index.html | 230 - .../modificando_una_interfaz_xul/index.html | 157 - .../m\303\241s_asistentes/index.html" | 88 - .../index.html" | 102 - .../index.html" | 132 - .../index.html" | 128 - .../m\303\241s_gestores_de_eventos/index.html" | 168 - .../objeto_de_caja_de_\303\241rbol/index.html" | 190 - .../paneles_de_contenidos/index.html | 48 - .../xul/tutorial_de_xul/plantillas/index.html | 191 - .../index.html | 229 - .../xul/tutorial_de_xul/rejillas/index.html | 141 - .../index.html" | 94 - .../tutorial_de_xul/usando_espaciadores/index.html | 103 - .../xul/tutorial_de_xul/\303\241rboles/index.html" | 194 - .../\303\241rboles_y_plantillas/index.html" | 138 - .../archive/mozilla/xul/xul_reference/index.html | 318 - .../xul_element_attributes/index.html | 551 - .../mozilla/xulrunner/componentes/index.html | 16 - files/es/archive/mozilla/xulrunner/index.html | 96 - .../primeros_pasos_con_xulrunner/index.html | 280 - files/es/archive/rss/index.html | 56 - files/es/archive/rss/primeros_pasos/index.html | 53 - files/es/archive/rss/versiones/index.html | 115 - .../index.html" | 78 - files/es/archive/security/index.html | 14 - .../index.html | 102 - files/es/archive/themes/index.html | 11 - .../tutoriales-para-principiantes/index.html | 8 - files/es/archive/web/index.html | 12 - files/es/archive/web/javascript/index.html | 12 - .../legacy_generator_function_statement/index.html | 63 - .../index.html | 85 - files/es/archive/web/liveconnect/index.html | 23 - files/es/archive/web/liveconnect/java/index.html | 15 - .../archive/web/liveconnect/javaarray/index.html | 65 - .../archive/web/liveconnect/javaclass/index.html | 64 - .../archive/web/liveconnect/javaobject/index.html | 61 - .../archive/web/liveconnect/javapackage/index.html | 39 - .../es/archive/web/liveconnect/netscape/index.html | 23 - .../es/archive/web/liveconnect/packages/index.html | 44 - files/es/archive/web/liveconnect/sun/index.html | 17 - files/es/arrastrar_y_soltar/index.html | 77 - .../index.html" | 47 - .../index.html" | 287 - .../configuraci\303\263n_r\303\241pida/index.html" | 73 - files/es/browserid/funciones_avanzadas/index.html | 43 - files/es/browserid/index.html | 5 - files/es/bundles/index.html | 65 - files/es/cambios_del_tema_en_firefox_2/index.html | 883 - .../cambios_en_los_temas_de_firefox_3/index.html | 101 - .../cat\303\241logo/algoritmo_frecency/index.html" | 138 - .../direcciones_web_consultas_places/index.html" | 345 - "files/es/cat\303\241logo/index.html" | 19 - files/es/como_crear_un_microresumen/index.html | 175 - files/es/components.utils.import/index.html | 62 - files/es/consola_de_errores/index.html | 77 - .../index.html" | 274 - .../un_vistazo_de_xpcom/index.html" | 281 - .../uso_de_componentes_xpcom/index.html" | 318 - .../index.html" | 146 - .../como_empezar/index.html | 108 - .../creando_un_skin_para_firefox/uuid/index.html | 16 - files/es/creando_un_tema_para_firefox/index.html | 36 - .../index.html" | 122 - .../crear_un_panel_lateral_en_firefox/index.html | 163 - .../index.html" | 178 - .../index.html" | 205 - .../index.html" | 191 - .../index.html" | 108 - files/es/desarrollo_web/web_adaptable/index.html | 39 - files/es/descripcion_general_sobre_nss/index.html | 19 - .../index.html" | 504 - files/es/e4x/index.html | 25 - files/es/empaquetado_de_extensiones/index.html | 29 - files/es/empaquetar_un_tema/index.html | 109 - .../escribir_c\303\263digo_localizable/index.html" | 25 - .../index.html | 108 - files/es/eventos_arrastrar_y_soltar/index.html | 31 - .../extensions/bootstrapped_extensions/index.html | 226 - files/es/extensions/community/index.html | 19 - files/es/extensions/index.html | 107 - .../es/extensions/m\303\263vil_clone/index.html" | 86 - files/es/faq_de_mercurial/index.html | 237 - files/es/fuel/annotations/index.html | 121 - files/es/fuel/application/index.html | 81 - files/es/fuel/bookmark/index.html | 89 - files/es/fuel/bookmarkfolder/index.html | 144 - files/es/fuel/browsertab/index.html | 158 - files/es/fuel/console/index.html | 65 - files/es/fuel/eventitem/index.html | 56 - files/es/fuel/eventlistener/index.html | 49 - files/es/fuel/events/index.html | 72 - files/es/fuel/extension/index.html | 61 - files/es/fuel/extensions/index.html | 77 - files/es/fuel/index.html | 33 - files/es/fuel/preference/index.html | 81 - files/es/fuel/preferencebranch/index.html | 147 - files/es/fuel/sessionstorage/index.html | 97 - files/es/fuel/window/index.html | 87 - files/es/gecko/index.html | 25 - files/es/gecko_sdk/index.html | 117 - "files/es/gr\303\241ficos_png_animados/index.html" | 548 - files/es/herramientas/borrador/index.html | 56 - files/es/incrustando_mozilla/index.html | 47 - .../index.html | 50 - files/es/introduccion_venkman/index.html | 261 - .../index.html" | 360 - .../index.html" | 248 - files/es/ipdl/index.html | 18 - files/es/javascript_code_modules/using/index.html | 138 - files/es/l10n_en_mercurial/index.html | 133 - files/es/la_plataforma_mozilla/index.html | 13 - .../es/lo_b\303\241sico_de_mercurial/index.html" | 48 - .../es/localizaci\303\263n_y_plurales/index.html" | 386 - .../index.html" | 645 - .../manifiesto_de_instalaci\303\263n/index.html" | 653 - .../index.html" | 123 - .../manual_de_compatibilidad_de_gecko/index.html | 187 - .../index.html" | 187 - .../howto/enlace_cuenta_github/index.html | 110 - .../es/mdn/contribute/registro_persona/index.html | 36 - files/es/mdn/contribute/team_status/index.html | 93 - files/es/mdn/user_guide/writing/index.html | 67 - files/es/mejoras_css_en_firefox_3/index.html | 65 - .../index.html | 43 - files/es/mercurial/index.html | 35 - files/es/microsummary_topics/index.html | 64 - files/es/midas/index.html | 328 - files/es/mozilla/add-ons/add-on_manager/index.html | 61 - .../mozilla/add-ons/add-on_repository/index.html | 159 - files/es/mozilla/add-ons/amo/index.html | 11 - .../mozilla/add-ons/amo/policy/contacto/index.html | 26 - files/es/mozilla/add-ons/amo/policy/index.html | 21 - .../add-ons/amo/policy/revisiones/index.html | 157 - files/es/mozilla/add-ons/code_snippets/index.html | 138 - .../add-ons/code_snippets/queryselector/index.html | 99 - .../lineamientos_de_complementos/index.html | 113 - .../mozilla/add-ons/overlay_extensions/index.html | 57 - files/es/mozilla/add-ons/sdk/builder/index.html | 13 - files/es/mozilla/add-ons/sdk/index.html | 84 - .../tutorials/add_a_context_menu_item/index.html | 119 - .../add_a_menu_item_to_firefox/index.html | 114 - .../adding_a_button_to_the_toolbar/index.html | 85 - .../sdk/tutorials/display_a_popup/index.html | 164 - .../sdk/tutorials/getting_started/index.html | 214 - files/es/mozilla/add-ons/sdk/tutorials/index.html | 146 - .../add-ons/sdk/tutorials/installation/index.html | 145 - .../sdk/tutorials/list_open_tabs/index.html | 66 - .../sdk/tutorials/listen_for_page_load/index.html | 38 - .../modifying_the_page_hosted_by_a_tab/index.html | 135 - .../modifying_web_pages_based_on_url/index.html | 227 - .../sdk/tutorials/open_a_web_page/index.html | 48 - .../sdk/tutorials/troubleshooting/index.html | 143 - .../es/mozilla/add-ons/themes/obsolete/index.html | 10 - .../add_toolbar_button/index.html | 33 - .../index.html | 13 - .../mozilla/add-ons/thunderbird/howtos/index.html | 128 - files/es/mozilla/add-ons/thunderbird/index.html | 137 - files/es/mozilla/bugzilla/index.html | 59 - files/es/mozilla/bugzilla/testopia/index.html | 162 - .../index.html | 97 - files/es/mozilla/connect/index.html | 143 - .../index.html | 92 - .../compilar_firefox_con_codigo_en_rust/index.html | 37 - .../edici\303\263n_de_desarrollador/index.html" | 59 - .../revertir/index.html" | 25 - files/es/mozilla/firefox/firefox_esr/index.html | 13 - .../firefox/multiprocess_firefox/index.html | 75 - .../message_manager/index.html | 74 - .../message_manager/process_scripts/index.html | 81 - .../multiprocess_firefox/motivation/index.html | 46 - .../pitfalls_for_add-on_developers/index.html | 212 - .../remotepagemanager/index.html | 127 - .../index.html | 23 - .../technical_overview/index.html | 166 - .../types_of_message_manager/index.html | 179 - .../web_content_compatibility/index.html | 28 - .../which_uris_load_where/index.html | 61 - files/es/mozilla/firefox/privacy/index.html | 9 - .../errors/cookieblockedtracker/index.html | 97 - .../storage_access_policy/errors/index.html | 24 - .../privacy/storage_access_policy/index.html | 267 - .../firefox/privacy/tracking_protection/index.html | 80 - files/es/mozilla/firefox_para_android/index.html | 65 - files/es/mozilla/git/index.html | 12 - files/es/mozilla/http_cache/index.html | 487 - .../index.html | 76 - files/es/mozilla/instantbird/index.html | 58 - .../es/mozilla/javascript_code_modules/index.html | 146 - .../javascript_code_modules/promise.jsm/index.html | 134 - .../promise.jsm/promise/index.html | 218 - .../source-editor.jsm/index.html | 1549 -- .../javascript_code_modules/timer.jsm/index.html | 32 - files/es/mozilla/localization/index.html | 24 - .../localization/l10n_style_guide/index.html | 363 - .../l10n_style_guide/your_language/index.html | 40 - .../localizing_with_pontoon/index.html | 139 - .../localization/notas_de_localizacion/index.html | 25 - .../quick_start_guide/fase_qa/index.html | 209 - .../localization/quick_start_guide/index.html | 55 - .../quick_start_guide/initial_setup/index.html | 99 - .../creating_localizable_web_content/index.html | 58 - files/es/mozilla/marketplace/apis/index.html | 42 - files/es/mozilla/marketplace/faq/index.html | 30 - files/es/mozilla/marketplace/index.html | 114 - .../marketplace/marketplace_apis/index.html | 56 - .../monetization/estatus_de_pagos/index.html | 32 - .../es/mozilla/marketplace/monetization/index.html | 80 - .../introduccion_monetizacion/index.html | 83 - .../normas_valoracion_usuario/index.html | 92 - .../options/introducci\303\263n/index.html" | 37 - files/es/mozilla/marketplace/publish/index.html | 69 - files/es/mozilla/marketplace/publishing/index.html | 9 - .../marketplace_screenshot_criteria/index.html | 78 - .../open_web_apps_for_android/index.html | 133 - .../publishing/packaged_apps/index.html | 190 - .../publishing/publish_options/index.html | 70 - .../marketplace/publishing/submit/index.html | 10 - .../publishing/submit/overview/index.html | 122 - .../publishing/updating_apps/index.html | 24 - files/es/mozilla/marketplace/submission/index.html | 9 - .../marketplace_review_criteria/index.html | 82 - .../submission/rating_your_content/index.html | 118 - .../testing_and_troubleshooting/index.html | 36 - files/es/mozilla/mathml_project/basics/index.html | 821 - files/es/mozilla/mathml_project/extras/index.html | 307 - files/es/mozilla/mathml_project/fonts/index.html | 60 - files/es/mozilla/mathml_project/index.html | 91 - .../mathml_project/mathml3testsuite/index.html | 64 - .../mozilla/mathml_project/screenshots/index.html | 14 - files/es/mozilla/mathml_project/start/index.html | 96 - files/es/mozilla/mathml_project/status/index.html | 325 - .../mathml_project/student_projects/index.html | 49 - files/es/mozilla/mathml_project/various/index.html | 36 - .../opciones_de_linea_de_comandos/index.html | 448 - .../index.html | 106 - files/es/mozilla/persona/branding/index.html | 42 - .../persona/browser_compatibility/index.html | 73 - files/es/mozilla/persona/faq/index.html | 59 - files/es/mozilla/persona/glosario/index.html | 67 - files/es/mozilla/persona/index.html | 131 - .../informaci\303\263n_general_idp/index.html" | 39 - files/es/mozilla/persona/quick_setup/index.html | 170 - .../persona/remote_verification_api/index.html | 199 - .../persona/security_considerations/index.html | 59 - files/es/mozilla/persona/why_persona/index.html | 30 - files/es/mozilla/preferences/index.html | 48 - files/es/mozilla/projects/index.html | 14 - .../es/mozilla/projects/nspr/reference/index.html | 770 - files/es/mozilla/projects/psm/index.html | 11 - files/es/mozilla/rendimiento/index.html | 135 - files/es/mozilla/rust/index.html | 45 - files/es/mozilla/security/index.html | 33 - .../mozilla/security/x509_certificates/index.html | 386 - files/es/mozilla/tech/index.html | 14 - files/es/mozilla/tech/toolkit_api/smile/index.html | 58 - files/es/mozilla/tech/xpcom/guide/index.html | 16 - .../tech/xpcom/language_bindings/index.html | 25 - files/es/mozilla/tech/xpcom/reference/index.html | 30 - files/es/mozilla/tech/xpidl/index.html | 26 - .../index.html" | 291 - .../agregar_barras_laterales/index.html | 198 - .../agregar_eventos_y_comandos/index.html | 135 - .../agregar_menus_y_submenus/index.html | 139 - .../agregar_ventanas_y_dialogos/index.html | 197 - .../escuela_xul/almacenamiento_local/index.html | 140 - .../index.html" | 57 - .../index.html" | 51 - .../index.html" | 210 - .../index.html" | 304 - .../index.html" | 244 - .../documentaci\303\263n_de_mozilla/index.html" | 72 - .../index.html" | 417 - .../enlazando_contenido_remoto/index.html | 231 - files/es/mozilla/tech/xul/escuela_xul/index.html | 77 - .../index.html" | 128 - .../tech/xul/escuela_xul/introduction/index.html | 54 - .../escuela_xul/manejo_de_preferencias/index.html | 305 - .../montando_un_ambiente_de_desarrollo/index.html | 244 - .../notificaciones_de_usuario_y_alertas/index.html | 94 - .../tech/xul/escuela_xul/objetos_xpcom/index.html | 378 - .../personalizar_elementos_xul_con_xbl/index.html | 544 - .../index.html" | 46 - .../uso_de_objetos_en_javascript/index.html | 338 - files/es/mozilla/thunderbird/index.html | 91 - .../thunderbird_in_the_enterprise/index.html | 37 - files/es/mozilla/toolkit_version_format/index.html | 61 - .../working_with_windows_in_chrome_code/index.html | 386 - .../xpcom/cambios_xpcom_en_gecko_2.0/index.html | 111 - .../xpcom/el_administrador_de_hilos/index.html | 33 - files/es/mozilla/xpcom/xpcom/index.html | 83 - files/es/mozistorageconnection/index.html | 470 - "files/es/m\303\263vil/index.html" | 30 - .../es/m\303\263vil/viewport_meta_tag/index.html" | 89 - files/es/nsicancelable/index.html | 50 - files/es/nsichannel/index.html | 183 - files/es/nsidomofflineresourcelist/index.html | 228 - files/es/nsidownload/index.html | 116 - files/es/nsidownloadmanager/index.html | 442 - files/es/nsidownloadmanagerui/index.html | 126 - files/es/nsidownloadprogresslistener/index.html | 304 - files/es/nsidragservice/index.html | 317 - files/es/nsilocalfile/index.html | 121 - files/es/nsisimpleenumerator/index.html | 46 - files/es/nsisupports/addref/index.html | 20 - files/es/nsisupports/index.html | 44 - files/es/nsisupports/queryinterface/index.html | 43 - files/es/nsisupports/release/index.html | 18 - files/es/nsiuri/index.html | 441 - files/es/nsiwebprogress/index.html | 233 - files/es/nsizipwriter/index.html | 517 - files/es/nspr/index.html | 58 - files/es/nss/index.html | 17 - .../es/nss/nss_sources_building_testing/index.html | 68 - .../index.html | 24 - files/es/persona/crypto/index.html | 21 - files/es/persona/iniciar_persona/index.html | 29 - files/es/persona/internationalization/index.html | 51 - files/es/persona/libraries_and_plugins/index.html | 165 - files/es/plugins/index.html | 52 - .../index.html | 10 - .../index.html | 127 - .../index.html | 53 - files/es/prtime/index.html | 432 - .../es/pruebas_automatizadas_de_mozilla/index.html | 51 - files/es/qa/bug_writing_guidelines/index.html | 111 - files/es/qa/confirming_unconfirmed_bugs/index.html | 44 - files/es/qa/index.html | 252 - files/es/qa/organizando_un_testday/index.html | 219 - files/es/qa/screening_duplicate_bugs/index.html | 157 - files/es/rdf/index.html | 56 - files/es/rhino/comunidad/index.html | 13 - files/es/rhino/descarga_rhino/index.html | 106 - files/es/rhino/index.html | 16 - files/es/rhino/resumen/index.html | 45 - files/es/rhino_documentacon/index.html | 115 - files/es/sandbox/index.html | 29 - files/es/sax/index.html | 114 - files/es/servicios_web_xml/index.html | 20 - files/es/sistema_de_preferencias/index.html | 65 - files/es/social_api/glossary/index.html | 53 - files/es/social_api/guide/index.html | 32 - files/es/social_api/index.html | 65 - files/es/social_api/manifiesto/index.html | 38 - .../service_worker_api_reference/index.html | 377 - files/es/social_api/widgets/index.html | 16 - files/es/spidermonkey/index.html | 115 - files/es/storage/performance/index.html | 196 - files/es/temas/background/index.html | 99 - files/es/temas/index.html | 20 - files/es/temas/theme_concepts/index.html | 231 - files/es/thunderbird_localization/index.html | 100 - files/es/tools/webide/index.html | 298 - files/es/tools/webide/monitor/index.html | 158 - files/es/tools/webide/troubleshooting/index.html | 50 - files/es/uso_de_nsiloginmanager/index.html | 177 - files/es/venkman/index.html | 50 - files/es/vigilancia_de_plugins/index.html | 131 - files/es/vigilar_descargas/index.html | 247 - .../web/api/cameracapabilities/effects/index.html | 37 - .../api/cameracapabilities/fileformats/index.html | 37 - .../api/cameracapabilities/flashmodes/index.html | 37 - files/es/web/api/cameracapabilities/index.html | 86 - .../maxexposurecompensation/index.html | 33 - .../cameracapabilities/maxfocusareas/index.html | 33 - .../checkinstalled/index.html | 49 - .../getinstalled/index.html | 40 - .../es/web/api/domapplicationsregistry/index.html | 89 - .../api/domapplicationsregistry/install/index.html | 90 - .../installpackage/index.html | 36 - files/es/web/api/mozsocial/closepanel/index.html | 19 - files/es/web/api/mozsocial/getattention/index.html | 19 - files/es/web/api/mozsocial/getworker/index.html | 19 - files/es/web/api/mozsocial/index.html | 44 - files/es/web/api/mozsocial/isvisible/index.html | 22 - .../es/web/api/mozsocial/openchatwindow/index.html | 26 - files/es/web/api/mozsocial/openpanel/index.html | 30 - files/es/web/api/navigator/id/index.html | 16 - files/es/web/api/navigator/mozsocial/index.html | 48 - files/es/web/api/simple_push_api/index.html | 235 - files/es/web/api/using_the_browser_api/index.html | 159 - files/es/web/css/-moz-binding/index.html | 110 - .../web/css/-moz-border-bottom-colors/index.html | 136 - .../es/web/css/-moz-border-left-colors/index.html | 144 - .../es/web/css/-moz-border-right-colors/index.html | 136 - files/es/web/css/-moz-border-top-colors/index.html | 140 - files/es/web/css/-moz-stack-sizing/index.html | 57 - files/es/web/css/-moz-text-blink/index.html | 95 - files/es/web/css/-moz-window-shadow/index.html | 52 - files/es/web/css/-ms-accelerator/index.html | 75 - files/es/web/css/-ms-overflow-style/index.html | 40 - .../_colon_-moz-full-screen-ancestor/index.html | 83 - .../css/_colon_-moz-lwtheme-brighttext/index.html | 24 - .../css/_colon_-moz-lwtheme-darktext/index.html | 25 - files/es/web/css/_colon_-moz-lwtheme/index.html | 26 - .../index.html | 19 - .../index.html | 25 - .../index.html | 73 - .../index.html | 73 - .../index.html | 73 - .../index.html | 73 - .../index.html | 73 - .../index.html | 73 - .../index.html | 113 - .../_colon_-moz-tree-cell-text(hover)/index.html | 19 - .../web/css/_colon_-moz-tree-cell-text/index.html | 30 - files/es/web/css/_colon_-moz-tree-cell/index.html | 38 - .../es/web/css/_colon_-moz-tree-column/index.html | 29 - .../css/_colon_-moz-tree-drop-feedback/index.html | 29 - files/es/web/css/_colon_-moz-tree-image/index.html | 34 - .../css/_colon_-moz-tree-indentation/index.html | 27 - files/es/web/css/_colon_-moz-tree-line/index.html | 28 - .../css/_colon_-moz-tree-progressmeter/index.html | 28 - .../web/css/_colon_-moz-tree-row(hover)/index.html | 19 - files/es/web/css/_colon_-moz-tree-row/index.html | 50 - .../web/css/_colon_-moz-tree-separator/index.html | 29 - .../es/web/css/_colon_-moz-tree-twisty/index.html | 33 - .../es/web/css/_doublecolon_-ms-browse/index.html | 97 - files/es/web/css/_doublecolon_-ms-check/index.html | 114 - files/es/web/css/_doublecolon_-ms-clear/index.html | 113 - .../es/web/css/_doublecolon_-ms-expand/index.html | 25 - .../web/css/_doublecolon_-ms-fill-lower/index.html | 88 - .../web/css/_doublecolon_-ms-fill-upper/index.html | 88 - files/es/web/css/_doublecolon_-ms-fill/index.html | 106 - .../es/web/css/_doublecolon_-ms-reveal/index.html | 72 - files/es/web/css/_doublecolon_-ms-thumb/index.html | 44 - .../css/_doublecolon_-ms-ticks-after/index.html | 84 - files/es/web/css/_doublecolon_-ms-track/index.html | 48 - files/es/web/css/_doublecolon_-ms-value/index.html | 31 - files/es/web/css/azimuth/index.html | 70 - files/es/web/events/domsubtreemodified/index.html | 27 - files/es/web/guide/api/camera/index.html | 244 - .../novedades_en_javascript/1.1/index.html | 74 - .../novedades_en_javascript/1.2/index.html | 100 - .../novedades_en_javascript/1.3/index.html | 141 - .../novedades_en_javascript/1.5/index.html | 47 - .../novedades_en_javascript/1.6/index.html | 79 - .../novedades_en_javascript/1.7/index.html | 534 - .../novedades_en_javascript/1.8.1/index.html | 30 - .../novedades_en_javascript/1.8.5/index.html | 151 - .../novedades_en_javascript/1.8/index.html | 150 - .../ecmascript_5_support_in_mozilla/index.html | 41 - .../ecmascript_6_support_in_mozilla/index.html | 273 - .../javascript/novedades_en_javascript/index.html | 81 - .../objetos_globales/array/observe/index.html | 133 - .../objetos_globales/array/unobserve/index.html | 127 - .../objetos_globales/function/arity/index.html | 32 - .../function/isgenerator/index.html | 90 - .../objetos_globales/object/count/index.html | 82 - .../objetos_globales/object/getnotifier/index.html | 92 - .../object/nosuchmethod/index.html | 198 - .../objetos_globales/object/observe/index.html | 188 - .../objetos_globales/object/parent/index.html | 244 - .../objetos_globales/object/unobserve/index.html | 138 - .../objetos_globales/object/unwatch/index.html | 37 - .../objetos_globales/object/watch/index.html | 104 - .../operadores/array_comprehensions/index.html | 195 - .../operadores/expression_closures/index.html | 76 - .../referencia/sentencias/for_each...in/index.html | 67 - files/es/web_localizability/index.html | 19 - files/es/webapi/alarm/index.html | 180 - "files/es/webapi/c\303\241mara/index.html" | 20 - files/es/webapi/device_storage/index.html | 226 - files/es/xforms/index.html | 28 - files/es/xforms/soporte_en_mozilla/index.html | 116 - files/es/xml_en_mozilla/index.html | 280 - .../xmlhttprequest_cambios_en_gecko1.8/index.html | 22 - files/es/xpcom_interface_reference/index.html | 17 - .../nsiloginmanager/index.html | 372 - files/es/xpcomutils.jsm/index.html | 509 - files/es/xpinstall/index.html | 54 - files/es/xul_tutorial/index.html | 5 - files/es/zonas/index.html | 72 - 653 files changed, 105197 deletions(-) delete mode 100644 files/es/_wikihistory.json delete mode 100644 files/es/administrador_de_perfiles/index.html delete mode 100644 files/es/almacenamiento/index.html delete mode 100644 files/es/api_de_acceso_a_canales/index.html delete mode 100644 files/es/api_del_toolkit/index.html delete mode 100644 "files/es/archive/add-ons/api_de_restauraci\303\263n_de_sesi\303\263n/index.html" delete mode 100644 files/es/archive/add-ons/index.html delete mode 100644 files/es/archive/add-ons/observer_notifications/index.html delete mode 100644 "files/es/archive/add-ons/permitir_sugerencias_en_los_plugins_de_b\303\272squeda/index.html" delete mode 100644 "files/es/archive/add-ons/versionado,_actualizaci\303\263n_y_compatibilidad_de_extensiones/index.html" delete mode 100644 files/es/archive/api/index.html delete mode 100644 files/es/archive/api/navigator/index.html delete mode 100644 files/es/archive/api/navigator/moznotification/index.html delete mode 100644 files/es/archive/apps/advanced_topics/index.html delete mode 100644 files/es/archive/apps/index.html delete mode 100644 files/es/archive/b2g_os/api/callevent/index.html delete mode 100644 files/es/archive/b2g_os/api/cameramanager/getcamera/index.html delete mode 100644 files/es/archive/b2g_os/api/cameramanager/index.html delete mode 100644 files/es/archive/b2g_os/api/index.html delete mode 100644 files/es/archive/b2g_os/api/mozactivity/index.html delete mode 100644 files/es/archive/b2g_os/api/mozvoicemailstatus/index.html delete mode 100644 files/es/archive/b2g_os/api/navigator/index.html delete mode 100644 files/es/archive/b2g_os/api/navigator/mozalarms/index.html delete mode 100644 files/es/archive/b2g_os/api/navigator/mozapps/index.html delete mode 100644 files/es/archive/b2g_os/api/navigator/moztelephony/index.html delete mode 100644 files/es/archive/b2g_os/api/telephony/index.html delete mode 100644 files/es/archive/b2g_os/api/telephonycall/hangup/index.html delete mode 100644 files/es/archive/b2g_os/api/telephonycall/index.html delete mode 100644 files/es/archive/b2g_os/api/telephonycall/number/index.html delete mode 100644 files/es/archive/b2g_os/api/telephonycall/onincoming/index.html delete mode 100644 files/es/archive/b2g_os/api/window/index.html delete mode 100644 files/es/archive/b2g_os/application_development/index.html delete mode 100644 files/es/archive/b2g_os/apps/escribiendo_una_aplicacion_web_para_b2g/index.html delete mode 100644 files/es/archive/b2g_os/apps/index.html delete mode 100644 files/es/archive/b2g_os/architecture/index.html delete mode 100644 files/es/archive/b2g_os/building_and_installing_boot_to_gecko/dispositivos_compatibles/index.html delete mode 100644 files/es/archive/b2g_os/building_and_installing_boot_to_gecko/firefox_os_build_process_summary/index.html delete mode 100644 files/es/archive/b2g_os/building_and_installing_boot_to_gecko/index.html delete mode 100644 files/es/archive/b2g_os/building_b2g_for_qemu_emulator/index.html delete mode 100644 files/es/archive/b2g_os/compilar_boot_to_gecko/index.html delete mode 100644 files/es/archive/b2g_os/complementos/index.html delete mode 100644 files/es/archive/b2g_os/consejos_uso_firefox_os/index.html delete mode 100644 files/es/archive/b2g_os/debugging/depurar_b2g_usando_gdb/index.html delete mode 100644 files/es/archive/b2g_os/debugging/developer_settings/index.html delete mode 100644 files/es/archive/b2g_os/debugging/index.html delete mode 100644 files/es/archive/b2g_os/debugging/personalizando_el_script_b2g.sh/index.html delete mode 100644 files/es/archive/b2g_os/debugging/setting_up/index.html delete mode 100644 files/es/archive/b2g_os/developing_gaia/entendiendo_el_codigo_base_de_gaia/index.html delete mode 100644 files/es/archive/b2g_os/developing_gaia/index.html delete mode 100644 files/es/archive/b2g_os/developing_gaia/running_the_gaia_codebase/index.html delete mode 100644 files/es/archive/b2g_os/elegir_como_ejecutar_gaia_o_b2g/index.html delete mode 100644 files/es/archive/b2g_os/firefox_os_apps/building_blocks/index.html delete mode 100644 files/es/archive/b2g_os/firefox_os_apps/index.html delete mode 100644 files/es/archive/b2g_os/firefox_os_build_prerequisites/index.html delete mode 100644 files/es/archive/b2g_os/gaia_hacking_guide/index.html delete mode 100644 files/es/archive/b2g_os/gonk/index.html delete mode 100644 files/es/archive/b2g_os/index.html delete mode 100644 files/es/archive/b2g_os/installing_on_a_mobile_device/index.html delete mode 100644 files/es/archive/b2g_os/introduction/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/fairphone/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/flame/configuracion_inicial/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/flame/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/flame/updating_your_flame/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/fx0/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/geeksphone/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/lista_dispositivos/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/zte_open/index.html delete mode 100644 files/es/archive/b2g_os/phone_guide/zte_open_c/index.html delete mode 100644 files/es/archive/b2g_os/platform/gaia/hacking/index.html delete mode 100644 files/es/archive/b2g_os/platform/gaia/index.html delete mode 100644 files/es/archive/b2g_os/platform/gaia/introduction_to_gaia/index.html delete mode 100644 files/es/archive/b2g_os/platform/index.html delete mode 100644 files/es/archive/b2g_os/platform/settings_list/index.html delete mode 100644 files/es/archive/b2g_os/portando/index.html delete mode 100644 files/es/archive/b2g_os/porting_firefox_os/index.html delete mode 100644 files/es/archive/b2g_os/porting_firefox_os/portando_de_cyanogenmod/index.html delete mode 100644 files/es/archive/b2g_os/preparing_for_your_first_b2g_build/index.html delete mode 100644 files/es/archive/b2g_os/probando_firefox_os/index.html delete mode 100644 files/es/archive/b2g_os/quickstart/app_tools/index.html delete mode 100644 files/es/archive/b2g_os/quickstart/index.html delete mode 100644 files/es/archive/b2g_os/quickstart/intro_to_manifests/index.html delete mode 100644 files/es/archive/b2g_os/quickstart/introduccion_a_las_open_web_apps/index.html delete mode 100644 files/es/archive/b2g_os/quickstart/tu_primera_aplicacion/index.html delete mode 100644 files/es/archive/b2g_os/releases/2.0/index.html delete mode 100644 files/es/archive/b2g_os/releases/2.1/index.html delete mode 100644 files/es/archive/b2g_os/releases/index.html delete mode 100644 files/es/archive/b2g_os/screencast_series_colon__app_basics_for_firefox_os/index.html delete mode 100644 files/es/archive/b2g_os/security/application_security/index.html delete mode 100644 files/es/archive/b2g_os/security/index.html delete mode 100644 files/es/archive/b2g_os/security/modelo_seguridad/index.html delete mode 100644 files/es/archive/b2g_os/simulator/index.html delete mode 100644 files/es/archive/b2g_os/usando_el_b2g_escritorio_cliente/index.html delete mode 100644 files/es/archive/b2g_os/using_firefox_os_simulator/index.html delete mode 100644 files/es/archive/b2g_os/using_the_app_manager/index.html delete mode 100644 files/es/archive/b2g_os/ux/building_blocks/action_menu/coding/index.html delete mode 100644 files/es/archive/b2g_os/ux/building_blocks/action_menu/index.html delete mode 100644 files/es/archive/b2g_os/ux/building_blocks/button/index.html delete mode 100644 files/es/archive/b2g_os/ux/building_blocks/index.html delete mode 100644 files/es/archive/b2g_os/ux/guia_estilo/index.html delete mode 100644 files/es/archive/b2g_os/web_telephony_api/index.html delete mode 100644 files/es/archive/b2g_os/web_telephony_api/introduccion_a_la_webtelephony/index.html delete mode 100644 files/es/archive/css3/index.html delete mode 100644 "files/es/archive/est\303\241ndares_web/analizar_microformatos_en_javascript/index.html" delete mode 100644 "files/es/archive/est\303\241ndares_web/crear_microformatos_en_javascript/index.html" delete mode 100644 "files/es/archive/est\303\241ndares_web/index.html" delete mode 100644 "files/es/archive/est\303\241ndares_web/preguntas_frecuentes_sobre_rdf_en_mozilla/index.html" delete mode 100644 "files/es/archive/est\303\241ndares_web/usando_el_marcado_correcto_para_llamar_a_los_plugins/index.html" delete mode 100644 "files/es/archive/est\303\241ndares_web/ventajas_para_los_negocios_del_uso_de_est\303\241ndares_web/index.html" delete mode 100644 files/es/archive/index.html delete mode 100644 files/es/archive/jxon/index.html delete mode 100644 files/es/archive/mdn/index.html delete mode 100644 files/es/archive/meta_docs/index.html delete mode 100644 files/es/archive/meta_docs/mdn_content_on_webplatform.org/index.html delete mode 100644 files/es/archive/meta_docs/mdn_page_layout_guide/index.html delete mode 100644 "files/es/archive/misc_top_level/im\303\241genes,_tablas_y_huecos_misteriosos/index.html" delete mode 100644 files/es/archive/misc_top_level/index.html delete mode 100644 files/es/archive/misc_top_level/usar_las_preferencias_de_contenido/index.html delete mode 100644 files/es/archive/mozilla/firefox/el_uso_de_microformatos/index.html delete mode 100644 files/es/archive/mozilla/firefox/index.html delete mode 100644 files/es/archive/mozilla/firefox/soap_en_los_navegadores_basados_en_gecko/index.html delete mode 100644 files/es/archive/mozilla/index.html delete mode 100644 files/es/archive/mozilla/jetpack/index.html delete mode 100644 files/es/archive/mozilla/table_layout_regression_tests/index.html delete mode 100644 files/es/archive/mozilla/xbl/index.html delete mode 100644 files/es/archive/mozilla/xul/action/index.html delete mode 100644 files/es/archive/mozilla/xul/attribute/index.html delete mode 100644 files/es/archive/mozilla/xul/bestiario_xul/index.html delete mode 100644 "files/es/archive/mozilla/xul/c\303\263mo_implementar_un_componente_procesador_de_consultas_xul/index.html" delete mode 100644 files/es/archive/mozilla/xul/dialog/index.html delete mode 100644 files/es/archive/mozilla/xul/elementos/index.html delete mode 100644 files/es/archive/mozilla/xul/events/index.html delete mode 100644 "files/es/archive/mozilla/xul/gu\303\255a_de_plantillas/index.html" delete mode 100644 "files/es/archive/mozilla/xul/gu\303\255a_de_plantillas/ordenar_resultados/index.html" delete mode 100644 files/es/archive/mozilla/xul/index.html delete mode 100644 files/es/archive/mozilla/xul/method/index.html delete mode 100644 files/es/archive/mozilla/xul/property/align/index.html delete mode 100644 files/es/archive/mozilla/xul/property/buttons/index.html delete mode 100644 files/es/archive/mozilla/xul/property/index.html delete mode 100644 files/es/archive/mozilla/xul/style/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/actualizar_comandos/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/archivos_manifest/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/atajos_de_teclado/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_botones/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_elementos_html/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_etiquetas_e_imagenes/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_los_gestores_de_eventos/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_m\303\241s_elementos/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/barra_de_herramientas/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/barras_de_desplazamiento/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/cajas_de_grupo/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/caracter\303\255sticas_adicionales_de_la_instalaci\303\263n/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/caracter\303\255sticas_de_una_ventana/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/comandos/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/controles_de_entrada/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/controles_de_listas/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/creando_un_asistente/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/creando_un_instalador/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/creando_una_ventana/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/detalles_de_vistas_de_un_\303\241rbol/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/detalles_del_modelo_de_caja/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/divisores/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/di\303\241logos_abrir_y_guardar/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/el_modelo_de_caja/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/emisores_y_receptores/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/estructura_xul/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/foco_y_selecci\303\263n/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/herencia_de_atributos_xbl_en_firefox_1.5_y_2.0/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/instalando_scripts/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/interfaces_xpcom/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/introducci\303\263n/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/introducci\303\263n_a_rdf/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/la_url_chrome/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/manipulando_listas/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/medidores_de_progreso/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_con_desplazamiento/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_de_barras_simples/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_emergentes/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/modelo_de_objeto_de_documento/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/modificando_una_interfaz_xul/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_asistentes/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_caracter\303\255sticas_de_los_botones/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_caracter\303\255sticas_de_los_\303\241rboles/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_funciones_de_men\303\272/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_gestores_de_eventos/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/objeto_de_caja_de_\303\241rbol/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/paneles_de_contenidos/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/plantillas/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/posicionamiento_de_elementos_de_la_ventana/index.html delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/rejillas/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/selecci\303\263n_en_un_\303\241rbol/index.html" delete mode 100644 files/es/archive/mozilla/xul/tutorial_de_xul/usando_espaciadores/index.html delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/\303\241rboles/index.html" delete mode 100644 "files/es/archive/mozilla/xul/tutorial_de_xul/\303\241rboles_y_plantillas/index.html" delete mode 100644 files/es/archive/mozilla/xul/xul_reference/index.html delete mode 100644 files/es/archive/mozilla/xul/xul_reference/xul_element_attributes/index.html delete mode 100644 files/es/archive/mozilla/xulrunner/componentes/index.html delete mode 100644 files/es/archive/mozilla/xulrunner/index.html delete mode 100644 files/es/archive/mozilla/xulrunner/primeros_pasos_con_xulrunner/index.html delete mode 100644 files/es/archive/rss/index.html delete mode 100644 files/es/archive/rss/primeros_pasos/index.html delete mode 100644 files/es/archive/rss/versiones/index.html delete mode 100644 "files/es/archive/security/encriptaci\303\263n_y_desencriptaci\303\263n/index.html" delete mode 100644 files/es/archive/security/index.html delete mode 100644 files/es/archive/themes/create_your_own_firefox_background_theme/index.html delete mode 100644 files/es/archive/themes/index.html delete mode 100644 files/es/archive/tutoriales-para-principiantes/index.html delete mode 100644 files/es/archive/web/index.html delete mode 100644 files/es/archive/web/javascript/index.html delete mode 100644 files/es/archive/web/javascript/legacy_generator_function_statement/index.html delete mode 100644 files/es/archive/web/javascript/proximo_soporte_de_ecmascript_en_mozilla/index.html delete mode 100644 files/es/archive/web/liveconnect/index.html delete mode 100644 files/es/archive/web/liveconnect/java/index.html delete mode 100644 files/es/archive/web/liveconnect/javaarray/index.html delete mode 100644 files/es/archive/web/liveconnect/javaclass/index.html delete mode 100644 files/es/archive/web/liveconnect/javaobject/index.html delete mode 100644 files/es/archive/web/liveconnect/javapackage/index.html delete mode 100644 files/es/archive/web/liveconnect/netscape/index.html delete mode 100644 files/es/archive/web/liveconnect/packages/index.html delete mode 100644 files/es/archive/web/liveconnect/sun/index.html delete mode 100644 files/es/arrastrar_y_soltar/index.html delete mode 100644 "files/es/a\303\261adir_datos_para_la_protecci\303\263n_anti-phishing/index.html" delete mode 100644 "files/es/a\303\261adir_preferencias_a_una_extensi\303\263n/index.html" delete mode 100644 "files/es/browserid/configuraci\303\263n_r\303\241pida/index.html" delete mode 100644 files/es/browserid/funciones_avanzadas/index.html delete mode 100644 files/es/browserid/index.html delete mode 100644 files/es/bundles/index.html delete mode 100644 files/es/cambios_del_tema_en_firefox_2/index.html delete mode 100644 files/es/cambios_en_los_temas_de_firefox_3/index.html delete mode 100644 "files/es/cat\303\241logo/algoritmo_frecency/index.html" delete mode 100644 "files/es/cat\303\241logo/direcciones_web_consultas_places/index.html" delete mode 100644 "files/es/cat\303\241logo/index.html" delete mode 100644 files/es/como_crear_un_microresumen/index.html delete mode 100644 files/es/components.utils.import/index.html delete mode 100644 files/es/consola_de_errores/index.html delete mode 100644 "files/es/creaci\303\263n_de_componentes_xpcom/index.html" delete mode 100644 "files/es/creaci\303\263n_de_componentes_xpcom/un_vistazo_de_xpcom/index.html" delete mode 100644 "files/es/creaci\303\263n_de_componentes_xpcom/uso_de_componentes_xpcom/index.html" delete mode 100644 "files/es/creaci\303\263n_de_plugins_mozsearch/index.html" delete mode 100644 files/es/creando_un_skin_para_firefox/como_empezar/index.html delete mode 100644 files/es/creando_un_skin_para_firefox/uuid/index.html delete mode 100644 files/es/creando_un_tema_para_firefox/index.html delete mode 100644 "files/es/crear_un_m\303\263dulo_de_administrador_de_cuentas_almacenadas/index.html" delete mode 100644 files/es/crear_un_panel_lateral_en_firefox/index.html delete mode 100644 "files/es/crear_una_extensi\303\263n_din\303\241mica_en_la_barra_de_estado/index.html" delete mode 100644 "files/es/crear_una_extensi\303\263n_en_la_barra_de_estado/index.html" delete mode 100644 "files/es/c\303\263mo_crear_un_componente_xpcom_en_javascript/index.html" delete mode 100644 "files/es/c\303\263mo_incrustar_el_motor_javascript/index.html" delete mode 100644 files/es/desarrollo_web/web_adaptable/index.html delete mode 100644 files/es/descripcion_general_sobre_nss/index.html delete mode 100644 "files/es/detecci\303\263n_del_navegador_y_cobertura_a_m\303\272ltiples_navegadores/index.html" delete mode 100644 files/es/e4x/index.html delete mode 100644 files/es/empaquetado_de_extensiones/index.html delete mode 100644 files/es/empaquetar_un_tema/index.html delete mode 100644 "files/es/escribir_c\303\263digo_localizable/index.html" delete mode 100644 files/es/esquema_del_administrador_de_descargas/index.html delete mode 100644 files/es/eventos_arrastrar_y_soltar/index.html delete mode 100644 files/es/extensions/bootstrapped_extensions/index.html delete mode 100644 files/es/extensions/community/index.html delete mode 100644 files/es/extensions/index.html delete mode 100644 "files/es/extensions/m\303\263vil_clone/index.html" delete mode 100644 files/es/faq_de_mercurial/index.html delete mode 100644 files/es/fuel/annotations/index.html delete mode 100644 files/es/fuel/application/index.html delete mode 100644 files/es/fuel/bookmark/index.html delete mode 100644 files/es/fuel/bookmarkfolder/index.html delete mode 100644 files/es/fuel/browsertab/index.html delete mode 100644 files/es/fuel/console/index.html delete mode 100644 files/es/fuel/eventitem/index.html delete mode 100644 files/es/fuel/eventlistener/index.html delete mode 100644 files/es/fuel/events/index.html delete mode 100644 files/es/fuel/extension/index.html delete mode 100644 files/es/fuel/extensions/index.html delete mode 100644 files/es/fuel/index.html delete mode 100644 files/es/fuel/preference/index.html delete mode 100644 files/es/fuel/preferencebranch/index.html delete mode 100644 files/es/fuel/sessionstorage/index.html delete mode 100644 files/es/fuel/window/index.html delete mode 100644 files/es/gecko/index.html delete mode 100644 files/es/gecko_sdk/index.html delete mode 100644 "files/es/gr\303\241ficos_png_animados/index.html" delete mode 100644 files/es/herramientas/borrador/index.html delete mode 100644 files/es/incrustando_mozilla/index.html delete mode 100644 files/es/interactuar_con_el_colector_de_ciclos_de_xpcom/index.html delete mode 100644 files/es/introduccion_venkman/index.html delete mode 100644 "files/es/introducci\303\263n_a_la_extensi\303\263n_de_la_api_de_audio/index.html" delete mode 100644 "files/es/introducci\303\263n_al_shell_de_javascript/index.html" delete mode 100644 files/es/ipdl/index.html delete mode 100644 files/es/javascript_code_modules/using/index.html delete mode 100644 files/es/l10n_en_mercurial/index.html delete mode 100644 files/es/la_plataforma_mozilla/index.html delete mode 100644 "files/es/lo_b\303\241sico_de_mercurial/index.html" delete mode 100644 "files/es/localizaci\303\263n_y_plurales/index.html" delete mode 100644 "files/es/lugares/gu\303\255a_para_migraci\303\263n_con_lugares/index.html" delete mode 100644 "files/es/manifiesto_de_instalaci\303\263n/index.html" delete mode 100644 "files/es/manipular_marcadores_usando_el_cat\303\241logo/index.html" delete mode 100644 files/es/manual_de_compatibilidad_de_gecko/index.html delete mode 100644 "files/es/marcado_xml_en_los_microres\303\272menes/index.html" delete mode 100644 files/es/mdn/contribute/howto/enlace_cuenta_github/index.html delete mode 100644 files/es/mdn/contribute/registro_persona/index.html delete mode 100644 files/es/mdn/contribute/team_status/index.html delete mode 100644 files/es/mdn/user_guide/writing/index.html delete mode 100644 files/es/mejoras_css_en_firefox_3/index.html delete mode 100644 files/es/mejoras_en_el_administrador_de_descargas_en_firefox_3/index.html delete mode 100644 files/es/mercurial/index.html delete mode 100644 files/es/microsummary_topics/index.html delete mode 100644 files/es/midas/index.html delete mode 100644 files/es/mozilla/add-ons/add-on_manager/index.html delete mode 100644 files/es/mozilla/add-ons/add-on_repository/index.html delete mode 100644 files/es/mozilla/add-ons/amo/index.html delete mode 100644 files/es/mozilla/add-ons/amo/policy/contacto/index.html delete mode 100644 files/es/mozilla/add-ons/amo/policy/index.html delete mode 100644 files/es/mozilla/add-ons/amo/policy/revisiones/index.html delete mode 100644 files/es/mozilla/add-ons/code_snippets/index.html delete mode 100644 files/es/mozilla/add-ons/code_snippets/queryselector/index.html delete mode 100644 files/es/mozilla/add-ons/lineamientos_de_complementos/index.html delete mode 100644 files/es/mozilla/add-ons/overlay_extensions/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/builder/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/add_a_context_menu_item/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/add_a_menu_item_to_firefox/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/adding_a_button_to_the_toolbar/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/display_a_popup/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/getting_started/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/installation/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/list_open_tabs/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/listen_for_page_load/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/modifying_the_page_hosted_by_a_tab/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/modifying_web_pages_based_on_url/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/open_a_web_page/index.html delete mode 100644 files/es/mozilla/add-ons/sdk/tutorials/troubleshooting/index.html delete mode 100644 files/es/mozilla/add-ons/themes/obsolete/index.html delete mode 100644 files/es/mozilla/add-ons/thunderbird/howtos/common_thunderbird_extension_techniques/add_toolbar_button/index.html delete mode 100644 files/es/mozilla/add-ons/thunderbird/howtos/common_thunderbird_extension_techniques/index.html delete mode 100644 files/es/mozilla/add-ons/thunderbird/howtos/index.html delete mode 100644 files/es/mozilla/add-ons/thunderbird/index.html delete mode 100644 files/es/mozilla/bugzilla/index.html delete mode 100644 files/es/mozilla/bugzilla/testopia/index.html delete mode 100644 files/es/mozilla/como_obtener_un_seguimiento_de_pila_para_un_informe_de_error/index.html delete mode 100644 files/es/mozilla/connect/index.html delete mode 100644 files/es/mozilla/creando_un_complemento_de_diccionario_de_ortografia/index.html delete mode 100644 files/es/mozilla/firefox/compilar_firefox_con_codigo_en_rust/index.html delete mode 100644 "files/es/mozilla/firefox/edici\303\263n_de_desarrollador/index.html" delete mode 100644 "files/es/mozilla/firefox/edici\303\263n_de_desarrollador/revertir/index.html" delete mode 100644 files/es/mozilla/firefox/firefox_esr/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/message_manager/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/message_manager/process_scripts/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/motivation/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/pitfalls_for_add-on_developers/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/remotepagemanager/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/tab_selection_in_multiprocess_firefox/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/technical_overview/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/types_of_message_manager/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/web_content_compatibility/index.html delete mode 100644 files/es/mozilla/firefox/multiprocess_firefox/which_uris_load_where/index.html delete mode 100644 files/es/mozilla/firefox/privacy/index.html delete mode 100644 files/es/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedtracker/index.html delete mode 100644 files/es/mozilla/firefox/privacy/storage_access_policy/errors/index.html delete mode 100644 files/es/mozilla/firefox/privacy/storage_access_policy/index.html delete mode 100644 files/es/mozilla/firefox/privacy/tracking_protection/index.html delete mode 100644 files/es/mozilla/firefox_para_android/index.html delete mode 100644 files/es/mozilla/git/index.html delete mode 100644 files/es/mozilla/http_cache/index.html delete mode 100644 files/es/mozilla/implementing_pontoon_in_a_mozilla_website/index.html delete mode 100644 files/es/mozilla/instantbird/index.html delete mode 100644 files/es/mozilla/javascript_code_modules/index.html delete mode 100644 files/es/mozilla/javascript_code_modules/promise.jsm/index.html delete mode 100644 files/es/mozilla/javascript_code_modules/promise.jsm/promise/index.html delete mode 100644 files/es/mozilla/javascript_code_modules/source-editor.jsm/index.html delete mode 100644 files/es/mozilla/javascript_code_modules/timer.jsm/index.html delete mode 100644 files/es/mozilla/localization/index.html delete mode 100644 files/es/mozilla/localization/l10n_style_guide/index.html delete mode 100644 files/es/mozilla/localization/l10n_style_guide/your_language/index.html delete mode 100644 files/es/mozilla/localization/localizing_with_pontoon/index.html delete mode 100644 files/es/mozilla/localization/notas_de_localizacion/index.html delete mode 100644 files/es/mozilla/localization/quick_start_guide/fase_qa/index.html delete mode 100644 files/es/mozilla/localization/quick_start_guide/index.html delete mode 100644 files/es/mozilla/localization/quick_start_guide/initial_setup/index.html delete mode 100644 files/es/mozilla/localization/web_localizability/creating_localizable_web_content/index.html delete mode 100644 files/es/mozilla/marketplace/apis/index.html delete mode 100644 files/es/mozilla/marketplace/faq/index.html delete mode 100644 files/es/mozilla/marketplace/index.html delete mode 100644 files/es/mozilla/marketplace/marketplace_apis/index.html delete mode 100644 files/es/mozilla/marketplace/monetization/estatus_de_pagos/index.html delete mode 100644 files/es/mozilla/marketplace/monetization/index.html delete mode 100644 files/es/mozilla/marketplace/monetization/introduccion_monetizacion/index.html delete mode 100644 files/es/mozilla/marketplace/normas_valoracion_usuario/index.html delete mode 100644 "files/es/mozilla/marketplace/options/introducci\303\263n/index.html" delete mode 100644 files/es/mozilla/marketplace/publish/index.html delete mode 100644 files/es/mozilla/marketplace/publishing/index.html delete mode 100644 files/es/mozilla/marketplace/publishing/marketplace_screenshot_criteria/index.html delete mode 100644 files/es/mozilla/marketplace/publishing/open_web_apps_for_android/index.html delete mode 100644 files/es/mozilla/marketplace/publishing/packaged_apps/index.html delete mode 100644 files/es/mozilla/marketplace/publishing/publish_options/index.html delete mode 100644 files/es/mozilla/marketplace/publishing/submit/index.html delete mode 100644 files/es/mozilla/marketplace/publishing/submit/overview/index.html delete mode 100644 files/es/mozilla/marketplace/publishing/updating_apps/index.html delete mode 100644 files/es/mozilla/marketplace/submission/index.html delete mode 100644 files/es/mozilla/marketplace/submission/marketplace_review_criteria/index.html delete mode 100644 files/es/mozilla/marketplace/submission/rating_your_content/index.html delete mode 100644 files/es/mozilla/marketplace/submission/testing_and_troubleshooting/index.html delete mode 100644 files/es/mozilla/mathml_project/basics/index.html delete mode 100644 files/es/mozilla/mathml_project/extras/index.html delete mode 100644 files/es/mozilla/mathml_project/fonts/index.html delete mode 100644 files/es/mozilla/mathml_project/index.html delete mode 100644 files/es/mozilla/mathml_project/mathml3testsuite/index.html delete mode 100644 files/es/mozilla/mathml_project/screenshots/index.html delete mode 100644 files/es/mozilla/mathml_project/start/index.html delete mode 100644 files/es/mozilla/mathml_project/status/index.html delete mode 100644 files/es/mozilla/mathml_project/student_projects/index.html delete mode 100644 files/es/mozilla/mathml_project/various/index.html delete mode 100644 files/es/mozilla/opciones_de_linea_de_comandos/index.html delete mode 100644 files/es/mozilla/participating_in_the_mozilla_project/index.html delete mode 100644 files/es/mozilla/persona/branding/index.html delete mode 100644 files/es/mozilla/persona/browser_compatibility/index.html delete mode 100644 files/es/mozilla/persona/faq/index.html delete mode 100644 files/es/mozilla/persona/glosario/index.html delete mode 100644 files/es/mozilla/persona/index.html delete mode 100644 "files/es/mozilla/persona/informaci\303\263n_general_idp/index.html" delete mode 100644 files/es/mozilla/persona/quick_setup/index.html delete mode 100644 files/es/mozilla/persona/remote_verification_api/index.html delete mode 100644 files/es/mozilla/persona/security_considerations/index.html delete mode 100644 files/es/mozilla/persona/why_persona/index.html delete mode 100644 files/es/mozilla/preferences/index.html delete mode 100644 files/es/mozilla/projects/index.html delete mode 100644 files/es/mozilla/projects/nspr/reference/index.html delete mode 100644 files/es/mozilla/projects/psm/index.html delete mode 100644 files/es/mozilla/rendimiento/index.html delete mode 100644 files/es/mozilla/rust/index.html delete mode 100644 files/es/mozilla/security/index.html delete mode 100644 files/es/mozilla/security/x509_certificates/index.html delete mode 100644 files/es/mozilla/tech/index.html delete mode 100644 files/es/mozilla/tech/toolkit_api/smile/index.html delete mode 100644 files/es/mozilla/tech/xpcom/guide/index.html delete mode 100644 files/es/mozilla/tech/xpcom/language_bindings/index.html delete mode 100644 files/es/mozilla/tech/xpcom/reference/index.html delete mode 100644 files/es/mozilla/tech/xpidl/index.html delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/agregar_barras_de_herramientas_y_botones_para_\303\251stas/index.html" delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/agregar_barras_laterales/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/agregar_eventos_y_comandos/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/agregar_menus_y_submenus/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/agregar_ventanas_y_dialogos/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/almacenamiento_local/index.html delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_a_colon__rendimiento_de_los_add-ons/index.html" delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_b_colon__instalar_y_desinstalar_scripts/index.html" delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_c_colon__evitar_usar_eval_en_los_add-ons/index.html" delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_d_colon__cargar_scripts/index.html" delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_e_colon__dom_e_inserci\303\263n_html/index.html" delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/documentaci\303\263n_de_mozilla/index.html" delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/elementos_esenciales_de_una_extensi\303\263n/index.html" delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/enlazando_contenido_remoto/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/index.html delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/introducci\303\263n_a_las_extensiones_de_firefox/index.html" delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/introduction/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/manejo_de_preferencias/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/montando_un_ambiente_de_desarrollo/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/notificaciones_de_usuario_y_alertas/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/objetos_xpcom/index.html delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/personalizar_elementos_xul_con_xbl/index.html delete mode 100644 "files/es/mozilla/tech/xul/escuela_xul/sitios_\303\272tiles_de_la_comunidad_mozilla/index.html" delete mode 100644 files/es/mozilla/tech/xul/escuela_xul/uso_de_objetos_en_javascript/index.html delete mode 100644 files/es/mozilla/thunderbird/index.html delete mode 100644 files/es/mozilla/thunderbird/thunderbird_in_the_enterprise/index.html delete mode 100644 files/es/mozilla/toolkit_version_format/index.html delete mode 100644 files/es/mozilla/working_with_windows_in_chrome_code/index.html delete mode 100644 files/es/mozilla/xpcom/xpcom/cambios_xpcom_en_gecko_2.0/index.html delete mode 100644 files/es/mozilla/xpcom/xpcom/el_administrador_de_hilos/index.html delete mode 100644 files/es/mozilla/xpcom/xpcom/index.html delete mode 100644 files/es/mozistorageconnection/index.html delete mode 100644 "files/es/m\303\263vil/index.html" delete mode 100644 "files/es/m\303\263vil/viewport_meta_tag/index.html" delete mode 100644 files/es/nsicancelable/index.html delete mode 100644 files/es/nsichannel/index.html delete mode 100644 files/es/nsidomofflineresourcelist/index.html delete mode 100644 files/es/nsidownload/index.html delete mode 100644 files/es/nsidownloadmanager/index.html delete mode 100644 files/es/nsidownloadmanagerui/index.html delete mode 100644 files/es/nsidownloadprogresslistener/index.html delete mode 100644 files/es/nsidragservice/index.html delete mode 100644 files/es/nsilocalfile/index.html delete mode 100644 files/es/nsisimpleenumerator/index.html delete mode 100644 files/es/nsisupports/addref/index.html delete mode 100644 files/es/nsisupports/index.html delete mode 100644 files/es/nsisupports/queryinterface/index.html delete mode 100644 files/es/nsisupports/release/index.html delete mode 100644 files/es/nsiuri/index.html delete mode 100644 files/es/nsiwebprogress/index.html delete mode 100644 files/es/nsizipwriter/index.html delete mode 100644 files/es/nspr/index.html delete mode 100644 files/es/nss/index.html delete mode 100644 files/es/nss/nss_sources_building_testing/index.html delete mode 100644 files/es/nuevas_tablas_de_compatibilidad_beta/index.html delete mode 100644 files/es/persona/crypto/index.html delete mode 100644 files/es/persona/iniciar_persona/index.html delete mode 100644 files/es/persona/internationalization/index.html delete mode 100644 files/es/persona/libraries_and_plugins/index.html delete mode 100644 files/es/plugins/index.html delete mode 100644 files/es/plugins/supporting_private_browsing_in_plugins/index.html delete mode 100644 files/es/preferencias_del_administrador_de_descargas/index.html delete mode 100644 files/es/preguntas_frecuentes_sobre_extensiones/index.html delete mode 100644 files/es/prtime/index.html delete mode 100644 files/es/pruebas_automatizadas_de_mozilla/index.html delete mode 100644 files/es/qa/bug_writing_guidelines/index.html delete mode 100644 files/es/qa/confirming_unconfirmed_bugs/index.html delete mode 100644 files/es/qa/index.html delete mode 100644 files/es/qa/organizando_un_testday/index.html delete mode 100644 files/es/qa/screening_duplicate_bugs/index.html delete mode 100644 files/es/rdf/index.html delete mode 100644 files/es/rhino/comunidad/index.html delete mode 100644 files/es/rhino/descarga_rhino/index.html delete mode 100644 files/es/rhino/index.html delete mode 100644 files/es/rhino/resumen/index.html delete mode 100644 files/es/rhino_documentacon/index.html delete mode 100644 files/es/sandbox/index.html delete mode 100644 files/es/sax/index.html delete mode 100644 files/es/servicios_web_xml/index.html delete mode 100644 files/es/sistema_de_preferencias/index.html delete mode 100644 files/es/social_api/glossary/index.html delete mode 100644 files/es/social_api/guide/index.html delete mode 100644 files/es/social_api/index.html delete mode 100644 files/es/social_api/manifiesto/index.html delete mode 100644 files/es/social_api/service_worker_api_reference/index.html delete mode 100644 files/es/social_api/widgets/index.html delete mode 100644 files/es/spidermonkey/index.html delete mode 100644 files/es/storage/performance/index.html delete mode 100644 files/es/temas/background/index.html delete mode 100644 files/es/temas/index.html delete mode 100644 files/es/temas/theme_concepts/index.html delete mode 100644 files/es/thunderbird_localization/index.html delete mode 100644 files/es/tools/webide/index.html delete mode 100644 files/es/tools/webide/monitor/index.html delete mode 100644 files/es/tools/webide/troubleshooting/index.html delete mode 100644 files/es/uso_de_nsiloginmanager/index.html delete mode 100644 files/es/venkman/index.html delete mode 100644 files/es/vigilancia_de_plugins/index.html delete mode 100644 files/es/vigilar_descargas/index.html delete mode 100644 files/es/web/api/cameracapabilities/effects/index.html delete mode 100644 files/es/web/api/cameracapabilities/fileformats/index.html delete mode 100644 files/es/web/api/cameracapabilities/flashmodes/index.html delete mode 100644 files/es/web/api/cameracapabilities/index.html delete mode 100644 files/es/web/api/cameracapabilities/maxexposurecompensation/index.html delete mode 100644 files/es/web/api/cameracapabilities/maxfocusareas/index.html delete mode 100644 files/es/web/api/domapplicationsregistry/checkinstalled/index.html delete mode 100644 files/es/web/api/domapplicationsregistry/getinstalled/index.html delete mode 100644 files/es/web/api/domapplicationsregistry/index.html delete mode 100644 files/es/web/api/domapplicationsregistry/install/index.html delete mode 100644 files/es/web/api/domapplicationsregistry/installpackage/index.html delete mode 100644 files/es/web/api/mozsocial/closepanel/index.html delete mode 100644 files/es/web/api/mozsocial/getattention/index.html delete mode 100644 files/es/web/api/mozsocial/getworker/index.html delete mode 100644 files/es/web/api/mozsocial/index.html delete mode 100644 files/es/web/api/mozsocial/isvisible/index.html delete mode 100644 files/es/web/api/mozsocial/openchatwindow/index.html delete mode 100644 files/es/web/api/mozsocial/openpanel/index.html delete mode 100644 files/es/web/api/navigator/id/index.html delete mode 100644 files/es/web/api/navigator/mozsocial/index.html delete mode 100644 files/es/web/api/simple_push_api/index.html delete mode 100644 files/es/web/api/using_the_browser_api/index.html delete mode 100644 files/es/web/css/-moz-binding/index.html delete mode 100644 files/es/web/css/-moz-border-bottom-colors/index.html delete mode 100644 files/es/web/css/-moz-border-left-colors/index.html delete mode 100644 files/es/web/css/-moz-border-right-colors/index.html delete mode 100644 files/es/web/css/-moz-border-top-colors/index.html delete mode 100644 files/es/web/css/-moz-stack-sizing/index.html delete mode 100644 files/es/web/css/-moz-text-blink/index.html delete mode 100644 files/es/web/css/-moz-window-shadow/index.html delete mode 100644 files/es/web/css/-ms-accelerator/index.html delete mode 100644 files/es/web/css/-ms-overflow-style/index.html delete mode 100644 files/es/web/css/_colon_-moz-full-screen-ancestor/index.html delete mode 100644 files/es/web/css/_colon_-moz-lwtheme-brighttext/index.html delete mode 100644 files/es/web/css/_colon_-moz-lwtheme-darktext/index.html delete mode 100644 files/es/web/css/_colon_-moz-lwtheme/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(images-in-menus)/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(mac-graphite-theme)/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(scrollbar-end-backward)/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(scrollbar-end-forward)/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(scrollbar-start-backward)/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(scrollbar-start-forward)/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(scrollbar-thumb-proportional)/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(touch-enabled)/index.html delete mode 100644 files/es/web/css/_colon_-moz-system-metric(windows-default-theme)/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-cell-text(hover)/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-cell-text/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-cell/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-column/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-drop-feedback/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-image/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-indentation/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-line/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-progressmeter/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-row(hover)/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-row/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-separator/index.html delete mode 100644 files/es/web/css/_colon_-moz-tree-twisty/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-browse/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-check/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-clear/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-expand/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-fill-lower/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-fill-upper/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-fill/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-reveal/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-thumb/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-ticks-after/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-track/index.html delete mode 100644 files/es/web/css/_doublecolon_-ms-value/index.html delete mode 100644 files/es/web/css/azimuth/index.html delete mode 100644 files/es/web/events/domsubtreemodified/index.html delete mode 100644 files/es/web/guide/api/camera/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.1/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.2/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.3/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.5/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.6/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.7/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.8.1/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.8.5/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/1.8/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/ecmascript_5_support_in_mozilla/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/ecmascript_6_support_in_mozilla/index.html delete mode 100644 files/es/web/javascript/novedades_en_javascript/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/array/observe/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/array/unobserve/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/function/arity/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/function/isgenerator/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/object/count/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/object/getnotifier/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/object/nosuchmethod/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/object/observe/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/object/parent/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/object/unobserve/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/object/unwatch/index.html delete mode 100644 files/es/web/javascript/referencia/objetos_globales/object/watch/index.html delete mode 100644 files/es/web/javascript/referencia/operadores/array_comprehensions/index.html delete mode 100644 files/es/web/javascript/referencia/operadores/expression_closures/index.html delete mode 100644 files/es/web/javascript/referencia/sentencias/for_each...in/index.html delete mode 100644 files/es/web_localizability/index.html delete mode 100644 files/es/webapi/alarm/index.html delete mode 100644 "files/es/webapi/c\303\241mara/index.html" delete mode 100644 files/es/webapi/device_storage/index.html delete mode 100644 files/es/xforms/index.html delete mode 100644 files/es/xforms/soporte_en_mozilla/index.html delete mode 100644 files/es/xml_en_mozilla/index.html delete mode 100644 files/es/xmlhttprequest_cambios_en_gecko1.8/index.html delete mode 100644 files/es/xpcom_interface_reference/index.html delete mode 100644 files/es/xpcom_interface_reference/nsiloginmanager/index.html delete mode 100644 files/es/xpcomutils.jsm/index.html delete mode 100644 files/es/xpinstall/index.html delete mode 100644 files/es/xul_tutorial/index.html delete mode 100644 files/es/zonas/index.html (limited to 'files/es') diff --git a/files/es/_wikihistory.json b/files/es/_wikihistory.json deleted file mode 100644 index 6a83fa982b..0000000000 --- a/files/es/_wikihistory.json +++ /dev/null @@ -1,23774 +0,0 @@ -{ - "Acerca_del_Modelo_de_Objetos_del_Documento": { - "modified": "2019-03-24T00:02:47.149Z", - "contributors": [ - "fscholz", - "Mgjbot", - "Nathymig", - "Jorolo" - ] - }, - "Actualizar_aplicaciones_web_para_Firefox_3": { - "modified": "2019-03-23T23:58:06.668Z", - "contributors": [ - "wbamberg", - "SphinxKnight", - "Sheppy", - "trada", - "manueljrs", - "flaviog", - "Rafavs", - "Marcomavil", - "Mgjbot" - ] - }, - "Actualizar_extensiones_para_Firefox_3": { - "modified": "2019-03-23T23:58:10.215Z", - "contributors": [ - "wbamberg", - "SphinxKnight", - "Pgulijczuk", - "deimidis", - "flaviog", - "Nukeador", - "Giovanisf13", - "Firewordy", - "Dfier", - "Rumont", - "Wrongloop", - "Mgjbot" - ] - }, - "Actualizar_extensiones_para_Firefox_3/Actualizar_extensiones_para_Firefox_3": { - "modified": "2019-12-13T20:34:57.052Z", - "contributors": [ - "wbamberg", - "lajaso", - "teoli", - "Sheppy", - "Pgulijczuk", - "deimidis", - "Nukeador", - "Ffranz", - "HenryGR" - ] - }, - "Actualizar_una_extensión_para_que_soporte_múltiples_aplicaciones_de_Mozilla": { - "modified": "2019-01-16T14:53:56.551Z", - "contributors": [ - "DoctorRomi", - "Superruzafa" - ] - }, - "Applying_SVG_effects_to_HTML_content": { - "modified": "2019-03-24T00:09:04.196Z", - "contributors": [ - "elPatox" - ] - }, - "Añadir_lectores_de_canales_a_Firefox": { - "modified": "2019-03-23T23:54:31.423Z", - "contributors": [ - "wbamberg", - "Mgjbot", - "RickieesES", - "Nukeador", - "Anyulled" - ] - }, - "Añadir_motores_de_búsqueda_desde_páginas_web": { - "modified": "2019-01-16T15:27:59.157Z", - "contributors": [ - "Mgjbot", - "Superruzafa", - "Lesmo sft", - "Nukeador" - ] - }, - "Bugs_importantes_solucionados_en_Firefox_3": { - "modified": "2019-03-23T23:53:21.447Z", - "contributors": [ - "wbamberg", - "Mgjbot", - "Nathymig", - "Nukeador", - "HenryGR", - "RickieesES", - "Ciberman osman" - ] - }, - "Building_an_Extension": { - "modified": "2019-03-23T23:19:24.053Z", - "contributors": [ - "martin.weingart", - "Josele89" - ] - }, - "CSS/Media_queries": { - "modified": "2019-10-03T11:52:26.928Z", - "contributors": [ - "danielblazquez", - "brunonra-dev", - "kitab15", - "Sebastianz", - "jsx", - "carlossuarez", - "mrstork", - "malayaleecoder", - "seeker8", - "Xaviju", - "sinfallas", - "maedca" - ] - }, - "CSS/Using_CSS_gradients": { - "modified": "2019-06-03T20:30:31.836Z", - "contributors": [ - "GasGen", - "undest", - "Sebastianz", - "Eneagrama" - ] - }, - "CSS_dinámico": { - "modified": "2019-01-16T14:14:46.881Z", - "contributors": [ - "RickieesES", - "Jorolo", - "Peperoni", - "Hande", - "Nukeador" - ] - }, - "Cadenas_del_User_Agent_de_Gecko": { - "modified": "2019-03-23T23:45:27.069Z", - "contributors": [ - "teoli", - "Orestesleal13022" - ] - }, - "Code_snippets": { - "modified": "2019-01-16T13:52:37.564Z", - "contributors": [ - "ffox" - ] - }, - "Code_snippets/Pestañas_del_navegador": { - "modified": "2019-01-16T13:52:57.159Z", - "contributors": [ - "ffox" - ] - }, - "Columnas_con_CSS-3": { - "modified": "2019-03-23T23:43:23.940Z", - "contributors": [ - "Mgjbot", - "Jorolo", - "Nukeador" - ] - }, - "Compilar_e_instalar": { - "modified": "2019-03-23T23:58:55.256Z", - "contributors": [ - "teoli", - "DoctorRomi", - "Mgjbot", - "Blank zero" - ] - }, - "Configurar_correctamente_los_tipos_MIME_del_servidor": { - "modified": "2020-07-16T22:36:04.341Z", - "contributors": [ - "Nukeador", - "Kroatan", - "Mtiscordio", - "Hostar", - "Iwa1", - "Markens", - "Brayan Habid" - ] - }, - "Control_de_la_corrección_ortográfica_en_formularios_HTML": { - "modified": "2019-03-23T23:54:20.583Z", - "contributors": [ - "raecillacastellana", - "vltamara", - "MxJ3susDi4z", - "teoli", - "Mgjbot", - "Jorolo", - "Omnisilver", - "Nukeador" - ] - }, - "Creacion_de_plugins_OpenSearch_para_Firefox": { - "modified": "2019-03-24T00:00:08.096Z", - "contributors": [ - "teoli", - "Etrigan", - "tbusca", - "Nukeador", - "Rodrigoknascimento", - "Citora", - "Mgjbot", - "Fenomeno" - ] - }, - "Creación_de_Componentes_XPCOM/Interior_del_Componente": { - "modified": "2019-04-20T03:45:43.371Z", - "contributors": [ - "wbamberg", - "Maharba" - ] - }, - "Creación_de_Componentes_XPCOM/Prefacio": { - "modified": "2019-04-20T03:45:45.365Z", - "contributors": [ - "wbamberg", - "Maharba" - ] - }, - "Creando_una_extensión": { - "modified": "2019-03-24T00:13:16.401Z", - "contributors": [ - "teoli", - "ethertank", - "Sheppy", - "athesto", - "StripTM", - "myfcr", - "DoctorRomi", - "Mgjbot", - "M4ur170", - "Nukeador", - "Wayner", - "El Hacker", - "Arcangelhak", - "Psanz", - "Victor-27-", - "Arteadonis", - "Gadolinio", - "Opevelyn", - "Verruckt", - "Spg2006", - "Gbulfon", - "Damien", - "Peperoni", - "CD77", - "Ordep", - "Indigo", - "Jp1", - "GMG", - "Ateneo", - "Doctormanfer", - "A Morenazo", - "Trace2x", - "Odo", - "Hatch", - "Jorolo", - "Lastjuan", - "Ulntux" - ] - }, - "Crear_una_extensión_personalizada_de_Firefox_con_el_Mozilla_Build_System": { - "modified": "2019-04-26T15:53:18.603Z", - "contributors": [ - "cantineoqueteveo", - "2stapps", - "teoli", - "DoctorRomi", - "Carok", - "Gustavo Ruiz", - "Nukeador", - "JuninhoBoy95", - "Kuriboh", - "Mgjbot", - "RickieesES", - "Geomorillo", - "Blank zero", - "Haelmx", - "Superruzafa" - ] - }, - "DHTML": { - "modified": "2019-03-23T23:44:54.880Z", - "contributors": [ - "Mgjbot", - "Jorolo", - "Jos" - ] - }, - "DHTML_Demostraciones_del_uso_de_DOM_Style": { - "modified": "2019-01-16T16:07:51.712Z", - "contributors": [ - "Mgjbot", - "Superruzafa", - "Trace2x", - "Fedora-core", - "Nukeador" - ] - }, - "DOM": { - "modified": "2019-03-24T00:03:50.113Z", - "contributors": [ - "ethertank", - "fscholz", - "Mgjbot", - "Nukeador", - "Jorolo", - "Takenbot", - "julionc", - "Versae" - ] - }, - "DOM/Almacenamiento": { - "modified": "2019-03-24T00:11:21.014Z", - "contributors": [ - "AshfaqHossain", - "StripTM", - "RickieesES", - "inma_610", - "Mgjbot", - "Superruzafa", - "Nukeador" - ] - }, - "DOM/Manipulando_el_historial_del_navegador": { - "modified": "2019-09-07T17:44:48.428Z", - "contributors": [ - "seaug", - "HerniHdez", - "AlePerez92", - "SphinxKnight", - "talo242", - "mauroc8", - "javiernunez", - "dongerardor", - "StripTM", - "Galsas", - "teoli", - "Izel", - "Sheppy", - "translatoon" - ] - }, - "DOM/Manipulando_el_historial_del_navegador/Ejemplo": { - "modified": "2019-03-23T22:29:32.414Z", - "contributors": [ - "maitret" - ] - }, - "DOM/Touch_events": { - "modified": "2019-03-23T23:35:01.361Z", - "contributors": [ - "wbamberg", - "wffranco", - "fscholz", - "teoli", - "Fjaguero", - "jvmjunior", - "maedca" - ] - }, - "DOM/document.cookie": { - "modified": "2020-04-15T13:31:17.928Z", - "contributors": [ - "atiliopereira", - "Skattspa", - "aralvarez", - "SphinxKnight", - "khalid32", - "Ogquir", - "strongville", - "Ciencia Al Poder", - "Markens", - "DR" - ] - }, - "DOM_Inspector": { - "modified": "2020-07-16T22:36:24.191Z", - "contributors": [ - "Mgjbot", - "Jorolo", - "Tatan", - "TETSUO" - ] - }, - "Desarrollando_Mozilla": { - "modified": "2019-01-16T14:32:31.515Z", - "contributors": [ - "another_sam", - "Mgjbot", - "Jorolo", - "Nukeador", - "Turin" - ] - }, - "Desarrollo_Web": { - "modified": "2019-03-23T23:43:57.691Z", - "contributors": [ - "Mgjbot", - "Jorolo" - ] - }, - "Detectar_la_orientación_del_dispositivo": { - "modified": "2019-03-24T00:07:57.131Z", - "contributors": [ - "inma_610" - ] - }, - "Dibujando_Gráficos_con_Canvas": { - "modified": "2019-01-16T20:01:59.575Z", - "contributors": [ - "Firegooploer" - ] - }, - "Dibujar_texto_usando_canvas": { - "modified": "2019-01-16T15:31:41.845Z", - "contributors": [ - "Mgjbot", - "HenryGR", - "Nukeador", - "RickieesES", - "Debianpc" - ] - }, - "DragDrop": { - "modified": "2019-03-23T23:18:26.504Z", - "contributors": [ - "drewp" - ] - }, - "DragDrop/Drag_and_Drop": { - "modified": "2019-03-24T00:07:57.845Z", - "contributors": [ - "ethertank", - "inma_610" - ] - }, - "DragDrop/Drag_and_Drop/drag_and_drop_archivo": { - "modified": "2020-11-01T11:34:07.543Z", - "contributors": [ - "juanrueda", - "davidpala.dev", - "brahAraya", - "ajuni880", - "israteneda", - "RVidalki", - "clarii", - "rgomez" - ] - }, - "DragDrop/Recommended_Drag_Types": { - "modified": "2019-03-23T23:18:24.597Z", - "contributors": [ - "Evinton" - ] - }, - "Estructura_de_directorios_de_código_fuente_de_Mozilla": { - "modified": "2019-03-24T00:17:11.569Z", - "contributors": [ - "ethertank", - "MiguelFRomeroR", - "Sheppy" - ] - }, - "Etiquetas_audio_y_video_en_Firefox": { - "modified": "2019-03-23T23:59:36.294Z", - "contributors": [ - "Nukeador", - "deimidis" - ] - }, - "Extensiones/Actualización_de_extensiones_para_Firefox_4": { - "modified": "2019-03-24T00:05:58.390Z", - "contributors": [ - "inma_610" - ] - }, - "FAQ_Incrustando_Mozilla": { - "modified": "2019-01-16T16:20:13.874Z", - "contributors": [ - "Lastjuan" - ] - }, - "Firefox_1.5_para_Desarrolladores": { - "modified": "2019-03-23T23:47:34.365Z", - "contributors": [ - "wbamberg", - "SphinxKnight", - "Rubenbae", - "Pachtonio", - "Sheppy", - "Mgjbot", - "Jorolo", - "Fedora-core", - "Nukeador", - "Takenbot", - "Willyaranda", - "Pasky", - "Angelr04", - "Epaclon" - ] - }, - "Firefox_19_para_desarrolladores": { - "modified": "2019-03-18T20:54:04.568Z", - "contributors": [ - "ulisestrujillo", - "wbamberg", - "Sebastianz", - "mannyatico" - ] - }, - "Firefox_2_para_desarrolladores": { - "modified": "2019-03-23T23:58:56.168Z", - "contributors": [ - "wbamberg", - "DoctorRomi", - "Markens", - "Mgjbot", - "Nukeador", - "Superruzafa", - "Guis", - "StripTM", - "Jorolo" - ] - }, - "Firefox_3.5_para_desarrolladores": { - "modified": "2019-03-24T00:03:16.036Z", - "contributors": [ - "wbamberg", - "ethertank", - "another_sam", - "deimidis", - "Nukeador" - ] - }, - "Firefox_3_para_desarrolladores": { - "modified": "2019-03-24T00:04:08.312Z", - "contributors": [ - "wbamberg", - "teoli", - "fscholz", - "Mgjbot", - "Nukeador", - "Surferosx", - "Nathymig", - "Dfier", - "Wrongloop", - "Garlock", - "Brahiam", - "Mariano", - "HenryGR", - "Jseldon" - ] - }, - "Firefox_addons_developer_guide/Introduction_to_Extensions": { - "modified": "2019-03-23T23:37:41.632Z", - "contributors": [ - "pacommozilla", - "AgustinAlvia" - ] - }, - "Firefox_addons_developer_guide/Technologies_used_in_developing_extensions": { - "modified": "2019-03-18T21:16:06.336Z", - "contributors": [ - "AgustinAlvia" - ] - }, - "Formatos_multimedia_admitidos_por_los_elementos_de_video_y_audio": { - "modified": "2019-01-16T14:22:48.165Z", - "contributors": [ - "inma_610" - ] - }, - "Fragmentos_de_código": { - "modified": "2019-01-16T13:52:44.049Z", - "contributors": [ - "ffox" - ] - }, - "Funciones": { - "modified": "2019-01-16T16:18:04.260Z", - "contributors": [ - "Jorolo" - ] - }, - "Games": { - "modified": "2019-09-09T15:31:15.455Z", - "contributors": [ - "SphinxKnight", - "isocialweb", - "wbamberg", - "fscholz", - "ajspadial", - "Arudb79", - "atlas7jean", - "chrisdavidmills" - ] - }, - "Games/Anatomy": { - "modified": "2019-01-16T22:18:47.235Z", - "contributors": [ - "wbamberg", - "cnaucler" - ] - }, - "Games/Herramients": { - "modified": "2019-01-16T19:29:51.696Z", - "contributors": [ - "wbamberg", - "atlas7jean" - ] - }, - "Games/Herramients/asm.js": { - "modified": "2019-03-18T21:21:31.919Z", - "contributors": [ - "WilsonIsAliveClone", - "serarroy" - ] - }, - "Games/Introduccion": { - "modified": "2020-11-28T21:23:49.961Z", - "contributors": [ - "rayrojas", - "titox", - "gauchoscript", - "wbamberg", - "Mancux2", - "Albizures", - "atlas7jean" - ] - }, - "Games/Introducción_al_desarrollo_de_juegos_HTML5_(resumen)": { - "modified": "2019-08-05T12:49:59.324Z", - "contributors": [ - "WilsonIsAliveClone" - ] - }, - "Games/Publishing_games": { - "modified": "2019-03-18T21:22:03.542Z", - "contributors": [ - "carlosgocereceda", - "mikelmg", - "SphinxKnight", - "wbamberg" - ] - }, - "Games/Publishing_games/Game_distribution": { - "modified": "2020-08-09T16:02:37.394Z", - "contributors": [ - "katherincorredor", - "WilsonIsAliveClone", - "carlosgocereceda" - ] - }, - "Games/Publishing_games/Monetización_de_los_juegos": { - "modified": "2019-03-18T21:22:04.540Z", - "contributors": [ - "mikelmg", - "carlosgocereceda", - "WilsonIsAliveClone" - ] - }, - "Games/Techniques": { - "modified": "2019-01-17T02:01:32.309Z", - "contributors": [ - "wbamberg", - "chrisdavidmills" - ] - }, - "Games/Techniques/2D_collision_detection": { - "modified": "2019-01-17T02:34:23.543Z", - "contributors": [ - "wbamberg", - "SuperHostile" - ] - }, - "Games/Techniques/3D_on_the_web": { - "modified": "2019-03-18T21:23:46.780Z", - "contributors": [ - "wbamberg" - ] - }, - "Games/Techniques/WebRTC_data_channels": { - "modified": "2019-03-23T22:04:08.435Z", - "contributors": [ - "wbamberg", - "J4MP" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser": { - "modified": "2019-03-18T21:43:09.977Z", - "contributors": [ - "wbamberg", - "chrisdavidmills" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Animations_and_tweens": { - "modified": "2019-03-18T21:18:57.095Z", - "contributors": [ - "WilsonIsAliveClone", - "serarroy" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Botones": { - "modified": "2019-11-03T00:22:01.318Z", - "contributors": [ - "AdryDev92", - "carlosgocereceda", - "serarroy" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Collision_detection": { - "modified": "2019-03-18T21:21:35.455Z", - "contributors": [ - "WilsonIsAliveClone", - "serarroy" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Extra_lives": { - "modified": "2019-03-18T21:21:17.358Z", - "contributors": [ - "carlosgocereceda", - "WilsonIsAliveClone", - "serarroy" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Game_over": { - "modified": "2019-03-18T21:20:23.610Z", - "contributors": [ - "mikelmg", - "carlosgocereceda", - "WilsonIsAliveClone" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Initialize_the_framework": { - "modified": "2019-01-17T02:28:59.298Z", - "contributors": [ - "wbamberg", - "proncaglia" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Move_the_ball": { - "modified": "2019-03-18T21:21:15.950Z", - "contributors": [ - "WilsonIsAliveClone", - "serarroy" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Rebotar_en_las_paredes": { - "modified": "2019-03-18T21:18:55.239Z", - "contributors": [ - "WilsonIsAliveClone" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Scaling": { - "modified": "2019-01-17T02:28:53.459Z", - "contributors": [ - "wbamberg", - "proncaglia" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/The_score": { - "modified": "2019-03-18T21:21:15.588Z", - "contributors": [ - "mikelmg", - "WilsonIsAliveClone", - "serarroy" - ] - }, - "Games/Tutorials/2D_breakout_game_Phaser/Win_the_game": { - "modified": "2020-04-05T22:13:29.758Z", - "contributors": [ - "KevinPiola", - "carlosgocereceda", - "serarroy" - ] - }, - "Games/Workflows": { - "modified": "2019-01-16T19:25:39.809Z", - "contributors": [ - "wbamberg", - "groovecoder" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro": { - "modified": "2019-03-23T22:19:39.385Z", - "contributors": [ - "wbamberg", - "profesooooor", - "emolinerom", - "jolosan" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Bounce_off_the_walls": { - "modified": "2019-03-23T22:19:43.884Z", - "contributors": [ - "wbamberg", - "regisdark", - "profesooooor", - "emolinerom" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Construye_grupo_bloques": { - "modified": "2019-01-17T00:34:48.662Z", - "contributors": [ - "wbamberg", - "profesooooor", - "emolinerom" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Control_pala_y_teclado": { - "modified": "2019-01-17T00:34:24.542Z", - "contributors": [ - "wbamberg", - "profesooooor", - "emolinerom" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Controles_raton": { - "modified": "2019-01-17T00:34:40.600Z", - "contributors": [ - "wbamberg", - "profesooooor", - "emolinerom" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Create_the_Canvas_and_draw_on_it": { - "modified": "2019-01-17T00:33:08.752Z", - "contributors": [ - "wbamberg", - "profesooooor", - "jolosan" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Deteccion_colisiones": { - "modified": "2019-03-18T20:48:38.662Z", - "contributors": [ - "juanedsa", - "wbamberg", - "profesooooor", - "emolinerom" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Fin_del_juego": { - "modified": "2019-03-23T22:17:05.460Z", - "contributors": [ - "wbamberg", - "regisdark", - "profesooooor", - "jolosan" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Mueve_la_bola": { - "modified": "2019-03-23T22:19:10.641Z", - "contributors": [ - "wbamberg", - "profesooooor", - "jolosan", - "emolinerom" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Terminando": { - "modified": "2019-01-17T01:08:54.537Z", - "contributors": [ - "wbamberg", - "profesooooor" - ] - }, - "Games/Workflows/Famoso_juego_2D_usando_JavaScript_puro/Track_the_score_and_win": { - "modified": "2019-01-17T01:08:23.453Z", - "contributors": [ - "wbamberg", - "profesooooor" - ] - }, - "Games/Workflows/HTML5_Gamedev_Phaser_Device_Orientation": { - "modified": "2019-03-23T23:11:29.148Z", - "contributors": [ - "wbamberg", - "lauttttaro", - "chebit" - ] - }, - "Generación_de_GUIDs": { - "modified": "2019-03-24T00:06:07.388Z", - "contributors": [ - "ibnkhaldun" - ] - }, - "Glossary": { - "modified": "2020-10-07T11:08:11.871Z", - "contributors": [ - "peterbe", - "joseluisq", - "SphinxKnight", - "wbamberg", - "raecillacastellana", - "LauraHilliger" - ] - }, - "Glossary/404": { - "modified": "2019-03-23T22:37:45.365Z", - "contributors": [ - "pekechis" - ] - }, - "Glossary/502": { - "modified": "2019-03-23T22:37:47.150Z", - "contributors": [ - "pekechis" - ] - }, - "Glossary/AJAX": { - "modified": "2020-08-03T01:24:29.370Z", - "contributors": [ - "zgreco2000", - "hello", - "hectoraldairah", - "tonyrodrigues", - "memotronix", - "ekros" - ] - }, - "Glossary/API": { - "modified": "2019-03-23T23:14:34.833Z", - "contributors": [ - "teoli", - "AngelFQC" - ] - }, - "Glossary/ARIA": { - "modified": "2019-03-23T22:15:41.387Z", - "contributors": [ - "gparra989" - ] - }, - "Glossary/ARPA": { - "modified": "2019-03-18T21:31:13.320Z", - "contributors": [ - "dcantomo" - ] - }, - "Glossary/ASCII": { - "modified": "2019-03-23T22:15:33.120Z", - "contributors": [ - "lajaso", - "gparra989" - ] - }, - "Glossary/ATAG": { - "modified": "2019-03-23T22:15:44.329Z", - "contributors": [ - "gparra989" - ] - }, - "Glossary/Abstraction": { - "modified": "2019-03-23T22:24:49.785Z", - "contributors": [ - "feliperomero3", - "israel-munoz", - "ekros" - ] - }, - "Glossary/Accessibility": { - "modified": "2019-03-23T22:25:00.142Z", - "contributors": [ - "ekros" - ] - }, - "Glossary/Accessibility_tree": { - "modified": "2020-10-23T07:47:20.142Z", - "contributors": [ - "chrisdavidmills", - "caro-oviedo" - ] - }, - "Glossary/Adobe_Flash": { - "modified": "2019-03-18T20:57:35.400Z", - "contributors": [ - "yoshimii", - "ekros" - ] - }, - "Glossary/Algoritmo": { - "modified": "2019-01-17T00:09:54.063Z", - "contributors": [ - "ekros" - ] - }, - "Glossary/Apple_Safari": { - "modified": "2020-08-30T09:41:20.026Z", - "contributors": [ - "mastertrooper", - "ekros" - ] - }, - "Glossary/Argumento": { - "modified": "2019-03-23T22:15:34.303Z", - "contributors": [ - "gparra989" - ] - }, - "Glossary/Arpanet": { - "modified": "2020-03-15T22:50:09.715Z", - "contributors": [ - "kev8in", - "gparra989" - ] - }, - "Glossary/Arquitectura_de_la_información": { - "modified": "2020-09-06T16:32:32.362Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/Arreglos": { - "modified": "2020-05-28T13:51:10.546Z", - "contributors": [ - "fedoroffs", - "BubuAnabelas", - "Davids-Devel", - "Daniel_Martin", - "gparra989" - ] - }, - "Glossary/Asíncrono": { - "modified": "2020-05-04T10:40:03.360Z", - "contributors": [ - "jorgeCaster", - "fjluengo", - "gparra989" - ] - }, - "Glossary/Atributo": { - "modified": "2019-03-23T22:15:46.319Z", - "contributors": [ - "gparra989" - ] - }, - "Glossary/Atributo_global": { - "modified": "2019-03-18T21:19:21.658Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Bandwidth": { - "modified": "2019-03-23T22:15:45.908Z", - "contributors": [ - "gparra989" - ] - }, - "Glossary/BigInt": { - "modified": "2020-09-25T04:27:46.263Z", - "contributors": [ - "4rturd13" - ] - }, - "Glossary/Blink": { - "modified": "2019-03-18T21:44:06.201Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/Block": { - "modified": "2019-03-18T21:41:49.707Z", - "contributors": [ - "Esteban" - ] - }, - "Glossary/Block/CSS": { - "modified": "2020-06-24T23:38:45.496Z", - "contributors": [ - "LinkStrifer", - "BubuAnabelas", - "Esteban" - ] - }, - "Glossary/Boolean": { - "modified": "2019-03-23T22:58:03.390Z", - "contributors": [ - "Cleon" - ] - }, - "Glossary/Browser": { - "modified": "2019-03-18T21:43:56.678Z", - "contributors": [ - "Maletil", - "ferlopezcarr" - ] - }, - "Glossary/Browsing_context": { - "modified": "2019-04-04T14:36:22.033Z", - "contributors": [ - "danielblazquez" - ] - }, - "Glossary/Buffer": { - "modified": "2019-03-18T21:18:59.378Z", - "contributors": [ - "diegorhs" - ] - }, - "Glossary/CDN": { - "modified": "2020-05-28T16:24:22.721Z", - "contributors": [ - "jaimefdezmv", - "quirinolemanches" - ] - }, - "Glossary/CID": { - "modified": "2019-03-18T21:19:22.724Z", - "contributors": [ - "PabloDeTorre", - "sergiomgm" - ] - }, - "Glossary/CRUD": { - "modified": "2019-03-23T22:03:05.724Z", - "contributors": [ - "velizluisma" - ] - }, - "Glossary/CSRF": { - "modified": "2019-03-18T21:19:22.851Z", - "contributors": [ - "sergiomgm" - ] - }, - "Glossary/CSS": { - "modified": "2020-06-20T09:41:42.032Z", - "contributors": [ - "hello", - "Maletil", - "cawilff", - "Sergio_Gonzalez_Collado", - "analia.antenucci", - "sergio_p_d", - "memotronix" - ] - }, - "Glossary/Cabecera_general": { - "modified": "2019-03-18T21:34:28.155Z", - "contributors": [ - "Watermelonnable" - ] - }, - "Glossary/Caché": { - "modified": "2019-03-18T21:19:00.217Z", - "contributors": [ - "diegorhs" - ] - }, - "Glossary/Callback_function": { - "modified": "2019-04-22T16:14:36.669Z", - "contributors": [ - "faustom721", - "lcassettai", - "yomar-dev" - ] - }, - "Glossary/Canvas": { - "modified": "2020-09-21T20:35:53.439Z", - "contributors": [ - "Alejo1417", - "jorgeluispedro16" - ] - }, - "Glossary/Caracter": { - "modified": "2020-08-23T05:27:25.056Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/Chrome": { - "modified": "2019-03-18T21:42:29.056Z", - "contributors": [ - "amirtorrez" - ] - }, - "Glossary/Cifrado": { - "modified": "2019-03-18T21:19:02.237Z", - "contributors": [ - "PabloDeTorre", - "sergiomgm" - ] - }, - "Glossary/Clasificación_por_tarjetas_(card_sorting)": { - "modified": "2019-03-18T21:19:20.709Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Class": { - "modified": "2019-03-18T21:18:45.753Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/Clausura": { - "modified": "2020-08-12T18:07:27.330Z", - "contributors": [ - "l1oret" - ] - }, - "Glossary/Clave": { - "modified": "2020-02-18T06:49:22.148Z", - "contributors": [ - "joseluisq", - "sergiomgm", - "GCF7" - ] - }, - "Glossary/Codec": { - "modified": "2019-03-18T21:19:01.793Z", - "contributors": [ - "diegorhs" - ] - }, - "Glossary/Compile": { - "modified": "2019-03-18T21:19:15.661Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/Computer_Programming": { - "modified": "2019-03-23T22:02:08.531Z", - "contributors": [ - "israel-munoz" - ] - }, - "Glossary/Constante": { - "modified": "2019-03-18T21:19:15.794Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Constructor": { - "modified": "2019-03-23T22:15:36.356Z", - "contributors": [ - "untilbit", - "gparra989" - ] - }, - "Glossary/Cookie": { - "modified": "2019-03-18T21:19:00.075Z", - "contributors": [ - "diegorhs" - ] - }, - "Glossary/Copyleft": { - "modified": "2019-03-18T21:43:43.180Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/Criptoanálisis": { - "modified": "2019-03-18T21:18:36.783Z", - "contributors": [ - "sergiomgm", - "GCF7" - ] - }, - "Glossary/Criptografía": { - "modified": "2019-03-23T22:02:58.447Z", - "contributors": [ - "velizluisma" - ] - }, - "Glossary/Cross-site_scripting": { - "modified": "2020-04-13T08:31:08.536Z", - "contributors": [ - "Luiggy", - "qwerty726" - ] - }, - "Glossary/DOM": { - "modified": "2019-03-18T21:10:52.251Z", - "contributors": [ - "ChrisMHM", - "PabloDeTorre", - "vinyetcg", - "ferlopezcarr", - "HerberWest" - ] - }, - "Glossary/DTD": { - "modified": "2019-01-17T00:20:06.485Z", - "contributors": [ - "wilfridoSantos" - ] - }, - "Glossary/Descifrado": { - "modified": "2019-03-18T21:19:11.476Z", - "contributors": [ - "sergiomgm", - "GCF7" - ] - }, - "Glossary/Doctype": { - "modified": "2019-03-23T22:07:28.155Z", - "contributors": [ - "omertafox" - ] - }, - "Glossary/Domain": { - "modified": "2019-03-18T21:19:17.838Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Dynamic_programming_language": { - "modified": "2020-09-12T18:21:07.076Z", - "contributors": [ - "IsraFloores", - "DaniNz" - ] - }, - "Glossary/ECMAScript": { - "modified": "2020-08-31T05:49:16.882Z", - "contributors": [ - "Nachec", - "anaturrillo", - "Cleon" - ] - }, - "Glossary/Element": { - "modified": "2019-03-18T21:31:18.857Z", - "contributors": [ - "eddieurbina", - "carllewisc" - ] - }, - "Glossary/Empty_element": { - "modified": "2019-03-23T22:10:52.378Z", - "contributors": [ - "juanmmendez", - "DaniNz" - ] - }, - "Glossary/Encapsulation": { - "modified": "2019-03-18T21:19:13.092Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Encriptación": { - "modified": "2019-03-18T21:19:07.209Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie", - "sergiomgm" - ] - }, - "Glossary/Entidad": { - "modified": "2020-07-08T14:34:06.256Z", - "contributors": [ - "lucasreta" - ] - }, - "Glossary/Espacio_en_blanco": { - "modified": "2020-08-24T04:59:10.953Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/Estructura_de_datos": { - "modified": "2019-03-18T21:24:31.453Z", - "contributors": [ - "edsonv" - ] - }, - "Glossary/FPS": { - "modified": "2020-08-19T14:42:01.823Z", - "contributors": [ - "ianaya89" - ] - }, - "Glossary/FTP": { - "modified": "2020-06-22T03:59:10.085Z", - "contributors": [ - "Maose" - ] - }, - "Glossary/Flex": { - "modified": "2020-10-03T01:09:13.365Z", - "contributors": [ - "duduindo", - "FlashAmarillo" - ] - }, - "Glossary/Flex_Container": { - "modified": "2019-11-21T16:42:31.273Z", - "contributors": [ - "scaloner" - ] - }, - "Glossary/Flexbox": { - "modified": "2019-03-18T21:23:56.502Z", - "contributors": [ - "danpaltor", - "ericksonespejo" - ] - }, - "Glossary/Funcion_de_primera_clase": { - "modified": "2020-05-14T19:36:29.513Z", - "contributors": [ - "l1oret", - "hmorv", - "LaloHao" - ] - }, - "Glossary/Función": { - "modified": "2019-03-18T21:19:19.995Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/GPL": { - "modified": "2019-03-18T21:43:50.897Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/Git": { - "modified": "2019-03-18T21:19:20.412Z", - "contributors": [ - "PabloDeTorre", - "sergiomgm" - ] - }, - "Glossary/Google_Chrome": { - "modified": "2019-03-18T21:44:29.185Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/Grid": { - "modified": "2019-03-23T22:10:55.372Z", - "contributors": [ - "ocamachor", - "tipoqueno", - "welm" - ] - }, - "Glossary/Grid_Areas": { - "modified": "2019-03-18T21:46:28.612Z", - "contributors": [ - "tipoqueno" - ] - }, - "Glossary/Grid_Column": { - "modified": "2020-05-19T18:27:14.068Z", - "contributors": [ - "biclope13", - "amaiafilo" - ] - }, - "Glossary/Grid_Lines": { - "modified": "2019-05-27T03:46:29.561Z", - "contributors": [ - "asael2" - ] - }, - "Glossary/Grid_Rows": { - "modified": "2019-03-18T21:23:35.644Z", - "contributors": [ - "Xino" - ] - }, - "Glossary/HTML": { - "modified": "2020-01-23T12:51:04.156Z", - "contributors": [ - "editorUOC", - "edsonv", - "jpmontoya182", - "sergio_p_d", - "raecillacastellana" - ] - }, - "Glossary/HTML5": { - "modified": "2020-06-22T04:32:17.508Z", - "contributors": [ - "Maose" - ] - }, - "Glossary/HTTP": { - "modified": "2019-07-01T03:11:50.434Z", - "contributors": [ - "SphinxKnight", - "unaivalle", - "sdelrio", - "sergio_p_d" - ] - }, - "Glossary/Head": { - "modified": "2020-06-22T04:54:37.023Z", - "contributors": [ - "Maose" - ] - }, - "Glossary/Hilo_principal": { - "modified": "2020-03-12T06:05:36.693Z", - "contributors": [ - "elimperiodelaweb" - ] - }, - "Glossary/Hoisting": { - "modified": "2019-05-15T21:40:52.256Z", - "contributors": [ - "jevvilla", - "IsaacAaron", - "sminutoli" - ] - }, - "Glossary/Hyperlink": { - "modified": "2019-03-18T21:44:07.373Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/Hypertext": { - "modified": "2019-03-18T21:30:26.239Z", - "contributors": [ - "12g" - ] - }, - "Glossary/IDE": { - "modified": "2019-03-18T21:18:59.913Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/IIFE": { - "modified": "2019-03-18T20:50:02.318Z", - "contributors": [ - "danyparc", - "Efrain", - "bluesky11117", - "emorc" - ] - }, - "Glossary/IP_Address": { - "modified": "2020-06-22T03:38:12.516Z", - "contributors": [ - "Maose" - ] - }, - "Glossary/IPv6": { - "modified": "2020-06-03T01:33:08.312Z", - "contributors": [ - "geryescalier" - ] - }, - "Glossary/IRC": { - "modified": "2020-12-03T00:37:27.868Z", - "contributors": [ - "devil64-dev" - ] - }, - "Glossary/ISP": { - "modified": "2020-06-22T04:21:55.362Z", - "contributors": [ - "Maose" - ] - }, - "Glossary/IU": { - "modified": "2019-03-18T21:18:49.573Z", - "contributors": [ - "diegorhs" - ] - }, - "Glossary/Identificador": { - "modified": "2020-08-28T17:30:13.071Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/IndexedDB": { - "modified": "2019-03-23T22:36:07.366Z", - "contributors": [ - "Loque" - ] - }, - "Glossary/Inmutable": { - "modified": "2019-03-18T21:19:12.385Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Internet": { - "modified": "2020-04-27T00:09:14.977Z", - "contributors": [ - "candepineyro2015", - "r2cris", - "cawilff" - ] - }, - "Glossary/JSON": { - "modified": "2019-05-24T12:44:54.639Z", - "contributors": [ - "EstebanRK", - "chavesrdj", - "LeonardoDG" - ] - }, - "Glossary/Java": { - "modified": "2019-03-18T21:19:11.310Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/JavaScript": { - "modified": "2020-09-01T00:56:53.463Z", - "contributors": [ - "Nachec", - "c9009", - "missmakita", - "sergio_p_d", - "gorrotowi" - ] - }, - "Glossary/Keyword": { - "modified": "2020-05-04T10:31:29.902Z", - "contributors": [ - "jorgeCaster", - "blanchart", - "DaniNz" - ] - }, - "Glossary/LGPL": { - "modified": "2019-03-18T21:43:48.377Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/Long_task": { - "modified": "2020-08-08T01:38:15.029Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/MVC": { - "modified": "2020-01-31T17:55:57.978Z", - "contributors": [ - "deit", - "IsaacAlvrt" - ] - }, - "Glossary/Metadato": { - "modified": "2019-03-18T21:19:04.572Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/MitM": { - "modified": "2019-03-18T21:25:35.556Z", - "contributors": [ - "lcastrosaez" - ] - }, - "Glossary/Mixin": { - "modified": "2019-03-23T22:37:38.011Z", - "contributors": [ - "josepaez2", - "raecillacastellana", - "kramery" - ] - }, - "Glossary/Mobile_First": { - "modified": "2019-07-02T17:22:58.448Z", - "contributors": [ - "JuanMaRuiz" - ] - }, - "Glossary/Mozilla_Firefox": { - "modified": "2019-03-23T22:06:36.476Z", - "contributors": [ - "BrodaNoel" - ] - }, - "Glossary/Método": { - "modified": "2020-07-21T21:37:11.109Z", - "contributors": [ - "Assael02", - "Davids-Devel" - ] - }, - "Glossary/Node": { - "modified": "2019-05-17T13:24:16.608Z", - "contributors": [ - "GUEROZ", - "untilbit", - "klez" - ] - }, - "Glossary/Node.js": { - "modified": "2020-10-24T17:01:45.516Z", - "contributors": [ - "oism28", - "rlopezAyala", - "malonson", - "migdonio1" - ] - }, - "Glossary/Node/DOM": { - "modified": "2019-03-23T22:27:35.877Z", - "contributors": [ - "malonson" - ] - }, - "Glossary/Nombre_de_dominio": { - "modified": "2019-03-18T21:19:21.120Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Nombre_de_encabezado_prohibido": { - "modified": "2019-03-23T22:02:11.147Z", - "contributors": [ - "Luiggy", - "tonialfaro" - ] - }, - "Glossary/Null": { - "modified": "2019-03-23T22:58:02.167Z", - "contributors": [ - "Cleon" - ] - }, - "Glossary/Numero": { - "modified": "2019-03-23T22:58:03.851Z", - "contributors": [ - "Cleon" - ] - }, - "Glossary/OOP": { - "modified": "2019-03-18T21:19:20.278Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/Objecto": { - "modified": "2019-03-23T22:58:05.221Z", - "contributors": [ - "Cleon" - ] - }, - "Glossary/Operador": { - "modified": "2019-03-23T22:53:20.989Z", - "contributors": [ - "germanfr" - ] - }, - "Glossary/Operando": { - "modified": "2020-09-05T17:33:42.415Z", - "contributors": [ - "brayan-orellanos" - ] - }, - "Glossary/PHP": { - "modified": "2020-05-07T14:37:16.100Z", - "contributors": [ - "pascual143" - ] - }, - "Glossary/POP": { - "modified": "2020-04-18T03:21:04.687Z", - "contributors": [ - "itrjwyss" - ] - }, - "Glossary/Parse": { - "modified": "2020-12-05T08:25:54.330Z", - "contributors": [ - "StripTM" - ] - }, - "Glossary/Pila_llamadas": { - "modified": "2020-04-26T12:00:35.332Z", - "contributors": [ - "l1oret" - ] - }, - "Glossary/Polyfill": { - "modified": "2019-03-18T21:24:24.118Z", - "contributors": [ - "viabadia" - ] - }, - "Glossary/Port": { - "modified": "2020-04-18T03:24:57.722Z", - "contributors": [ - "itrjwyss", - "malonson" - ] - }, - "Glossary/Preflight_peticion": { - "modified": "2019-03-18T21:29:47.773Z", - "contributors": [ - "daviddelamo" - ] - }, - "Glossary/Preprocesador_CSS": { - "modified": "2019-03-23T22:02:54.782Z", - "contributors": [ - "ealch", - "velizluisma" - ] - }, - "Glossary/Primitivo": { - "modified": "2020-09-17T22:06:17.504Z", - "contributors": [ - "Nachec", - "cocososo", - "abaracedo", - "Cleon" - ] - }, - "Glossary/Progressive_Enhancement": { - "modified": "2019-07-07T08:35:50.920Z", - "contributors": [ - "JuanMaRuiz" - ] - }, - "Glossary/Promise": { - "modified": "2019-03-18T21:18:47.852Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/Protocol": { - "modified": "2020-06-22T04:02:41.549Z", - "contributors": [ - "Maose", - "itrjwyss", - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/Prototype": { - "modified": "2019-03-28T18:50:47.544Z", - "contributors": [ - "maruskina" - ] - }, - "Glossary/Prototype-based_programming": { - "modified": "2020-08-25T19:45:44.389Z", - "contributors": [ - "duduindo", - "paolazaratem" - ] - }, - "Glossary/Pseudo-clase": { - "modified": "2019-03-23T22:38:49.143Z", - "contributors": [ - "VictorAbdon" - ] - }, - "Glossary/Pseudocódigo": { - "modified": "2019-03-18T21:19:15.497Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Public-key_cryptography": { - "modified": "2019-03-18T21:18:41.396Z", - "contributors": [ - "GCF7" - ] - }, - "Glossary/Python": { - "modified": "2019-01-17T03:26:06.615Z", - "contributors": [ - "Guzmanr1", - "ax16mr" - ] - }, - "Glossary/REST": { - "modified": "2019-03-18T21:19:06.376Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/RGB": { - "modified": "2019-03-18T21:19:01.657Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/RSS": { - "modified": "2019-03-18T21:43:45.312Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/Recursión": { - "modified": "2019-03-18T21:19:02.064Z", - "contributors": [ - "PabloDeTorre", - "sergiomgm" - ] - }, - "Glossary/Reflow": { - "modified": "2020-11-16T21:27:00.470Z", - "contributors": [ - "ccamiloo" - ] - }, - "Glossary/Regular_expression": { - "modified": "2019-03-23T22:27:50.421Z", - "contributors": [ - "lurkinboss81", - "malonson" - ] - }, - "Glossary/Responsive_web_design": { - "modified": "2019-03-18T21:36:04.998Z", - "contributors": [ - "lajaso" - ] - }, - "Glossary/Ruby": { - "modified": "2019-03-18T21:18:51.137Z", - "contributors": [ - "diegorhs" - ] - }, - "Glossary/SCV": { - "modified": "2019-03-18T21:19:21.440Z", - "contributors": [ - "carlosCharlie", - "sergiomgm" - ] - }, - "Glossary/SEO": { - "modified": "2019-03-23T22:38:01.994Z", - "contributors": [ - "carlossuarez" - ] - }, - "Glossary/SGML": { - "modified": "2019-03-18T21:43:11.251Z", - "contributors": [ - "Undigon", - "cawilff" - ] - }, - "Glossary/SIMD": { - "modified": "2019-03-18T21:18:44.939Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/SISD": { - "modified": "2019-03-18T21:18:56.313Z", - "contributors": [ - "carlosCharlie" - ] - }, - "Glossary/SLD": { - "modified": "2019-04-30T13:59:51.577Z", - "contributors": [ - "manfredosanchez" - ] - }, - "Glossary/SMTP": { - "modified": "2020-04-18T03:31:14.904Z", - "contributors": [ - "itrjwyss" - ] - }, - "Glossary/SQL": { - "modified": "2019-03-18T21:18:56.658Z", - "contributors": [ - "diegorhs" - ] - }, - "Glossary/SVG": { - "modified": "2019-03-18T21:35:52.789Z", - "contributors": [ - "lajaso" - ] - }, - "Glossary/SVN": { - "modified": "2019-03-18T21:19:01.509Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/Scope": { - "modified": "2019-07-02T17:59:48.762Z", - "contributors": [ - "Angel10050" - ] - }, - "Glossary/Sentencias": { - "modified": "2019-03-23T22:57:58.260Z", - "contributors": [ - "abaracedo", - "Cleon" - ] - }, - "Glossary/Sincronico": { - "modified": "2020-11-14T06:15:42.366Z", - "contributors": [ - "Yuunichi" - ] - }, - "Glossary/Sistema_gestion_contenidos": { - "modified": "2020-05-23T07:15:12.062Z", - "contributors": [ - "l1oret" - ] - }, - "Glossary/Sloppy_mode": { - "modified": "2020-08-31T05:32:49.321Z", - "contributors": [ - "Nachec", - "dcarmal-dayvo" - ] - }, - "Glossary/Slug": { - "modified": "2019-03-18T21:43:51.297Z", - "contributors": [ - "LSanchez697" - ] - }, - "Glossary/String": { - "modified": "2019-03-23T22:58:03.956Z", - "contributors": [ - "Cleon" - ] - }, - "Glossary/Symbol": { - "modified": "2019-03-23T22:57:59.274Z", - "contributors": [ - "Cleon" - ] - }, - "Glossary/Symmetric-key_cryptography": { - "modified": "2019-03-18T21:18:28.720Z", - "contributors": [ - "sergiomgm", - "GCF7" - ] - }, - "Glossary/TCP": { - "modified": "2020-04-18T03:19:23.119Z", - "contributors": [ - "itrjwyss", - "DaniNz" - ] - }, - "Glossary/Tag": { - "modified": "2020-05-04T10:24:41.308Z", - "contributors": [ - "jorgeCaster", - "DaniNz" - ] - }, - "Glossary/TextoCifrado": { - "modified": "2019-03-18T21:19:21.003Z", - "contributors": [ - "sergiomgm", - "GCF7" - ] - }, - "Glossary/TextoSimple": { - "modified": "2019-03-18T21:19:20.138Z", - "contributors": [ - "sergiomgm", - "GCF7" - ] - }, - "Glossary/Three_js": { - "modified": "2020-11-09T17:44:33.436Z", - "contributors": [ - "Plumas" - ] - }, - "Glossary/Tipado_dinámico": { - "modified": "2020-05-04T14:10:14.107Z", - "contributors": [ - "Caav98" - ] - }, - "Glossary/Tipificación_estática": { - "modified": "2019-11-22T03:17:09.186Z", - "contributors": [ - "HugolJumex" - ] - }, - "Glossary/Truthy": { - "modified": "2019-03-18T21:45:50.903Z", - "contributors": [ - "AlePerez92", - "VlixesItaca", - "juandata" - ] - }, - "Glossary/Type": { - "modified": "2019-03-18T21:19:01.358Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/URI": { - "modified": "2019-03-18T21:33:53.970Z", - "contributors": [ - "DaniNz" - ] - }, - "Glossary/URL": { - "modified": "2020-09-05T02:39:54.712Z", - "contributors": [ - "Nachec", - "BubuAnabelas", - "Jabi" - ] - }, - "Glossary/UTF-8": { - "modified": "2020-08-28T17:54:39.004Z", - "contributors": [ - "Nachec", - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/UX": { - "modified": "2020-11-10T01:47:49.876Z", - "contributors": [ - "rockoldo" - ] - }, - "Glossary/Unicode": { - "modified": "2020-08-28T17:48:20.454Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/Validador": { - "modified": "2019-03-18T21:19:01.934Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie", - "sergiomgm" - ] - }, - "Glossary/Valor": { - "modified": "2020-09-01T08:20:32.500Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/Variable": { - "modified": "2020-09-01T08:00:19.523Z", - "contributors": [ - "Nachec", - "Oscarloray" - ] - }, - "Glossary/Vendor_Prefix": { - "modified": "2019-03-18T21:21:31.446Z", - "contributors": [ - "Carlos_Gutierrez" - ] - }, - "Glossary/Viewport": { - "modified": "2019-07-22T14:35:59.639Z", - "contributors": [ - "EBregains", - "ffcc" - ] - }, - "Glossary/WCAG": { - "modified": "2019-03-18T21:19:06.839Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/WHATWG": { - "modified": "2019-03-18T21:43:10.212Z", - "contributors": [ - "cawilff" - ] - }, - "Glossary/WebKit": { - "modified": "2019-03-18T21:43:49.861Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/WebSockets": { - "modified": "2019-03-23T22:10:09.047Z", - "contributors": [ - "spachecojimenez" - ] - }, - "Glossary/WebVTT": { - "modified": "2020-08-13T17:05:43.218Z", - "contributors": [ - "Pablo-No" - ] - }, - "Glossary/World_Wide_Web": { - "modified": "2020-07-07T13:22:38.798Z", - "contributors": [ - "pauli.rodriguez.c", - "camsa", - "SphinxKnight", - "r2cris", - "sergio_p_d" - ] - }, - "Glossary/Wrapper": { - "modified": "2019-03-18T21:18:59.254Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/XForm": { - "modified": "2019-03-23T22:15:44.959Z", - "contributors": [ - "gparra989" - ] - }, - "Glossary/XML": { - "modified": "2019-03-18T21:43:43.021Z", - "contributors": [ - "ferlopezcarr" - ] - }, - "Glossary/application_context": { - "modified": "2019-03-23T22:22:51.795Z", - "contributors": [ - "ekros" - ] - }, - "Glossary/cacheable": { - "modified": "2019-10-03T19:16:28.937Z", - "contributors": [ - "htmike" - ] - }, - "Glossary/challenge": { - "modified": "2019-03-23T22:03:38.845Z", - "contributors": [ - "_deiberchacon" - ] - }, - "Glossary/character_encoding": { - "modified": "2019-03-18T21:19:17.489Z", - "contributors": [ - "PabloDeTorre", - "carlosCharlie" - ] - }, - "Glossary/coercion": { - "modified": "2020-02-29T16:57:08.213Z", - "contributors": [ - "frankynztein" - ] - }, - "Glossary/compile_time": { - "modified": "2020-12-05T08:34:39.507Z", - "contributors": [ - "StripTM" - ] - }, - "Glossary/conjunto_de_caracteres": { - "modified": "2020-08-28T18:09:05.836Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/elemento": { - "modified": "2019-01-16T19:38:18.287Z", - "contributors": [ - "BubuAnabelas", - "HerberWest" - ] - }, - "Glossary/event": { - "modified": "2019-03-18T21:19:03.177Z", - "contributors": [ - "PabloDeTorre" - ] - }, - "Glossary/gif": { - "modified": "2019-03-18T21:44:23.965Z", - "contributors": [ - "lajaso", - "ferlopezcarr" - ] - }, - "Glossary/https": { - "modified": "2019-03-18T21:20:16.521Z", - "contributors": [ - "mikelmg", - "BubuAnabelas" - ] - }, - "Glossary/jQuery": { - "modified": "2019-03-23T22:02:49.153Z", - "contributors": [ - "yancarq", - "velizluisma" - ] - }, - "Glossary/jpeg": { - "modified": "2019-03-23T22:15:35.380Z", - "contributors": [ - "gparra989" - ] - }, - "Glossary/miga-de-pan": { - "modified": "2020-02-02T10:51:21.098Z", - "contributors": [ - "blanchart" - ] - }, - "Glossary/propiedad": { - "modified": "2020-08-28T18:32:40.804Z", - "contributors": [ - "Nachec" - ] - }, - "Glossary/seguro": { - "modified": "2019-03-18T21:18:23.904Z", - "contributors": [ - "SackmannDV" - ] - }, - "Glossary/undefined": { - "modified": "2019-03-23T22:58:03.590Z", - "contributors": [ - "teoli", - "Cleon" - ] - }, - "Guía_para_el_desarrollador_de_agregados_para_Firefox": { - "modified": "2019-01-16T14:29:03.747Z", - "contributors": [ - "teoli", - "Sheppy", - "Eloy" - ] - }, - "Guía_para_el_desarrollador_de_agregados_para_Firefox/Introducción_a_las_extensiones": { - "modified": "2019-03-24T00:04:44.724Z", - "contributors": [ - "christopherccg", - "Sheppy", - "Eloy" - ] - }, - "Guía_para_la_migración_a_catálogo": { - "modified": "2019-01-16T15:34:19.890Z", - "contributors": [ - "HenryGR", - "Mgjbot" - ] - }, - "HTML/Elemento/datalist": { - "modified": "2019-01-16T19:13:20.868Z", - "contributors": [ - "Darkgyro", - "teoli" - ] - }, - "HTML/Elemento/form": { - "modified": "2019-01-16T21:24:44.882Z", - "contributors": [ - "eincioch" - ] - }, - "HTML/Elemento/section": { - "modified": "2019-03-23T23:08:59.333Z", - "contributors": [ - "Raulpascual2", - "carllewisc", - "GeorgeAviateur" - ] - }, - "HTML/HTML5": { - "modified": "2020-05-16T09:08:08.720Z", - "contributors": [ - "jonasdamher", - "SphinxKnight", - "anibalymariacantantes60", - "AzulMartin", - "264531666", - "fracp", - "damianed", - "alfredotemiquel", - "rossettistone", - "carlossuarez", - "teoli", - "JosueMolina", - "Pablo_Ivan", - "welm", - "bicentenario", - "jesusruiz", - "pierre_alfonso", - "pitufo_cabron", - "cesar_ortiz_elPatox", - "inma_610", - "vigia122", - "StripTM", - "deimidis", - "Izel" - ] - }, - "HTML/HTML5/Forms_in_HTML5": { - "modified": "2019-03-24T00:17:58.788Z", - "contributors": [ - "DGarCam", - "teoli", - "prieto.any", - "deibyod", - "Ces", - "hugohabel", - "deimidis" - ] - }, - "HTML/HTML5/Formularios_en_HTML5": { - "modified": "2019-03-24T00:07:51.068Z", - "contributors": [ - "inma_610", - "Izel", - "StripTM", - "deimidis" - ] - }, - "HTML/HTML5/HTML5_Parser": { - "modified": "2019-03-24T00:07:09.448Z", - "contributors": [ - "teoli", - "RickieesES", - "inma_610", - "StripTM", - "juanb", - "Izel" - ] - }, - "HTML/HTML5/HTML5_lista_elementos": { - "modified": "2020-01-21T22:36:54.135Z", - "contributors": [ - "losfroger", - "cocoletzimata", - "Duque61", - "raecillacastellana", - "maymaury", - "squidjam", - "on3_g" - ] - }, - "HTML/HTML5/Introducción_a_HTML5": { - "modified": "2019-03-24T00:05:36.058Z", - "contributors": [ - "teoli", - "inma_610" - ] - }, - "HTML/HTML5/Validacion_de_restricciones": { - "modified": "2020-08-11T08:06:04.309Z", - "contributors": [ - "gerardo750711", - "israel-munoz" - ] - }, - "Herramientas": { - "modified": "2019-01-16T13:52:37.109Z", - "contributors": [ - "teoli", - "StripTM", - "inma_610", - "camilourd" - ] - }, - "How_to_create_a_DOM_tree": { - "modified": "2019-03-23T23:22:26.711Z", - "contributors": [ - "carrillog.luis" - ] - }, - "Incrustando_Mozilla/Comunidad": { - "modified": "2019-03-23T22:39:14.279Z", - "contributors": [ - "vamm1981" - ] - }, - "IndexedDB": { - "modified": "2019-03-18T21:11:08.379Z", - "contributors": [ - "duduindo", - "teoli", - "semptrion", - "CHORVAT", - "inma_610" - ] - }, - "Instalación_de_motores_de_búsqueda_desde_páginas_web": { - "modified": "2019-01-16T16:13:53.798Z", - "contributors": [ - "teoli", - "Nukeador", - "Jorolo" - ] - }, - "Learn": { - "modified": "2020-10-06T09:14:51.258Z", - "contributors": [ - "blanchart", - "Nachec", - "Maose", - "methodx", - "npcsayfail", - "GilbertoHernan", - "ivanagui2", - "svarlamov", - "clarii", - "hamfree", - "raul782", - "astrapotro", - "karlalhdz", - "sillo01", - "carlosmartinezfyd", - "carlo.romero1991", - "nelruk", - "merol-dad", - "Pablo_Ivan", - "Da_igual", - "jhapik", - "cgsramirez", - "PedroFumero", - "Yanlu", - "Jenny-T-Type", - "Jeremie" - ] - }, - "Learn/Accessibility": { - "modified": "2020-07-16T22:39:56.491Z", - "contributors": [ - "adiccb", - "WilsonIsAliveClone", - "mikelmg" - ] - }, - "Learn/Accessibility/Accessibility_troubleshooting": { - "modified": "2020-09-27T07:55:30.040Z", - "contributors": [ - "UOCccorcoles", - "adiccb" - ] - }, - "Learn/Accessibility/CSS_and_JavaScript": { - "modified": "2020-09-25T04:23:21.491Z", - "contributors": [ - "UOCccorcoles" - ] - }, - "Learn/Accessibility/HTML": { - "modified": "2020-09-24T10:25:02.383Z", - "contributors": [ - "UOCccorcoles", - "diegocastillogz", - "jeronimonunez", - "WilsonIsAliveClone" - ] - }, - "Learn/Accessibility/Mobile": { - "modified": "2020-07-16T22:40:29.507Z", - "contributors": [ - "Adorta4", - "mikelmg" - ] - }, - "Learn/Accessibility/Qué_es_la_accesibilidad": { - "modified": "2020-07-16T22:40:03.734Z", - "contributors": [ - "editorUOC" - ] - }, - "Learn/Aprender_y_obtener_ayuda": { - "modified": "2020-09-02T21:15:54.167Z", - "contributors": [ - "Nachec" - ] - }, - "Learn/CSS": { - "modified": "2020-07-16T22:25:33.047Z", - "contributors": [ - "welm", - "javierpolit", - "TomatoSenpai", - "andrpueb", - "Aglezabad", - "RaulHernandez" - ] - }, - "Learn/CSS/Building_blocks": { - "modified": "2020-10-02T00:43:44.395Z", - "contributors": [ - "johanfvn", - "capitanzealot", - "Enesimus", - "SphinxKnight", - "inwm", - "edixonMoreno", - "rayrojas", - "chrisdavidmills" - ] - }, - "Learn/CSS/Building_blocks/Cascada_y_herencia": { - "modified": "2020-09-10T08:32:11.848Z", - "contributors": [ - "renatico", - "UOCccorcoles", - "Enesimus", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Contenido_desbordado": { - "modified": "2020-09-07T07:36:40.422Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Depurar_el_CSS": { - "modified": "2020-10-15T22:26:23.448Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Dimensionar_elementos_en_CSS": { - "modified": "2020-07-16T22:29:20.704Z", - "contributors": [ - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/El_modelo_de_caja": { - "modified": "2020-09-06T15:07:38.107Z", - "contributors": [ - "UOCccorcoles", - "capitanzealot", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Fondos_y_bordes": { - "modified": "2020-09-06T17:26:53.330Z", - "contributors": [ - "UOCccorcoles", - "psotresc", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Imágenes_medios_y_elementos_de_formulario": { - "modified": "2020-07-16T22:29:24.707Z", - "contributors": [ - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Manejando_diferentes_direcciones_de_texto": { - "modified": "2020-07-31T14:48:40.359Z", - "contributors": [ - "AndrewSKV", - "Enesimus" - ] - }, - "Learn/CSS/Building_blocks/Selectores_CSS": { - "modified": "2020-09-06T12:41:53.412Z", - "contributors": [ - "UOCccorcoles", - "VichoReyes", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Selectores_CSS/Combinadores": { - "modified": "2020-09-06T14:09:26.839Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Selectores_CSS/Pseudo-clases_y_pseudo-elementos": { - "modified": "2020-09-06T13:58:30.411Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Selectores_CSS/Selectores_de_atributos": { - "modified": "2020-09-06T13:34:27.599Z", - "contributors": [ - "UOCccorcoles", - "psotresc", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Selectores_CSS/Selectores_de_tipo_clase_e_ID": { - "modified": "2020-09-06T13:13:47.580Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/Building_blocks/Styling_tables": { - "modified": "2020-09-14T09:45:44.143Z", - "contributors": [ - "UOCccorcoles", - "editorUOC", - "chrisdavidmills", - "otheym", - "wbamberg", - "IXTRUnai" - ] - }, - "Learn/CSS/Building_blocks/Valores_y_unidades_CSS": { - "modified": "2020-09-07T09:35:00.652Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/CSS_layout": { - "modified": "2020-07-31T15:01:33.453Z", - "contributors": [ - "AndrewSKV", - "untilbit", - "pantuflo", - "chrisdavidmills" - ] - }, - "Learn/CSS/CSS_layout/Diseño_receptivo": { - "modified": "2020-07-16T22:27:27.257Z", - "contributors": [ - "editorUOC" - ] - }, - "Learn/CSS/CSS_layout/Flexbox": { - "modified": "2020-09-15T16:36:01.723Z", - "contributors": [ - "UOCccorcoles", - "nachopo", - "chrisdavidmills", - "editorUOC", - "facundogqr", - "felixgomez", - "LuisL", - "amaiafilo", - "spachecojimenez" - ] - }, - "Learn/CSS/CSS_layout/Floats": { - "modified": "2020-10-16T12:52:48.804Z", - "contributors": [ - "zuruckzugehen", - "chrisdavidmills" - ] - }, - "Learn/CSS/CSS_layout/Flujo_normal": { - "modified": "2020-07-16T22:27:20.728Z", - "contributors": [ - "editorUOC" - ] - }, - "Learn/CSS/CSS_layout/Grids": { - "modified": "2020-07-16T22:26:58.625Z", - "contributors": [ - "editorUOC", - "chrisdavidmills", - "Luis_Calvo" - ] - }, - "Learn/CSS/CSS_layout/Introducción": { - "modified": "2020-09-15T13:39:37.384Z", - "contributors": [ - "UOCccorcoles", - "AndrewSKV", - "editorUOC", - "Jhonaz" - ] - }, - "Learn/CSS/CSS_layout/Positioning": { - "modified": "2020-07-16T22:26:42.380Z", - "contributors": [ - "fr3dth" - ] - }, - "Learn/CSS/CSS_layout/Soporte_a_navegadores_antiguos": { - "modified": "2020-07-16T22:27:17.501Z", - "contributors": [ - "editorUOC" - ] - }, - "Learn/CSS/First_steps": { - "modified": "2020-07-16T22:27:38.921Z", - "contributors": [ - "GiuMagnani", - "Enesimus", - "cinthylli", - "BiP00", - "jesquintero" - ] - }, - "Learn/CSS/First_steps/Comenzando_CSS": { - "modified": "2020-08-31T14:16:45.193Z", - "contributors": [ - "UOCccorcoles", - "AndrewSKV", - "tito-ramirez", - "editorUOC" - ] - }, - "Learn/CSS/First_steps/Como_funciona_CSS": { - "modified": "2020-09-18T07:47:46.630Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/First_steps/Como_se_estructura_CSS": { - "modified": "2020-08-31T16:55:37.346Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/First_steps/Qué_es_CSS": { - "modified": "2020-10-15T22:25:30.119Z", - "contributors": [ - "UOCccorcoles", - "Enesimus", - "editorUOC" - ] - }, - "Learn/CSS/First_steps/Usa_tu_nuevo_conocimiento": { - "modified": "2020-08-23T19:45:30.596Z", - "contributors": [ - "capitanzealot", - "AndrewSKV", - "Enesimus" - ] - }, - "Learn/CSS/Introduction_to_CSS/Fundamental_CSS_comprehension": { - "modified": "2020-07-16T22:28:11.693Z", - "contributors": [ - "Creasick", - "Enesimus", - "javierpolit", - "DennisM" - ] - }, - "Learn/CSS/Styling_text": { - "modified": "2020-07-16T22:25:57.799Z", - "contributors": [ - "laatcode", - "wilton-cruz" - ] - }, - "Learn/CSS/Styling_text/Fuentes_web": { - "modified": "2020-09-01T07:26:18.054Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/CSS/Styling_text/Fundamentals": { - "modified": "2020-09-18T08:01:18.738Z", - "contributors": [ - "UOCccorcoles", - "editorUOC", - "laatcode", - "joseanpg" - ] - }, - "Learn/CSS/Styling_text/Styling_links": { - "modified": "2020-09-18T08:20:17.759Z", - "contributors": [ - "UOCccorcoles", - "editorUOC", - "Tull666" - ] - }, - "Learn/CSS/Styling_text/Styling_lists": { - "modified": "2020-09-01T06:14:44.024Z", - "contributors": [ - "UOCccorcoles", - "editorUOC", - "MARKO75", - "Tull666", - "laatcode", - "jmcavanzo" - ] - }, - "Learn/CSS/Sábercomo": { - "modified": "2020-07-16T22:25:42.139Z", - "contributors": [ - "alebarbaja", - "abestrad1" - ] - }, - "Learn/CSS/Sábercomo/Generated_content": { - "modified": "2020-07-16T22:25:47.515Z", - "contributors": [ - "chrisdavidmills", - "Juansereina", - "lavilofam1" - ] - }, - "Learn/Common_questions": { - "modified": "2020-07-16T22:35:23.102Z", - "contributors": [ - "eduardo-estrada", - "balderasric", - "soedrego", - "astrapotro", - "Miguelank", - "chrisdavidmills" - ] - }, - "Learn/Common_questions/Cuanto_cuesta": { - "modified": "2020-07-16T22:35:45.385Z", - "contributors": [ - "Beatriz_Ortega_Valdes" - ] - }, - "Learn/Common_questions/How_does_the_Internet_work": { - "modified": "2020-09-07T00:56:10.834Z", - "contributors": [ - "IsraFloores", - "Pau_Vera_S", - "Yel-Martinez-Consultor-Seo", - "Creasick", - "Tan_", - "punkyh", - "krthr", - "DaniNz" - ] - }, - "Learn/Common_questions/Pages_sites_servers_and_search_engines": { - "modified": "2020-07-16T22:35:39.645Z", - "contributors": [ - "benelliraul", - "MarcosN", - "DaniNz" - ] - }, - "Learn/Common_questions/Que_es_un_servidor_WEB": { - "modified": "2020-10-27T18:34:43.608Z", - "contributors": [ - "noksenberg", - "Yel-Martinez-Consultor-Seo", - "Spectrum369", - "Luisk955", - "Sebaspaco", - "flaki53", - "welm" - ] - }, - "Learn/Common_questions/Que_software_necesito": { - "modified": "2020-07-16T22:35:32.855Z", - "contributors": [ - "Beatriz_Ortega_Valdes" - ] - }, - "Learn/Common_questions/Qué_es_una_URL": { - "modified": "2020-07-16T22:35:29.126Z", - "contributors": [ - "ezzep66", - "BubuAnabelas" - ] - }, - "Learn/Common_questions/Thinking_before_coding": { - "modified": "2020-07-16T22:35:34.085Z", - "contributors": [ - "Beatriz_Ortega_Valdes", - "LourFabiM", - "DaniNz" - ] - }, - "Learn/Common_questions/What_are_browser_developer_tools": { - "modified": "2020-09-13T07:49:07.373Z", - "contributors": [ - "rockoldo", - "IsraFloores", - "Nachec", - "John19D", - "DaniNz" - ] - }, - "Learn/Common_questions/What_are_hyperlinks": { - "modified": "2020-07-16T22:35:42.995Z", - "contributors": [ - "ezzep66" - ] - }, - "Learn/Common_questions/What_is_a_domain_name": { - "modified": "2020-07-16T22:35:43.888Z", - "contributors": [ - "Beatriz_Ortega_Valdes", - "hmendezm90" - ] - }, - "Learn/Common_questions/diseños_web_comunes": { - "modified": "2020-07-16T22:35:42.298Z", - "contributors": [ - "Beatriz_Ortega_Valdes" - ] - }, - "Learn/Common_questions/set_up_a_local_testing_server": { - "modified": "2020-07-16T22:35:52.759Z", - "contributors": [ - "rjpu24", - "iseafa", - "DaniNz" - ] - }, - "Learn/Como_Contribuir": { - "modified": "2020-07-16T22:33:43.206Z", - "contributors": [ - "SphinxKnight", - "Code118", - "dervys19", - "javierdelpino", - "axgeon", - "Leonardo_Valdez", - "cgsramirez" - ] - }, - "Learn/Desarrollo_web_Front-end": { - "modified": "2020-11-18T03:33:37.370Z", - "contributors": [ - "SphinxKnight", - "marquezpedro151", - "andresf.duran", - "Nachec" - ] - }, - "Learn/Getting_started_with_the_web": { - "modified": "2020-09-22T16:37:42.904Z", - "contributors": [ - "Nachec", - "IsraFloores", - "Enesimus", - "rodririobo", - "escalant3", - "jimmypazos", - "ingridc", - "hamfree", - "npcsayfail", - "BrodaNoel", - "israel-munoz", - "Da_igual", - "welm", - "Diio", - "darbalma", - "chrisdavidmills" - ] - }, - "Learn/Getting_started_with_the_web/CSS_basics": { - "modified": "2020-11-10T20:04:05.272Z", - "contributors": [ - "rockoldo", - "Maose", - "JaviGonLope", - "hamfree", - "juanluis", - "montygabe", - "mamptecnocrata", - "juanqui", - "welm" - ] - }, - "Learn/Getting_started_with_the_web/Cómo_funciona_la_Web": { - "modified": "2020-07-16T22:33:59.672Z", - "contributors": [ - "Enesimus", - "Maose", - "rulo_diaz", - "SphinxKnight" - ] - }, - "Learn/Getting_started_with_the_web/HTML_basics": { - "modified": "2020-11-08T05:08:38.542Z", - "contributors": [ - "SphinxKnight", - "cesarmolina.sdb", - "egonzalez", - "Maose", - "Axes", - "NataliaCba", - "Armando-Cruz", - "hamfree", - "BrodaNoel", - "PhantomDemon", - "DaniNz", - "SandraMoreH", - "HeberRojo", - "welm", - "JoaquinBedoian", - "Huarseral" - ] - }, - "Learn/Getting_started_with_the_web/Instalacion_de_software_basico": { - "modified": "2020-11-10T01:28:22.294Z", - "contributors": [ - "rockoldo", - "Nachec", - "Maose", - "Anyito", - "ingridc", - "Enesimus", - "israel-munoz", - "Neto2412", - "AngelFQC", - "mads0306", - "Da_igual", - "Chrixos", - "darbalma" - ] - }, - "Learn/Getting_started_with_the_web/JavaScript_basics": { - "modified": "2020-08-17T06:23:11.691Z", - "contributors": [ - "Nachec", - "Enesimus", - "Maose", - "John19D", - "yavemu", - "pablopennisi", - "Sergio_Gonzalez_Collado", - "hamfree", - "Bluterg", - "jpmontoya182", - "sillo01", - "lfrasae", - "bartolocarrasco", - "nhuamani", - "ricardormeza", - "fcojgodoy", - "soulminato", - "chech", - "juanqui", - "RaulHernandez", - "joelomar", - "welm", - "derplak", - "sin_nombre365", - "germanfr", - "cgsramirez", - "nekludov" - ] - }, - "Learn/Getting_started_with_the_web/La_web_y_los_estandares_web": { - "modified": "2020-09-03T04:02:22.375Z", - "contributors": [ - "Nachec" - ] - }, - "Learn/Getting_started_with_the_web/Manejando_los_archivos": { - "modified": "2020-09-23T03:12:43.364Z", - "contributors": [ - "Nachec", - "chrisdavidmills", - "NavetsArev", - "Maose", - "airmind97", - "hamfree", - "israel-munoz", - "GuilleMiranda", - "merol-dad", - "samshara1", - "mads0306", - "mamptecnocrata", - "Huarseral", - "diazwatson" - ] - }, - "Learn/Getting_started_with_the_web/Publishing_your_website": { - "modified": "2020-11-11T14:35:28.910Z", - "contributors": [ - "Yuunichi", - "Maose", - "IrwinAcosta", - "rjpu24", - "ingridc", - "binariosistemas", - "emermao", - "Michelangeur", - "javierdelpino", - "krthr", - "DaniNz", - "Rivo23", - "alexguerrero", - "MaurooRen", - "Da_igual", - "welm", - "Yadira" - ] - }, - "Learn/Getting_started_with_the_web/What_will_your_website_look_like": { - "modified": "2020-09-22T18:59:15.940Z", - "contributors": [ - "Nachec", - "Maose", - "jimmy_ml", - "NataliaCba", - "vact", - "israel-munoz", - "DaniNz", - "7eacemaker", - "mads0306", - "Da_igual", - "Davixe", - "Chrixos", - "diazwatson", - "omar.fiscal" - ] - }, - "Learn/HTML": { - "modified": "2020-09-09T07:22:36.336Z", - "contributors": [ - "Nachec", - "Enesimus", - "mppfiles", - "titox", - "patoezequiel", - "mitodamabra", - "crispragmatico", - "chancherokerido", - "Athene2RM", - "Alejandra.B", - "welm", - "jpazos" - ] - }, - "Learn/HTML/Forms": { - "modified": "2020-07-16T22:20:56.050Z", - "contributors": [ - "xyvs", - "mikiangel10", - "chrisdavidmills", - "eljonims", - "sjmiles" - ] - }, - "Learn/HTML/Forms/How_to_structure_an_HTML_form": { - "modified": "2020-09-18T11:13:13.645Z", - "contributors": [ - "UOCccorcoles", - "UOCjcanovasi", - "editorUOC", - "chrisdavidmills", - "eljonims" - ] - }, - "Learn/HTML/Forms/Property_compatibility_table_for_form_controls": { - "modified": "2020-08-30T01:12:52.090Z", - "contributors": [ - "edchasw" - ] - }, - "Learn/HTML/Forms/Prueba_tus_habilidades:_Otros_controles": { - "modified": "2020-07-16T22:22:12.140Z", - "contributors": [ - "Enesimus" - ] - }, - "Learn/HTML/Forms/Prueba_tus_habilidades:_controles_HTML5": { - "modified": "2020-07-16T22:22:11.445Z", - "contributors": [ - "Enesimus" - ] - }, - "Learn/HTML/Forms/Sending_and_retrieving_form_data": { - "modified": "2020-07-16T22:21:26.056Z", - "contributors": [ - "Rafasu", - "rocioDEV", - "MrGreen", - "OseChez", - "DaniNz", - "peternerd", - "SphinxKnight", - "chrisdavidmills", - "Ricky_Lomax" - ] - }, - "Learn/HTML/Forms/Styling_HTML_forms": { - "modified": "2020-07-16T22:21:30.546Z", - "contributors": [ - "OMEGAYALFA", - "chrisdavidmills", - "cizquierdof" - ] - }, - "Learn/HTML/Forms/The_native_form_widgets": { - "modified": "2020-09-15T08:02:23.197Z", - "contributors": [ - "UOCccorcoles", - "editorUOC", - "rayrojas" - ] - }, - "Learn/HTML/Forms/Tipos_input_HTML5": { - "modified": "2020-10-30T10:06:35.877Z", - "contributors": [ - "alejandro0619", - "panpy-web" - ] - }, - "Learn/HTML/Forms/Validacion_formulario_datos": { - "modified": "2020-11-19T13:12:47.854Z", - "contributors": [ - "tcebrian", - "UOCccorcoles", - "UOCjcanovasi", - "editorUOC", - "blanchart", - "israel-munoz" - ] - }, - "Learn/HTML/Forms/Your_first_HTML_form": { - "modified": "2020-09-15T05:57:07.460Z", - "contributors": [ - "UOCccorcoles", - "editorUOC", - "BraisOliveira", - "OMEGAYALFA", - "OrlandoDeJesusCuxinYama", - "Giikah", - "chrisdavidmills", - "HGARZON" - ] - }, - "Learn/HTML/Forms/como_crear_widgets_de_formularios_personalizados": { - "modified": "2020-07-16T22:21:55.231Z", - "contributors": [ - "laatcode" - ] - }, - "Learn/HTML/Introduccion_a_HTML": { - "modified": "2020-09-03T05:18:15.831Z", - "contributors": [ - "Nachec", - "Enesimus", - "ivanagui2", - "Sergio_Gonzalez_Collado", - "cizquierdof", - "AngelFQC" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Advanced_text_formatting": { - "modified": "2020-09-05T21:21:55.228Z", - "contributors": [ - "Nachec", - "UOCccorcoles", - "Enesimus", - "jmalsar", - "editorUOC", - "RG52", - "luchiano199", - "AlieYin" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Creating_hyperlinks": { - "modified": "2020-09-05T04:27:29.218Z", - "contributors": [ - "Nachec", - "UOCccorcoles", - "juan.grred", - "Enesimus", - "jmalsar", - "blanchart", - "editorUOC", - "Myuel", - "MichaelMejiaMora", - "ferlopezcarr", - "javierpolit" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Debugging_HTML": { - "modified": "2020-08-31T12:17:08.843Z", - "contributors": [ - "UOCccorcoles", - "editorUOC", - "javierpolit" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Estructuración_de_una_página_de_contenido": { - "modified": "2020-07-16T22:24:18.388Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Marking_up_a_letter": { - "modified": "2020-07-16T22:23:11.881Z", - "contributors": [ - "jmalsar", - "luchiano199", - "javierpolit" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Metados_en": { - "modified": "2020-11-07T18:07:55.376Z", - "contributors": [ - "nilo15", - "Nachec", - "UOCccorcoles", - "ccorcoles", - "editorUOC", - "hector080", - "clarii", - "Myuel", - "dmipaguirre", - "Armando-Cruz", - "MichaelMejiaMora", - "soedrego", - "absaucedo", - "venomdj2011", - "CarlosJose" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Prueba_tus_habilidades:_Enlaces": { - "modified": "2020-07-16T22:24:22.922Z", - "contributors": [ - "Enesimus" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Prueba_tus_habilidades:_Texto_básico_HTML": { - "modified": "2020-07-16T22:24:21.949Z", - "contributors": [ - "Enesimus" - ] - }, - "Learn/HTML/Introduccion_a_HTML/Test_your_skills:_Advanced_HTML_text": { - "modified": "2020-09-05T23:06:12.474Z", - "contributors": [ - "walter.boba79" - ] - }, - "Learn/HTML/Introduccion_a_HTML/estructura": { - "modified": "2020-09-06T16:55:31.460Z", - "contributors": [ - "Nachec", - "UOCccorcoles", - "editorUOC", - "chaerf", - "AlidaContreras", - "javierpolit", - "SoftwareRVG", - "welm" - ] - }, - "Learn/HTML/Introduccion_a_HTML/iniciar": { - "modified": "2020-11-24T21:57:47.560Z", - "contributors": [ - "nilo15", - "Nachec", - "UOCccorcoles", - "maodecolombia", - "Enesimus", - "editorUOC", - "narvmtz", - "dmipaguirre", - "BubuAnabelas", - "marlabarbz", - "erllanosr", - "r2fv", - "jonasmreza", - "Cjpertuz", - "yan-vega", - "Armando-Cruz", - "felixgomez", - "olvap", - "emermao", - "soedrego", - "Abihu", - "mitocondriaco", - "nahuelsotelo", - "dayamll", - "JimP99", - "EdwinTorres", - "salvarez1988", - "cizquierdof", - "juanluis", - "welm" - ] - }, - "Learn/HTML/Introduccion_a_HTML/texto": { - "modified": "2020-09-04T15:00:09.675Z", - "contributors": [ - "Nachec", - "UOCccorcoles", - "Enesimus", - "Maose", - "ccorcoles", - "editorUOC", - "hector080", - "JulianMahecha", - "BubuAnabelas", - "RafaelVentura", - "jadiosc", - "dcarmal-dayvo", - "Owildfox", - "Myuel", - "dmipaguirre", - "Dany07", - "welm" - ] - }, - "Learn/HTML/Multimedia_and_embedding": { - "modified": "2020-08-08T01:15:36.731Z", - "contributors": [ - "Nachec", - "Loba25", - "emibena75", - "tomandech", - "rayrojas", - "SphinxKnight", - "rickygutim", - "luchiano199", - "jonasmreza", - "vHarz", - "hell0h0la", - "J0rgeMG", - "yarochewsky" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Adding_vector_graphics_to_the_Web": { - "modified": "2020-08-13T15:11:41.992Z", - "contributors": [ - "JuanMejia" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Images_in_HTML": { - "modified": "2020-09-01T08:06:52.329Z", - "contributors": [ - "UOCccorcoles", - "jmalsar", - "editorUOC", - "ccorcoles", - "acvidelaa", - "BubuAnabelas", - "Alpha3-Developer", - "Makinita", - "Parziva_1", - "luchiano199", - "calvearc", - "soedrego", - "JuniorBO", - "JoseCuestas" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Mozilla_splash_page": { - "modified": "2020-07-16T22:25:06.606Z", - "contributors": [ - "Loba25", - "henardemiguel" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Other_embedding_technologies": { - "modified": "2020-07-16T22:25:00.943Z", - "contributors": [ - "Ismael_Diaz", - "cinthylli", - "duduindo", - "soedrego", - "luchiano199", - "SphinxKnight", - "dylanroman03" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Responsive_images": { - "modified": "2020-11-02T15:27:00.386Z", - "contributors": [ - "Daniel_Martin", - "LuisCA", - "baumannzone", - "JuanMejia", - "lucasan", - "pipe01", - "sebaLinares", - "kuntur-studio", - "iiegor", - "malonson", - "javierarcheni", - "alexuy51", - "SigridMonsalve", - "arnoldobr", - "anfuca" - ] - }, - "Learn/HTML/Multimedia_and_embedding/Video_and_audio_content": { - "modified": "2020-12-07T13:00:58.885Z", - "contributors": [ - "occu29", - "Leiner.lop", - "pabdani", - "Enesimus", - "soedrego", - "jesusgirao", - "acvidelaa", - "rayrojas" - ] - }, - "Learn/HTML/Tablas": { - "modified": "2020-07-16T22:25:11.000Z", - "contributors": [ - "Drathveloper", - "IXTRUnai" - ] - }, - "Learn/HTML/Tablas/Conceptos_básicos_de_las_tablas_HTML": { - "modified": "2020-09-09T11:52:38.720Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/HTML/Tablas/Funciones_avanzadas_de_las_tablas_HTML_y_accesibilidad": { - "modified": "2020-09-14T06:33:13.790Z", - "contributors": [ - "UOCccorcoles", - "editorUOC" - ] - }, - "Learn/HTML/Tablas/Structuring_planet_data": { - "modified": "2020-07-16T22:25:29.339Z", - "contributors": [ - "IXTRUnai" - ] - }, - "Learn/HTML/como": { - "modified": "2020-07-16T22:22:28.075Z", - "contributors": [ - "Loba25", - "blanchart", - "welm" - ] - }, - "Learn/HTML/como/Usando_atributos_de_datos": { - "modified": "2020-10-29T15:52:03.444Z", - "contributors": [ - "angeljpa95", - "camsa", - "laatcode" - ] - }, - "Learn/Herramientas_y_pruebas": { - "modified": "2020-07-16T22:38:54.378Z", - "contributors": [ - "WilsonIsAliveClone", - "carlosgocereceda", - "mikelmg" - ] - }, - "Learn/Herramientas_y_pruebas/Cross_browser_testing": { - "modified": "2020-07-16T22:38:59.665Z", - "contributors": [ - "arnoldobr" - ] - }, - "Learn/Herramientas_y_pruebas/GitHub": { - "modified": "2020-10-01T17:01:32.394Z", - "contributors": [ - "IsraFloores", - "Nachec" - ] - }, - "Learn/Herramientas_y_pruebas/Lado-del-cliente_JavaScript_frameworks": { - "modified": "2020-08-22T19:34:32.519Z", - "contributors": [ - "spaceinvadev", - "jhonarielgj" - ] - }, - "Learn/Herramientas_y_pruebas/Lado-del-cliente_JavaScript_frameworks/React_getting_started": { - "modified": "2020-08-22T19:52:35.580Z", - "contributors": [ - "spaceinvadev" - ] - }, - "Learn/Herramientas_y_pruebas/Lado-del-cliente_JavaScript_frameworks/Vue_primeros_pasos": { - "modified": "2020-09-17T18:53:24.146Z", - "contributors": [ - "Faem0220" - ] - }, - "Learn/Herramientas_y_pruebas/Understanding_client-side_tools": { - "modified": "2020-07-28T15:51:57.413Z", - "contributors": [ - "b3m3bi" - ] - }, - "Learn/JavaScript": { - "modified": "2020-08-08T12:13:32.547Z", - "contributors": [ - "Nachec", - "chrisdavidmills", - "NavetsArev", - "ivanagui2", - "Makinita", - "hamfree", - "tonymedrano", - "0sc4rR4v3l0" - ] - }, - "Learn/JavaScript/Asynchronous": { - "modified": "2020-08-07T20:26:22.020Z", - "contributors": [ - "Nachec", - "PatoDeTuring", - "duduindo", - "madmaxdios" - ] - }, - "Learn/JavaScript/Asynchronous/Async_await": { - "modified": "2020-11-12T21:09:30.375Z", - "contributors": [ - "sargentogato", - "oscartzgz", - "SphinxKnight" - ] - }, - "Learn/JavaScript/Asynchronous/Concepts": { - "modified": "2020-11-19T20:30:13.091Z", - "contributors": [ - "AndresSalomon1990", - "marcusdesantis" - ] - }, - "Learn/JavaScript/Building_blocks": { - "modified": "2020-07-17T01:46:33.034Z", - "contributors": [ - "Enesimus", - "InmobAli", - "rodririobo", - "josecampo", - "ivanagui2", - "ldeth", - "Makinita", - "jhonattanbenitez", - "Sergio_Gonzalez_Collado", - "Michelangeur", - "Elicar", - "chrisdavidmills" - ] - }, - "Learn/JavaScript/Building_blocks/Bucle_codigo": { - "modified": "2020-10-10T18:54:10.014Z", - "contributors": [ - "GianGuerra", - "Enesimus", - "josecampo", - "jesusvillalta", - "yohanolmedo", - "Zenchy", - "SebastianMaciel" - ] - }, - "Learn/JavaScript/Building_blocks/Construyendo_tu_propia_funcion": { - "modified": "2020-07-16T22:31:28.751Z", - "contributors": [ - "InmobAli", - "serarroy", - "carlosgocereceda" - ] - }, - "Learn/JavaScript/Building_blocks/Eventos": { - "modified": "2020-07-16T22:31:37.027Z", - "contributors": [ - "jhonarielgj", - "sebastiananea", - "maximilianotulian", - "ismamz" - ] - }, - "Learn/JavaScript/Building_blocks/Functions": { - "modified": "2020-10-10T22:09:39.322Z", - "contributors": [ - "GianGuerra", - "pmusetti", - "pablorebora", - "blanchart", - "Alessa", - "DanielAgustinTradito" - ] - }, - "Learn/JavaScript/Building_blocks/Galeria_de_imagenes": { - "modified": "2020-07-16T22:31:42.753Z", - "contributors": [ - "amIsmael" - ] - }, - "Learn/JavaScript/Building_blocks/Return_values": { - "modified": "2020-07-17T01:43:24.262Z", - "contributors": [ - "Enesimus", - "EnekoOdoo" - ] - }, - "Learn/JavaScript/Building_blocks/conditionals": { - "modified": "2020-11-28T22:20:55.059Z", - "contributors": [ - "willian593", - "Enesimus", - "InmobAli", - "BorisQF", - "markosaav", - "Atabord", - "jhonattanbenitez" - ] - }, - "Learn/JavaScript/Client-side_web_APIs": { - "modified": "2020-07-16T22:32:38.714Z", - "contributors": [ - "rayrojas", - "FedeRacun", - "dvincent" - ] - }, - "Learn/JavaScript/Client-side_web_APIs/Client-side_storage": { - "modified": "2020-09-22T05:14:27.901Z", - "contributors": [ - "Nachec", - "Enesimus" - ] - }, - "Learn/JavaScript/Client-side_web_APIs/Fetching_data": { - "modified": "2020-07-16T22:32:57.121Z", - "contributors": [ - "Dsabillon" - ] - }, - "Learn/JavaScript/Client-side_web_APIs/Introducción": { - "modified": "2020-07-16T22:32:44.249Z", - "contributors": [ - "robertsallent", - "gonzaa96", - "Usuario001", - "kevtinoco", - "Anonymous", - "OrlandoDeJesusCuxinYama" - ] - }, - "Learn/JavaScript/First_steps": { - "modified": "2020-09-22T14:49:32.194Z", - "contributors": [ - "Nachec", - "IsraFloores", - "mvuljevas", - "Mario-new", - "lalaggv2", - "rodrigocruz13", - "antonygiomarx", - "rickygutim", - "ivanagui2", - "EliasMCaja", - "Creasick", - "Aussith_9NT", - "sergioqa123", - "RayPL", - "ernestomr", - "eliud-c-delgado", - "chrisdavidmills" - ] - }, - "Learn/JavaScript/First_steps/A_first_splash": { - "modified": "2020-08-09T09:51:52.684Z", - "contributors": [ - "Nachec", - "zgreco2000", - "Enesimus", - "jacobo.delgado", - "xisco", - "Creasick", - "JaviMartain", - "Alfacoy", - "bosspetta", - "NataliaCba", - "arnaldop10", - "recortes", - "Darkiring", - "oscarkb24", - "roberbnd", - "joosemi02" - ] - }, - "Learn/JavaScript/First_steps/Arrays": { - "modified": "2020-07-16T22:30:53.191Z", - "contributors": [ - "InmobAli", - "amIsmael", - "Creasick", - "DaniNz" - ] - }, - "Learn/JavaScript/First_steps/Generador_de_historias_absurdas": { - "modified": "2020-11-28T18:15:56.503Z", - "contributors": [ - "willian593", - "Enesimus", - "fj1261", - "keskyle17", - "antqted" - ] - }, - "Learn/JavaScript/First_steps/Matemáticas": { - "modified": "2020-08-11T20:21:00.937Z", - "contributors": [ - "Nachec", - "Enesimus", - "keskyle17", - "Creasick", - "Aussith_9NT", - "JaviMartain", - "guibetancur", - "domingoacd", - "jjpc" - ] - }, - "Learn/JavaScript/First_steps/Prueba_tus_habilidades:_Strings": { - "modified": "2020-08-11T12:16:57.685Z", - "contributors": [ - "Nachec" - ] - }, - "Learn/JavaScript/First_steps/Qué_es_JavaScript": { - "modified": "2020-08-08T22:05:17.982Z", - "contributors": [ - "Nachec", - "zgreco2000", - "jacobo.delgado", - "console", - "c9009", - "Creasick", - "bosspetta", - "alejoWeb", - "JorgeAML", - "eliud-c-delgado", - "roberbnd" - ] - }, - "Learn/JavaScript/First_steps/Strings": { - "modified": "2020-09-06T21:18:25.448Z", - "contributors": [ - "brayan-orellanos", - "Nachec", - "Enesimus", - "keskyle17", - "wajari", - "Ale87GG", - "Creasick", - "malonson", - "punkcuadecuc" - ] - }, - "Learn/JavaScript/First_steps/Test_your_skills:_Math": { - "modified": "2020-10-27T13:03:04.825Z", - "contributors": [ - "mediodepan", - "FabianBeltran96", - "syntaxter" - ] - }, - "Learn/JavaScript/First_steps/Test_your_skills:_variables": { - "modified": "2020-09-05T01:09:05.732Z", - "contributors": [ - "FabianBeltran96", - "Nachec" - ] - }, - "Learn/JavaScript/First_steps/Useful_string_methods": { - "modified": "2020-10-19T12:56:16.453Z", - "contributors": [ - "chrisdavidmills", - "yeyskalyn", - "Enesimus", - "Rtf747", - "InmobAli", - "keskyle17", - "enekate", - "Creasick", - "DaniNz" - ] - }, - "Learn/JavaScript/First_steps/Variables": { - "modified": "2020-08-22T08:01:38.443Z", - "contributors": [ - "Nachec", - "Enesimus", - "jacobo.delgado", - "pmusetti", - "keskyle17", - "amIsmael", - "enekate", - "xisco", - "Creasick", - "TheJarX", - "hchelbat", - "JaviMartain", - "Dhelarius" - ] - }, - "Learn/JavaScript/First_steps/What_went_wrong": { - "modified": "2020-08-10T05:39:33.652Z", - "contributors": [ - "Nachec", - "Enesimus", - "CarlesBou", - "enekate", - "amIsmael", - "xisco", - "mamjerez", - "Creasick", - "Alfacoy", - "NataliaCba", - "esencialinux" - ] - }, - "Learn/JavaScript/Howto": { - "modified": "2020-07-16T22:33:09.029Z", - "contributors": [ - "FelipeAndrade" - ] - }, - "Learn/JavaScript/Objects": { - "modified": "2020-11-12T18:14:51.703Z", - "contributors": [ - "alejandro.fca", - "pablojp", - "ivanagui2", - "clarii", - "Irwin1985", - "jsanpedror", - "blaipas", - "Tzikin100", - "edu1464", - "chrisdavidmills" - ] - }, - "Learn/JavaScript/Objects/Adding_bouncing_balls_features": { - "modified": "2020-07-16T22:32:34.341Z", - "contributors": [ - "Enesimus", - "serarroy", - "carlosgocereceda" - ] - }, - "Learn/JavaScript/Objects/Basics": { - "modified": "2020-08-08T03:12:26.699Z", - "contributors": [ - "Nachec", - "Fernando-Funes", - "pmusetti", - "ivanagui2", - "djdouta", - "seba2305", - "B1tF8er", - "kevin-loal98" - ] - }, - "Learn/JavaScript/Objects/Ejercicio_práctico_de_construcción_de_objetos": { - "modified": "2020-07-16T22:32:30.877Z", - "contributors": [ - "r-vasquez", - "rayrojas", - "luchiano199", - "Sergio_Gonzalez_Collado", - "pomarbar" - ] - }, - "Learn/JavaScript/Objects/Inheritance": { - "modified": "2020-07-28T01:53:21.821Z", - "contributors": [ - "Fernando-Funes", - "darkarth80", - "ivanagui2", - "cvillafraz", - "Adrian-Cuellar", - "B1tF8er" - ] - }, - "Learn/JavaScript/Objects/JSON": { - "modified": "2020-07-16T22:32:24.819Z", - "contributors": [ - "jorgeCaster", - "pmiranda-geo", - "Enesimus" - ] - }, - "Learn/JavaScript/Objects/Object-oriented_JS": { - "modified": "2020-08-08T09:41:13.386Z", - "contributors": [ - "Nachec", - "andyesp", - "Fernando-Funes", - "jhonarielgj", - "rimbener", - "ReneAG", - "EnekoOdoo", - "ivanagui2", - "cristianmarquezp", - "djdouta", - "paulaco", - "martinGerez", - "anyruizd", - "Michelangeur" - ] - }, - "Learn/JavaScript/Objects/Object_prototypes": { - "modified": "2020-11-22T14:56:33.662Z", - "contributors": [ - "VictoriaRamirezCharles", - "TextC0de", - "Cesaraugp", - "Fernando-Funes", - "joooni1998", - "kevin_Luna", - "asamajamasa", - "ddavalos", - "JuanMaRuiz", - "ivanagui2", - "salpreh", - "djangoJosele" - ] - }, - "Learn/Performance": { - "modified": "2020-07-16T22:40:38.336Z", - "contributors": [ - "mikelmg" - ] - }, - "Learn/Server-side": { - "modified": "2020-07-16T22:35:56.070Z", - "contributors": [ - "davidenriq11", - "javierdelpino", - "IXTRUnai" - ] - }, - "Learn/Server-side/Django": { - "modified": "2020-07-16T22:36:31.705Z", - "contributors": [ - "jlpb97", - "javierdelpino", - "oscvic", - "faustinoloeza" - ] - }, - "Learn/Server-side/Django/Admin_site": { - "modified": "2020-07-16T22:37:02.726Z", - "contributors": [ - "ricardo-soria", - "cristianaguilarvelozo", - "SgtSteiner", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/Authentication": { - "modified": "2020-07-29T13:34:31.552Z", - "contributors": [ - "rayrojas", - "quijot", - "gatopadre", - "zelkovar", - "cbayonao", - "DTaiD", - "Carlosmgs111", - "ricardo-soria", - "GankerDev", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/Deployment": { - "modified": "2020-09-29T05:31:27.175Z", - "contributors": [ - "chrisdavidmills", - "LIBIDORI", - "taponato", - "joanvasa", - "banideus", - "LUISCR", - "ricardo-soria", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/Forms": { - "modified": "2020-09-03T20:14:00.959Z", - "contributors": [ - "FoulMangoPY", - "joserojas1270", - "panpy-web", - "taponato", - "gatopadre", - "gt67ma", - "soberanes", - "ricardo-soria", - "boleklolek", - "SgtSteiner", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/Generic_views": { - "modified": "2020-07-16T22:37:14.516Z", - "contributors": [ - "ricardo-soria", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/Home_page": { - "modified": "2020-07-16T22:37:08.036Z", - "contributors": [ - "dr2d4", - "MatiasJAco", - "ricardo-soria", - "cristianaguilarvelozo", - "AnPlandolit", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/Introducción": { - "modified": "2020-07-16T22:36:38.315Z", - "contributors": [ - "dr2d4", - "jlpb97", - "oalberto96", - "javierdelpino", - "oscvic" - ] - }, - "Learn/Server-side/Django/Models": { - "modified": "2020-08-27T11:46:51.559Z", - "contributors": [ - "FoulMangoPY", - "dr2d4", - "Kalisto", - "cuantosoft", - "cruzito626", - "ricardo-soria", - "CristianFonseca03", - "cristianaguilarvelozo", - "iehurtado", - "SgtSteiner", - "javierdelpino", - "Panchosama", - "MatiMateo" - ] - }, - "Learn/Server-side/Django/Sessions": { - "modified": "2020-09-02T12:56:54.473Z", - "contributors": [ - "FoulMangoPY", - "franpandol", - "ricardo-soria", - "tonyrodrigues", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/Testing": { - "modified": "2020-11-25T15:32:01.505Z", - "contributors": [ - "JanoVZ", - "joserojas1270", - "rayrojas", - "julyaann", - "ferxohn", - "ricardo-soria", - "R4v3n15", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/Tutorial_local_library_website": { - "modified": "2020-07-16T22:36:48.653Z", - "contributors": [ - "dr2d4", - "jfpIE16", - "ricardo-soria", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/development_environment": { - "modified": "2020-07-16T22:36:43.747Z", - "contributors": [ - "sign4l", - "cruzito626", - "ricardo-soria", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/django_assessment_blog": { - "modified": "2020-07-16T22:37:48.773Z", - "contributors": [ - "ricardo-soria", - "matiexe", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/skeleton_website": { - "modified": "2020-07-16T22:36:52.017Z", - "contributors": [ - "dr2d4", - "cuantosoft", - "gozarrojas", - "ricardo-soria", - "javierdelpino" - ] - }, - "Learn/Server-side/Django/web_application_security": { - "modified": "2020-07-16T22:37:45.102Z", - "contributors": [ - "sebastianmr6", - "ricardo-soria", - "javierdelpino" - ] - }, - "Learn/Server-side/Express_Nodejs": { - "modified": "2020-07-16T22:37:51.529Z", - "contributors": [ - "GUEROZ", - "deit", - "rmon_vfer", - "sergiodiezdepedro", - "javierdelpino", - "sergionunez" - ] - }, - "Learn/Server-side/Express_Nodejs/Introduction": { - "modified": "2020-07-16T22:38:09.037Z", - "contributors": [ - "evaferreira", - "threevanny", - "hernanfloresramirez1987", - "jorgesqm95", - "GUEROZ", - "Slb-Sbsz", - "tec.josec", - "crisaragon", - "Sergio_Gonzalez_Collado", - "fedechiappero", - "RigobertoUlloa", - "javierdelpino", - "SphinxKnight" - ] - }, - "Learn/Server-side/Express_Nodejs/Tutorial_local_library_website": { - "modified": "2020-07-16T22:38:15.482Z", - "contributors": [ - "acasco", - "antiepoke" - ] - }, - "Learn/Server-side/Express_Nodejs/development_environment": { - "modified": "2020-07-16T22:37:58.161Z", - "contributors": [ - "sandromedina", - "threevanny", - "pajaro5", - "GUEROZ", - "maringenio" - ] - }, - "Learn/Server-side/Express_Nodejs/mongoose": { - "modified": "2020-07-16T22:38:20.335Z", - "contributors": [ - "danimrprofe", - "rmon_vfer" - ] - }, - "Learn/Server-side/Express_Nodejs/skeleton_website": { - "modified": "2020-07-16T22:38:03.936Z", - "contributors": [ - "juancorbacho", - "tec.josec", - "maringenio", - "mimz2563" - ] - }, - "Learn/Server-side/Node_server_without_framework": { - "modified": "2020-07-16T22:36:05.239Z", - "contributors": [ - "javierdelpino" - ] - }, - "Learn/Server-side/Primeros_pasos": { - "modified": "2020-07-16T22:36:08.254Z", - "contributors": [ - "javierdelpino" - ] - }, - "Learn/Server-side/Primeros_pasos/Introducción": { - "modified": "2020-07-16T22:36:13.094Z", - "contributors": [ - "AnaHertaj", - "SphinxKnight", - "mortyBL", - "javierdelpino" - ] - }, - "Learn/Server-side/Primeros_pasos/Vision_General_Cliente_Servidor": { - "modified": "2020-07-16T22:36:18.740Z", - "contributors": [ - "Slb-Sbsz", - "javierdelpino" - ] - }, - "Learn/Server-side/Primeros_pasos/Web_frameworks": { - "modified": "2020-07-16T22:36:23.784Z", - "contributors": [ - "Slb-Sbsz", - "javierdelpino" - ] - }, - "Learn/Server-side/Primeros_pasos/seguridad_sitios_web": { - "modified": "2020-07-16T22:36:27.856Z", - "contributors": [ - "isaine", - "Slb-Sbsz", - "javierdelpino" - ] - }, - "Learn/Using_Github_pages": { - "modified": "2020-07-16T22:35:51.571Z", - "contributors": [ - "DaniNz", - "LuyisiMiger", - "TAXIS" - ] - }, - "Learn/codificacion-scripting": { - "modified": "2020-07-16T22:22:13.785Z", - "contributors": [ - "hamfree" - ] - }, - "Localización": { - "modified": "2019-01-16T13:31:36.167Z", - "contributors": [ - "DirkS", - "RickieesES", - "Mgjbot", - "Verruckt", - "Jorolo", - "Takenbot", - "Nukeador", - "Radigar" - ] - }, - "Localizar_con_Narro": { - "modified": "2019-03-24T00:12:25.538Z", - "contributors": [ - "jvmjunior", - "deimidis" - ] - }, - "MDN": { - "modified": "2020-07-08T14:43:57.058Z", - "contributors": [ - "Maose", - "jswisher", - "SphinxKnight", - "Riszin", - "Beatriz_Ortega_Valdes", - "facufacu3789", - "wbamberg", - "0zxo", - "Jeremie", - "raecillacastellana", - "DonPrime", - "GersonLazaro", - "Arudb79", - "MauricioGil", - "Sheppy" - ] - }, - "MDN/About": { - "modified": "2020-05-03T01:47:58.469Z", - "contributors": [ - "Beatriz_Ortega_Valdes", - "ecedenyo", - "wbamberg", - "jswisher", - "hecaxmmx", - "SoftwareRVG", - "Jeremie", - "carloslazaro", - "cosmesantos", - "wilo", - "LuisArt", - "sinfallas", - "maedca" - ] - }, - "MDN/Comunidad": { - "modified": "2020-04-24T19:14:03.228Z", - "contributors": [ - "inwm", - "SphinxKnight", - "wbamberg", - "jenyvera", - "0zxo", - "Jeremie", - "LeoHirsch", - "luisgm76" - ] - }, - "MDN/Contribute": { - "modified": "2019-03-22T01:52:35.495Z", - "contributors": [ - "Beatriz_Ortega_Valdes", - "wbamberg", - "Rrxxxx", - "Ibrahim1997", - "LeoHirsch", - "MauricioGil", - "Mars" - ] - }, - "MDN/Contribute/Community": { - "modified": "2020-09-03T13:14:53.733Z", - "contributors": [ - "FoulMangoPY", - "jswisher", - "wbamberg", - "welm", - "Sebastian.Nagles" - ] - }, - "MDN/Contribute/Feedback": { - "modified": "2020-12-02T14:04:57.487Z", - "contributors": [ - "SphinxKnight", - "abcserviki", - "chrisdavidmills", - "Rafasu", - "jswisher", - "yohanolmedo", - "alex16jpv", - "wbamberg", - "astrapotro", - "Jabi", - "Sergio_Gonzalez_Collado", - "karl_", - "MARVINFLORENTINO", - "aresth+", - "DracotMolver" - ] - }, - "MDN/Contribute/Getting_started": { - "modified": "2020-12-02T19:26:24.923Z", - "contributors": [ - "chrisdavidmills", - "Anibalismo", - "MIKE1203", - "gcjuan", - "clarii", - "wbamberg", - "0zxo", - "dariomaim", - "grover.velasquez", - "Primo18", - "maubarbetti", - "Arukantara", - "jsx", - "fraph", - "teoli", - "aguilaindomable", - "LeoHirsch", - "cototion" - ] - }, - "MDN/Contribute/Howto": { - "modified": "2019-01-16T18:56:52.965Z", - "contributors": [ - "wbamberg", - "0zxo", - "astrapotro", - "MauricioGil", - "Sheppy" - ] - }, - "MDN/Contribute/Howto/Convert_code_samples_to_be_live": { - "modified": "2019-01-16T19:10:19.469Z", - "contributors": [ - "wbamberg", - "javierdp", - "gpadilla", - "RoxPulido", - "LeoHirsch" - ] - }, - "MDN/Contribute/Howto/Crear_cuenta_MDN": { - "modified": "2020-08-21T18:14:17.930Z", - "contributors": [ - "Tomillo", - "JADE-2006", - "wbamberg", - "JuniorBO", - "Arudb79", - "LeoHirsch" - ] - }, - "MDN/Contribute/Howto/Document_a_CSS_property": { - "modified": "2020-02-19T19:43:18.253Z", - "contributors": [ - "jswisher", - "SphinxKnight", - "wbamberg", - "teoli", - "stephaniehobson", - "MauricioGil" - ] - }, - "MDN/Contribute/Howto/Document_a_CSS_property/Plantilla_propiedad": { - "modified": "2019-03-18T21:31:21.033Z", - "contributors": [ - "wbamberg", - "B1tF8er" - ] - }, - "MDN/Contribute/Howto/Etiquetas_paginas_javascript": { - "modified": "2019-01-16T19:47:18.318Z", - "contributors": [ - "wbamberg", - "LeoHirsch" - ] - }, - "MDN/Contribute/Howto/Remover_Macros_Experimentales": { - "modified": "2020-07-05T17:06:56.383Z", - "contributors": [ - "Anibalismo" - ] - }, - "MDN/Contribute/Howto/Set_the_summary_for_a_page": { - "modified": "2020-07-05T16:17:53.925Z", - "contributors": [ - "Anibalismo", - "Maose", - "wbamberg", - "gerard.am", - "LeoHirsch" - ] - }, - "MDN/Contribute/Howto/Tag": { - "modified": "2019-03-23T23:15:01.953Z", - "contributors": [ - "wbamberg", - "Creasick", - "blanchart", - "meCarrion17", - "rafamagno", - "teoli", - "PepeAntonio", - "CristianMar25", - "anmartinez", - "LeoHirsch" - ] - }, - "MDN/Contribute/Howto/Usar_barras_laterales_de_navegación": { - "modified": "2019-05-08T17:34:30.854Z", - "contributors": [ - "ivanagui2" - ] - }, - "MDN/Contribute/Howto/Write_a_new_entry_in_the_Glossary": { - "modified": "2019-03-23T23:09:23.417Z", - "contributors": [ - "wbamberg", - "astrapotro", - "teoli", - "L_e_o" - ] - }, - "MDN/Contribute/Howto/Write_an_article_to_help_learn_about_the_Web": { - "modified": "2020-06-26T02:13:25.044Z", - "contributors": [ - "Enesimus", - "pablorebora", - "blanchart", - "BubuAnabelas", - "SphinxKnight", - "FranciscoImanolSuarez" - ] - }, - "MDN/Contribute/Howto/revision_editorial": { - "modified": "2019-03-18T20:54:27.132Z", - "contributors": [ - "LauraJaime8", - "wbamberg", - "ElNobDeTfm", - "Arudb79", - "LeoHirsch" - ] - }, - "MDN/Contribute/Howto/revision_tecnica": { - "modified": "2019-01-16T18:56:48.857Z", - "contributors": [ - "wbamberg", - "MarkelCuesta", - "rowasc", - "LeoHirsch" - ] - }, - "MDN/Contribute/Localize": { - "modified": "2019-01-16T17:46:06.700Z", - "contributors": [ - "wbamberg", - "Jeremie", - "meiyu333", - "Sheppy" - ] - }, - "MDN/Contribute/Localize/Iniciar_una_localizacion": { - "modified": "2019-03-23T22:20:12.721Z", - "contributors": [ - "wbamberg", - "SoftwareRVG" - ] - }, - "MDN/Contribute/Localize/Project:Localization_Projects": { - "modified": "2019-05-18T11:53:27.961Z", - "contributors": [ - "wbamberg", - "AlePerez92", - "karlalhdz", - "Jeremie", - "LeoHirsch", - "Sheppy", - "Antiparticule", - "jorge_diaz", - "LuisArt", - "maedca", - "desiderantes" - ] - }, - "MDN/Contribute/Localize/Project:Translating_MDN_pages": { - "modified": "2020-10-10T03:14:55.439Z", - "contributors": [ - "elpetiso", - "Beatriz_Ortega_Valdes", - "jimmypazos", - "wbamberg", - "juan-ferrer-toribio", - "AlePerez92", - "manatico4", - "wilton-cruz", - "seidelw", - "JuanMacias", - "sergio_p_d", - "Jeremie", - "JessDev", - "humbertaco", - "LeoHirsch", - "sintaxis", - "maedca" - ] - }, - "MDN/Contribute/Procesos": { - "modified": "2019-01-17T02:12:44.469Z", - "contributors": [ - "wbamberg", - "astrapotro" - ] - }, - "MDN/Contribute/Tareas": { - "modified": "2019-01-16T18:56:38.941Z", - "contributors": [ - "wbamberg", - "MauricioGil", - "LeoHirsch" - ] - }, - "MDN/Guidelines": { - "modified": "2020-09-30T15:28:55.816Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "Jeremie", - "LeoHirsch" - ] - }, - "MDN/Guidelines/Content_blocks": { - "modified": "2020-09-30T15:28:56.171Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "Jeremie", - "LeoHirsch" - ] - }, - "MDN/Guidelines/Convenciones_y_definiciones": { - "modified": "2020-09-30T15:28:56.412Z", - "contributors": [ - "chrisdavidmills", - "Nachec" - ] - }, - "MDN/Guidelines/Project:Guía_de_estilo": { - "modified": "2020-09-30T15:28:56.038Z", - "contributors": [ - "chrisdavidmills", - "blanchart", - "clarii", - "wbamberg", - "Jeremie", - "Salamandra101", - "Dgeek", - "fscholz", - "LeoHirsch", - "teoli", - "Pgulijczuk", - "DoctorRomi", - "Nukeador", - "Nanomo", - "Eqx", - "Jorolo" - ] - }, - "MDN/Kuma": { - "modified": "2019-09-09T15:52:33.535Z", - "contributors": [ - "SphinxKnight", - "clarii", - "wbamberg", - "Jeremie", - "Diio", - "atlas7jean" - ] - }, - "MDN/Kuma/Contributing": { - "modified": "2019-03-23T23:15:25.956Z", - "contributors": [ - "wbamberg", - "Jeremie", - "MauricioGil" - ] - }, - "MDN/Kuma/Contributing/Getting_started": { - "modified": "2019-01-16T19:06:06.895Z", - "contributors": [ - "wbamberg", - "Jeremie", - "MauricioGil" - ] - }, - "MDN/Structures": { - "modified": "2020-09-30T09:06:15.403Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "jswisher" - ] - }, - "MDN/Structures/Ejemplos_ejecutables": { - "modified": "2020-09-30T09:06:15.983Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "emanuelvega", - "LUISTGMDN", - "elihro" - ] - }, - "MDN/Structures/Macros": { - "modified": "2020-09-30T09:06:16.658Z", - "contributors": [ - "chrisdavidmills", - "Nachec", - "wbamberg" - ] - }, - "MDN/Structures/Macros/Commonly-used_macros": { - "modified": "2020-09-30T09:06:17.138Z", - "contributors": [ - "chrisdavidmills", - "Nachec" - ] - }, - "MDN/Structures/Macros/Otras": { - "modified": "2020-09-30T09:06:17.522Z", - "contributors": [ - "chrisdavidmills", - "Nachec" - ] - }, - "MDN/Structures/Tablas_de_compatibilidad": { - "modified": "2020-10-15T22:33:39.399Z", - "contributors": [ - "chrisdavidmills", - "Nachec" - ] - }, - "MDN/Tools": { - "modified": "2020-09-30T16:48:18.728Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "Jeremie", - "Arudb79", - "atlas7jean" - ] - }, - "MDN/Tools/Introduction_to_KumaScript": { - "modified": "2020-09-30T16:48:19.117Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "velizluisma", - "Jeremie", - "LeoHirsch" - ] - }, - "MDN/Tools/Page_regeneration": { - "modified": "2020-09-30T16:48:19.365Z", - "contributors": [ - "chrisdavidmills", - "Anibalismo" - ] - }, - "MDN/Tools/Template_editing": { - "modified": "2020-09-30T16:48:19.234Z", - "contributors": [ - "chrisdavidmills", - "wbamberg", - "juan-ferrer-toribio" - ] - }, - "MDN/User_guide": { - "modified": "2020-12-07T17:30:04.089Z", - "contributors": [ - "wbamberg", - "Sheppy" - ] - }, - "MDN_en_diez": { - "modified": "2019-03-23T22:49:57.954Z", - "contributors": [ - "pabloveintimilla", - "diego.mauricio.meneses.rios" - ] - }, - "Mejoras_DOM_en_Firefox_3": { - "modified": "2019-03-23T23:50:52.840Z", - "contributors": [ - "wbamberg", - "Mgjbot", - "RickieesES", - "Nukeador", - "HenryGR", - "Talisker" - ] - }, - "Mejoras_SVG_en_Firefox_3": { - "modified": "2019-03-23T23:50:55.206Z", - "contributors": [ - "wbamberg", - "Mgjbot", - "RickieesES", - "Nukeador", - "Talisker" - ] - }, - "Mejoras_XUL_en_Firefox_3": { - "modified": "2019-03-24T00:02:34.038Z", - "contributors": [ - "wbamberg", - "fscholz", - "Nukeador", - "Mgjbot", - "Nathymig", - "Dukebody" - ] - }, - "Migrar_aplicaciones_desde_Internet_Explorer_a_Mozilla": { - "modified": "2019-03-23T23:59:56.566Z", - "contributors": [ - "teoli", - "Siyivan", - "krusch", - "Mgjbot", - "Mrgonzalez", - "Superruzafa", - "Ttataje", - "Nukeador" - ] - }, - "Modo_casi_estándar_de_Gecko": { - "modified": "2019-03-23T23:43:50.956Z", - "contributors": [ - "teoli", - "Mgjbot", - "Jorolo" - ] - }, - "Mozilla": { - "modified": "2019-01-16T13:16:23.082Z", - "contributors": [ - "cosmesantos", - "andersonvc89", - "Vladi05", - "Granpichi", - "yesypsb", - "Getachi", - "Izel" - ] - }, - "Mozilla/Add-ons": { - "modified": "2019-03-18T21:08:47.524Z", - "contributors": [ - "hecaxmmx", - "hamfree", - "Aldrin508", - "Arudb79", - "Psy", - "RaulVisa", - "LeoHirsch", - "rojo32" - ] - }, - "Mozilla/Add-ons/WebExtensions": { - "modified": "2019-07-18T20:39:33.007Z", - "contributors": [ - "hecaxmmx", - "ivanruvalcaba", - "AngelFQC", - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/API": { - "modified": "2019-05-09T20:52:57.986Z", - "contributors": [ - "Micronine", - "BubuAnabelas", - "chicocoulomb", - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/i18n": { - "modified": "2020-10-15T21:39:41.302Z", - "contributors": [ - "wbamberg", - "fitojb", - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/storage": { - "modified": "2020-10-15T22:13:52.747Z", - "contributors": [ - "SphinxKnight", - "wbamberg", - "grxdipgra" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/storage/local": { - "modified": "2020-10-15T22:13:52.742Z", - "contributors": [ - "wbamberg", - "grxdipgra" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/storage/sync": { - "modified": "2020-10-15T22:13:52.602Z", - "contributors": [ - "wbamberg", - "grxdipgra" - ] - }, - "Mozilla/Add-ons/WebExtensions/API/webNavigation": { - "modified": "2020-10-15T21:52:47.862Z", - "contributors": [ - "wbamberg", - "tanclony" - ] - }, - "Mozilla/Add-ons/WebExtensions/Add_a_button_to_the_toolbar": { - "modified": "2019-03-18T21:05:11.701Z", - "contributors": [ - "roberbnd" - ] - }, - "Mozilla/Add-ons/WebExtensions/Anatomia_de_una_WebExtension": { - "modified": "2019-03-18T21:08:05.873Z", - "contributors": [ - "hecaxmmx", - "rgo", - "jde-gr", - "doztrock", - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/Browser_support_for_JavaScript_APIs": { - "modified": "2020-10-15T20:55:02.467Z", - "contributors": [ - "rossc90" - ] - }, - "Mozilla/Add-ons/WebExtensions/Chrome_incompatibilities": { - "modified": "2019-03-23T22:45:10.191Z", - "contributors": [ - "Nitram_G", - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/Depuración": { - "modified": "2019-03-18T21:05:20.525Z", - "contributors": [ - "Pau" - ] - }, - "Mozilla/Add-ons/WebExtensions/Examples": { - "modified": "2019-03-18T21:06:01.388Z", - "contributors": [ - "hecaxmmx" - ] - }, - "Mozilla/Add-ons/WebExtensions/Extending_the_developer_tools": { - "modified": "2020-09-27T05:32:44.293Z", - "contributors": [ - "omaralonsog" - ] - }, - "Mozilla/Add-ons/WebExtensions/Implement_a_settings_page": { - "modified": "2019-03-18T21:06:46.901Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Mozilla/Add-ons/WebExtensions/Intercept_HTTP_requests": { - "modified": "2019-03-18T21:06:03.133Z", - "contributors": [ - "juanbrujo", - "regisdark", - "hecaxmmx" - ] - }, - "Mozilla/Add-ons/WebExtensions/Internationalization": { - "modified": "2020-06-29T22:25:32.104Z", - "contributors": [ - "hugojavierduran9" - ] - }, - "Mozilla/Add-ons/WebExtensions/Modify_a_web_page": { - "modified": "2019-03-18T21:02:55.354Z", - "contributors": [ - "alexgilsoncampi" - ] - }, - "Mozilla/Add-ons/WebExtensions/Packaging_and_installation": { - "modified": "2019-03-23T22:45:27.399Z", - "contributors": [ - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/Porting_from_Google_Chrome": { - "modified": "2019-03-18T21:08:10.456Z", - "contributors": [ - "fitojb", - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/Prerequisitos": { - "modified": "2019-03-23T22:45:28.352Z", - "contributors": [ - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/Publishing_your_WebExtension": { - "modified": "2019-03-18T21:05:24.379Z", - "contributors": [ - "FacundoCerezo", - "IXTRUnai" - ] - }, - "Mozilla/Add-ons/WebExtensions/Que_son_las_WebExtensions": { - "modified": "2020-11-23T00:59:33.889Z", - "contributors": [ - "kenliten", - "hecaxmmx", - "13539" - ] - }, - "Mozilla/Add-ons/WebExtensions/Tu_primera_WebExtension": { - "modified": "2020-11-23T01:34:20.681Z", - "contributors": [ - "kenliten", - "IgnacioMilia", - "mppfiles", - "adderou", - "hecaxmmx", - "Maller_Lagoon" - ] - }, - "Mozilla/Add-ons/WebExtensions/Tutorial": { - "modified": "2019-04-25T06:15:12.057Z", - "contributors": [ - "Klius", - "IgnacioMilia", - "chicocoulomb", - "hecaxmmx", - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/What_next_": { - "modified": "2019-03-18T20:43:00.251Z", - "contributors": [ - "chicocoulomb" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json": { - "modified": "2020-10-15T21:39:41.879Z", - "contributors": [ - "wachunei", - "legomolina", - "yuniers" - ] - }, - "Mozilla/Add-ons/WebExtensions/manifest.json/icons": { - "modified": "2020-10-15T22:27:24.193Z", - "contributors": [ - "qwerty726" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface": { - "modified": "2019-03-18T21:03:49.876Z", - "contributors": [ - "rebloor" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Accion_navegador": { - "modified": "2019-03-18T21:03:34.447Z", - "contributors": [ - "adderou" - ] - }, - "Mozilla/Add-ons/WebExtensions/user_interface/Page_actions": { - "modified": "2019-08-12T17:02:44.540Z", - "contributors": [ - "rayrojas" - ] - }, - "Mozilla/Developer_guide": { - "modified": "2019-03-23T23:34:39.883Z", - "contributors": [ - "chrisdavidmills", - "Etruscco" - ] - }, - "Mozilla/Developer_guide/Preguntas_frecuentes_sobre_la_compilación_de_Mozilla": { - "modified": "2019-03-23T23:58:56.616Z", - "contributors": [ - "chrisdavidmills", - "fscholz", - "teoli", - "DoctorRomi", - "Nukeador", - "Mgjbot", - "Blank zero" - ] - }, - "Mozilla/Developer_guide/Source_Code": { - "modified": "2020-03-01T17:19:51.307Z", - "contributors": [ - "IngrownMink4", - "Allamc11", - "chrisdavidmills", - "jntesteves" - ] - }, - "Mozilla/Developer_guide/Source_Code/Código_fuente_de_Mozilla_(CVS)": { - "modified": "2019-03-23T23:46:33.805Z", - "contributors": [ - "chrisdavidmills", - "teoli", - "Nukeador", - "Mgjbot", - "Blank zero" - ] - }, - "Mozilla/Developer_guide/mozilla-central": { - "modified": "2019-03-18T21:11:07.718Z", - "contributors": [ - "duduindo", - "chrisdavidmills", - "fscholz", - "RickieesES" - ] - }, - "Mozilla/Firefox": { - "modified": "2020-01-18T13:20:40.065Z", - "contributors": [ - "leela52452", - "SphinxKnight", - "wbamberg", - "jonasmreza", - "avelper", - "regisdark", - "AlmondCupcake", - "hecaxmmx", - "SecurityResearcher", - "Pablo_Ivan", - "Alejandro_Blanco", - "gabpull", - "nekside" - ] - }, - "Mozilla/Firefox/Experimental_features": { - "modified": "2019-04-01T12:56:43.181Z", - "contributors": [ - "johnboy-99", - "wbamberg", - "Maletil" - ] - }, - "Mozilla/Firefox/Releases": { - "modified": "2019-03-23T23:27:32.191Z", - "contributors": [ - "wbamberg", - "thzunder", - "Sheppy" - ] - }, - "Mozilla/Firefox/Releases/30": { - "modified": "2019-03-23T23:06:34.308Z", - "contributors": [ - "wbamberg", - "mrbyte007" - ] - }, - "Mozilla/Firefox/Releases/50": { - "modified": "2019-03-18T21:11:07.358Z", - "contributors": [ - "duduindo", - "wbamberg", - "frank-orellana", - "raiosxdxd" - ] - }, - "Mozilla/Firefox/Releases/57": { - "modified": "2019-03-23T22:03:40.720Z", - "contributors": [ - "wbamberg", - "fitojb" - ] - }, - "Mozilla/Firefox/Releases/61": { - "modified": "2019-03-18T21:34:25.134Z", - "contributors": [ - "wbamberg", - "JoaLop" - ] - }, - "Mozilla/Firefox/Releases/62": { - "modified": "2019-03-18T21:26:40.295Z", - "contributors": [ - "laptou" - ] - }, - "Mozilla/Firefox/Releases/63": { - "modified": "2019-03-18T21:22:18.650Z", - "contributors": [ - "SphinxKnight", - "Dev-MADJ" - ] - }, - "Mozilla/Firefox/Releases/66": { - "modified": "2019-05-09T17:56:10.878Z", - "contributors": [ - "Smartloony" - ] - }, - "Mozilla/Firefox/Releases/67": { - "modified": "2019-06-27T23:25:44.498Z", - "contributors": [ - "erickton", - "marcorichetta" - ] - }, - "Mozilla/Firefox/Releases/68": { - "modified": "2019-07-14T03:15:02.367Z", - "contributors": [ - "Gummox" - ] - }, - "Mozilla/Firefox/Releases/9": { - "modified": "2019-12-13T20:33:17.732Z", - "contributors": [ - "wbamberg", - "fscholz" - ] - }, - "Mozilla/Firefox/Releases/9/Updating_add-ons": { - "modified": "2019-03-23T23:09:25.426Z", - "contributors": [ - "wbamberg", - "Rickatomato" - ] - }, - "Módulos_JavaScript": { - "modified": "2019-03-23T23:53:21.168Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Mgjbot", - "Ffranz", - "Mariano" - ] - }, - "Participar_en_el_proyecto_Mozilla": { - "modified": "2019-03-24T00:07:54.638Z", - "contributors": [ - "teoli", - "inma_610" - ] - }, - "Plantillas_en_Firefox_3": { - "modified": "2019-03-24T00:02:45.436Z", - "contributors": [ - "wbamberg", - "fscholz", - "Nukeador", - "Kaltya", - "Mgjbot" - ] - }, - "Preguntas_frecuentes_sobre_incrustación_en_Mozilla": { - "modified": "2019-01-16T15:02:38.544Z", - "contributors": [ - "Anonymous" - ] - }, - "Preguntas_frecuentes_sobre_incrustación_en_Mozilla/Introducción_a_Gecko_e_inscrustación": { - "modified": "2019-01-16T16:13:02.334Z", - "contributors": [ - "Jorolo", - "Lastjuan" - ] - }, - "Principios_básicos_de_los_servicios_Web": { - "modified": "2019-01-16T16:13:03.069Z", - "contributors": [ - "Jorolo", - "Xoan", - "Breaking Pitt" - ] - }, - "Recursos_en_modo_desconectado_en_Firefox": { - "modified": "2019-03-18T21:11:07.042Z", - "contributors": [ - "duduindo", - "Mgjbot", - "Nukeador", - "Nathymig", - "HenryGR" - ] - }, - "Referencia_DOM_de_Gecko": { - "modified": "2019-01-16T16:01:11.054Z", - "contributors": [ - "DR", - "Nathymig" - ] - }, - "Referencia_DOM_de_Gecko/Cómo_espacioenblanco": { - "modified": "2020-08-24T04:42:05.596Z", - "contributors": [ - "Nachec" - ] - }, - "Referencia_DOM_de_Gecko/Ejemplos": { - "modified": "2019-03-23T23:51:24.173Z", - "contributors": [ - "SphinxKnight", - "khalid32", - "Mgjbot", - "Manu", - "Markens", - "Nathymig" - ] - }, - "Referencia_DOM_de_Gecko/Eventos": { - "modified": "2019-03-18T21:45:13.362Z", - "contributors": [ - "recortes" - ] - }, - "Referencia_DOM_de_Gecko/Introducción": { - "modified": "2019-03-23T23:48:16.078Z", - "contributors": [ - "LuisSevillano", - "IsaacAaron", - "Sheppy", - "Uri", - "Nathymig" - ] - }, - "Referencia_DOM_de_Gecko/Localizando_elementos_DOM_usando_selectores": { - "modified": "2020-06-14T19:56:35.416Z", - "contributors": [ - "snickArg" - ] - }, - "Referencia_DOM_de_Gecko/Prefacio": { - "modified": "2019-06-16T19:12:21.185Z", - "contributors": [ - "jesusvillalta", - "Sheppy", - "Nathymig" - ] - }, - "Referencia_de_XUL": { - "modified": "2019-04-19T23:18:32.719Z", - "contributors": [ - "wbamberg", - "teoli", - "chukito" - ] - }, - "SVG_en_Firefox": { - "modified": "2019-03-23T23:43:25.545Z", - "contributors": [ - "teoli", - "Superruzafa", - "Jorolo" - ] - }, - "Sections_and_Outlines_of_an_HTML5_document": { - "modified": "2019-03-23T23:38:22.567Z", - "contributors": [ - "blanchart", - "eljonims", - "welm", - "javigaar", - "learnercys", - "pierre_alfonso", - "jesanchez" - ] - }, - "Seguridad_en_Firefox_2": { - "modified": "2019-03-23T23:42:29.185Z", - "contributors": [ - "wbamberg", - "teoli", - "Nukeador" - ] - }, - "Selección_de_modo_en_Mozilla": { - "modified": "2019-11-21T20:40:48.950Z", - "contributors": [ - "wbamberg", - "teoli", - "fscholz", - "Jorolo" - ] - }, - "Server-sent_events": { - "modified": "2019-03-23T23:24:42.323Z", - "contributors": [ - "ethertank" - ] - }, - "Server-sent_events/utilizando_server_sent_events_sse": { - "modified": "2019-04-16T06:11:09.003Z", - "contributors": [ - "albertoclarbrines", - "adlr", - "iamwao", - "jgutix", - "aztrock" - ] - }, - "Storage": { - "modified": "2019-03-24T00:09:02.141Z", - "contributors": [ - "teoli", - "elPatox", - "Francoyote", - "HenryGR", - "Mgjbot" - ] - }, - "Tipo_MIME_incorrecto_en_archivos_CSS": { - "modified": "2019-01-16T15:43:53.805Z", - "contributors": [ - "Dailosmm", - "Mgjbot", - "Jorolo", - "Nukeador", - "Epaclon", - "Pasky" - ] - }, - "Tools": { - "modified": "2020-07-16T22:44:14.436Z", - "contributors": [ - "SphinxKnight", - "wbamberg", - "sprodrigues", - "Bugrtn", - "guillermocamon", - "mautematico", - "superrebe", - "mishelashala", - "juan-castano", - "Joker_DC", - "rossif", - "ArcangelZith", - "adri1993", - "zota", - "danielUFO", - "Arudb79", - "Jacqueline", - "@Perlyshh_76", - "ivanlopez", - "Gusvar", - "cristel.ariana", - "jesusruiz", - "PabloDev", - "gorrotowi", - "SebastianRave", - "Houseboyzgz", - "hjaguen", - "foxtro", - "reoo", - "dinoop.p1" - ] - }, - "Tools/3D_View": { - "modified": "2020-07-16T22:34:25.151Z", - "contributors": [ - "rmilano" - ] - }, - "Tools/Accesos_directos": { - "modified": "2020-07-28T10:35:37.425Z", - "contributors": [ - "Anibalismo", - "ssm", - "hugojavierduran9", - "marcorichetta" - ] - }, - "Tools/Add-ons": { - "modified": "2020-07-16T22:36:23.274Z", - "contributors": [ - "mfluehr" - ] - }, - "Tools/Browser_Console": { - "modified": "2020-07-16T22:35:42.205Z", - "contributors": [ - "AldoSantiago", - "almozara" - ] - }, - "Tools/Browser_Toolbox": { - "modified": "2020-07-16T22:35:55.417Z", - "contributors": [ - "norwie" - ] - }, - "Tools/Debugger": { - "modified": "2020-09-13T21:00:58.239Z", - "contributors": [ - "luuiizzaa9060", - "Juanchoib", - "jcmarcfloress", - "eroto", - "wbamberg", - "nacholereu", - "Pablo_Ivan", - "trevorh", - "cgsramirez", - "stephaniehobson", - "Jacqueline", - "C.E." - ] - }, - "Tools/Debugger/How_to": { - "modified": "2020-07-16T22:35:07.255Z", - "contributors": [ - "wbamberg" - ] - }, - "Tools/Debugger/How_to/Disable_breakpoints": { - "modified": "2020-07-16T22:35:11.175Z", - "contributors": [ - "drdavi7@hotmail.com" - ] - }, - "Tools/Debugger/How_to/Set_a_breakpoint": { - "modified": "2020-07-16T22:35:09.854Z", - "contributors": [ - "erickton" - ] - }, - "Tools/Debugger/How_to/Uso_de_un_mapa_fuente": { - "modified": "2020-07-16T22:35:12.325Z", - "contributors": [ - "Makinita" - ] - }, - "Tools/Debugger/Source_map_errors": { - "modified": "2020-07-16T22:35:19.165Z", - "contributors": [ - "Makinita" - ] - }, - "Tools/Desempeño": { - "modified": "2020-07-16T22:36:12.530Z", - "contributors": [ - "LesterGuerra", - "juanmapiquero", - "PorcoMaledette" - ] - }, - "Tools/Desempeño/UI_Tour": { - "modified": "2020-07-16T22:36:14.726Z", - "contributors": [ - "kynu", - "calcerrada", - "ramferposadas" - ] - }, - "Tools/Editor_Audio_Web": { - "modified": "2020-07-16T22:36:08.308Z", - "contributors": [ - "MPoli" - ] - }, - "Tools/Editor_Estilo": { - "modified": "2020-07-16T22:35:00.009Z", - "contributors": [ - "jwhitlock", - "cheline", - "SoftwareRVG", - "JosshuaCalixto1", - "maybe", - "padre629", - "CagsaBit" - ] - }, - "Tools/Monitor_de_Red": { - "modified": "2020-07-16T22:35:29.709Z", - "contributors": [ - "sevillacode", - "Makinita", - "_cuco_", - "Ivan-Perez", - "Dieg" - ] - }, - "Tools/Page_Inspector": { - "modified": "2020-07-16T22:34:27.363Z", - "contributors": [ - "amaiafilo", - "SoftwareRVG", - "maybe", - "webmaster", - "Jacqueline", - "MauricioGil" - ] - }, - "Tools/Page_Inspector/3er-panel_modo": { - "modified": "2020-07-16T22:34:53.611Z", - "contributors": [ - "welm" - ] - }, - "Tools/Page_Inspector/How_to": { - "modified": "2020-07-16T22:34:30.977Z", - "contributors": [ - "sidgan" - ] - }, - "Tools/Page_Inspector/How_to/Abrir_el_Inspector": { - "modified": "2020-07-16T22:34:32.611Z", - "contributors": [ - "amaiafilo" - ] - }, - "Tools/Page_Inspector/How_to/Examinar_y_editar_HTML": { - "modified": "2020-07-16T22:34:40.440Z", - "contributors": [ - "amaiafilo" - ] - }, - "Tools/Page_Inspector/How_to/Examinar_y_editar_el_modelo_de_cajasmodel": { - "modified": "2020-07-16T22:34:34.150Z", - "contributors": [ - "amaiafilo" - ] - }, - "Tools/Page_Inspector/How_to/Examine_and_edit_CSS": { - "modified": "2020-07-16T22:34:42.117Z", - "contributors": [ - "amaiafilo" - ] - }, - "Tools/Page_Inspector/How_to/Examine_grid_layouts": { - "modified": "2020-07-16T22:34:47.093Z", - "contributors": [ - "welm" - ] - }, - "Tools/Page_Inspector/How_to/Inspeccionar_y_seleccionar_colores": { - "modified": "2020-07-16T22:34:34.877Z", - "contributors": [ - "amaiafilo" - ] - }, - "Tools/Page_Inspector/How_to/Reposicionando_elementos_en_la_pagina": { - "modified": "2020-07-16T22:34:45.756Z", - "contributors": [ - "alebarbaja" - ] - }, - "Tools/Page_Inspector/How_to/Select_an_element": { - "modified": "2020-07-16T22:34:33.474Z", - "contributors": [ - "amaiafilo" - ] - }, - "Tools/Page_Inspector/How_to/Work_with_animations": { - "modified": "2020-07-16T22:34:36.333Z", - "contributors": [ - "lyono666", - "angelmillan", - "fmagrosoto" - ] - }, - "Tools/Page_Inspector/UI_Tour": { - "modified": "2020-07-16T22:34:48.922Z", - "contributors": [ - "maruskina", - "amaiafilo" - ] - }, - "Tools/Profiler": { - "modified": "2020-07-16T22:35:28.621Z", - "contributors": [ - "MrDaza" - ] - }, - "Tools/Remote_Debugging": { - "modified": "2020-07-16T22:35:37.186Z", - "contributors": [ - "sonidos", - "mando", - "Xorgius", - "CesarS", - "Fani100", - "Patriposa", - "awbruna190", - "aguntinito" - ] - }, - "Tools/Remote_Debugging/Debugging_over_a_network": { - "modified": "2020-07-16T22:35:41.552Z", - "contributors": [ - "stephiemtz" - ] - }, - "Tools/Remote_Debugging/Firefox_para_Android": { - "modified": "2020-07-16T22:35:38.980Z", - "contributors": [ - "odelrio", - "pawer13", - "pacommozilla", - "StripTM" - ] - }, - "Tools/Responsive_Design_View": { - "modified": "2020-07-16T22:35:21.169Z", - "contributors": [ - "adolfotc", - "HugoM1682", - "amaiafilo", - "walter.atg", - "maedca" - ] - }, - "Tools/Settings": { - "modified": "2020-07-16T22:36:34.818Z", - "contributors": [ - "amaiafilo" - ] - }, - "Tools/Storage_Inspector": { - "modified": "2020-07-16T22:36:09.696Z", - "contributors": [ - "Sebastianz" - ] - }, - "Tools/Storage_Inspector/Cookies": { - "modified": "2020-07-16T22:36:11.000Z", - "contributors": [ - "Enesimus" - ] - }, - "Tools/Tomar_capturas_de_pantalla": { - "modified": "2020-07-16T22:36:38.280Z", - "contributors": [ - "picandocodigo" - ] - }, - "Tools/Tools_Toolbox": { - "modified": "2020-07-16T22:35:26.877Z", - "contributors": [ - "amaiafilo", - "Papicorito", - "am.garcia" - ] - }, - "Tools/View_source": { - "modified": "2020-07-16T22:35:02.649Z", - "contributors": [ - "StripTM" - ] - }, - "Tools/Web_Console": { - "modified": "2020-07-16T22:34:05.366Z", - "contributors": [ - "elias_ramirez_elriso", - "cgsramirez", - "bassam", - "wbamberg" - ] - }, - "Tools/Web_Console/Console_messages": { - "modified": "2020-07-16T22:34:14.880Z", - "contributors": [ - "Enesimus", - "pacommozilla", - "JeidyVega" - ] - }, - "Tools/Web_Console/Iniciando_la_Consola_Web": { - "modified": "2020-07-16T22:34:17.075Z", - "contributors": [ - "JonoyeMasuso" - ] - }, - "Tools/Web_Console/La_línea_de_comandos_del_intérprete": { - "modified": "2020-08-27T20:06:30.290Z", - "contributors": [ - "Nachec" - ] - }, - "Tools/Working_with_iframes": { - "modified": "2020-07-16T22:36:11.768Z", - "contributors": [ - "carpasse" - ] - }, - "Tools/about:debugging": { - "modified": "2020-07-30T13:12:25.833Z", - "contributors": [ - "Anibalismo" - ] - }, - "Traducir_las_descripciones_de_las_extensiones": { - "modified": "2019-03-23T23:53:33.332Z", - "contributors": [ - "teoli", - "Nukeador", - "Sebastianzartner@gmx.de", - "D20v02d", - "Mgjbot" - ] - }, - "Traducir_una_extensión": { - "modified": "2019-03-23T23:57:54.041Z", - "contributors": [ - "Sebastianz", - "teoli", - "Sheppy", - "gironlievanos", - "Mgjbot", - "Superruzafa" - ] - }, - "Trazado_de_una_tabla_HTML_mediante_JavaScript_y_la_Interface_DOM": { - "modified": "2019-03-23T23:20:26.633Z", - "contributors": [ - "lajaso", - "jucazam", - "pablo.turati" - ] - }, - "Usando_archivos_desde_aplicaciones_web": { - "modified": "2019-03-24T00:07:10.927Z", - "contributors": [ - "SphinxKnight", - "AngelFQC", - "StripTM", - "Izel", - "deimidis", - "maedca" - ] - }, - "Usar_XPInstall_para_instalar_plugins": { - "modified": "2019-01-16T16:11:23.781Z", - "contributors": [ - "Superruzafa", - "Fedora-core", - "Floot" - ] - }, - "Usar_código_de_Mozilla_en_otros_proyectos": { - "modified": "2019-03-24T00:09:00.370Z", - "contributors": [ - "maedca", - "inma_610" - ] - }, - "Usar_web_workers": { - "modified": "2019-03-24T00:07:32.918Z", - "contributors": [ - "teoli", - "ajimix", - "inma_610" - ] - }, - "Using_the_W3C_DOM_Level_1_Core": { - "modified": "2019-12-13T21:06:41.403Z", - "contributors": [ - "wbamberg", - "jswisher" - ] - }, - "Uso_del_núcleo_del_nivel_1_del_DOM": { - "modified": "2019-12-13T21:10:23.918Z", - "contributors": [ - "wbamberg", - "broxmgs", - "Superruzafa", - "Jorolo" - ] - }, - "Vigilar_plugins": { - "modified": "2019-01-16T15:35:57.481Z", - "contributors": [ - "HenryGR" - ] - }, - "Web": { - "modified": "2020-11-28T21:26:15.631Z", - "contributors": [ - "gabrielazambrano307", - "Nachec", - "Enesimus", - "blanchart", - "SoftwareRVG", - "danieldelvillar", - "raecillacastellana", - "jcbp", - "BubuAnabelas", - "Jacqueline", - "igualar.com", - "atlas7jean", - "luisgm76", - "Sheppy" - ] - }, - "Web/API": { - "modified": "2020-08-08T02:17:57.801Z", - "contributors": [ - "Nachec", - "Enesimus", - "fscholz", - "AJMG", - "tecniloco", - "teoli", - "maedca", - "ethertank", - "Sheppy" - ] - }, - "Web/API/API_de_almacenamiento_web": { - "modified": "2019-03-23T22:46:51.819Z", - "contributors": [ - "fherce", - "AlePerez92", - "VictorAbdon" - ] - }, - "Web/API/API_de_almacenamiento_web/Usando_la_API_de_almacenamiento_web": { - "modified": "2020-08-14T20:09:18.391Z", - "contributors": [ - "Enesimus", - "fherce" - ] - }, - "Web/API/API_del_portapapeles": { - "modified": "2020-10-15T22:31:40.101Z", - "contributors": [ - "gato" - ] - }, - "Web/API/AbstractWorker": { - "modified": "2019-12-20T01:50:52.328Z", - "contributors": [ - "Kaliu", - "Gustavo_Armoa", - "AshWilliams" - ] - }, - "Web/API/Ambient_Light_Events": { - "modified": "2019-03-23T22:33:31.225Z", - "contributors": [ - "BubuAnabelas", - "RockoDev", - "guiller1998" - ] - }, - "Web/API/AnalyserNode": { - "modified": "2019-03-23T22:51:59.371Z", - "contributors": [ - "teoli", - "CarlosLinares" - ] - }, - "Web/API/Animation": { - "modified": "2020-10-15T21:57:43.283Z", - "contributors": [ - "AlePerez92", - "evaferreira", - "IngoBongo" - ] - }, - "Web/API/Animation/Animación": { - "modified": "2019-03-23T22:05:09.399Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/cancel": { - "modified": "2019-03-23T22:04:37.170Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/effect": { - "modified": "2019-03-18T21:15:31.270Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/finish": { - "modified": "2019-03-23T22:04:33.125Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/id": { - "modified": "2019-03-18T21:15:30.202Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/oncancel": { - "modified": "2019-03-23T22:05:09.237Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/onfinish": { - "modified": "2019-03-23T22:05:11.188Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/pause": { - "modified": "2020-10-15T21:58:07.078Z", - "contributors": [ - "AlePerez92", - "IngoBongo" - ] - }, - "Web/API/Animation/play": { - "modified": "2019-03-23T22:04:30.047Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/playState": { - "modified": "2019-03-23T22:05:06.415Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/playbackRate": { - "modified": "2019-03-23T22:05:12.184Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/ready": { - "modified": "2019-03-23T22:04:55.912Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/reverse": { - "modified": "2019-03-23T22:04:31.837Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/startTime": { - "modified": "2019-03-23T22:04:36.769Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/terminado": { - "modified": "2019-03-23T22:05:06.573Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/tiempoActual": { - "modified": "2019-03-23T22:05:12.506Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/Animation/timeline": { - "modified": "2019-03-23T22:04:30.790Z", - "contributors": [ - "IngoBongo" - ] - }, - "Web/API/AnimationEvent": { - "modified": "2019-03-23T22:31:58.545Z", - "contributors": [ - "fscholz", - "jzatarain", - "Vanessa85" - ] - }, - "Web/API/AnimationEvent/animationName": { - "modified": "2019-03-23T22:29:49.749Z", - "contributors": [ - "jzatarain" - ] - }, - "Web/API/Attr": { - "modified": "2020-04-04T11:16:16.397Z", - "contributors": [ - "MiguelHG2351", - "rayrojas", - "AlePerez92" - ] - }, - "Web/API/AudioBuffer": { - "modified": "2020-10-15T22:15:24.740Z", - "contributors": [ - "rayrojas" - ] - }, - "Web/API/AudioNode": { - "modified": "2020-10-15T22:15:25.198Z", - "contributors": [ - "rayrojas" - ] - }, - "Web/API/BaseAudioContext": { - "modified": "2019-03-18T21:00:34.809Z", - "contributors": [ - "SphinxKnight", - "miguelonce", - "chrisdavidmills" - ] - }, - "Web/API/BaseAudioContext/createBiquadFilter": { - "modified": "2019-03-23T22:04:57.563Z", - "contributors": [ - "GersonRosales" - ] - }, - "Web/API/BatteryManager": { - "modified": "2019-03-23T23:24:54.302Z", - "contributors": [ - "David_Marcos", - "maedca", - "sinfallas" - ] - }, - "Web/API/BatteryManager/charging": { - "modified": "2019-03-23T23:27:11.890Z", - "contributors": [ - "fscholz", - "Hasilt", - "LuisE" - ] - }, - "Web/API/BatteryManager/chargingTime": { - "modified": "2019-03-23T23:25:12.194Z", - "contributors": [ - "fscholz", - "palfrei" - ] - }, - "Web/API/BatteryManager/dischargingTime": { - "modified": "2019-03-23T23:27:15.312Z", - "contributors": [ - "fscholz", - "khalid32", - "LuisE" - ] - }, - "Web/API/BatteryManager/level": { - "modified": "2019-03-23T23:25:16.177Z", - "contributors": [ - "fscholz", - "eliezerb", - "maedca", - "David_Marcos", - "sinfallas", - "voylinux" - ] - }, - "Web/API/BatteryManager/onchargingchange": { - "modified": "2019-03-23T23:25:06.308Z", - "contributors": [ - "fscholz", - "Pau_Ilargia", - "voylinux" - ] - }, - "Web/API/BatteryManager/onlevelchange": { - "modified": "2019-03-23T23:25:08.174Z", - "contributors": [ - "fscholz", - "teoli", - "eliezerb", - "robertoasq", - "voylinux" - ] - }, - "Web/API/BeforeUnloadEvent": { - "modified": "2020-10-15T22:19:49.552Z", - "contributors": [ - "tuamigoxavi", - "matias981" - ] - }, - "Web/API/Blob": { - "modified": "2019-03-23T23:07:07.610Z", - "contributors": [ - "parzibyte", - "japho", - "fscholz", - "degrammer" - ] - }, - "Web/API/Blob/Blob": { - "modified": "2020-10-15T21:31:45.424Z", - "contributors": [ - "IsraelFloresDGA", - "BrodaNoel", - "fscholz", - "matajm" - ] - }, - "Web/API/Blob/type": { - "modified": "2019-03-23T22:06:34.982Z", - "contributors": [ - "BrodaNoel" - ] - }, - "Web/API/BlobBuilder": { - "modified": "2019-03-23T22:49:30.131Z", - "contributors": [ - "BrodaNoel", - "japho" - ] - }, - "Web/API/Body": { - "modified": "2020-10-15T22:17:35.545Z", - "contributors": [ - "SphinxKnight", - "bigblair81" - ] - }, - "Web/API/Body/formData": { - "modified": "2020-10-15T22:17:33.164Z", - "contributors": [ - "brauni800" - ] - }, - "Web/API/Body/json": { - "modified": "2020-10-15T22:29:20.361Z", - "contributors": [ - "camsa" - ] - }, - "Web/API/CSSRule": { - "modified": "2019-03-23T23:58:11.498Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/CSSRule/cssText": { - "modified": "2019-03-23T23:58:05.630Z", - "contributors": [ - "fscholz", - "arunpandianp", - "teoli", - "HenryGR" - ] - }, - "Web/API/CSSRule/parentStyleSheet": { - "modified": "2019-03-23T23:58:10.522Z", - "contributors": [ - "fscholz", - "arunpandianp", - "teoli", - "HenryGR" - ] - }, - "Web/API/CSSStyleDeclaration": { - "modified": "2019-03-23T22:44:46.721Z", - "contributors": [ - "guerratron" - ] - }, - "Web/API/CSSStyleRule": { - "modified": "2019-03-23T23:01:37.512Z", - "contributors": [ - "darioperez", - "fscholz" - ] - }, - "Web/API/CSSStyleRule/selectorText": { - "modified": "2019-03-23T23:58:12.055Z", - "contributors": [ - "fscholz", - "jsx", - "teoli", - "HenryGR" - ] - }, - "Web/API/CSSStyleSheet": { - "modified": "2019-03-23T23:58:09.423Z", - "contributors": [ - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/CSSStyleSheet/deleteRule": { - "modified": "2019-03-23T23:58:10.847Z", - "contributors": [ - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/CSSStyleSheet/insertRule": { - "modified": "2019-03-23T23:16:46.847Z", - "contributors": [ - "fscholz", - "LeoHirsch" - ] - }, - "Web/API/CSSStyleSheet/ownerRule": { - "modified": "2019-03-23T23:58:08.873Z", - "contributors": [ - "fscholz", - "khalid32", - "HenryGR" - ] - }, - "Web/API/CSS_Object_Model": { - "modified": "2019-03-23T22:01:23.472Z", - "contributors": [ - "dmelian" - ] - }, - "Web/API/CacheStorage": { - "modified": "2020-10-15T22:30:42.396Z", - "contributors": [ - "AprilSylph" - ] - }, - "Web/API/CacheStorage/keys": { - "modified": "2020-10-15T22:30:42.056Z", - "contributors": [ - "duduindo", - "ph4538157" - ] - }, - "Web/API/CanvasImageSource": { - "modified": "2019-03-23T22:09:10.185Z", - "contributors": [ - "alinarezrangel" - ] - }, - "Web/API/CanvasRenderingContext2D": { - "modified": "2019-03-23T22:54:41.294Z", - "contributors": [ - "rrodrigo", - "JoSaGuDu", - "iamwao", - "geodracs" - ] - }, - "Web/API/CanvasRenderingContext2D/arc": { - "modified": "2019-04-15T00:25:11.182Z", - "contributors": [ - "Rodrigo-Sanchez", - "Mancux2" - ] - }, - "Web/API/CanvasRenderingContext2D/beginPath": { - "modified": "2019-03-23T22:47:39.451Z", - "contributors": [ - "PepeBeat" - ] - }, - "Web/API/CanvasRenderingContext2D/clearRect": { - "modified": "2019-03-23T22:19:13.064Z", - "contributors": [ - "andrpueb" - ] - }, - "Web/API/CanvasRenderingContext2D/drawImage": { - "modified": "2019-03-23T22:47:09.124Z", - "contributors": [ - "iamwao" - ] - }, - "Web/API/CanvasRenderingContext2D/fillRect": { - "modified": "2019-03-23T22:32:43.881Z", - "contributors": [ - "eljonims" - ] - }, - "Web/API/CanvasRenderingContext2D/getImageData": { - "modified": "2020-10-15T22:03:53.553Z", - "contributors": [ - "LEUGIM99" - ] - }, - "Web/API/CanvasRenderingContext2D/lineCap": { - "modified": "2020-10-15T22:18:19.205Z", - "contributors": [ - "Ricardo_F." - ] - }, - "Web/API/CanvasRenderingContext2D/rotate": { - "modified": "2020-10-15T22:12:15.546Z", - "contributors": [ - "albertor21" - ] - }, - "Web/API/CanvasRenderingContext2D/save": { - "modified": "2020-10-15T22:23:30.799Z", - "contributors": [ - "feiss" - ] - }, - "Web/API/Canvas_API/Tutorial/Compositing": { - "modified": "2020-08-27T21:09:19.590Z", - "contributors": [ - "mastertrooper", - "stephaniehobson" - ] - }, - "Web/API/Canvas_API/Tutorial/Compositing/Ejemplo": { - "modified": "2019-03-18T21:36:04.043Z", - "contributors": [ - "lajaso" - ] - }, - "Web/API/ChildNode": { - "modified": "2019-03-29T14:12:39.589Z", - "contributors": [ - "jpmedley" - ] - }, - "Web/API/ChildNode/after": { - "modified": "2020-10-15T21:50:39.528Z", - "contributors": [ - "AlePerez92", - "SoftwareRVG" - ] - }, - "Web/API/ChildNode/before": { - "modified": "2019-03-23T22:23:28.772Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/ChildNode/remove": { - "modified": "2020-10-15T21:50:43.901Z", - "contributors": [ - "daniel.arango", - "teffcode", - "AlePerez92", - "SoftwareRVG" - ] - }, - "Web/API/ChildNode/replaceWith": { - "modified": "2019-03-23T22:23:34.633Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/ClipboardEvent": { - "modified": "2020-10-15T22:14:15.464Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/ClipboardEvent/clipboardData": { - "modified": "2020-10-15T22:14:15.340Z", - "contributors": [ - "Bumxu" - ] - }, - "Web/API/CloseEvent": { - "modified": "2020-11-24T05:35:48.408Z", - "contributors": [ - "netizen", - "jpmontoya182" - ] - }, - "Web/API/Comment": { - "modified": "2020-10-15T22:24:21.833Z", - "contributors": [ - "pablorebora" - ] - }, - "Web/API/Console": { - "modified": "2019-08-30T08:42:12.082Z", - "contributors": [ - "ajuanjojjj", - "fcanellas", - "vlguerrero", - "chrisdavidmills" - ] - }, - "Web/API/Console/count": { - "modified": "2019-03-23T22:07:26.644Z", - "contributors": [ - "deluxury", - "roberbnd" - ] - }, - "Web/API/Console/dir": { - "modified": "2020-11-11T11:46:41.122Z", - "contributors": [ - "jomoji", - "laloptk" - ] - }, - "Web/API/Console/dirxml": { - "modified": "2019-03-23T22:18:03.809Z", - "contributors": [ - "aeroxmotion" - ] - }, - "Web/API/Console/error": { - "modified": "2019-03-23T22:06:32.134Z", - "contributors": [ - "BrodaNoel" - ] - }, - "Web/API/Console/info": { - "modified": "2019-03-23T22:12:32.604Z", - "contributors": [ - "Lwissitoon" - ] - }, - "Web/API/Console/log": { - "modified": "2019-03-23T22:19:48.741Z", - "contributors": [ - "BrodaNoel", - "fcanellas" - ] - }, - "Web/API/Console/tabla": { - "modified": "2019-03-23T22:20:30.589Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Console/time": { - "modified": "2019-03-18T21:42:22.745Z", - "contributors": [ - "jotaoncode" - ] - }, - "Web/API/Console/timeEnd": { - "modified": "2020-10-15T22:13:11.825Z", - "contributors": [ - "xlhector10" - ] - }, - "Web/API/Console/trace": { - "modified": "2019-03-23T22:22:51.545Z", - "contributors": [ - "Axl-Nolasco" - ] - }, - "Web/API/Console/warn": { - "modified": "2020-10-15T21:53:36.780Z", - "contributors": [ - "juanluisrp", - "oderflaj" - ] - }, - "Web/API/Constraint_validation": { - "modified": "2019-04-22T15:33:44.796Z" - }, - "Web/API/Crypto": { - "modified": "2020-10-15T22:27:12.417Z", - "contributors": [ - "joseluisq" - ] - }, - "Web/API/Crypto/subtle": { - "modified": "2020-10-15T22:27:11.548Z", - "contributors": [ - "joseluisq" - ] - }, - "Web/API/CustomElementRegistry": { - "modified": "2020-10-15T22:29:44.444Z", - "contributors": [ - "alattalatta" - ] - }, - "Web/API/CustomElementRegistry/define": { - "modified": "2020-10-15T22:29:45.200Z", - "contributors": [ - "aguilerajl" - ] - }, - "Web/API/CustomEvent": { - "modified": "2020-10-15T21:56:03.240Z", - "contributors": [ - "fscholz", - "AlePerez92", - "daniville" - ] - }, - "Web/API/DOMError": { - "modified": "2020-10-15T21:34:32.594Z", - "contributors": [ - "fscholz", - "MauroEldritch" - ] - }, - "Web/API/DOMParser": { - "modified": "2019-03-23T22:20:06.466Z", - "contributors": [ - "rferraris" - ] - }, - "Web/API/DOMString": { - "modified": "2019-03-18T21:41:05.316Z", - "contributors": [ - "jagomf" - ] - }, - "Web/API/DOMString/Cadenas_binarias": { - "modified": "2020-08-29T03:33:22.030Z", - "contributors": [ - "Nachec" - ] - }, - "Web/API/DataTransfer": { - "modified": "2019-03-23T23:17:03.398Z", - "contributors": [ - "wbamberg", - "nmarmon", - "vmv", - "fscholz", - "yonatanalexis22" - ] - }, - "Web/API/Detecting_device_orientation": { - "modified": "2020-08-11T08:30:00.189Z", - "contributors": [ - "juancarlos.rmr", - "rayrojas", - "jairopezlo" - ] - }, - "Web/API/DeviceMotionEvent": { - "modified": "2020-10-15T22:22:26.832Z", - "contributors": [ - "miguelaup" - ] - }, - "Web/API/Document": { - "modified": "2019-10-10T16:52:49.015Z", - "contributors": [ - "luis.iglesias", - "AlejandroCordova", - "fscholz", - "Crash", - "DoctorRomi", - "Mgjbot", - "DR", - "Carlosds", - "Nathymig" - ] - }, - "Web/API/Document/URL": { - "modified": "2020-10-15T21:18:01.820Z", - "contributors": [ - "AlePerez92", - "fscholz", - "DR" - ] - }, - "Web/API/Document/abrir": { - "modified": "2020-10-15T22:31:23.051Z", - "contributors": [ - "WillieMensa" - ] - }, - "Web/API/Document/adoptNode": { - "modified": "2020-10-15T22:06:16.900Z", - "contributors": [ - "AlePerez92", - "InfaSysKey", - "ANDRUS74" - ] - }, - "Web/API/Document/alinkColor": { - "modified": "2019-03-23T23:46:52.743Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Document/anchors": { - "modified": "2020-10-15T21:18:02.380Z", - "contributors": [ - "roocce", - "fscholz", - "DR" - ] - }, - "Web/API/Document/applets": { - "modified": "2019-03-23T23:46:53.464Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Document/async": { - "modified": "2019-03-23T22:57:43.989Z", - "contributors": [ - "MauroEldritch" - ] - }, - "Web/API/Document/bgColor": { - "modified": "2019-03-23T23:46:48.550Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Document/body": { - "modified": "2019-03-23T23:47:18.556Z", - "contributors": [ - "MauroEldritch", - "fscholz", - "Markens", - "DR" - ] - }, - "Web/API/Document/characterSet": { - "modified": "2019-03-23T23:46:47.961Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Document/clear": { - "modified": "2019-03-23T22:27:12.101Z", - "contributors": [ - "pekechis" - ] - }, - "Web/API/Document/close": { - "modified": "2019-03-23T22:33:21.768Z", - "contributors": [ - "AitorRodriguez990" - ] - }, - "Web/API/Document/contentType": { - "modified": "2019-03-23T22:57:42.530Z", - "contributors": [ - "MauroEldritch" - ] - }, - "Web/API/Document/crearAtributo": { - "modified": "2020-10-15T21:55:08.825Z", - "contributors": [ - "rodririobo", - "juanseromo12", - "FenixAlive" - ] - }, - "Web/API/Document/createDocumentFragment": { - "modified": "2020-08-12T01:13:43.917Z", - "contributors": [ - "zgreco2000", - "msaglietto" - ] - }, - "Web/API/Document/createElement": { - "modified": "2019-09-19T04:18:24.578Z", - "contributors": [ - "AlePerez92", - "Juandresyn", - "aitorllj93", - "BrodaNoel", - "McSonk", - "malonson", - "AlejandroBlanco", - "daesnorey_xy", - "JoaquinGonzalez" - ] - }, - "Web/API/Document/createElementNS": { - "modified": "2019-03-23T22:23:11.141Z", - "contributors": [ - "ErikMj69" - ] - }, - "Web/API/Document/createRange": { - "modified": "2019-08-27T15:00:09.804Z", - "contributors": [ - "iarah", - "fscholz", - "jsx", - "Mgjbot", - "DR" - ] - }, - "Web/API/Document/createTextNode": { - "modified": "2020-10-15T22:17:21.251Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Document/defaultView": { - "modified": "2019-03-23T22:54:20.024Z", - "contributors": [ - "ArcangelZith" - ] - }, - "Web/API/Document/designMode": { - "modified": "2020-10-15T21:40:52.052Z", - "contributors": [ - "AlePerez92", - "sohereitcomes" - ] - }, - "Web/API/Document/dir": { - "modified": "2019-03-23T22:57:39.171Z", - "contributors": [ - "MauroEldritch" - ] - }, - "Web/API/Document/doctype": { - "modified": "2019-03-23T22:43:25.055Z", - "contributors": [ - "joselix" - ] - }, - "Web/API/Document/documentElement": { - "modified": "2019-03-23T23:50:27.852Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Document/documentURI": { - "modified": "2019-03-23T22:39:59.389Z", - "contributors": [ - "Zholary" - ] - }, - "Web/API/Document/documentURIObject": { - "modified": "2019-03-23T23:50:26.462Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Document/dragover_event": { - "modified": "2019-04-30T14:24:25.773Z", - "contributors": [ - "wbamberg", - "fscholz", - "ExE-Boss", - "Vickysolo" - ] - }, - "Web/API/Document/embeds": { - "modified": "2020-10-15T22:22:17.171Z", - "contributors": [ - "iarah" - ] - }, - "Web/API/Document/evaluate": { - "modified": "2019-03-23T22:10:41.891Z", - "contributors": [ - "bryan3561" - ] - }, - "Web/API/Document/execCommand": { - "modified": "2019-03-23T22:59:11.227Z", - "contributors": [ - "MarkelCuesta", - "asero82", - "javatlacati" - ] - }, - "Web/API/Document/exitFullscreen": { - "modified": "2020-10-15T22:23:56.627Z", - "contributors": [ - "davidmartinezfl" - ] - }, - "Web/API/Document/getElementById": { - "modified": "2019-03-23T23:46:23.291Z", - "contributors": [ - "Enesimus", - "jlpindado", - "pclifecl", - "OLiiver", - "fscholz", - "teoli", - "tuxisma", - "Juan c c q" - ] - }, - "Web/API/Document/getElementsByClassName": { - "modified": "2019-03-23T22:48:57.077Z", - "contributors": [ - "JuanMacias", - "JungkookScript", - "ncaracci" - ] - }, - "Web/API/Document/getElementsByName": { - "modified": "2019-03-18T21:37:32.461Z", - "contributors": [ - "MikeGsus" - ] - }, - "Web/API/Document/getElementsByTagName": { - "modified": "2019-03-23T23:50:32.110Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "teoli", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Document/getElementsByTagNameNS": { - "modified": "2019-03-23T23:50:38.494Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "AlejandroSilva", - "leopic", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Document/getSelection": { - "modified": "2019-03-23T22:54:50.239Z", - "contributors": [ - "Diferno" - ] - }, - "Web/API/Document/hasFocus": { - "modified": "2019-03-23T23:53:13.498Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "Mgjbot", - "Talisker", - "HenryGR" - ] - }, - "Web/API/Document/head": { - "modified": "2019-03-23T22:55:43.504Z", - "contributors": [ - "federicobond" - ] - }, - "Web/API/Document/height": { - "modified": "2019-03-23T22:09:21.631Z", - "contributors": [ - "HarleySG" - ] - }, - "Web/API/Document/hidden": { - "modified": "2020-10-15T22:14:24.023Z", - "contributors": [ - "Elenito93" - ] - }, - "Web/API/Document/importNode": { - "modified": "2020-10-15T21:52:00.631Z", - "contributors": [ - "fscholz", - "wbamberg", - "AsLogd" - ] - }, - "Web/API/Document/keydown_event": { - "modified": "2020-04-03T23:31:41.800Z", - "contributors": [ - "camsa", - "irenesmith", - "ExE-Boss", - "fscholz", - "juan-ferrer-toribio" - ] - }, - "Web/API/Document/keyup_event": { - "modified": "2019-04-18T03:50:20.204Z", - "contributors": [ - "irenesmith", - "ExE-Boss", - "fscholz", - "gabojkz" - ] - }, - "Web/API/Document/pointerLockElement": { - "modified": "2019-03-23T22:05:31.350Z", - "contributors": [ - "arquigames" - ] - }, - "Web/API/Document/querySelector": { - "modified": "2019-03-23T22:58:51.923Z", - "contributors": [ - "BrodaNoel", - "Luis_Calvo", - "dannysalazar90" - ] - }, - "Web/API/Document/querySelectorAll": { - "modified": "2020-10-15T21:34:24.234Z", - "contributors": [ - "chrisdavidmills", - "AlePerez92", - "padrecedano", - "lfottaviano", - "joeljose" - ] - }, - "Web/API/Document/readyState": { - "modified": "2019-03-23T22:46:17.268Z", - "contributors": [ - "Codejobs" - ] - }, - "Web/API/Document/registerElement": { - "modified": "2019-03-23T22:58:15.536Z", - "contributors": [ - "SphinxKnight", - "AlePerez92", - "mclo", - "chrisdavidmills" - ] - }, - "Web/API/Document/scripts": { - "modified": "2019-03-23T22:57:42.662Z", - "contributors": [ - "MauroEldritch" - ] - }, - "Web/API/Document/scroll_event": { - "modified": "2020-04-13T22:20:51.709Z", - "contributors": [ - "camsa", - "irenesmith", - "ExE-Boss", - "arkgast", - "fscholz", - "PatoDeTuring", - "Thargelion" - ] - }, - "Web/API/Document/styleSheets": { - "modified": "2019-03-23T23:58:05.224Z", - "contributors": [ - "fscholz", - "jsx", - "teoli", - "HenryGR" - ] - }, - "Web/API/Document/write": { - "modified": "2019-03-23T22:26:37.503Z", - "contributors": [ - "JohnnyKB", - "bastiantowers" - ] - }, - "Web/API/Document/writeln": { - "modified": "2019-03-23T22:21:05.956Z", - "contributors": [ - "mauroc8" - ] - }, - "Web/API/DocumentFragment": { - "modified": "2020-10-15T22:29:37.426Z", - "contributors": [ - "JooseNavarro" - ] - }, - "Web/API/Document_object_model/Using_the_W3C_DOM_Level_1_Core/Example": { - "modified": "2019-03-23T22:06:28.946Z", - "contributors": [ - "BrodaNoel" - ] - }, - "Web/API/DragEvent": { - "modified": "2020-11-04T23:21:08.729Z", - "contributors": [ - "AngelFQC" - ] - }, - "Web/API/Element": { - "modified": "2019-03-24T00:06:42.464Z", - "contributors": [ - "carllewisc", - "JuanMacias", - "SphinxKnight", - "fscholz", - "teoli", - "webmaster", - "AshfaqHossain", - "MARCASTELEON", - "Markens", - "Mgjbot", - "Nathymig" - ] - }, - "Web/API/Element/accessKey": { - "modified": "2019-03-23T22:26:12.172Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/animate": { - "modified": "2019-03-23T22:26:03.841Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/attachShadow": { - "modified": "2020-10-15T22:29:44.635Z", - "contributors": [ - "aguilerajl" - ] - }, - "Web/API/Element/attributes": { - "modified": "2019-03-23T22:32:35.186Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Element/classList": { - "modified": "2019-08-07T11:56:45.170Z", - "contributors": [ - "AlePerez92", - "alkaithil", - "luispuchades" - ] - }, - "Web/API/Element/className": { - "modified": "2019-03-23T22:32:39.589Z", - "contributors": [ - "AlePerez92", - "Grijander81" - ] - }, - "Web/API/Element/click_event": { - "modified": "2019-03-18T20:47:32.813Z", - "contributors": [ - "irenesmith", - "ExE-Boss", - "fscholz", - "jvas28" - ] - }, - "Web/API/Element/clientHeight": { - "modified": "2019-03-18T20:59:01.264Z", - "contributors": [ - "SphinxKnight", - "maxijb", - "germanfr" - ] - }, - "Web/API/Element/clientLeft": { - "modified": "2019-03-23T23:50:22.640Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Element/clientTop": { - "modified": "2019-03-23T23:50:18.628Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "AshfaqHossain", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Element/clientWidth": { - "modified": "2020-10-15T21:46:17.283Z", - "contributors": [ - "SphinxKnight", - "Grijander81" - ] - }, - "Web/API/Element/closest": { - "modified": "2020-10-15T21:51:29.500Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Element/computedStyleMap": { - "modified": "2020-11-20T23:32:12.573Z", - "contributors": [ - "mrkadium" - ] - }, - "Web/API/Element/currentStyle": { - "modified": "2019-03-23T22:26:01.738Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/getAttribute": { - "modified": "2019-03-23T22:55:05.590Z", - "contributors": [ - "germanfr", - "hawkins" - ] - }, - "Web/API/Element/getAttributeNodeNS": { - "modified": "2019-03-18T21:40:41.705Z", - "contributors": [ - "FcoJavierEsc" - ] - }, - "Web/API/Element/getBoundingClientRect": { - "modified": "2020-10-15T21:16:26.376Z", - "contributors": [ - "AlePerez92", - "slam", - "cristianmartinez", - "SphinxKnight", - "joseanpg", - "jzatarain", - "fscholz", - "jsx", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Element/getClientRects": { - "modified": "2019-03-23T23:50:31.325Z", - "contributors": [ - "SphinxKnight", - "edhzsz", - "fscholz", - "khalid32", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Element/getElementsByClassName": { - "modified": "2019-03-23T22:32:46.843Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Element/getElementsByTagName": { - "modified": "2019-03-23T23:53:30.735Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "Mgjbot", - "HenryGR" - ] - }, - "Web/API/Element/getElementsByTagNameNS": { - "modified": "2019-03-18T21:15:33.018Z", - "contributors": [ - "cguimaraenz" - ] - }, - "Web/API/Element/hasAttribute": { - "modified": "2019-03-23T22:12:50.721Z", - "contributors": [ - "ElChiniNet" - ] - }, - "Web/API/Element/id": { - "modified": "2019-03-23T22:26:11.048Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/innerHTML": { - "modified": "2019-03-18T20:58:51.922Z", - "contributors": [ - "SphinxKnight", - "IsaacAaron", - "BrodaNoel", - "CristhianLora1", - "fscholz", - "teoli", - "JAparici" - ] - }, - "Web/API/Element/insertAdjacentElement": { - "modified": "2020-12-03T10:36:12.400Z", - "contributors": [ - "AlePerez92", - "alexlndn", - "AgustinPrieto" - ] - }, - "Web/API/Element/insertAdjacentHTML": { - "modified": "2020-10-15T21:56:01.516Z", - "contributors": [ - "AlePerez92", - "mikekrn" - ] - }, - "Web/API/Element/localName": { - "modified": "2019-03-23T22:26:08.984Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/matches": { - "modified": "2020-12-06T16:23:07.481Z", - "contributors": [ - "AlePerez92", - "amIsmael", - "nbouvrette", - "Grijander81" - ] - }, - "Web/API/Element/mousedown_event": { - "modified": "2019-03-18T20:41:57.554Z", - "contributors": [ - "irenesmith", - "ExE-Boss", - "fscholz", - "marydn" - ] - }, - "Web/API/Element/name": { - "modified": "2019-03-23T22:26:11.317Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/namespaceURI": { - "modified": "2019-03-23T22:25:51.573Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/ongotpointercapture": { - "modified": "2019-03-23T22:25:49.346Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/onlostpointercapture": { - "modified": "2019-03-23T22:25:49.190Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/onwheel": { - "modified": "2019-03-18T21:09:09.483Z", - "contributors": [ - "fscholz", - "SoftwareRVG" - ] - }, - "Web/API/Element/outerHTML": { - "modified": "2019-03-23T22:32:38.203Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Element/prefix": { - "modified": "2019-03-23T22:25:56.753Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/querySelector": { - "modified": "2020-10-01T13:45:10.425Z", - "contributors": [ - "Augusto-Ruiz", - "Luis_Calvo", - "Fx-Enlcxx" - ] - }, - "Web/API/Element/removeAttribute": { - "modified": "2019-03-23T22:32:43.147Z", - "contributors": [ - "AlePerez92", - "Grijander81" - ] - }, - "Web/API/Element/requestFullScreen": { - "modified": "2019-03-23T22:46:59.466Z", - "contributors": [ - "joseamn1" - ] - }, - "Web/API/Element/runtimeStyle": { - "modified": "2019-03-23T22:25:35.378Z", - "contributors": [ - "SoftwareRVG" - ] - }, - "Web/API/Element/scrollHeight": { - "modified": "2020-09-19T11:38:52.843Z", - "contributors": [ - "amfolgar", - "SphinxKnight", - "SoftwareRVG" - ] - }, - "Web/API/Element/scrollIntoView": { - "modified": "2020-08-02T20:51:14.523Z", - "contributors": [ - "maketas", - "avaleriani", - "magorismagor", - "germanfr" - ] - }, - "Web/API/Element/scrollLeft": { - "modified": "2019-03-18T20:59:11.327Z", - "contributors": [ - "SphinxKnight", - "SoftwareRVG" - ] - }, - "Web/API/Element/scrollTop": { - "modified": "2019-03-23T22:32:41.577Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Element/scrollTopMax": { - "modified": "2019-03-23T22:16:03.156Z", - "contributors": [ - "lizzie136" - ] - }, - "Web/API/Element/scrollWidth": { - "modified": "2020-10-15T21:46:17.244Z", - "contributors": [ - "SphinxKnight", - "Grijander81" - ] - }, - "Web/API/Element/setAttribute": { - "modified": "2019-03-23T23:58:09.577Z", - "contributors": [ - "AlePerez92", - "fscholz", - "AshfaqHossain", - "teoli", - "HenryGR" - ] - }, - "Web/API/Element/setAttributeNS": { - "modified": "2019-03-23T22:29:35.252Z", - "contributors": [ - "developersoul" - ] - }, - "Web/API/Element/setCapture": { - "modified": "2019-03-23T22:23:40.163Z", - "contributors": [ - "wbamberg", - "SoftwareRVG" - ] - }, - "Web/API/Element/shadowRoot": { - "modified": "2020-10-15T22:21:04.049Z", - "contributors": [ - "quintero_japon" - ] - }, - "Web/API/Element/tagName": { - "modified": "2019-03-23T23:53:26.081Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "Mgjbot", - "HenryGR" - ] - }, - "Web/API/Element/wheel_event": { - "modified": "2019-04-08T07:24:47.493Z", - "contributors": [ - "irenesmith", - "fscholz", - "ExE-Boss", - "dimuziop", - "Thargelion", - "PRDeving" - ] - }, - "Web/API/ElementosHTMLparaVideo": { - "modified": "2019-06-22T13:44:40.927Z", - "contributors": [ - "Santi72Alc", - "myrnafig" - ] - }, - "Web/API/Event": { - "modified": "2019-03-24T00:00:03.889Z", - "contributors": [ - "wbamberg", - "jesmarquez", - "fscholz", - "cesardelahoz", - "Mgjbot", - "Markens", - "DR", - "Nathymig" - ] - }, - "Web/API/Event/Event": { - "modified": "2020-10-15T21:51:25.582Z", - "contributors": [ - "fscholz", - "malonson" - ] - }, - "Web/API/Event/bubbles": { - "modified": "2019-03-23T23:50:25.843Z", - "contributors": [ - "SphinxKnight", - "DeiberChacon", - "fscholz", - "khalid32", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Event/cancelable": { - "modified": "2019-03-23T23:53:29.694Z", - "contributors": [ - "fscholz", - "hardhik", - "AshfaqHossain", - "Mgjbot", - "HenryGR" - ] - }, - "Web/API/Event/createEvent": { - "modified": "2019-03-23T22:01:26.841Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Event/currentTarget": { - "modified": "2020-10-15T21:56:21.779Z", - "contributors": [ - "AlePerez92", - "KacosPro", - "roberbnd" - ] - }, - "Web/API/Event/defaultPrevented": { - "modified": "2019-03-23T23:06:29.767Z", - "contributors": [ - "AlePerez92", - "fscholz", - "matajm" - ] - }, - "Web/API/Event/initEvent": { - "modified": "2019-03-23T23:53:14.885Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "AndresSaa", - "AshfaqHossain", - "Mgjbot", - "HenryGR" - ] - }, - "Web/API/Event/preventDefault": { - "modified": "2019-03-23T23:53:27.022Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "Mgjbot", - "HenryGR" - ] - }, - "Web/API/Event/stopPropagation": { - "modified": "2019-03-18T20:37:26.213Z", - "contributors": [ - "sebaLinares", - "theskear", - "AlePerez92" - ] - }, - "Web/API/Event/target": { - "modified": "2020-11-21T17:52:42.977Z", - "contributors": [ - "fernandoarmonellifiedler", - "luchosr", - "Eyurivilc", - "roberbnd" - ] - }, - "Web/API/Event/type": { - "modified": "2020-10-15T21:21:03.258Z", - "contributors": [ - "AlePerez92", - "javier1nc", - "fscholz", - "Chacho" - ] - }, - "Web/API/EventListener": { - "modified": "2019-03-23T22:49:37.176Z", - "contributors": [ - "gdlm91", - "japho" - ] - }, - "Web/API/EventSource": { - "modified": "2019-03-23T22:10:23.912Z", - "contributors": [ - "Jabi" - ] - }, - "Web/API/EventSource/onopen": { - "modified": "2019-03-23T22:03:59.180Z", - "contributors": [ - "Hoosep" - ] - }, - "Web/API/EventTarget": { - "modified": "2020-10-26T17:08:31.808Z", - "contributors": [ - "Ktoxcon", - "diazpolanco13", - "jorgeherrera9103", - "fscholz" - ] - }, - "Web/API/EventTarget/addEventListener": { - "modified": "2020-10-24T17:14:12.317Z", - "contributors": [ - "codesandtags", - "wbamberg", - "padrecedano", - "LuxDie", - "juanbrujo", - "StripTM", - "fscholz", - "samurai-code", - "Josias", - "edulon", - "Chacho" - ] - }, - "Web/API/EventTarget/dispatchEvent": { - "modified": "2020-05-25T14:53:28.357Z", - "contributors": [ - "OneLoneFox", - "SphinxKnight", - "fscholz", - "jsx", - "teoli", - "Mgjbot", - "HenryGR" - ] - }, - "Web/API/EventTarget/removeEventListener": { - "modified": "2020-10-15T21:33:28.829Z", - "contributors": [ - "IsraelFloresDGA", - "everblut", - "cmadrono" - ] - }, - "Web/API/FetchEvent": { - "modified": "2020-11-15T12:19:50.961Z", - "contributors": [ - "kuntur-studio", - "pavilion", - "fasalgad" - ] - }, - "Web/API/Fetch_API": { - "modified": "2020-10-15T21:38:02.526Z", - "contributors": [ - "PacoVela", - "SSantiago90", - "erpheus", - "AlePerez92", - "robermorales", - "jmcarnero", - "enlinea777" - ] - }, - "Web/API/Fetch_API/Conceptos_basicos": { - "modified": "2019-03-18T21:24:00.327Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/API/Fetch_API/Utilizando_Fetch": { - "modified": "2020-10-15T21:51:23.613Z", - "contributors": [ - "arturojimenezmedia", - "camsa", - "jccuevas", - "MateoVelilla", - "crimoniv", - "danielM9521", - "SphinxKnight", - "Ruluk", - "jpuerto", - "baumannzone", - "anjerago", - "icedrek", - "royexr", - "AlePerez92" - ] - }, - "Web/API/File": { - "modified": "2020-10-15T21:37:53.420Z", - "contributors": [ - "IsraelFloresDGA", - "mattkgross", - "AshWilliams" - ] - }, - "Web/API/File/Using_files_from_web_applications": { - "modified": "2019-03-24T00:06:11.527Z", - "contributors": [ - "chrisdavidmills", - "israelfl", - "pacommozilla", - "teoli", - "mare", - "Izel" - ] - }, - "Web/API/File/fileName": { - "modified": "2020-02-09T09:40:59.258Z", - "contributors": [ - "blanchart", - "IsraelFloresDGA", - "BrodaNoel" - ] - }, - "Web/API/File/lastModifiedDate": { - "modified": "2019-03-23T22:06:34.338Z", - "contributors": [ - "BrodaNoel" - ] - }, - "Web/API/File/name": { - "modified": "2020-10-15T21:56:43.088Z", - "contributors": [ - "IsraelFloresDGA", - "BrodaNoel" - ] - }, - "Web/API/File/type": { - "modified": "2020-10-15T22:26:46.640Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/API/File/webkitRelativePath": { - "modified": "2019-03-23T22:06:35.128Z", - "contributors": [ - "BrodaNoel" - ] - }, - "Web/API/FileError": { - "modified": "2019-03-23T22:51:12.244Z", - "contributors": [ - "Jarvanux" - ] - }, - "Web/API/FileReader": { - "modified": "2019-03-23T23:04:14.656Z", - "contributors": [ - "JuanjoVlado", - "V.Morantes", - "israelfl", - "Carlos-T", - "Clunaenc", - "fscholz", - "cm_rocanroll" - ] - }, - "Web/API/FileReader/onload": { - "modified": "2019-03-23T22:18:25.451Z", - "contributors": [ - "DaniMartiRamirez" - ] - }, - "Web/API/FileReader/readAsArrayBuffer": { - "modified": "2019-03-23T22:49:37.062Z", - "contributors": [ - "MarcoZepeda" - ] - }, - "Web/API/FileReader/readAsDataURL": { - "modified": "2019-03-23T22:48:53.339Z", - "contributors": [ - "teoli", - "empirreamm", - "developersoul" - ] - }, - "Web/API/FileReader/readAsText": { - "modified": "2019-03-23T22:11:54.836Z", - "contributors": [ - "owaremx" - ] - }, - "Web/API/FileReader/result": { - "modified": "2020-10-15T22:16:53.945Z", - "contributors": [ - "carlosbulnes" - ] - }, - "Web/API/FileSystem": { - "modified": "2019-07-04T14:31:32.136Z", - "contributors": [ - "lperezp", - "jpmontoya182" - ] - }, - "Web/API/Fullscreen_API": { - "modified": "2019-03-23T22:19:43.566Z", - "contributors": [ - "wbamberg", - "israel-munoz" - ] - }, - "Web/API/GamepadButton": { - "modified": "2020-10-15T22:31:36.770Z", - "contributors": [ - "kenliten" - ] - }, - "Web/API/Gamepad_API": { - "modified": "2020-10-15T22:24:50.048Z", - "contributors": [ - "LeonEmil" - ] - }, - "Web/API/Geolocation": { - "modified": "2019-03-23T23:21:41.383Z", - "contributors": [ - "AlePerez92", - "fscholz", - "AJMG" - ] - }, - "Web/API/Geolocation/clearWatch": { - "modified": "2019-03-23T23:21:31.757Z", - "contributors": [ - "franklevel", - "fscholz", - "AJMG" - ] - }, - "Web/API/Geolocation/getCurrentPosition": { - "modified": "2019-03-23T23:21:46.266Z", - "contributors": [ - "AlePerez92", - "fscholz", - "lupomontero", - "AJMG" - ] - }, - "Web/API/Geolocation/watchPosition": { - "modified": "2019-03-23T23:21:44.720Z", - "contributors": [ - "AlePerez92", - "fscholz", - "AJMG" - ] - }, - "Web/API/GeolocationCoordinates": { - "modified": "2019-12-10T09:34:21.214Z", - "contributors": [ - "chrisdavidmills", - "AlePerez92" - ] - }, - "Web/API/GeolocationCoordinates/latitude": { - "modified": "2019-12-10T09:34:21.409Z", - "contributors": [ - "chrisdavidmills", - "elxris" - ] - }, - "Web/API/GeolocationPosition": { - "modified": "2020-10-15T22:10:48.604Z", - "contributors": [ - "chrisdavidmills", - "sergitxu" - ] - }, - "Web/API/GlobalEventHandlers": { - "modified": "2020-10-15T21:33:09.443Z", - "contributors": [ - "Nachec", - "fscholz" - ] - }, - "Web/API/GlobalEventHandlers/onblur": { - "modified": "2019-03-23T22:33:17.308Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/GlobalEventHandlers/onchange": { - "modified": "2019-03-23T22:18:11.571Z", - "contributors": [ - "gama" - ] - }, - "Web/API/GlobalEventHandlers/onclick": { - "modified": "2019-08-28T11:37:06.287Z", - "contributors": [ - "J-Lobo", - "Noreen", - "gama" - ] - }, - "Web/API/GlobalEventHandlers/onclose": { - "modified": "2020-10-15T22:12:16.407Z", - "contributors": [ - "alexisrazok" - ] - }, - "Web/API/GlobalEventHandlers/onerror": { - "modified": "2019-03-23T22:53:42.268Z", - "contributors": [ - "wbamberg", - "galegosimpatico" - ] - }, - "Web/API/GlobalEventHandlers/onfocus": { - "modified": "2019-03-18T21:31:41.059Z", - "contributors": [ - "ANDRUS74" - ] - }, - "Web/API/GlobalEventHandlers/oninput": { - "modified": "2019-03-23T22:55:01.733Z", - "contributors": [ - "Diegosolo" - ] - }, - "Web/API/GlobalEventHandlers/onkeydown": { - "modified": "2019-03-18T21:31:44.954Z", - "contributors": [ - "ANDRUS74" - ] - }, - "Web/API/GlobalEventHandlers/onkeyup": { - "modified": "2019-03-18T21:31:50.304Z", - "contributors": [ - "ANDRUS74" - ] - }, - "Web/API/GlobalEventHandlers/onload": { - "modified": "2019-03-23T23:33:14.527Z", - "contributors": [ - "fscholz", - "khalid32", - "ehecatl" - ] - }, - "Web/API/GlobalEventHandlers/onloadedmetadata": { - "modified": "2020-10-15T22:34:40.071Z", - "contributors": [ - "winxde" - ] - }, - "Web/API/GlobalEventHandlers/onresize": { - "modified": "2019-03-23T22:38:35.801Z", - "contributors": [ - "NevinSantana" - ] - }, - "Web/API/GlobalEventHandlers/onscroll": { - "modified": "2019-03-23T22:33:14.134Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/GlobalEventHandlers/onselect": { - "modified": "2019-03-23T22:33:14.413Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/GlobalEventHandlers/onselectstart": { - "modified": "2019-03-18T21:23:16.974Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/GlobalEventHandlers/onsubmit": { - "modified": "2019-03-18T21:31:41.533Z", - "contributors": [ - "ANDRUS74" - ] - }, - "Web/API/GlobalEventHandlers/ontouchstart": { - "modified": "2019-03-23T22:32:02.059Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/GlobalEventHandlers/onunload": { - "modified": "2019-03-23T23:39:28.498Z", - "contributors": [ - "fscholz", - "khalid32", - "Sheppy" - ] - }, - "Web/API/HTMLAnchorElement": { - "modified": "2019-03-18T21:42:27.257Z", - "contributors": [ - "BubuAnabelas", - "LUISTGMDN" - ] - }, - "Web/API/HTMLAudioElement": { - "modified": "2019-03-24T00:05:48.645Z", - "contributors": [ - "wbamberg", - "fscholz", - "teoli", - "inma_610" - ] - }, - "Web/API/HTMLCanvasElement": { - "modified": "2019-03-23T22:50:27.840Z", - "contributors": [ - "AshWilliams" - ] - }, - "Web/API/HTMLCanvasElement/getContext": { - "modified": "2019-03-23T22:18:36.564Z", - "contributors": [ - "OrlandoIsay" - ] - }, - "Web/API/HTMLCanvasElement/height": { - "modified": "2019-03-23T22:47:48.394Z", - "contributors": [ - "empirreamm" - ] - }, - "Web/API/HTMLCanvasElement/toBlob": { - "modified": "2019-03-23T22:44:55.955Z", - "contributors": [ - "kodamirmo" - ] - }, - "Web/API/HTMLCanvasElement/toDataURL": { - "modified": "2020-10-15T21:38:42.950Z", - "contributors": [ - "jagomf", - "calmsz", - "genuinefafa", - "empirreamm" - ] - }, - "Web/API/HTMLCanvasElement/width": { - "modified": "2019-03-23T22:47:52.236Z", - "contributors": [ - "empirreamm" - ] - }, - "Web/API/HTMLCollection": { - "modified": "2020-10-15T21:37:48.821Z", - "contributors": [ - "AlePerez92", - "diego_bardelas", - "kromsoft", - "djrm" - ] - }, - "Web/API/HTMLContentElement": { - "modified": "2019-03-23T22:10:28.345Z", - "contributors": [ - "dkocho4" - ] - }, - "Web/API/HTMLContentElement/getDistributedNodes": { - "modified": "2019-03-23T22:10:26.488Z", - "contributors": [ - "dkocho4" - ] - }, - "Web/API/HTMLContentElement/select": { - "modified": "2019-03-23T22:10:36.116Z", - "contributors": [ - "dkocho4" - ] - }, - "Web/API/HTMLDivElement": { - "modified": "2019-03-23T22:03:41.348Z", - "contributors": [ - "jonvadillo" - ] - }, - "Web/API/HTMLElement": { - "modified": "2020-06-20T19:45:51.700Z", - "contributors": [ - "hernandoh", - "hpintos", - "fscholz" - ] - }, - "Web/API/HTMLElement/change_event": { - "modified": "2020-10-15T22:17:42.425Z", - "contributors": [ - "IsraelFloresDGA", - "AlePerez92" - ] - }, - "Web/API/HTMLElement/click": { - "modified": "2020-10-15T21:59:51.355Z", - "contributors": [ - "hecaxmmx", - "mtnalonso" - ] - }, - "Web/API/HTMLElement/contentEditable": { - "modified": "2020-10-15T22:23:54.889Z", - "contributors": [ - "lauramacdaleno" - ] - }, - "Web/API/HTMLElement/dataset": { - "modified": "2020-10-15T22:06:35.887Z", - "contributors": [ - "OneLoneFox", - "PacoVela", - "ultraklon", - "pipepico", - "AlePerez92" - ] - }, - "Web/API/HTMLElement/focus": { - "modified": "2020-10-15T21:51:27.517Z", - "contributors": [ - "IsraelFloresDGA", - "AlePerez92", - "jesumv" - ] - }, - "Web/API/HTMLElement/innerText": { - "modified": "2020-10-15T22:31:46.481Z", - "contributors": [ - "hugojavierduran9" - ] - }, - "Web/API/HTMLElement/input_event": { - "modified": "2020-10-15T22:17:41.989Z", - "contributors": [ - "mariomoreno", - "IsraelFloresDGA" - ] - }, - "Web/API/HTMLElement/offsetHeight": { - "modified": "2019-04-30T12:33:07.062Z", - "contributors": [ - "AlePerez92", - "SphinxKnight", - "germanfr" - ] - }, - "Web/API/HTMLElement/offsetLeft": { - "modified": "2019-03-18T20:59:09.140Z", - "contributors": [ - "SphinxKnight", - "gama" - ] - }, - "Web/API/HTMLElement/offsetParent": { - "modified": "2020-10-15T22:11:55.510Z", - "contributors": [ - "Vincetroid" - ] - }, - "Web/API/HTMLElement/offsetTop": { - "modified": "2020-10-15T21:46:16.171Z", - "contributors": [ - "SphinxKnight", - "santinogue", - "Grijander81" - ] - }, - "Web/API/HTMLElement/offsetWidth": { - "modified": "2020-10-15T21:50:38.562Z", - "contributors": [ - "SphinxKnight", - "Facu50196", - "jvas28" - ] - }, - "Web/API/HTMLElement/style": { - "modified": "2019-03-23T23:58:09.934Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/HTMLFormElement": { - "modified": "2019-03-23T23:46:38.218Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "DR", - "Nathymig" - ] - }, - "Web/API/HTMLFormElement/reset": { - "modified": "2020-11-28T13:27:49.559Z", - "contributors": [ - "hiperion" - ] - }, - "Web/API/HTMLHeadElement": { - "modified": "2020-10-15T22:31:07.133Z", - "contributors": [ - "jhonarielgj" - ] - }, - "Web/API/HTMLHtmlElement": { - "modified": "2019-03-23T22:27:47.579Z", - "contributors": [ - "raecillacastellana" - ] - }, - "Web/API/HTMLImageElement": { - "modified": "2019-03-23T22:42:00.195Z", - "contributors": [ - "thzunder" - ] - }, - "Web/API/HTMLImageElement/Image": { - "modified": "2019-03-23T22:12:14.962Z", - "contributors": [ - "gabo32", - "Jhandrox" - ] - }, - "Web/API/HTMLInputElement": { - "modified": "2020-08-25T19:55:45.034Z", - "contributors": [ - "duduindo", - "Enesimus", - "chrisdavidmills" - ] - }, - "Web/API/HTMLInputElement/invalid_event": { - "modified": "2019-04-30T13:47:32.409Z", - "contributors": [ - "wbamberg", - "estelle", - "IsraelFloresDGA" - ] - }, - "Web/API/HTMLInputElement/select": { - "modified": "2019-03-18T21:34:04.996Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/HTMLLIElement": { - "modified": "2019-03-23T22:21:38.998Z", - "contributors": [ - "elxris", - "bardcrack" - ] - }, - "Web/API/HTMLLabelElement": { - "modified": "2020-10-15T22:11:47.827Z", - "contributors": [ - "BubuAnabelas", - "mym2013" - ] - }, - "Web/API/HTMLMediaElement": { - "modified": "2020-10-15T22:13:56.798Z", - "contributors": [ - "mannypinillo" - ] - }, - "Web/API/HTMLMediaElement/canplay_event": { - "modified": "2019-03-18T20:49:26.430Z", - "contributors": [ - "estelle", - "ExE-Boss", - "fscholz", - "jjoselon" - ] - }, - "Web/API/HTMLMediaElement/loadeddata_event": { - "modified": "2020-10-15T22:25:54.605Z", - "contributors": [ - "NEVITS" - ] - }, - "Web/API/HTMLMediaElement/pause": { - "modified": "2020-10-15T22:24:10.390Z", - "contributors": [ - "chekoNava" - ] - }, - "Web/API/HTMLMediaElement/paused": { - "modified": "2020-10-15T22:24:09.151Z", - "contributors": [ - "chekoNava" - ] - }, - "Web/API/HTMLMediaElement/play": { - "modified": "2020-10-15T22:24:04.866Z", - "contributors": [ - "chekoNava" - ] - }, - "Web/API/HTMLMediaElement/timeupdate_event": { - "modified": "2019-03-18T20:49:28.173Z", - "contributors": [ - "estelle", - "ExE-Boss", - "fscholz", - "baldore" - ] - }, - "Web/API/HTMLSelectElement": { - "modified": "2020-10-15T22:06:34.378Z", - "contributors": [ - "wbamberg" - ] - }, - "Web/API/HTMLSelectElement/checkValidity": { - "modified": "2020-10-15T22:06:33.300Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/HTMLSelectElement/setCustomValidity": { - "modified": "2020-10-15T22:21:29.656Z", - "contributors": [ - "raul-arias" - ] - }, - "Web/API/HTMLShadowElement": { - "modified": "2019-03-23T22:10:24.059Z", - "contributors": [ - "dkocho4", - "Sebastianz" - ] - }, - "Web/API/HTMLShadowElement/getDistributedNodes": { - "modified": "2019-03-23T22:10:23.317Z", - "contributors": [ - "dkocho4" - ] - }, - "Web/API/HTMLStyleElement": { - "modified": "2019-03-24T00:07:06.618Z", - "contributors": [ - "fscholz", - "lcamacho", - "DoctorRomi", - "HenryGR", - "Markens", - "Nathymig" - ] - }, - "Web/API/HTMLTableElement": { - "modified": "2019-03-23T23:46:43.890Z", - "contributors": [ - "fscholz", - "khalid32", - "ethertank", - "DR", - "M3n3chm0", - "Nathymig" - ] - }, - "Web/API/HTMLTableElement/align": { - "modified": "2019-03-23T22:32:48.061Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/HTMLTableElement/insertRow": { - "modified": "2019-03-23T22:32:47.103Z", - "contributors": [ - "lalo", - "Grijander81" - ] - }, - "Web/API/Headers": { - "modified": "2020-10-15T22:07:38.324Z", - "contributors": [ - "Estebanrg21" - ] - }, - "Web/API/History": { - "modified": "2020-10-15T22:28:24.964Z", - "contributors": [ - "alattalatta" - ] - }, - "Web/API/History/length": { - "modified": "2020-10-15T22:34:59.646Z", - "contributors": [ - "cajotafer" - ] - }, - "Web/API/History/pushState": { - "modified": "2020-10-15T22:28:26.373Z", - "contributors": [ - "cajotafer", - "arcaela" - ] - }, - "Web/API/IDBCursor": { - "modified": "2019-09-04T06:41:50.466Z", - "contributors": [ - "jambsik", - "fscholz", - "chrisdavidmills" - ] - }, - "Web/API/IDBCursor/continue": { - "modified": "2019-03-23T22:40:02.950Z", - "contributors": [ - "BubuAnabelas", - "Alfalfa01" - ] - }, - "Web/API/IDBDatabase": { - "modified": "2019-03-23T22:23:43.090Z", - "contributors": [ - "jpmedley" - ] - }, - "Web/API/IDBDatabase/transaction": { - "modified": "2019-03-23T22:23:53.480Z", - "contributors": [ - "carlo.romero1991" - ] - }, - "Web/API/IDBObjectStore": { - "modified": "2019-03-23T23:01:30.975Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/IDBObjectStore/add": { - "modified": "2019-03-23T23:05:57.547Z", - "contributors": [ - "fscholz", - "AngelFQC" - ] - }, - "Web/API/ImageBitmap": { - "modified": "2020-10-15T22:03:23.639Z", - "contributors": [ - "necrobite" - ] - }, - "Web/API/ImageBitmapRenderingContext": { - "modified": "2020-10-15T22:03:23.985Z", - "contributors": [ - "teoli", - "necrobite" - ] - }, - "Web/API/IndexedDB_API": { - "modified": "2020-01-13T04:48:11.727Z", - "contributors": [ - "chrisdavidmills", - "thepianist2", - "GranRafa", - "semptrion", - "Fjaguero", - "MPoli" - ] - }, - "Web/API/IndexedDB_API/Conceptos_Basicos_Detras_De_IndexedDB": { - "modified": "2020-01-13T04:48:11.759Z", - "contributors": [ - "chrisdavidmills", - "fscholz", - "elin3t", - "sebasmagri" - ] - }, - "Web/API/IndexedDB_API/Usando_IndexedDB": { - "modified": "2020-01-13T04:48:12.209Z", - "contributors": [ - "chrisdavidmills", - "gama", - "Pcost8300", - "franvalmo", - "frank-orellana", - "otif11", - "urbanogb", - "AlePerez92", - "beatriz-merino", - "matajm", - "elin3t", - "maparrar" - ] - }, - "Web/API/Intersection_Observer_API": { - "modified": "2020-11-03T00:26:14.370Z", - "contributors": [ - "juanfelipejg", - "kuntur-studio", - "maketas", - "sandromedina", - "lacf95", - "midudev", - "joanvasa", - "AshWilliams" - ] - }, - "Web/API/KeyboardEvent": { - "modified": "2019-03-18T21:08:57.551Z", - "contributors": [ - "fscholz", - "pdro-enrique", - "wbamberg", - "pablodonoso" - ] - }, - "Web/API/KeyboardEvent/getModifierState": { - "modified": "2020-10-15T22:04:42.428Z", - "contributors": [ - "leoderja" - ] - }, - "Web/API/KeyboardEvent/key": { - "modified": "2020-10-15T22:10:09.653Z", - "contributors": [ - "isaacanet", - "aleju92" - ] - }, - "Web/API/KeyboardEvent/metaKey": { - "modified": "2019-03-23T22:47:47.329Z", - "contributors": [ - "empirreamm" - ] - }, - "Web/API/KeyboardEvent/which": { - "modified": "2019-03-23T23:25:30.040Z", - "contributors": [ - "fscholz", - "jsx", - "arthusu" - ] - }, - "Web/API/Location": { - "modified": "2020-03-11T08:46:40.807Z", - "contributors": [ - "nverino", - "BrodaNoel" - ] - }, - "Web/API/Location/origin": { - "modified": "2020-11-17T12:52:42.607Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Location/reload": { - "modified": "2020-10-30T03:50:17.206Z", - "contributors": [ - "SphinxKnight", - "MiguelHG2351", - "PatoDeTuring" - ] - }, - "Web/API/MediaDevices": { - "modified": "2019-03-23T22:36:21.378Z", - "contributors": [ - "Sebastianz" - ] - }, - "Web/API/MediaDevices/getUserMedia": { - "modified": "2019-03-23T22:36:21.202Z", - "contributors": [ - "AdanPalacios", - "titosobabas", - "RSalgadoAtala", - "Cristhian", - "matajm" - ] - }, - "Web/API/MediaQueryList": { - "modified": "2019-03-18T21:17:33.122Z", - "contributors": [ - "BubuAnabelas", - "PatoDeTuring" - ] - }, - "Web/API/MediaQueryList/addListener": { - "modified": "2019-03-18T21:16:20.430Z", - "contributors": [ - "PatoDeTuring" - ] - }, - "Web/API/MediaQueryList/matches": { - "modified": "2019-03-23T22:05:29.020Z", - "contributors": [ - "PatoDeTuring" - ] - }, - "Web/API/MediaQueryList/removeListener": { - "modified": "2019-03-23T22:05:31.060Z", - "contributors": [ - "PatoDeTuring" - ] - }, - "Web/API/MediaSource": { - "modified": "2019-03-23T22:38:20.191Z", - "contributors": [ - "Lazaro" - ] - }, - "Web/API/MediaStreamAudioSourceNode": { - "modified": "2019-03-18T20:35:52.439Z", - "contributors": [ - "davidtorroija", - "AndresMendozaOrozco" - ] - }, - "Web/API/MediaStreamTrack": { - "modified": "2019-03-23T23:10:18.897Z", - "contributors": [ - "matajm", - "maedca" - ] - }, - "Web/API/MessageEvent": { - "modified": "2019-03-18T21:44:05.386Z", - "contributors": [ - "jpmontoya182" - ] - }, - "Web/API/MimeType": { - "modified": "2019-03-18T21:36:36.016Z", - "contributors": [ - "daniel.duarte" - ] - }, - "Web/API/MouseEvent": { - "modified": "2019-03-23T23:01:32.904Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/MouseEvent/initMouseEvent": { - "modified": "2019-03-23T23:50:24.977Z", - "contributors": [ - "SphinxKnight", - "vectorderivative", - "jorgecasar", - "fscholz", - "khalid32", - "teoli", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/MouseEvent/shiftKey": { - "modified": "2019-03-23T22:05:24.832Z", - "contributors": [ - "evaferreira" - ] - }, - "Web/API/MutationObserver": { - "modified": "2019-05-13T04:27:12.587Z", - "contributors": [ - "mllambias", - "cesaruve", - "aeroxmotion", - "JordiCruells", - "alvaropinot" - ] - }, - "Web/API/MutationObserver/MutationObserver": { - "modified": "2020-10-15T22:18:30.706Z", - "contributors": [ - "mllambias" - ] - }, - "Web/API/MutationObserver/observe": { - "modified": "2020-10-15T22:18:29.107Z", - "contributors": [ - "mllambias" - ] - }, - "Web/API/Navigator": { - "modified": "2019-03-23T23:20:36.282Z", - "contributors": [ - "israel-munoz", - "khalid32", - "tpb" - ] - }, - "Web/API/Navigator/doNotTrack": { - "modified": "2019-03-18T21:35:42.847Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Navigator/getUserMedia": { - "modified": "2019-03-23T23:27:03.284Z", - "contributors": [ - "Jib", - "AlePerez92", - "fscholz", - "cm_rocanroll", - "franverona", - "py_crash", - "maedca" - ] - }, - "Web/API/Navigator/registerProtocolHandler": { - "modified": "2019-03-23T23:53:04.318Z", - "contributors": [ - "fscholz", - "khalid32", - "Nukeador", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Navigator/registerProtocolHandler/Web-based_protocol_handlers": { - "modified": "2019-03-23T22:06:43.969Z", - "contributors": [ - "chrisdavidmills", - "AngelFQC" - ] - }, - "Web/API/Navigator/vibrate": { - "modified": "2019-03-23T23:32:23.651Z", - "contributors": [ - "fscholz", - "jsx", - "mmednik" - ] - }, - "Web/API/NavigatorConcurrentHardware": { - "modified": "2020-10-15T22:25:58.692Z" - }, - "Web/API/NavigatorConcurrentHardware/hardwareConcurrency": { - "modified": "2020-10-15T22:26:06.271Z", - "contributors": [ - "Gnuxdar" - ] - }, - "Web/API/NavigatorGeolocation": { - "modified": "2019-03-23T23:01:31.642Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/NavigatorGeolocation/geolocation": { - "modified": "2019-03-23T23:31:55.176Z", - "contributors": [ - "jabarrioss", - "AlePerez92", - "fscholz", - "jsx", - "lfentanes" - ] - }, - "Web/API/NavigatorLanguage": { - "modified": "2019-03-23T22:46:20.556Z", - "contributors": [ - "teoli" - ] - }, - "Web/API/NavigatorLanguage/language": { - "modified": "2019-03-23T22:46:24.341Z", - "contributors": [ - "cesiztel", - "jesus9ias" - ] - }, - "Web/API/NavigatorOnLine": { - "modified": "2019-03-23T22:07:33.991Z", - "contributors": [ - "abbycar" - ] - }, - "Web/API/NavigatorOnLine/Eventos_online_y_offline": { - "modified": "2019-01-16T15:46:38.836Z", - "contributors": [ - "chrisdavidmills", - "Mgjbot", - "Nukeador", - "RickieesES", - "Unixcoder" - ] - }, - "Web/API/NavigatorOnLine/onLine": { - "modified": "2019-03-23T22:07:34.200Z", - "contributors": [ - "MarkelCuesta" - ] - }, - "Web/API/Network_Information_API": { - "modified": "2020-11-17T00:17:37.419Z", - "contributors": [ - "tobiasalbirosa" - ] - }, - "Web/API/Node": { - "modified": "2019-05-06T01:19:55.862Z", - "contributors": [ - "robinHurtado", - "fscholz" - ] - }, - "Web/API/Node/appendChild": { - "modified": "2020-10-15T21:22:57.221Z", - "contributors": [ - "AlePerez92", - "IsaacAaron", - "fscholz", - "jsx", - "AzulCz" - ] - }, - "Web/API/Node/childNodes": { - "modified": "2020-10-15T22:02:15.961Z", - "contributors": [ - "AlePerez92", - "presercomp" - ] - }, - "Web/API/Node/cloneNode": { - "modified": "2020-10-15T21:49:33.676Z", - "contributors": [ - "AlePerez92", - "jyorch2", - "fewrare" - ] - }, - "Web/API/Node/contains": { - "modified": "2020-10-15T22:00:52.714Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Node/elementoPadre": { - "modified": "2020-10-15T21:55:42.512Z", - "contributors": [ - "AlePerez92", - "LRojas", - "tureey" - ] - }, - "Web/API/Node/hasChildNodes": { - "modified": "2020-10-15T22:08:41.278Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Node/insertarAntes": { - "modified": "2020-10-15T21:36:49.326Z", - "contributors": [ - "AlePerez92", - "danvao", - "Sedoy", - "carpasse" - ] - }, - "Web/API/Node/isSameNode": { - "modified": "2019-03-23T22:49:05.364Z", - "contributors": [ - "JordiCruells" - ] - }, - "Web/API/Node/lastChild": { - "modified": "2020-10-15T21:55:48.810Z", - "contributors": [ - "fscholz", - "AlePerez92", - "tureey" - ] - }, - "Web/API/Node/namespaceURI": { - "modified": "2019-03-23T22:08:52.990Z", - "contributors": [ - "tureey" - ] - }, - "Web/API/Node/nextSibling": { - "modified": "2020-10-15T21:27:47.909Z", - "contributors": [ - "wbamberg", - "AlePerez92", - "fscholz", - "Alexis88" - ] - }, - "Web/API/Node/nodeName": { - "modified": "2019-03-23T23:50:40.382Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "Hasilt", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Node/nodeType": { - "modified": "2019-03-23T22:58:04.685Z", - "contributors": [ - "minrock" - ] - }, - "Web/API/Node/nodeValue": { - "modified": "2019-08-30T02:00:09.176Z", - "contributors": [ - "Jamel-Seyek", - "tureey" - ] - }, - "Web/API/Node/nodoPrincipal": { - "modified": "2019-03-23T22:08:57.260Z", - "contributors": [ - "tureey" - ] - }, - "Web/API/Node/ownerDocument": { - "modified": "2019-10-09T11:24:36.349Z", - "contributors": [ - "ogallagher", - "tureey" - ] - }, - "Web/API/Node/parentNode": { - "modified": "2019-03-23T22:08:56.619Z", - "contributors": [ - "IsmaOrdas", - "tureey" - ] - }, - "Web/API/Node/previousSibling": { - "modified": "2020-10-15T22:05:25.453Z", - "contributors": [ - "wbamberg", - "AlePerez92" - ] - }, - "Web/API/Node/removeChild": { - "modified": "2019-03-23T22:51:59.032Z", - "contributors": [ - "IsaacAaron", - "jcmunioz" - ] - }, - "Web/API/Node/replaceChild": { - "modified": "2019-03-23T22:46:30.428Z", - "contributors": [ - "pakitometal" - ] - }, - "Web/API/Node/textContent": { - "modified": "2020-10-15T21:21:16.429Z", - "contributors": [ - "yohanolmedo", - "AlePerez92", - "IsaacAaron", - "fscholz", - "another_sam" - ] - }, - "Web/API/NodeList": { - "modified": "2020-10-15T22:00:48.268Z", - "contributors": [ - "AlePerez92", - "padrecedano" - ] - }, - "Web/API/NodeList/forEach": { - "modified": "2020-10-15T22:08:20.485Z", - "contributors": [ - "SphinxKnight", - "InfaSysKey", - "jesumv" - ] - }, - "Web/API/NonDocumentTypeChildNode": { - "modified": "2019-03-23T22:32:46.517Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/NonDocumentTypeChildNode/nextElementSibling": { - "modified": "2020-10-15T21:46:25.502Z", - "contributors": [ - "AlePerez92", - "Grijander81" - ] - }, - "Web/API/NonDocumentTypeChildNode/previousElementSibling": { - "modified": "2019-03-23T22:32:40.718Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Notifications_API": { - "modified": "2019-03-23T22:07:39.198Z", - "contributors": [ - "david_ross" - ] - }, - "Web/API/Notifications_API/Usando_la_API_de_Notificaciones": { - "modified": "2020-04-11T06:35:05.696Z", - "contributors": [ - "davidelx", - "IXTRUnai" - ] - }, - "Web/API/ParentNode": { - "modified": "2019-03-23T22:43:20.773Z", - "contributors": [ - "Sebastianz" - ] - }, - "Web/API/ParentNode/append": { - "modified": "2020-10-15T22:24:28.452Z", - "contributors": [ - "Kyuoraku" - ] - }, - "Web/API/ParentNode/childElementCount": { - "modified": "2019-03-23T22:43:24.721Z", - "contributors": [ - "joselix" - ] - }, - "Web/API/ParentNode/children": { - "modified": "2019-03-23T22:32:44.383Z", - "contributors": [ - "AlePerez92", - "aeroxmotion", - "Grijander81" - ] - }, - "Web/API/ParentNode/firstElementChild": { - "modified": "2019-03-23T22:32:44.779Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/ParentNode/lastElementChild": { - "modified": "2019-03-23T22:32:39.974Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Payment_Request_API": { - "modified": "2020-10-15T22:33:12.666Z", - "contributors": [ - "cjguajardo" - ] - }, - "Web/API/Performance": { - "modified": "2020-10-15T21:53:40.885Z", - "contributors": [ - "wachunei", - "juanarbol", - "fscholz", - "jpmedley" - ] - }, - "Web/API/Performance/clearMarks": { - "modified": "2020-10-15T22:22:33.810Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/API/Performance/clearMeasures": { - "modified": "2020-10-15T22:22:45.763Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/API/Performance/memory": { - "modified": "2020-10-15T22:22:31.707Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/API/Performance/navigation": { - "modified": "2020-10-15T22:22:32.714Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/API/Performance/now": { - "modified": "2019-03-23T22:13:15.954Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/Performance/timeOrigin": { - "modified": "2020-10-15T22:22:32.944Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/API/Performance/timing": { - "modified": "2020-10-15T22:22:30.788Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/API/PerformanceNavigation": { - "modified": "2020-10-15T22:22:46.223Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/API/PositionOptions": { - "modified": "2019-03-23T23:16:28.831Z", - "contributors": [ - "fscholz", - "LeoHirsch", - "lupomontero" - ] - }, - "Web/API/PushManager": { - "modified": "2019-03-23T22:40:00.540Z", - "contributors": [ - "chrisdavidmills" - ] - }, - "Web/API/PushManager/permissionState": { - "modified": "2019-03-23T22:39:59.979Z", - "contributors": [ - "maedca" - ] - }, - "Web/API/PushManager/supportedContentEncodings": { - "modified": "2020-10-15T22:03:55.545Z", - "contributors": [ - "Erto" - ] - }, - "Web/API/Push_API": { - "modified": "2019-03-23T22:44:48.332Z", - "contributors": [ - "gimco", - "omar10594", - "Erto", - "FMRonin", - "YulianD", - "mautematico" - ] - }, - "Web/API/Push_API/Using_the_Push_API": { - "modified": "2019-03-23T22:19:10.252Z", - "contributors": [ - "YulianD" - ] - }, - "Web/API/RTCPeerConnection": { - "modified": "2019-03-18T21:43:02.717Z", - "contributors": [ - "jgalvezsoax", - "maomuriel" - ] - }, - "Web/API/RTCPeerConnection/canTrickleIceCandidates": { - "modified": "2020-10-15T22:33:02.442Z", - "contributors": [ - "JaderLuisDiaz" - ] - }, - "Web/API/RTCRtpReceiver": { - "modified": "2020-10-15T22:27:25.068Z", - "contributors": [ - "qwerty726" - ] - }, - "Web/API/RandomSource": { - "modified": "2019-03-23T22:25:15.548Z", - "contributors": [ - "Jeremie" - ] - }, - "Web/API/RandomSource/Obtenervaloresaleatorios": { - "modified": "2020-10-15T21:49:57.084Z", - "contributors": [ - "hecmonter", - "joseluisq", - "julianmoji" - ] - }, - "Web/API/Range": { - "modified": "2019-03-23T23:47:18.258Z", - "contributors": [ - "wbamberg", - "maiky", - "fscholz", - "Markens", - "DR", - "Nathymig" - ] - }, - "Web/API/Range/collapsed": { - "modified": "2019-03-23T23:47:00.550Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Range/commonAncestorContainer": { - "modified": "2019-03-23T23:53:54.038Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Range/getClientRects": { - "modified": "2019-03-23T22:10:01.541Z", - "contributors": [ - "edhzsz" - ] - }, - "Web/API/Range/intersectsNode": { - "modified": "2019-03-23T23:53:59.214Z", - "contributors": [ - "fscholz", - "khalid32", - "Mgjbot", - "DR" - ] - }, - "Web/API/Range/setStart": { - "modified": "2019-03-23T22:13:01.685Z", - "contributors": [ - "Vincetroid" - ] - }, - "Web/API/Request": { - "modified": "2020-10-15T22:02:13.323Z", - "contributors": [ - "DiegoFT", - "fscholz" - ] - }, - "Web/API/Request/headers": { - "modified": "2020-10-15T22:02:12.572Z", - "contributors": [ - "carojaspaz" - ] - }, - "Web/API/Response": { - "modified": "2020-11-13T19:18:52.099Z", - "contributors": [ - "chux", - "kant", - "ignatius73", - "crrlos" - ] - }, - "Web/API/Response/Response": { - "modified": "2020-10-15T22:15:43.532Z", - "contributors": [ - "AzazelN28" - ] - }, - "Web/API/Response/ok": { - "modified": "2020-10-15T22:22:31.771Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/API/Response/status": { - "modified": "2020-10-15T22:24:09.432Z", - "contributors": [ - "FDSoil" - ] - }, - "Web/API/SVGPoint": { - "modified": "2019-03-23T23:03:09.725Z", - "contributors": [ - "fscholz", - "hasAngel" - ] - }, - "Web/API/Screen": { - "modified": "2019-10-10T16:45:22.609Z", - "contributors": [ - "jazdian", - "Grijander81" - ] - }, - "Web/API/Selection": { - "modified": "2019-03-23T23:54:01.018Z", - "contributors": [ - "CxRxExO", - "fscholz", - "DR", - "Juandavaus", - "Kroatan", - "Mgjbot", - "LaRy", - "Nathymig" - ] - }, - "Web/API/Selection/addRange": { - "modified": "2019-03-23T23:46:53.374Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/anchorNode": { - "modified": "2019-03-23T23:46:46.912Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/anchorOffset": { - "modified": "2019-03-23T23:46:55.279Z", - "contributors": [ - "fscholz", - "DR", - "Mgjbot" - ] - }, - "Web/API/Selection/collapse": { - "modified": "2019-03-23T23:46:57.541Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/collapseToEnd": { - "modified": "2019-03-23T23:47:01.187Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/collapseToStart": { - "modified": "2019-03-23T23:46:59.744Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/containsNode": { - "modified": "2019-03-23T23:46:51.997Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/deleteFromDocument": { - "modified": "2019-03-23T23:46:47.857Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/extend": { - "modified": "2019-03-23T23:46:54.795Z", - "contributors": [ - "fscholz", - "DR", - "Mgjbot" - ] - }, - "Web/API/Selection/focusNode": { - "modified": "2019-03-23T23:46:46.574Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Selection/focusOffset": { - "modified": "2019-03-23T23:46:54.969Z", - "contributors": [ - "fscholz", - "DR", - "Mgjbot" - ] - }, - "Web/API/Selection/getRangeAt": { - "modified": "2019-03-23T23:46:55.195Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Selection/isCollapsed": { - "modified": "2019-03-23T23:46:52.080Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Selection/rangeCount": { - "modified": "2019-03-23T23:46:50.030Z", - "contributors": [ - "fscholz", - "DR" - ] - }, - "Web/API/Selection/removeAllRanges": { - "modified": "2019-03-23T23:46:54.883Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/removeRange": { - "modified": "2019-03-23T23:46:55.069Z", - "contributors": [ - "fscholz", - "DR", - "Mgjbot" - ] - }, - "Web/API/Selection/selectAllChildren": { - "modified": "2019-03-23T23:46:50.124Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Selection/toString": { - "modified": "2019-03-23T23:47:28.897Z", - "contributors": [ - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/ServiceWorkerContainer": { - "modified": "2020-10-15T22:03:12.673Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/ServiceWorkerContainer/register": { - "modified": "2020-10-15T22:03:11.889Z", - "contributors": [ - "LuisOlive", - "marc2684" - ] - }, - "Web/API/ServiceWorkerRegistration": { - "modified": "2020-10-15T22:05:45.607Z", - "contributors": [ - "ExE-Boss" - ] - }, - "Web/API/Service_Worker_API": { - "modified": "2019-03-23T22:09:38.478Z", - "contributors": [ - "Fedapamo", - "andrpueb", - "ibanlopez", - "eltioico", - "chrisdavidmills" - ] - }, - "Web/API/Service_Worker_API/Using_Service_Workers": { - "modified": "2019-03-23T22:09:43.848Z", - "contributors": [ - "JasonGlez", - "Vergara", - "GabrielSchlomo", - "Anibalismo", - "darioperez" - ] - }, - "Web/API/Storage": { - "modified": "2019-03-23T22:37:04.835Z", - "contributors": [ - "puma", - "Sebastianz" - ] - }, - "Web/API/Storage/LocalStorage": { - "modified": "2020-07-20T09:10:56.525Z", - "contributors": [ - "LucasMaciasAtala", - "moniqaveiga", - "Andresrodart", - "lsphantom" - ] - }, - "Web/API/Storage/clear": { - "modified": "2019-03-23T22:26:00.358Z", - "contributors": [ - "edwarfuentes97", - "theguitxo" - ] - }, - "Web/API/Storage/getItem": { - "modified": "2019-03-23T22:33:04.286Z", - "contributors": [ - "devconcept", - "aminguez" - ] - }, - "Web/API/Storage/length": { - "modified": "2019-03-23T22:25:49.492Z", - "contributors": [ - "Guitxo" - ] - }, - "Web/API/Storage/removeItem": { - "modified": "2020-06-16T13:11:43.937Z", - "contributors": [ - "jorgeCaster", - "aminguez" - ] - }, - "Web/API/Storage/setItem": { - "modified": "2019-03-23T22:37:01.770Z", - "contributors": [ - "aminguez", - "spideep" - ] - }, - "Web/API/StorageManager": { - "modified": "2020-10-15T22:18:18.423Z" - }, - "Web/API/StorageManager/estimate": { - "modified": "2020-10-15T22:18:17.461Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/StorageManager/persist": { - "modified": "2020-10-15T22:18:17.848Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/StorageManager/persisted": { - "modified": "2020-10-15T22:18:17.733Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/API/StyleSheet": { - "modified": "2019-03-18T21:12:49.649Z", - "contributors": [ - "diegovinie", - "SphinxKnight", - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/StyleSheet/disabled": { - "modified": "2019-03-23T23:58:08.612Z", - "contributors": [ - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/StyleSheet/href": { - "modified": "2019-03-23T23:58:07.932Z", - "contributors": [ - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/StyleSheet/media": { - "modified": "2019-03-23T23:58:05.417Z", - "contributors": [ - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/StyleSheet/ownerNode": { - "modified": "2019-03-23T23:58:23.239Z", - "contributors": [ - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/StyleSheet/parentStyleSheet": { - "modified": "2019-03-23T23:58:09.687Z", - "contributors": [ - "fscholz", - "khalid32", - "teoli", - "HenryGR" - ] - }, - "Web/API/StyleSheet/title": { - "modified": "2019-03-23T23:58:12.135Z", - "contributors": [ - "fscholz", - "xuancanh", - "teoli", - "HenryGR" - ] - }, - "Web/API/StyleSheet/type": { - "modified": "2019-03-23T23:58:05.312Z", - "contributors": [ - "fscholz", - "jsx", - "teoli", - "HenryGR" - ] - }, - "Web/API/SubtleCrypto": { - "modified": "2020-10-15T22:27:14.356Z", - "contributors": [ - "joseluisq" - ] - }, - "Web/API/SubtleCrypto/digest": { - "modified": "2020-10-15T22:27:30.018Z", - "contributors": [ - "joseluisq" - ] - }, - "Web/API/SubtleCrypto/encrypt": { - "modified": "2020-10-15T22:27:29.781Z", - "contributors": [ - "joseluisq" - ] - }, - "Web/API/TextTrack": { - "modified": "2020-10-15T22:33:08.345Z", - "contributors": [ - "joeyparrish" - ] - }, - "Web/API/TextTrack/cuechange_event": { - "modified": "2020-10-15T22:33:09.063Z", - "contributors": [ - "Pablo-No" - ] - }, - "Web/API/TouchEvent": { - "modified": "2019-03-23T22:32:05.809Z", - "contributors": [ - "ulisestrujillo", - "AlePerez92" - ] - }, - "Web/API/UIEvent": { - "modified": "2019-03-23T23:01:34.700Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/UIEvent/pageX": { - "modified": "2019-03-23T23:12:56.756Z", - "contributors": [ - "fscholz", - "khalid32", - "Nathymig", - "Julgon" - ] - }, - "Web/API/URL": { - "modified": "2019-03-23T22:19:12.735Z", - "contributors": [ - "zayle", - "wstaelens" - ] - }, - "Web/API/URL/Host": { - "modified": "2020-10-15T22:28:58.726Z", - "contributors": [ - "diegovlopez587" - ] - }, - "Web/API/URL/URL": { - "modified": "2020-10-15T22:21:36.171Z", - "contributors": [ - "roberth_dev" - ] - }, - "Web/API/URL/createObjectURL": { - "modified": "2019-03-23T22:19:19.805Z", - "contributors": [ - "OrlandoDeJesusCuxinYama", - "isafrus5", - "AzazelN28" - ] - }, - "Web/API/URL/port": { - "modified": "2020-10-15T22:21:35.297Z", - "contributors": [ - "roberth_dev" - ] - }, - "Web/API/URLSearchParams": { - "modified": "2019-03-23T22:08:25.598Z", - "contributors": [ - "aliveghost04" - ] - }, - "Web/API/URLSearchParams/URLSearchParams": { - "modified": "2020-10-15T22:28:05.327Z", - "contributors": [ - "daniel.duarte" - ] - }, - "Web/API/WebGL_API": { - "modified": "2019-03-24T00:07:50.182Z", - "contributors": [ - "fscholz", - "teoli", - "inma_610" - ] - }, - "Web/API/WebGL_API/Tutorial": { - "modified": "2019-03-23T22:48:50.519Z", - "contributors": [ - "SphinxKnight", - "lrlimon", - "fscholz" - ] - }, - "Web/API/WebGL_API/Tutorial/Adding_2D_content_to_a_WebGL_context": { - "modified": "2019-03-18T21:16:52.110Z", - "contributors": [ - "Nekete", - "Erik12Ixec", - "WHK102", - "COBRILL4" - ] - }, - "Web/API/WebGL_API/Tutorial/Animating_objects_with_WebGL": { - "modified": "2019-03-23T23:20:38.388Z", - "contributors": [ - "fscholz", - "teoli", - "luziiann" - ] - }, - "Web/API/WebGL_API/Tutorial/Animating_textures_in_WebGL": { - "modified": "2019-03-23T22:34:48.400Z", - "contributors": [ - "pixelements" - ] - }, - "Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL": { - "modified": "2019-03-23T23:06:04.656Z", - "contributors": [ - "fcanellas", - "Pablo_Bangueses", - "CarlosLinares", - "Inheritech", - "CandelarioGomez", - "fscholz", - "joeljose", - "Jorge0309" - ] - }, - "Web/API/WebGL_API/Tutorial/Objetos_3D_utilizando_WebGL": { - "modified": "2019-03-23T22:37:32.127Z", - "contributors": [ - "asarch", - "Giovan" - ] - }, - "Web/API/WebGL_API/Tutorial/Using_shaders_to_apply_color_in_WebGL": { - "modified": "2020-05-29T05:02:06.384Z", - "contributors": [ - "jmlocke1", - "Giovan" - ] - }, - "Web/API/WebGL_API/Tutorial/Wtilizando_texturas_en_WebGL": { - "modified": "2019-03-23T22:15:44.225Z", - "contributors": [ - "BubuAnabelas", - "marce_1994" - ] - }, - "Web/API/WebRTC_API": { - "modified": "2020-05-01T03:28:58.714Z", - "contributors": [ - "erito73", - "miguelsp" - ] - }, - "Web/API/WebRTC_API/Protocols": { - "modified": "2020-05-01T03:41:11.993Z", - "contributors": [ - "erito73", - "ValeriaRamos" - ] - }, - "Web/API/WebSocket": { - "modified": "2019-03-18T20:53:48.099Z", - "contributors": [ - "benja90", - "spachecojimenez", - "aranondo", - "dpineiden" - ] - }, - "Web/API/WebSocket/close_event": { - "modified": "2019-03-23T21:59:50.486Z", - "contributors": [ - "irenesmith", - "ExE-Boss", - "FLAVIOALFA" - ] - }, - "Web/API/WebSocket/onerror": { - "modified": "2020-10-15T22:13:54.439Z", - "contributors": [ - "Bumxu" - ] - }, - "Web/API/WebSockets_API": { - "modified": "2019-05-21T02:54:41.622Z", - "contributors": [ - "SphinxKnight", - "tpb", - "petisocarambanal", - "CesarBustios", - "mserracaldentey" - ] - }, - "Web/API/WebSockets_API/Escribiendo_servidor_WebSocket": { - "modified": "2019-05-21T02:54:42.354Z", - "contributors": [ - "SphinxKnight", - "manueljrs", - "Yantup", - "jjmontes" - ] - }, - "Web/API/WebSockets_API/Escribiendo_servidores_con_WebSocket": { - "modified": "2019-06-21T20:55:28.443Z", - "contributors": [ - "alesalva", - "SphinxKnight", - "juanmanuelramallo", - "8manuel", - "llekn", - "jjmontes", - "augus1990" - ] - }, - "Web/API/WebSockets_API/Writing_WebSocket_client_applications": { - "modified": "2019-05-21T02:54:42.026Z", - "contributors": [ - "SphinxKnight", - "neopablix", - "jevvilla", - "jvilla8a", - "AzazelN28", - "Unbrained", - "gabryk", - "MauroEldritch", - "frankzen" - ] - }, - "Web/API/WebVR_API": { - "modified": "2019-03-23T22:07:07.755Z", - "contributors": [ - "Alphaeolo", - "chrisdavidmills" - ] - }, - "Web/API/WebVR_API/Using_the_WebVR_API": { - "modified": "2020-10-12T08:06:57.683Z", - "contributors": [ - "SphinxKnight", - "MarioA19", - "geryescalier", - "karlalhdz" - ] - }, - "Web/API/WebVTT_API": { - "modified": "2020-10-15T22:33:07.538Z", - "contributors": [ - "Pablo-No" - ] - }, - "Web/API/Web_Crypto_API": { - "modified": "2020-02-12T20:20:09.829Z", - "contributors": [ - "joseluisq", - "anfuca", - "haxdai" - ] - }, - "Web/API/Web_Crypto_API/Checking_authenticity_with_password": { - "modified": "2019-03-23T22:10:43.026Z", - "contributors": [ - "haxdai" - ] - }, - "Web/API/Web_Speech_API": { - "modified": "2020-10-15T22:29:46.339Z", - "contributors": [ - "dianarryanti707" - ] - }, - "Web/API/Web_Speech_API/Uso_de_la_Web_Speech_API": { - "modified": "2020-05-10T18:32:28.954Z", - "contributors": [ - "mcarou" - ] - }, - "Web/API/Web_Workers_API": { - "modified": "2020-04-14T23:36:47.242Z", - "contributors": [ - "krebking", - "thepianist2", - "jsanmor" - ] - }, - "Web/API/WheelEvent": { - "modified": "2019-03-23T22:40:53.687Z", - "contributors": [ - "StripTM" - ] - }, - "Web/API/WheelEvent/deltaY": { - "modified": "2019-03-23T22:26:41.848Z", - "contributors": [ - "Thargelion" - ] - }, - "Web/API/Window": { - "modified": "2020-08-14T20:26:23.156Z", - "contributors": [ - "Enesimus", - "Michelangeur", - "antoiba86", - "jjoselon", - "vggallego", - "fscholz", - "Crash", - "Monty", - "Markens", - "DR", - "Nathymig", - "Mgjbot" - ] - }, - "Web/API/Window/URL": { - "modified": "2019-03-23T22:38:17.598Z", - "contributors": [ - "israelfl" - ] - }, - "Web/API/Window/alert": { - "modified": "2019-03-23T22:27:29.008Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/API/Window/applicationCache": { - "modified": "2019-03-23T23:52:56.666Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "AshfaqHossain", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Window/cancelAnimationFrame": { - "modified": "2019-03-23T22:30:46.211Z", - "contributors": [ - "khrizenriquez" - ] - }, - "Web/API/Window/close": { - "modified": "2020-10-15T21:37:07.614Z", - "contributors": [ - "SphinxKnight", - "dgrizzla", - "Siro_Diaz" - ] - }, - "Web/API/Window/closed": { - "modified": "2019-03-18T20:59:11.710Z", - "contributors": [ - "SphinxKnight", - "developingo" - ] - }, - "Web/API/Window/confirm": { - "modified": "2019-03-23T22:45:47.266Z", - "contributors": [ - "julian3xl" - ] - }, - "Web/API/Window/crypto": { - "modified": "2020-02-12T20:26:38.795Z", - "contributors": [ - "joseluisq", - "AlePerez92", - "victorjavierss" - ] - }, - "Web/API/Window/devicePixelRatio": { - "modified": "2019-03-23T22:33:20.853Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Window/dialogArguments": { - "modified": "2019-03-23T22:33:21.065Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Window/document": { - "modified": "2019-03-18T21:17:09.045Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Window/frameElement": { - "modified": "2019-03-23T22:33:19.039Z", - "contributors": [ - "edmon1024", - "Grijander81" - ] - }, - "Web/API/Window/fullScreen": { - "modified": "2019-03-23T23:50:19.968Z", - "contributors": [ - "SphinxKnight", - "fscholz", - "khalid32", - "HenryGR", - "Mgjbot" - ] - }, - "Web/API/Window/getComputedStyle": { - "modified": "2019-03-23T23:58:07.622Z", - "contributors": [ - "fscholz", - "jsx", - "teoli", - "HenryGR" - ] - }, - "Web/API/Window/getSelection": { - "modified": "2019-09-18T11:51:48.070Z", - "contributors": [ - "AlePerez92", - "LittleSanti", - "fscholz", - "Mgjbot", - "DR" - ] - }, - "Web/API/Window/hashchange_event": { - "modified": "2019-04-01T11:56:33.015Z", - "contributors": [ - "fscholz", - "ExE-Boss", - "jorgerenteral" - ] - }, - "Web/API/Window/history": { - "modified": "2020-10-15T21:43:45.922Z", - "contributors": [ - "SphinxKnight", - "khrizenriquez" - ] - }, - "Web/API/Window/innerHeight": { - "modified": "2020-07-23T18:50:37.998Z", - "contributors": [ - "dongerardor", - "alfredoWs" - ] - }, - "Web/API/Window/localStorage": { - "modified": "2019-06-04T06:54:12.078Z", - "contributors": [ - "taumartin", - "nazarioa", - "McSonk", - "faliure", - "tinchosrok", - "DragShot", - "ianaya89" - ] - }, - "Web/API/Window/location": { - "modified": "2019-03-23T22:52:04.798Z", - "contributors": [ - "khrizenriquez", - "MaFranceschi" - ] - }, - "Web/API/Window/locationbar": { - "modified": "2019-03-23T22:16:35.650Z", - "contributors": [ - "ivannieto" - ] - }, - "Web/API/Window/matchMedia": { - "modified": "2020-10-15T21:54:30.059Z", - "contributors": [ - "AlePerez92", - "tipoqueno", - "tavo379" - ] - }, - "Web/API/Window/menubar": { - "modified": "2019-03-23T22:33:13.331Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Window/moveBy": { - "modified": "2020-10-15T22:08:26.636Z", - "contributors": [ - "pedrofmb" - ] - }, - "Web/API/Window/navigator": { - "modified": "2019-03-23T23:20:37.914Z", - "contributors": [ - "fscholz", - "khalid32", - "tpb" - ] - }, - "Web/API/Window/offline_event": { - "modified": "2019-04-30T14:21:22.454Z", - "contributors": [ - "wbamberg", - "irenesmith", - "Daniel-VQ" - ] - }, - "Web/API/Window/open": { - "modified": "2020-04-13T14:31:02.220Z", - "contributors": [ - "fj-ramirez", - "BubuAnabelas", - "jccharlie90", - "SphinxKnight", - "VictorAbdon", - "jjoselon" - ] - }, - "Web/API/Window/opener": { - "modified": "2019-03-23T22:46:00.877Z", - "contributors": [ - "carlosmunozrodriguez", - "f3rbarraza" - ] - }, - "Web/API/Window/outerHeight": { - "modified": "2019-03-18T21:15:44.722Z", - "contributors": [ - "rlopezAyala", - "GianlucaBobbio" - ] - }, - "Web/API/Window/outerWidth": { - "modified": "2019-03-23T22:04:23.293Z", - "contributors": [ - "shadairafael" - ] - }, - "Web/API/Window/print": { - "modified": "2019-07-11T23:43:54.339Z", - "contributors": [ - "EstebanDalelR", - "ErikMj69" - ] - }, - "Web/API/Window/prompt": { - "modified": "2019-03-23T22:20:58.413Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/API/Window/requestAnimationFrame": { - "modified": "2020-07-05T08:38:54.640Z", - "contributors": [ - "AlePerez92", - "mauriciabad", - "fortil", - "andrpueb", - "fscholz", - "jbalsas" - ] - }, - "Web/API/Window/requestIdleCallback": { - "modified": "2020-12-05T00:33:07.625Z", - "contributors": [ - "gnunezr", - "jsolana" - ] - }, - "Web/API/Window/scroll": { - "modified": "2020-10-15T21:54:58.717Z", - "contributors": [ - "AlePerez92", - "patoezequiel" - ] - }, - "Web/API/Window/scrollBy": { - "modified": "2019-03-23T22:40:05.334Z", - "contributors": [ - "plaso", - "Bcd" - ] - }, - "Web/API/Window/scrollTo": { - "modified": "2019-03-23T22:05:41.259Z", - "contributors": [ - "gyroscopico" - ] - }, - "Web/API/Window/scrollX": { - "modified": "2019-03-18T21:15:11.745Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/API/Window/scrollY": { - "modified": "2019-03-23T22:53:30.651Z", - "contributors": [ - "MaFranceschi" - ] - }, - "Web/API/Window/sessionStorage": { - "modified": "2019-03-23T22:57:50.655Z", - "contributors": [ - "svera", - "pedromagnus", - "develasquez" - ] - }, - "Web/API/Window/showModalDialog": { - "modified": "2019-03-18T20:58:55.311Z", - "contributors": [ - "SphinxKnight", - "BubuAnabelas", - "Grijander81" - ] - }, - "Web/API/Window/sidebar": { - "modified": "2019-03-23T22:02:56.395Z", - "contributors": [ - "IsaacSchemm" - ] - }, - "Web/API/Window/statusbar": { - "modified": "2019-03-23T22:14:36.556Z", - "contributors": [ - "UshioSan" - ] - }, - "Web/API/WindowBase64": { - "modified": "2019-03-23T23:03:15.466Z", - "contributors": [ - "teoli" - ] - }, - "Web/API/WindowBase64/Base64_codificando_y_decodificando": { - "modified": "2020-10-08T22:36:13.676Z", - "contributors": [ - "kevinandresviedmanlopez", - "carloscasalar", - "Arukantara", - "sathyasanles" - ] - }, - "Web/API/WindowBase64/atob": { - "modified": "2019-03-23T23:03:12.715Z", - "contributors": [ - "fscholz", - "sathyasanles" - ] - }, - "Web/API/WindowEventHandlers": { - "modified": "2019-03-23T23:01:29.892Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/WindowEventHandlers/onbeforeunload": { - "modified": "2019-03-23T23:22:06.132Z", - "contributors": [ - "fscholz", - "AshfaqHossain", - "jota1410" - ] - }, - "Web/API/WindowEventHandlers/onhashchange": { - "modified": "2019-03-23T22:49:36.790Z", - "contributors": [ - "AlePerez92", - "daesnorey" - ] - }, - "Web/API/WindowEventHandlers/onpopstate": { - "modified": "2020-10-15T22:19:35.746Z", - "contributors": [ - "borxdev", - "jccuevas" - ] - }, - "Web/API/WindowOrWorkerGlobalScope": { - "modified": "2019-03-23T22:16:40.400Z", - "contributors": [ - "ivannieto", - "chrisdavidmills" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/caches": { - "modified": "2019-03-23T22:16:45.016Z", - "contributors": [ - "ivannieto" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/createImageBitmap": { - "modified": "2020-10-15T22:14:17.553Z", - "contributors": [ - "Bumxu" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/fetch": { - "modified": "2020-10-15T22:01:57.457Z", - "contributors": [ - "fscholz", - "jagomf" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/indexedDB": { - "modified": "2019-03-23T22:16:36.537Z", - "contributors": [ - "ivannieto" - ] - }, - "Web/API/WindowOrWorkerGlobalScope/isSecureContext": { - "modified": "2019-03-23T22:16:45.834Z", - "contributors": [ - "ivannieto" - ] - }, - "Web/API/WindowTimers": { - "modified": "2019-03-23T23:01:30.065Z", - "contributors": [ - "fscholz" - ] - }, - "Web/API/WindowTimers/clearInterval": { - "modified": "2019-03-23T22:56:16.485Z", - "contributors": [ - "Guitxo" - ] - }, - "Web/API/WindowTimers/clearTimeout": { - "modified": "2019-06-18T10:20:27.972Z", - "contributors": [ - "AlePerez92", - "fscholz", - "basemnassar11", - "VictorArias" - ] - }, - "Web/API/WindowTimers/setInterval": { - "modified": "2020-08-24T18:02:23.092Z", - "contributors": [ - "mastertrooper", - "Makinita", - "Klius", - "claudionebbia" - ] - }, - "Web/API/WindowTimers/setTimeout": { - "modified": "2019-03-23T23:17:29.378Z", - "contributors": [ - "BubuAnabelas", - "vltamara", - "nauj27", - "fscholz", - "AshfaqHossain", - "VictorArias" - ] - }, - "Web/API/Worker": { - "modified": "2019-03-23T22:48:01.797Z", - "contributors": [ - "benjroy" - ] - }, - "Web/API/Worker/postMessage": { - "modified": "2020-04-23T06:46:10.302Z", - "contributors": [ - "aguilahorus", - "cristyansv", - "mar777" - ] - }, - "Web/API/Worker/terminate": { - "modified": "2019-03-23T22:19:14.265Z", - "contributors": [ - "AzazelN28" - ] - }, - "Web/API/XMLHttpRequest": { - "modified": "2019-05-02T19:52:03.482Z", - "contributors": [ - "wbamberg", - "Juvenal-yescas", - "ojgarciab", - "Sheppy", - "dgrcode", - "HadesDX", - "StripTM", - "mitogh", - "deimidis", - "Mgjbot", - "Jorolo" - ] - }, - "Web/API/XMLHttpRequest/FormData": { - "modified": "2020-10-15T21:22:58.694Z", - "contributors": [ - "AlePerez92", - "vladimirbat", - "alvaromorenomorales", - "ojgarciab", - "Sheppy", - "AngelFQC", - "wilo", - "marco_mucino" - ] - }, - "Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests": { - "modified": "2019-03-23T22:05:30.902Z", - "contributors": [ - "Juvenal-yescas" - ] - }, - "Web/API/XMLHttpRequest/Using_XMLHttpRequest": { - "modified": "2020-03-17T04:09:47.273Z", - "contributors": [ - "jccuevas", - "camsa", - "david_ru", - "cesaruve", - "Sheppy", - "Sebastianz", - "iiegor", - "javierdp", - "bardackx", - "teoli", - "inma_610" - ] - }, - "Web/API/XMLHttpRequest/abort": { - "modified": "2019-03-23T22:12:16.683Z", - "contributors": [ - "Sheppy", - "todomagichere" - ] - }, - "Web/API/XMLHttpRequest/onreadystatechange": { - "modified": "2019-03-23T22:20:14.868Z", - "contributors": [ - "Sheppy", - "theUncanny" - ] - }, - "Web/API/XMLHttpRequest/responseText": { - "modified": "2019-03-23T22:09:05.708Z", - "contributors": [ - "midnight25" - ] - }, - "Web/API/XMLHttpRequest/timeout": { - "modified": "2020-10-15T22:26:49.508Z", - "contributors": [ - "mmednik" - ] - }, - "Web/API/XMLHttpRequestEventTarget": { - "modified": "2020-10-15T22:26:08.879Z" - }, - "Web/API/XMLHttpRequestEventTarget/onload": { - "modified": "2020-10-15T22:26:03.172Z", - "contributors": [ - "Akafadam" - ] - }, - "Web/API/console/assert": { - "modified": "2019-03-23T22:47:53.587Z", - "contributors": [ - "Takumakun", - "AlePerez92", - "danycoro" - ] - }, - "Web/API/notification": { - "modified": "2019-06-28T05:54:12.854Z", - "contributors": [ - "paumoreno", - "hhcarmenate", - "RockLee-BC", - "francotalarico93", - "frossi933", - "Irvandoval", - "LuyisiMiger", - "fscholz", - "elfoxero" - ] - }, - "Web/API/notification/body": { - "modified": "2019-03-23T22:59:34.974Z", - "contributors": [ - "joxhker" - ] - }, - "Web/API/notification/dir": { - "modified": "2019-03-23T22:59:36.852Z", - "contributors": [ - "joxhker" - ] - }, - "Web/API/notification/icon": { - "modified": "2019-03-23T22:59:32.492Z", - "contributors": [ - "joxhker" - ] - }, - "Web/API/notification/onclick": { - "modified": "2019-03-23T22:11:55.774Z", - "contributors": [ - "AndresTonello" - ] - }, - "Web/API/notification/permission": { - "modified": "2019-03-23T22:07:38.974Z", - "contributors": [ - "alanmacgowan", - "IXTRUnai" - ] - }, - "Web/API/notification/requestPermission": { - "modified": "2019-03-23T22:50:37.341Z", - "contributors": [ - "MarkelCuesta", - "jezdez", - "Davdriver" - ] - }, - "Web/Accesibilidad": { - "modified": "2020-09-22T14:24:03.363Z", - "contributors": [ - "FranciscoImanolSuarez", - "Gummox", - "Mediavilladiezj", - "cisval", - "monserratcallejaalmazan", - "chmutoff", - "teoli", - "DoctorRomi", - "Mgjbot", - "Jorolo", - "Lowprofile", - "Wikier", - "Nukeador", - "Gonzobonzoo" - ] - }, - "Web/Accesibilidad/Comunidad": { - "modified": "2019-03-23T23:41:25.430Z", - "contributors": [ - "teoli", - "Jorolo" - ] - }, - "Web/Accesibilidad/Understanding_WCAG": { - "modified": "2019-03-18T21:25:29.001Z", - "contributors": [ - "evaferreira" - ] - }, - "Web/Accesibilidad/Understanding_WCAG/Etiquetas_de_texto_y_nombres": { - "modified": "2020-05-21T19:43:48.950Z", - "contributors": [ - "giioaj", - "IsraelFloresDGA" - ] - }, - "Web/Accesibilidad/Understanding_WCAG/Perceivable": { - "modified": "2019-03-18T21:25:19.991Z", - "contributors": [ - "evaferreira" - ] - }, - "Web/Accesibilidad/Understanding_WCAG/Perceivable/Color_contraste": { - "modified": "2020-06-09T06:15:36.471Z", - "contributors": [ - "11bits", - "apenab" - ] - }, - "Web/Accesibilidad/Understanding_WCAG/Teclado": { - "modified": "2020-09-28T17:32:58.697Z", - "contributors": [ - "megatux", - "IsraelFloresDGA" - ] - }, - "Web/Accessibility/ARIA": { - "modified": "2019-03-23T22:32:50.943Z", - "contributors": [ - "AlejandroC92", - "megatux", - "guumo", - "VNWK", - "imelenchon", - "teoli" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques": { - "modified": "2019-03-23T22:46:27.954Z", - "contributors": [ - "chrisdavidmills" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques/Usando_el_atributo_aria-required": { - "modified": "2019-08-28T11:54:04.515Z", - "contributors": [ - "IsraelFloresDGA", - "Karla_Glez" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques/Usando_el_rol_alertdialog": { - "modified": "2019-08-28T12:48:39.532Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques/Using_the_alert_role": { - "modified": "2019-03-18T21:31:32.978Z", - "contributors": [ - "IsraelFloresDGA", - "mayrars" - ] - }, - "Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribute": { - "modified": "2020-12-02T07:09:06.472Z", - "contributors": [ - "AlePerez92", - "mitsurugi", - "fraboto", - "blanchart", - "ErikMj69", - "NelsonWF" - ] - }, - "Web/Accessibility/ARIA/forms": { - "modified": "2020-08-13T01:50:29.740Z", - "contributors": [ - "Nachec", - "IsraelFloresDGA", - "malonson" - ] - }, - "Web/Accessibility/ARIA/forms/Etiquetas_complejas": { - "modified": "2019-11-27T15:16:55.571Z", - "contributors": [ - "IsaacAaron", - "IsraelFloresDGA" - ] - }, - "Web/Accessibility/ARIA/forms/alertas": { - "modified": "2020-08-13T01:22:34.331Z", - "contributors": [ - "Nachec" - ] - }, - "Web/Accessibility/ARIA/forms/consejos_basicos_para_formularios": { - "modified": "2019-03-18T21:22:07.007Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/CSS": { - "modified": "2020-10-25T05:19:47.416Z", - "contributors": [ - "SphinxKnight", - "redondomoralesmelanny", - "Dolacres", - "boualidev", - "Enesimus", - "chrisdavidmills", - "NavetsArev", - "alazzuri", - "IsraelFloresDGA", - "lajaso", - "arturoblack", - "rogeliomtx", - "anecto", - "teoli", - "Luis_Calvo", - "alex_dm", - "ethertank", - "StripTM", - "inma_610", - "another_sam", - "fscholz", - "Wrongloop", - "Nathymig", - "Mgjbot", - "Nukeador", - "Jorolo", - "Lopez", - "Takenbot", - "Manu", - "Elrohir" - ] - }, - "Web/CSS/--*": { - "modified": "2020-11-18T17:43:24.329Z", - "contributors": [ - "jemilionautoch" - ] - }, - "Web/CSS/-moz-box-flex": { - "modified": "2019-03-23T22:36:18.128Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-moz-box-ordinal-group": { - "modified": "2019-03-23T22:36:12.257Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-box-pack": { - "modified": "2019-03-23T22:36:13.348Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-moz-cell": { - "modified": "2019-03-23T22:35:57.612Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-context-properties": { - "modified": "2020-10-15T22:13:14.061Z", - "contributors": [ - "Adorta4" - ] - }, - "Web/CSS/-moz-float-edge": { - "modified": "2019-03-23T22:36:02.702Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-font-language-override": { - "modified": "2019-03-23T23:13:49.521Z", - "contributors": [ - "martinezdario55" - ] - }, - "Web/CSS/-moz-force-broken-image-icon": { - "modified": "2019-03-23T23:21:21.736Z", - "contributors": [ - "Sebastianz", - "teoli", - "jota1410" - ] - }, - "Web/CSS/-moz-image-rect": { - "modified": "2019-03-23T22:35:59.460Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-image-region": { - "modified": "2019-03-23T22:35:58.872Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-orient": { - "modified": "2019-03-23T22:38:38.798Z", - "contributors": [ - "teoli", - "anytameleiro" - ] - }, - "Web/CSS/-moz-outline-radius": { - "modified": "2019-03-23T22:35:49.017Z", - "contributors": [ - "BubuAnabelas", - "teoli", - "Simplexible", - "Prinz_Rana", - "pekechis" - ] - }, - "Web/CSS/-moz-outline-radius-bottomleft": { - "modified": "2019-03-23T22:35:52.557Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-outline-radius-bottomright": { - "modified": "2019-03-23T22:35:53.397Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-outline-radius-topleft": { - "modified": "2019-03-23T22:35:51.509Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-outline-radius-topright": { - "modified": "2019-03-23T22:35:44.264Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-user-focus": { - "modified": "2019-03-23T22:35:52.089Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-moz-user-input": { - "modified": "2019-03-23T22:35:52.458Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-moz-user-modify": { - "modified": "2019-03-23T22:35:48.381Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-webkit-border-before": { - "modified": "2019-03-23T22:35:46.245Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-webkit-box-reflect": { - "modified": "2019-03-23T22:35:45.474Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-webkit-mask": { - "modified": "2019-03-23T22:35:50.079Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-attachment": { - "modified": "2019-03-23T22:35:53.127Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-box-image": { - "modified": "2019-03-23T22:35:44.795Z", - "contributors": [ - "Sebastianz", - "Prinz_Rana", - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-clip": { - "modified": "2019-03-23T22:35:47.057Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-composite": { - "modified": "2019-03-23T22:35:49.602Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-image": { - "modified": "2019-03-23T22:35:45.973Z", - "contributors": [ - "hectorcano", - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-origin": { - "modified": "2019-03-23T22:35:46.533Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-position": { - "modified": "2019-03-23T22:38:37.922Z", - "contributors": [ - "teoli", - "Simplexible", - "Prinz_Rana", - "pekechis", - "Kuiki" - ] - }, - "Web/CSS/-webkit-mask-position-x": { - "modified": "2019-03-23T22:34:17.919Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-position-y": { - "modified": "2019-03-23T22:34:11.674Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-repeat": { - "modified": "2019-03-23T22:35:46.401Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-repeat-x": { - "modified": "2019-03-23T22:34:04.348Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-mask-repeat-y": { - "modified": "2019-03-23T22:34:06.535Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-overflow-scrolling": { - "modified": "2020-10-15T21:44:50.401Z", - "contributors": [ - "AlePerez92", - "teoli", - "natav", - "pekechis" - ] - }, - "Web/CSS/-webkit-print-color-adjust": { - "modified": "2019-03-23T22:35:50.908Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-webkit-tap-highlight-color": { - "modified": "2019-03-23T22:35:33.059Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-text-fill-color": { - "modified": "2019-03-23T22:35:41.363Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-text-stroke": { - "modified": "2020-11-09T04:49:08.502Z", - "contributors": [ - "sideshowbarker", - "codingdudecom", - "NachoNav", - "pekechis" - ] - }, - "Web/CSS/-webkit-text-stroke-color": { - "modified": "2019-03-23T22:35:34.688Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/-webkit-text-stroke-width": { - "modified": "2019-03-23T22:35:36.221Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/-webkit-touch-callout": { - "modified": "2019-03-23T22:35:37.578Z", - "contributors": [ - "teoli", - "rankill", - "pekechis" - ] - }, - "Web/CSS/:-moz-broken": { - "modified": "2019-03-23T22:34:12.269Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-drag-over": { - "modified": "2019-03-23T22:34:06.375Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-first-node": { - "modified": "2019-03-23T22:34:12.741Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-focusring": { - "modified": "2019-03-23T22:34:12.588Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/:-moz-handler-blocked": { - "modified": "2019-03-23T22:33:34.259Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-handler-crashed": { - "modified": "2019-03-23T22:33:27.000Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-handler-disabled": { - "modified": "2019-03-23T22:33:35.339Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-last-node": { - "modified": "2019-03-18T21:15:45.566Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-list-bullet": { - "modified": "2019-03-23T22:29:23.137Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-list-number": { - "modified": "2019-03-23T22:29:22.603Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-loading": { - "modified": "2019-03-23T22:33:38.436Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-locale-dir(ltr)": { - "modified": "2019-03-23T22:33:43.908Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-locale-dir(rtl)": { - "modified": "2019-03-23T22:33:44.356Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-only-whitespace": { - "modified": "2019-03-23T22:33:33.786Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-placeholder": { - "modified": "2019-03-23T22:33:30.015Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/:-moz-submit-invalid": { - "modified": "2019-03-23T22:33:36.639Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-suppressed": { - "modified": "2019-03-23T22:33:37.212Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-ui-invalid": { - "modified": "2019-03-23T22:30:48.940Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/:-moz-ui-valid": { - "modified": "2019-03-23T22:29:23.305Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/:-moz-user-disabled": { - "modified": "2019-03-23T22:30:53.713Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:-moz-window-inactive": { - "modified": "2019-03-23T22:30:43.777Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/:-ms-input-placeholder": { - "modified": "2019-03-23T22:29:24.542Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/:-webkit-autofill": { - "modified": "2019-03-23T22:29:31.809Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-moz-color-swatch": { - "modified": "2020-10-15T22:13:15.247Z", - "contributors": [ - "Adorta4" - ] - }, - "Web/CSS/::-moz-page": { - "modified": "2019-03-23T22:29:23.000Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-moz-page-sequence": { - "modified": "2019-03-23T22:29:18.734Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-moz-placeholder": { - "modified": "2019-03-23T22:29:22.118Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-moz-progress-bar": { - "modified": "2019-03-23T22:29:21.640Z", - "contributors": [ - "lajaso", - "pekechis" - ] - }, - "Web/CSS/::-moz-range-progress": { - "modified": "2019-03-23T22:28:49.325Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-moz-range-thumb": { - "modified": "2019-03-23T22:28:56.558Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-moz-range-track": { - "modified": "2019-03-23T22:27:41.835Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-moz-scrolled-page-sequence": { - "modified": "2019-03-23T22:27:47.385Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-file-upload-button": { - "modified": "2019-03-18T21:21:36.190Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-inner-spin-button": { - "modified": "2019-03-18T21:17:13.569Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-input-placeholder": { - "modified": "2019-03-18T21:16:20.006Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-meter-bar": { - "modified": "2019-03-23T22:27:21.551Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-meter-even-less-good-value": { - "modified": "2019-03-18T21:15:16.586Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-meter-inner-element": { - "modified": "2019-03-23T22:27:02.054Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-meter-optimum-value": { - "modified": "2019-03-23T22:27:09.428Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-meter-suboptimum-value": { - "modified": "2019-03-23T22:27:08.613Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-outer-spin-button": { - "modified": "2019-03-23T22:27:04.174Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-progress-bar": { - "modified": "2019-03-23T22:26:48.592Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-progress-inner-element": { - "modified": "2019-03-23T22:27:11.051Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-progress-value": { - "modified": "2019-03-23T22:26:54.483Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-scrollbar": { - "modified": "2019-03-23T22:26:50.519Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/::-webkit-slider-runnable-track": { - "modified": "2019-03-23T22:26:41.971Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::-webkit-slider-thumb": { - "modified": "2019-03-23T22:26:41.006Z", - "contributors": [ - "teoli", - "pekechis" - ] - }, - "Web/CSS/::after": { - "modified": "2020-10-15T21:15:55.871Z", - "contributors": [ - "JFOG", - "IsraelFloresDGA", - "israel-munoz", - "Lorenzoygata", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/::backdrop": { - "modified": "2019-03-23T22:30:49.892Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/::before": { - "modified": "2020-11-24T07:28:22.113Z", - "contributors": [ - "chrisdavidmills", - "maketas", - "IsraelFloresDGA", - "israel-munoz", - "Yisus777", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/::cue": { - "modified": "2020-10-15T22:33:08.581Z", - "contributors": [ - "Pablo-No" - ] - }, - "Web/CSS/::first-letter": { - "modified": "2020-10-15T22:24:50.087Z", - "contributors": [ - "Plumas", - "adrymrtnz" - ] - }, - "Web/CSS/::first-line": { - "modified": "2020-10-15T22:24:51.827Z", - "contributors": [ - "Plumas", - "ivanenoriega", - "adrymrtnz" - ] - }, - "Web/CSS/::marker": { - "modified": "2020-10-15T22:22:16.686Z", - "contributors": [ - "qwerty726" - ] - }, - "Web/CSS/::placeholder": { - "modified": "2020-10-15T22:26:50.005Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/CSS/::selection": { - "modified": "2019-03-23T23:33:09.211Z", - "contributors": [ - "canobius", - "arroutado", - "jesu_abner", - "teoli", - "pepeheron" - ] - }, - "Web/CSS/::spelling-error": { - "modified": "2020-10-15T22:03:59.841Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/:active": { - "modified": "2020-10-15T21:21:49.325Z", - "contributors": [ - "pollirrata", - "lajaso", - "teoli", - "MrBlogger" - ] - }, - "Web/CSS/:any": { - "modified": "2019-03-23T22:17:18.601Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/:any-link": { - "modified": "2020-10-15T21:52:30.387Z", - "contributors": [ - "JFOG", - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/:blank": { - "modified": "2020-10-15T22:26:47.961Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/CSS/:checked": { - "modified": "2020-10-15T21:32:04.510Z", - "contributors": [ - "lajaso", - "zxhadow" - ] - }, - "Web/CSS/:default": { - "modified": "2020-10-15T21:15:24.516Z", - "contributors": [ - "lajaso", - "teoli", - "Mgjbot", - "Nathymig", - "HenryGR" - ] - }, - "Web/CSS/:defined": { - "modified": "2020-10-15T22:03:59.600Z", - "contributors": [ - "JFOG", - "lajaso" - ] - }, - "Web/CSS/:dir": { - "modified": "2020-10-15T21:44:46.376Z", - "contributors": [ - "lajaso", - "pekechis" - ] - }, - "Web/CSS/:disabled": { - "modified": "2020-10-15T21:43:53.936Z", - "contributors": [ - "lajaso", - "pekechis" - ] - }, - "Web/CSS/:empty": { - "modified": "2020-10-15T21:16:01.534Z", - "contributors": [ - "IsraelFloresDGA", - "lajaso", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/:enabled": { - "modified": "2020-10-15T21:44:29.292Z", - "contributors": [ - "lajaso", - "pekechis" - ] - }, - "Web/CSS/:first": { - "modified": "2020-10-15T21:43:42.281Z", - "contributors": [ - "lajaso", - "pekechis" - ] - }, - "Web/CSS/:first-child": { - "modified": "2020-10-15T21:19:55.452Z", - "contributors": [ - "lajaso", - "teoli", - "percy@mozilla.pe", - "jsalinas" - ] - }, - "Web/CSS/:first-of-type": { - "modified": "2020-10-15T21:44:49.790Z", - "contributors": [ - "lajaso", - "pekechis" - ] - }, - "Web/CSS/:focus": { - "modified": "2020-10-15T21:43:30.779Z", - "contributors": [ - "evaferreira", - "lajaso", - "pekechis" - ] - }, - "Web/CSS/:focus-visible": { - "modified": "2020-10-15T22:33:54.482Z", - "contributors": [ - "arauz.gus" - ] - }, - "Web/CSS/:focus-within": { - "modified": "2020-12-03T05:40:25.197Z", - "contributors": [ - "AlePerez92", - "carlosviteri", - "lajaso", - "AntonioNavajasOjeda" - ] - }, - "Web/CSS/:fullscreen": { - "modified": "2020-10-15T21:51:48.377Z", - "contributors": [ - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/:has": { - "modified": "2019-03-23T22:36:22.444Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/:host": { - "modified": "2020-10-15T22:04:25.470Z", - "contributors": [ - "rhssr", - "lajaso" - ] - }, - "Web/CSS/:hover": { - "modified": "2020-10-15T21:19:57.161Z", - "contributors": [ - "lajaso", - "teoli", - "percy@mozilla.pe", - "ccarruitero" - ] - }, - "Web/CSS/:in-range": { - "modified": "2020-10-15T21:52:29.381Z", - "contributors": [ - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/:indeterminate": { - "modified": "2020-10-15T21:52:30.617Z", - "contributors": [ - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/:invalid": { - "modified": "2020-10-15T21:25:32.434Z", - "contributors": [ - "lajaso", - "teoli", - "ccastillos" - ] - }, - "Web/CSS/:lang": { - "modified": "2020-10-15T21:49:25.234Z", - "contributors": [ - "lajaso", - "sapox" - ] - }, - "Web/CSS/:last-child": { - "modified": "2020-10-15T21:19:56.585Z", - "contributors": [ - "lajaso", - "MarkelCuesta", - "carloque", - "teoli", - "ccarruitero", - "percy@mozilla.pe" - ] - }, - "Web/CSS/:last-of-type": { - "modified": "2020-10-15T21:19:57.770Z", - "contributors": [ - "lajaso", - "teoli", - "jesanchez", - "jsalinas" - ] - }, - "Web/CSS/:left": { - "modified": "2020-10-15T22:03:35.116Z", - "contributors": [ - "Tartarin2018", - "lajaso", - "Skrinch" - ] - }, - "Web/CSS/:link": { - "modified": "2020-10-15T21:54:15.946Z", - "contributors": [ - "lajaso", - "Jhonatangiraldo" - ] - }, - "Web/CSS/:not()": { - "modified": "2020-11-30T09:54:17.195Z", - "contributors": [ - "blanchart", - "lajaso", - "teoli", - "jotadeaa", - "luisgagocasas" - ] - }, - "Web/CSS/:nth-child": { - "modified": "2020-10-15T21:20:38.559Z", - "contributors": [ - "ulisestrujillo", - "lajaso", - "teoli", - "tuxtitlan" - ] - }, - "Web/CSS/:nth-last-child": { - "modified": "2020-10-15T21:42:40.958Z", - "contributors": [ - "lajaso", - "alkaithil" - ] - }, - "Web/CSS/:nth-last-of-type": { - "modified": "2020-10-15T22:04:20.811Z", - "contributors": [ - "AltheaE", - "lajaso" - ] - }, - "Web/CSS/:nth-of-type": { - "modified": "2020-10-15T21:43:57.823Z", - "contributors": [ - "lajaso", - "edkalel" - ] - }, - "Web/CSS/:only-child": { - "modified": "2020-10-15T21:42:38.914Z", - "contributors": [ - "lajaso", - "alkaithil" - ] - }, - "Web/CSS/:only-of-type": { - "modified": "2020-10-15T22:04:23.870Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/:optional": { - "modified": "2020-10-15T22:03:59.272Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/:out-of-range": { - "modified": "2020-10-15T21:52:29.356Z", - "contributors": [ - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/:placeholder-shown": { - "modified": "2020-10-15T22:04:23.723Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/:read-only": { - "modified": "2020-10-15T21:58:16.699Z", - "contributors": [ - "lajaso", - "j-light" - ] - }, - "Web/CSS/:read-write": { - "modified": "2020-10-15T22:04:19.084Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/:required": { - "modified": "2020-10-15T21:44:28.186Z", - "contributors": [ - "lajaso", - "pekechis" - ] - }, - "Web/CSS/:right": { - "modified": "2020-10-15T22:04:16.818Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/:root": { - "modified": "2020-10-15T21:34:17.481Z", - "contributors": [ - "lajaso", - "JavierPeris", - "Xaviju" - ] - }, - "Web/CSS/:target": { - "modified": "2020-10-15T21:44:29.225Z", - "contributors": [ - "lajaso", - "moisesalmonte", - "pekechis" - ] - }, - "Web/CSS/:valid": { - "modified": "2020-10-15T21:45:32.621Z", - "contributors": [ - "lajaso", - "jorgesancheznet" - ] - }, - "Web/CSS/:visited": { - "modified": "2020-10-15T22:04:02.908Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/@charset": { - "modified": "2019-03-23T22:29:53.691Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/@counter-style": { - "modified": "2019-03-18T21:16:44.974Z", - "contributors": [ - "jamesbrown0" - ] - }, - "Web/CSS/@counter-style/additive-symbols": { - "modified": "2019-03-23T22:18:02.836Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/@counter-style/symbols": { - "modified": "2019-03-18T21:15:43.336Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/@document": { - "modified": "2020-10-15T22:01:34.650Z", - "contributors": [ - "SphinxKnight", - "lsosa81" - ] - }, - "Web/CSS/@font-face": { - "modified": "2019-09-26T12:01:00.515Z", - "contributors": [ - "ZodiacFireworks", - "fscholz", - "rtunon", - "ozkxr", - "teoli", - "ccarruitero", - "Nuc134rB0t", - "inma_610" - ] - }, - "Web/CSS/@font-face/font-display": { - "modified": "2020-10-15T21:59:11.206Z", - "contributors": [ - "AlePerez92", - "nuwanda555" - ] - }, - "Web/CSS/@font-face/font-family": { - "modified": "2019-03-23T22:37:47.693Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/@font-face/font-style": { - "modified": "2019-03-23T22:38:47.174Z", - "contributors": [ - "danielfdez" - ] - }, - "Web/CSS/@font-face/src": { - "modified": "2019-03-23T22:17:51.245Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/@font-face/unicode-range": { - "modified": "2020-10-15T21:50:47.753Z", - "contributors": [ - "SphinxKnight", - "giobeatle1794" - ] - }, - "Web/CSS/@font-feature-values": { - "modified": "2019-03-23T22:22:14.476Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/@import": { - "modified": "2019-03-23T23:38:27.735Z", - "contributors": [ - "JorgeCapillo", - "Guillaume-Heras", - "mrstork", - "fscholz", - "teoli", - "jsalinas", - "kamel.araujo" - ] - }, - "Web/CSS/@keyframes": { - "modified": "2019-03-23T23:36:20.944Z", - "contributors": [ - "Sebastianz", - "fscholz", - "Sheppy", - "teoli", - "jesanchez", - "Velociraktor" - ] - }, - "Web/CSS/@media": { - "modified": "2019-03-23T23:16:54.490Z", - "contributors": [ - "israel-munoz", - "fscholz", - "teoli", - "sanathy" - ] - }, - "Web/CSS/@media/altura": { - "modified": "2020-10-15T22:23:38.815Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/CSS/@media/color": { - "modified": "2019-03-18T21:15:44.481Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/@media/display-mode": { - "modified": "2020-10-15T22:23:39.088Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/CSS/@media/hover": { - "modified": "2020-10-15T22:23:44.104Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/CSS/@media/pointer": { - "modified": "2020-10-15T22:27:26.867Z", - "contributors": [ - "qwerty726" - ] - }, - "Web/CSS/@media/resolución": { - "modified": "2019-03-23T22:38:40.675Z", - "contributors": [ - "Conradin88" - ] - }, - "Web/CSS/@media/width": { - "modified": "2019-03-23T22:04:44.569Z", - "contributors": [ - "jswisher", - "wilton-cruz" - ] - }, - "Web/CSS/@namespace": { - "modified": "2020-10-15T22:29:21.901Z", - "contributors": [ - "qwerty726" - ] - }, - "Web/CSS/@page": { - "modified": "2019-03-18T21:35:50.476Z", - "contributors": [ - "luismj" - ] - }, - "Web/CSS/@supports": { - "modified": "2020-10-15T21:43:18.021Z", - "contributors": [ - "SJW", - "angelf", - "MilkSnake" - ] - }, - "Web/CSS/@viewport": { - "modified": "2019-03-18T21:16:54.012Z", - "contributors": [ - "cvrebert" - ] - }, - "Web/CSS/@viewport/height": { - "modified": "2019-03-18T21:38:59.253Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/@viewport/width": { - "modified": "2019-03-18T21:16:26.082Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/At-rule": { - "modified": "2019-03-23T22:29:55.371Z", - "contributors": [ - "Legioinvicta", - "israel-munoz" - ] - }, - "Web/CSS/CSS_Animations": { - "modified": "2019-03-23T22:43:48.247Z", - "contributors": [ - "teoli" - ] - }, - "Web/CSS/CSS_Animations/Detectar_soporte_de_animación_CSS": { - "modified": "2019-03-23T22:41:48.122Z", - "contributors": [ - "wbamberg", - "CristhianLora1", - "DracotMolver" - ] - }, - "Web/CSS/CSS_Animations/Tips": { - "modified": "2020-08-16T13:05:40.057Z", - "contributors": [ - "CamilaAchury", - "SphinxKnight", - "AlbertoVargasMoreno" - ] - }, - "Web/CSS/CSS_Animations/Usando_animaciones_CSS": { - "modified": "2020-07-06T16:16:21.887Z", - "contributors": [ - "Jazperist", - "miguelgilmartinez", - "fermelli", - "GasGen", - "KattyaCuevas", - "rod232", - "Jvalenz1982", - "SphinxKnight", - "teoli", - "onerbs", - "Luis_Calvo", - "ulisescab" - ] - }, - "Web/CSS/CSS_Background_and_Borders": { - "modified": "2019-03-23T22:41:48.399Z", - "contributors": [ - "teoli" - ] - }, - "Web/CSS/CSS_Background_and_Borders/Border-image_generador": { - "modified": "2019-03-23T22:41:48.777Z", - "contributors": [ - "teoli", - "mcclone2001" - ] - }, - "Web/CSS/CSS_Background_and_Borders/Border-radius_generator": { - "modified": "2019-03-18T21:15:42.476Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/CSS_Background_and_Borders/Using_CSS_multiple_backgrounds": { - "modified": "2019-03-23T22:17:03.740Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/CSS_Colors": { - "modified": "2019-03-23T22:23:30.277Z", - "contributors": [ - "betelleclerc", - "Krenair" - ] - }, - "Web/CSS/CSS_Colors/Herramienta_para_seleccionar_color": { - "modified": "2019-03-23T22:23:27.596Z", - "contributors": [ - "elihro" - ] - }, - "Web/CSS/CSS_Containment": { - "modified": "2020-10-21T02:39:25.867Z", - "contributors": [ - "SphinxKnight", - "RoqueAlonso" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout": { - "modified": "2019-03-23T22:43:42.897Z", - "contributors": [ - "danpaltor", - "tipoqueno", - "pepe2016", - "fscholz" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Aligning_Items_in_a_Flex_Container": { - "modified": "2020-09-12T08:36:23.473Z", - "contributors": [ - "x-N0", - "FrankGalanB", - "JulianCGG", - "PauloColorado", - "Irvandoval", - "turuto" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Backwards_Compatibility_of_Flexbox": { - "modified": "2019-11-06T19:10:32.985Z", - "contributors": [ - "tonyrodz" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Casos_de_uso_tipicos_de_Flexbox.": { - "modified": "2019-03-18T21:18:33.523Z", - "contributors": [ - "danpaltor" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Conceptos_Basicos_de_Flexbox": { - "modified": "2020-03-25T21:15:58.856Z", - "contributors": [ - "amazing79", - "otello1971", - "cwalternicolas" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Usando_flexbox_para_componer_aplicaciones_web": { - "modified": "2019-03-23T22:31:07.427Z", - "contributors": [ - "miguelsp" - ] - }, - "Web/CSS/CSS_Flexible_Box_Layout/Usando_las_cajas_flexibles_CSS": { - "modified": "2019-05-15T19:01:41.614Z", - "contributors": [ - "luzbelmex", - "VictorSan45", - "NeXuZZ-SCM", - "Tonylu11", - "javier_junin", - "AlePerez92", - "MMariscal", - "fscholz", - "ArcangelZith", - "FNK", - "rippe2hl", - "StripTM", - "joan.leon", - "arturo_sanz" - ] - }, - "Web/CSS/CSS_Flow_Layout": { - "modified": "2019-03-18T21:21:28.417Z", - "contributors": [ - "ariasfernando" - ] - }, - "Web/CSS/CSS_Fonts": { - "modified": "2019-03-23T22:18:19.285Z", - "contributors": [ - "Squirrel18" - ] - }, - "Web/CSS/CSS_Grid_Layout": { - "modified": "2020-08-21T18:16:34.348Z", - "contributors": [ - "dongerardor", - "yomar-dev", - "amaiafilo", - "AlePerez92", - "aribet", - "StripTM" - ] - }, - "Web/CSS/CSS_Grid_Layout/Auto-placement_in_CSS_Grid_Layout": { - "modified": "2019-11-06T13:46:19.795Z", - "contributors": [ - "tonyrodz" - ] - }, - "Web/CSS/CSS_Grid_Layout/Box_Alignment_in_CSS_Grid_Layout": { - "modified": "2019-05-30T17:37:47.442Z", - "contributors": [ - "narvmtz", - "ocamachor" - ] - }, - "Web/CSS/CSS_Grid_Layout/CSS_Grid_Layout_and_Accessibility": { - "modified": "2019-06-05T03:51:45.202Z", - "contributors": [ - "blanchart" - ] - }, - "Web/CSS/CSS_Grid_Layout/Conceptos_Básicos_del_Posicionamiento_con_Rejillas": { - "modified": "2019-10-01T23:38:23.285Z", - "contributors": [ - "jcastillaingeniero", - "amaiafilo", - "IsraelFloresDGA", - "jorgemontoyab" - ] - }, - "Web/CSS/CSS_Grid_Layout/Realizing_common_layouts_using_CSS_Grid_Layout": { - "modified": "2019-03-18T21:34:10.349Z", - "contributors": [ - "amaiafilo" - ] - }, - "Web/CSS/CSS_Grid_Layout/Relacion_de_Grid_Layout": { - "modified": "2019-12-18T12:24:17.824Z", - "contributors": [ - "amazing79", - "natalygiraldo", - "amaiafilo", - "TavoTrash", - "aribet", - "jorgemontoyab" - ] - }, - "Web/CSS/CSS_Logical_Properties": { - "modified": "2019-03-18T21:11:22.321Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/CSS_Logical_Properties/Basic_concepts": { - "modified": "2019-10-17T05:37:57.001Z", - "contributors": [ - "blanchart", - "teffcode" - ] - }, - "Web/CSS/CSS_Logical_Properties/Dimensionamiento": { - "modified": "2019-03-19T19:17:23.927Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/CSS_Logical_Properties/Floating_and_positioning": { - "modified": "2019-03-18T20:35:38.553Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/CSS_Logical_Properties/Margins_borders_padding": { - "modified": "2019-03-19T13:30:41.950Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/CSS_Modelo_Caja": { - "modified": "2019-03-23T22:37:33.458Z", - "contributors": [ - "tipoqueno", - "pekechis" - ] - }, - "Web/CSS/CSS_Modelo_Caja/Introducción_al_modelo_de_caja_de_CSS": { - "modified": "2019-08-28T10:35:24.055Z", - "contributors": [ - "tipoqueno" - ] - }, - "Web/CSS/CSS_Modelo_Caja/Mastering_margin_collapsing": { - "modified": "2019-03-23T22:32:15.462Z", - "contributors": [ - "amaiafilo", - "Ralexhx", - "javichito" - ] - }, - "Web/CSS/CSS_Motion_Path": { - "modified": "2020-10-15T22:26:49.512Z", - "contributors": [ - "josegarciamanez" - ] - }, - "Web/CSS/CSS_Positioning": { - "modified": "2019-03-23T22:32:36.509Z", - "contributors": [ - "javichito", - "davidhbrown" - ] - }, - "Web/CSS/CSS_Positioning/entendiendo_z_index": { - "modified": "2019-03-18T20:42:17.583Z", - "contributors": [ - "ChipTime", - "javichito" - ] - }, - "Web/CSS/CSS_Positioning/entendiendo_z_index/Agregando_z-index": { - "modified": "2019-03-23T22:32:38.884Z", - "contributors": [ - "javichito" - ] - }, - "Web/CSS/CSS_Positioning/entendiendo_z_index/Apilamiento_y_float": { - "modified": "2019-04-26T07:22:46.044Z", - "contributors": [ - "SphinxKnight", - "LaGallinaTuruleta", - "javichito" - ] - }, - "Web/CSS/CSS_Positioning/entendiendo_z_index/El_contexto_de_apilamiento": { - "modified": "2019-03-23T22:32:44.958Z", - "contributors": [ - "javichito" - ] - }, - "Web/CSS/CSS_Positioning/entendiendo_z_index/Stacking_without_z-index": { - "modified": "2019-03-23T22:32:47.571Z", - "contributors": [ - "javichito" - ] - }, - "Web/CSS/CSS_Positioning/entendiendo_z_index/ejemplo_1_del_contexto_de_apilamiento": { - "modified": "2019-03-23T22:32:36.821Z", - "contributors": [ - "javichito" - ] - }, - "Web/CSS/CSS_Positioning/entendiendo_z_index/ejemplo_2_del_contexto_de_apilamiento": { - "modified": "2019-03-23T22:32:34.821Z", - "contributors": [ - "javichito" - ] - }, - "Web/CSS/CSS_Positioning/entendiendo_z_index/ejemplo_3_del_contexto_de_apilamiento": { - "modified": "2019-03-23T22:32:30.208Z", - "contributors": [ - "javichito" - ] - }, - "Web/CSS/CSS_Properties_Reference": { - "modified": "2019-03-18T21:24:27.305Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/CSS_Reglas_Condicionales": { - "modified": "2019-03-23T22:05:34.864Z", - "contributors": [ - "arnulfolg" - ] - }, - "Web/CSS/CSS_Transforms": { - "modified": "2019-03-23T22:43:47.978Z", - "contributors": [ - "Sebastianz", - "fscholz" - ] - }, - "Web/CSS/CSS_Transforms/Using_CSS_transforms": { - "modified": "2019-03-24T00:05:10.570Z", - "contributors": [ - "recortes", - "fscholz", - "teoli", - "cristianjav", - "ajimix", - "another_sam" - ] - }, - "Web/CSS/CSS_Transitions": { - "modified": "2019-07-24T08:01:48.708Z", - "contributors": [ - "SphinxKnight", - "FedericoMarmo", - "crojasf", - "pekechis" - ] - }, - "Web/CSS/CSS_Types": { - "modified": "2019-03-18T21:35:39.343Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/CSS_Writing_Modes": { - "modified": "2019-04-10T10:27:10.380Z", - "contributors": [ - "cristianmartinez" - ] - }, - "Web/CSS/Cascade": { - "modified": "2020-04-20T15:19:07.785Z", - "contributors": [ - "arjusgit", - "tw1ttt3r" - ] - }, - "Web/CSS/Child_combinator": { - "modified": "2019-03-23T22:17:17.663Z", - "contributors": [ - "ExE-Boss", - "maguz727", - "israel-munoz" - ] - }, - "Web/CSS/Class_selectors": { - "modified": "2019-03-23T22:17:19.977Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/Columnas_CSS": { - "modified": "2019-03-23T22:28:10.699Z", - "contributors": [ - "Anonymous" - ] - }, - "Web/CSS/Comentarios": { - "modified": "2019-03-23T22:16:58.806Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/Comenzando_(tutorial_CSS)": { - "modified": "2019-03-23T23:39:37.048Z", - "contributors": [ - "teoli", - "jsalinas" - ] - }, - "Web/CSS/Como_iniciar": { - "modified": "2019-01-16T13:59:37.327Z", - "contributors": [ - "teoli", - "Izel" - ] - }, - "Web/CSS/Como_iniciar/Por_que_usar_CSS": { - "modified": "2019-03-23T23:39:38.906Z", - "contributors": [ - "teoli", - "jsalinas" - ] - }, - "Web/CSS/Como_iniciar/Que_es_CSS": { - "modified": "2019-03-24T00:11:28.788Z", - "contributors": [ - "fernandomoreno605", - "DavidWebcreate", - "aguilarcarlos", - "teoli", - "LeoHirsch", - "dusvilopez", - "turekon", - "Izel" - ] - }, - "Web/CSS/Descendant_combinator": { - "modified": "2019-03-23T23:13:24.480Z", - "contributors": [ - "ExE-Boss", - "Makiber" - ] - }, - "Web/CSS/Elemento_reemplazo": { - "modified": "2019-03-23T23:08:30.961Z", - "contributors": [ - "jdbazagaruiz" - ] - }, - "Web/CSS/Especificidad": { - "modified": "2020-11-14T17:11:45.294Z", - "contributors": [ - "0neomar", - "fer", - "glrodasz", - "mariupereyra", - "arjusgit", - "DavidGalvis", - "gcjuan", - "LuisSevillano", - "deimidis2", - "aeroxmotion", - "padrecedano", - "Remohir" - ] - }, - "Web/CSS/Gradiente": { - "modified": "2019-03-23T22:37:34.623Z", - "contributors": [ - "devilkillermc", - "mym2013", - "Sebastianz", - "wizAmit", - "slayslot", - "Conradin88" - ] - }, - "Web/CSS/Herramientas": { - "modified": "2019-03-23T22:28:04.142Z", - "contributors": [ - "arturoblack" - ] - }, - "Web/CSS/Herramientas/Cubic_Bezier_Generator": { - "modified": "2019-03-18T21:20:03.429Z", - "contributors": [ - "gsalinase" - ] - }, - "Web/CSS/ID_selectors": { - "modified": "2020-10-15T21:52:30.474Z", - "contributors": [ - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/Introducción": { - "modified": "2019-03-24T00:09:12.368Z", - "contributors": [ - "luismj", - "javierdp", - "teoli", - "inma_610" - ] - }, - "Web/CSS/Introducción/Boxes": { - "modified": "2019-03-23T23:02:20.733Z", - "contributors": [ - "albaluna" - ] - }, - "Web/CSS/Introducción/Cascading_and_inheritance": { - "modified": "2019-03-23T23:02:26.342Z", - "contributors": [ - "carlos.millan3", - "eljonims", - "mamptecnocrata", - "albaluna" - ] - }, - "Web/CSS/Introducción/Color": { - "modified": "2019-03-23T22:59:44.751Z", - "contributors": [ - "albaluna" - ] - }, - "Web/CSS/Introducción/How_CSS_works": { - "modified": "2019-03-23T23:02:23.335Z", - "contributors": [ - "mamptecnocrata", - "albaluna" - ] - }, - "Web/CSS/Introducción/Layout": { - "modified": "2019-03-23T22:20:39.961Z", - "contributors": [ - "lavilofam1" - ] - }, - "Web/CSS/Introducción/Los:estilos_de_texto": { - "modified": "2019-03-23T23:02:09.062Z", - "contributors": [ - "albaluna" - ] - }, - "Web/CSS/Introducción/Media": { - "modified": "2019-03-18T21:15:11.297Z", - "contributors": [ - "luismj" - ] - }, - "Web/CSS/Introducción/Selectors": { - "modified": "2019-03-23T23:02:22.202Z", - "contributors": [ - "albaluna" - ] - }, - "Web/CSS/Layout_cookbook": { - "modified": "2019-03-18T21:22:35.394Z", - "contributors": [ - "StripTM" - ] - }, - "Web/CSS/Layout_mode": { - "modified": "2019-03-18T21:44:15.658Z", - "contributors": [ - "NeXuZZ-SCM" - ] - }, - "Web/CSS/Media_Queries": { - "modified": "2020-10-15T22:13:20.096Z", - "contributors": [ - "mikelmg" - ] - }, - "Web/CSS/Mozilla_Extensions": { - "modified": "2019-03-23T23:21:23.902Z", - "contributors": [ - "ExE-Boss", - "Sebastianz", - "teoli", - "jota1410" - ] - }, - "Web/CSS/Preguntas_frecuentes_sobre_CSS": { - "modified": "2020-07-16T22:25:44.798Z", - "contributors": [ - "teoli", - "inma_610" - ] - }, - "Web/CSS/Primeros_pasos": { - "modified": "2019-03-24T00:05:34.862Z", - "contributors": [ - "teoli", - "deimidis" - ] - }, - "Web/CSS/Pseudo-classes": { - "modified": "2020-02-22T08:04:35.419Z", - "contributors": [ - "BraisOliveira", - "MrEscape54", - "MrCoffey", - "alkaithil", - "viro" - ] - }, - "Web/CSS/Pseudoelementos": { - "modified": "2019-03-23T23:21:50.048Z", - "contributors": [ - "BubuAnabelas", - "VictorAbdon", - "teoli", - "jota1410" - ] - }, - "Web/CSS/Referencia_CSS": { - "modified": "2019-03-24T00:14:13.384Z", - "contributors": [ - "lajaso", - "israel-munoz", - "joshitobuba", - "mrstork", - "prayash", - "malayaleecoder", - "teoli", - "tregagnon", - "inma_610", - "fscholz", - "Nukeador" - ] - }, - "Web/CSS/Referencia_CSS/mix-blend-mode": { - "modified": "2020-10-15T21:37:53.265Z", - "contributors": [ - "Undigon", - "mrstork", - "teoli", - "Sebastianz", - "msanz" - ] - }, - "Web/CSS/Selectores_CSS": { - "modified": "2019-07-09T01:16:13.123Z", - "contributors": [ - "missmakita", - "blanchart", - "Benji1337", - "metal-gogo", - "kikolevante" - ] - }, - "Web/CSS/Selectores_CSS/Usando_la_pseudo-clase_:target_en_selectores": { - "modified": "2020-07-31T07:57:08.167Z", - "contributors": [ - "blanchart", - "israel-munoz" - ] - }, - "Web/CSS/Selectores_atributo": { - "modified": "2020-10-15T21:26:03.862Z", - "contributors": [ - "blanchart", - "MoisesGuevara", - "lajaso", - "teoli", - "jota1410" - ] - }, - "Web/CSS/Selectores_hermanos_adyacentes": { - "modified": "2019-03-23T22:39:30.908Z", - "contributors": [ - "alkaithil" - ] - }, - "Web/CSS/Selectores_hermanos_generales": { - "modified": "2019-03-23T22:39:33.429Z", - "contributors": [ - "alkaithil" - ] - }, - "Web/CSS/Shorthand_properties": { - "modified": "2019-08-11T12:52:52.844Z", - "contributors": [ - "blanchart", - "EstebanRK", - "IsraelFloresDGA", - "huichops" - ] - }, - "Web/CSS/Sintaxis_definición_de_valor": { - "modified": "2019-03-23T22:38:52.899Z", - "contributors": [ - "apazacoder", - "Sebastianz", - "Guillaume-Heras", - "VictorAbdon" - ] - }, - "Web/CSS/Syntax": { - "modified": "2020-09-29T20:54:10.526Z", - "contributors": [ - "lucasmmaidana", - "joseanpg", - "mili01gm", - "Derhks" - ] - }, - "Web/CSS/Texto_CSS": { - "modified": "2019-03-23T22:36:23.444Z", - "contributors": [ - "pekechis" - ] - }, - "Web/CSS/Transiciones_de_CSS": { - "modified": "2019-08-01T05:58:17.579Z", - "contributors": [ - "chrisdavidmills", - "mrstork", - "alberdigital", - "teoli", - "inma_610", - "deimidis" - ] - }, - "Web/CSS/Tutorials": { - "modified": "2019-03-23T22:52:34.225Z", - "contributors": [ - "mariolugo" - ] - }, - "Web/CSS/Type_selectors": { - "modified": "2020-10-15T21:52:26.603Z", - "contributors": [ - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/Universal_selectors": { - "modified": "2020-10-15T21:52:26.325Z", - "contributors": [ - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/Using_CSS_custom_properties": { - "modified": "2020-11-26T20:11:21.130Z", - "contributors": [ - "lupomontero", - "betocantu93", - "sokaluis", - "chrisdavidmills", - "BubuAnabelas", - "Creasick", - "Maseria38", - "FlorTello" - ] - }, - "Web/CSS/Valor_calculado": { - "modified": "2019-03-23T23:53:20.456Z", - "contributors": [ - "teoli", - "Mgjbot", - "Firewordy", - "HenryGR" - ] - }, - "Web/CSS/Valor_inicial": { - "modified": "2019-01-16T15:32:31.295Z", - "contributors": [ - "teoli", - "Mgjbot", - "Nathymig", - "HenryGR" - ] - }, - "Web/CSS/actual_value": { - "modified": "2019-03-23T22:16:54.955Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/align-content": { - "modified": "2019-06-23T02:54:26.562Z", - "contributors": [ - "d0naldo", - "israel-munoz" - ] - }, - "Web/CSS/align-items": { - "modified": "2020-08-01T23:15:43.277Z", - "contributors": [ - "LorenzoSandoval", - "vanesa", - "AlePerez92", - "LuisJorgeLozano", - "israel-munoz" - ] - }, - "Web/CSS/align-self": { - "modified": "2019-03-18T21:17:16.430Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/all": { - "modified": "2019-03-18T21:16:29.697Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/angle": { - "modified": "2019-03-23T22:28:51.690Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/animation": { - "modified": "2019-03-23T23:38:13.777Z", - "contributors": [ - "evaferreira", - "teoli", - "Luis_Calvo", - "jesanchez", - "ccarruitero" - ] - }, - "Web/CSS/animation-delay": { - "modified": "2019-03-23T23:38:13.594Z", - "contributors": [ - "Maletil", - "teoli", - "Luis_Calvo", - "jesanchez", - "jsalinas" - ] - }, - "Web/CSS/animation-direction": { - "modified": "2019-03-23T23:38:14.261Z", - "contributors": [ - "teoli", - "Luis_Calvo", - "jesanchez", - "jsalinas" - ] - }, - "Web/CSS/animation-duration": { - "modified": "2019-03-23T23:31:43.672Z", - "contributors": [ - "teoli", - "Sebastianz", - "Luis_Calvo" - ] - }, - "Web/CSS/animation-fill-mode": { - "modified": "2019-03-23T23:03:51.180Z", - "contributors": [ - "teoli", - "Sebastianz", - "luigli", - "jesusr" - ] - }, - "Web/CSS/animation-iteration-count": { - "modified": "2019-03-23T22:59:21.919Z", - "contributors": [ - "teoli", - "Sebastianz", - "maiky" - ] - }, - "Web/CSS/animation-name": { - "modified": "2019-03-23T22:59:26.717Z", - "contributors": [ - "teoli", - "Sebastianz", - "maiky" - ] - }, - "Web/CSS/animation-play-state": { - "modified": "2019-03-23T22:44:18.177Z", - "contributors": [ - "Boton" - ] - }, - "Web/CSS/animation-timing-function": { - "modified": "2019-03-23T22:44:11.502Z", - "contributors": [ - "ndeniche", - "mrstork", - "Boton" - ] - }, - "Web/CSS/appearance": { - "modified": "2019-03-23T22:44:40.090Z", - "contributors": [ - "ExE-Boss", - "teoli", - "wbamberg", - "guerratron" - ] - }, - "Web/CSS/attr()": { - "modified": "2020-11-04T08:51:33.506Z", - "contributors": [ - "chrisdavidmills", - "mrstork", - "prayash", - "ismachine" - ] - }, - "Web/CSS/auto": { - "modified": "2019-01-16T15:41:51.944Z", - "contributors": [ - "teoli", - "Nathymig", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/backdrop-filter": { - "modified": "2020-10-15T22:05:06.351Z", - "contributors": [ - "lajaso" - ] - }, - "Web/CSS/backface-visibility": { - "modified": "2019-03-23T22:18:09.464Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/background": { - "modified": "2020-04-23T17:42:59.807Z", - "contributors": [ - "JAMC", - "MMariscal", - "SphinxKnight", - "fscholz", - "teoli", - "sebasmagri", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/background-attachment": { - "modified": "2020-10-06T09:05:59.493Z", - "contributors": [ - "blanchart", - "smltalavera95", - "SphinxKnight", - "fscholz", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/background-blend-mode": { - "modified": "2019-03-23T22:59:28.908Z", - "contributors": [ - "ExE-Boss", - "israel-munoz", - "mrstork", - "teoli", - "Sebastianz", - "maiky" - ] - }, - "Web/CSS/background-clip": { - "modified": "2019-03-18T20:52:42.788Z", - "contributors": [ - "Beatriz_Ortega_Valdes", - "Carlos_Gutierrez", - "teoli", - "Sebastianz", - "rurigk" - ] - }, - "Web/CSS/background-color": { - "modified": "2019-10-10T16:45:24.871Z", - "contributors": [ - "SphinxKnight", - "danielfdez", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/background-image": { - "modified": "2020-05-06T04:02:29.611Z", - "contributors": [ - "blanchart", - "evaferreira", - "SphinxKnight", - "alexisCan", - "andrpueb", - "teoli", - "Rayber", - "Nathymig", - "ethertank" - ] - }, - "Web/CSS/background-origin": { - "modified": "2019-03-24T00:15:00.605Z", - "contributors": [ - "teoli", - "Seanwalker" - ] - }, - "Web/CSS/background-position": { - "modified": "2020-05-06T06:30:15.110Z", - "contributors": [ - "blanchart", - "SphinxKnight", - "teoli", - "FredB", - "Nathymig", - "ethertank" - ] - }, - "Web/CSS/background-position-x": { - "modified": "2020-10-15T22:33:04.718Z", - "contributors": [ - "Ismael_Diaz" - ] - }, - "Web/CSS/background-repeat": { - "modified": "2020-10-15T21:16:00.953Z", - "contributors": [ - "itxuixdev", - "SphinxKnight", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/background-size": { - "modified": "2019-03-23T23:38:13.094Z", - "contributors": [ - "blanchart", - "samuelrb", - "Simplexible", - "Sebastianz", - "Prinz_Rana", - "fscholz", - "teoli", - "chux", - "aguztinrs" - ] - }, - "Web/CSS/basic-shape": { - "modified": "2019-03-23T22:21:44.895Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/blend-mode": { - "modified": "2020-12-04T10:45:45.837Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/block-size": { - "modified": "2019-03-25T00:21:59.271Z", - "contributors": [ - "teffcode", - "israel-munoz" - ] - }, - "Web/CSS/border": { - "modified": "2020-09-27T22:17:02.248Z", - "contributors": [ - "usuarioMan", - "cgosorio", - "wbamberg", - "SphinxKnight", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/border-block": { - "modified": "2020-10-15T22:16:25.322Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-block-color": { - "modified": "2020-10-15T22:16:29.172Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-block-end": { - "modified": "2019-03-23T00:00:36.213Z", - "contributors": [ - "teffcode", - "israel-munoz" - ] - }, - "Web/CSS/border-block-end-color": { - "modified": "2019-03-24T11:12:10.336Z", - "contributors": [ - "teffcode", - "israel-munoz" - ] - }, - "Web/CSS/border-block-end-style": { - "modified": "2019-03-23T22:11:28.819Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/border-block-end-width": { - "modified": "2020-10-15T22:16:29.514Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-block-start": { - "modified": "2020-10-15T22:16:31.641Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-block-start-color": { - "modified": "2020-10-15T22:16:30.534Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-block-start-style": { - "modified": "2020-10-15T22:16:32.074Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-block-start-width": { - "modified": "2020-10-15T22:16:36.793Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-block-style": { - "modified": "2020-10-15T22:16:36.371Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-block-width": { - "modified": "2020-10-15T22:16:39.535Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-bottom": { - "modified": "2019-03-24T00:08:41.510Z", - "contributors": [ - "wbamberg", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/border-bottom-color": { - "modified": "2019-03-24T00:08:33.937Z", - "contributors": [ - "wbamberg", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/border-bottom-left-radius": { - "modified": "2019-03-18T21:16:45.497Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/border-bottom-right-radius": { - "modified": "2019-03-18T21:15:46.042Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/border-bottom-style": { - "modified": "2019-03-24T00:08:38.365Z", - "contributors": [ - "wbamberg", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/border-bottom-width": { - "modified": "2019-03-24T00:12:49.342Z", - "contributors": [ - "wbamberg", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/border-collapse": { - "modified": "2019-03-23T23:52:09.803Z", - "contributors": [ - "wbamberg", - "teoli", - "Mgjbot", - "Nathymig" - ] - }, - "Web/CSS/border-color": { - "modified": "2019-03-24T00:08:40.211Z", - "contributors": [ - "wbamberg", - "SphinxKnight", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/border-end-end-radius": { - "modified": "2020-10-15T22:16:36.075Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-end-start-radius": { - "modified": "2020-10-15T22:16:41.715Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-image": { - "modified": "2019-03-23T23:21:15.962Z", - "contributors": [ - "teoli", - "Sebastianz", - "JuanCastela", - "yeyxav" - ] - }, - "Web/CSS/border-image-outset": { - "modified": "2019-03-23T22:22:10.809Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/border-image-repeat": { - "modified": "2020-10-15T21:51:01.640Z", - "contributors": [ - "SphinxKnight", - "israel-munoz" - ] - }, - "Web/CSS/border-image-slice": { - "modified": "2019-03-23T22:22:00.674Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/border-inline": { - "modified": "2020-10-15T22:16:39.413Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-color": { - "modified": "2020-10-15T22:16:39.129Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-end": { - "modified": "2020-10-15T22:16:35.919Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-end-color": { - "modified": "2020-10-15T22:16:44.169Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-end-style": { - "modified": "2020-10-15T22:16:36.354Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-end-width": { - "modified": "2020-10-15T22:16:36.837Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-start": { - "modified": "2020-10-15T22:16:44.782Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-start-color": { - "modified": "2020-10-15T22:16:35.643Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-start-style": { - "modified": "2020-10-15T22:16:41.098Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-start-width": { - "modified": "2020-10-15T22:16:33.765Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-style": { - "modified": "2020-10-15T22:16:43.176Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-inline-width": { - "modified": "2020-10-15T22:16:39.409Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-left": { - "modified": "2019-03-24T00:08:37.376Z", - "contributors": [ - "fscholz", - "teoli", - "Yuichiro", - "Mgjbot", - "Wrongloop" - ] - }, - "Web/CSS/border-left-color": { - "modified": "2019-03-23T23:52:28.495Z", - "contributors": [ - "wbamberg", - "d8vjork", - "teoli", - "Wrongloop" - ] - }, - "Web/CSS/border-radius": { - "modified": "2019-03-23T23:37:30.234Z", - "contributors": [ - "Barleby", - "Simplexible", - "Sebastianz", - "Prinz_Rana", - "teoli", - "bytx", - "wilo" - ] - }, - "Web/CSS/border-right": { - "modified": "2020-10-15T22:17:02.534Z", - "contributors": [ - "dlopez525", - "osperi" - ] - }, - "Web/CSS/border-spacing": { - "modified": "2019-03-23T23:52:00.961Z", - "contributors": [ - "wbamberg", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/border-start-end-radius": { - "modified": "2020-10-15T22:16:40.778Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-start-start-radius": { - "modified": "2020-10-15T22:16:40.498Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/border-style": { - "modified": "2020-10-22T00:09:31.436Z", - "contributors": [ - "YairCaptain", - "SphinxKnight", - "javierpolit", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/border-top": { - "modified": "2019-03-23T22:41:47.976Z", - "contributors": [ - "cgosorio", - "mcclone2001" - ] - }, - "Web/CSS/border-top-color": { - "modified": "2020-10-15T21:59:59.493Z", - "contributors": [ - "jpmontoya182" - ] - }, - "Web/CSS/border-top-left-radius": { - "modified": "2019-03-23T22:27:25.384Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/border-top-right-radius": { - "modified": "2019-03-23T22:27:24.905Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/border-width": { - "modified": "2020-12-03T13:55:01.337Z", - "contributors": [ - "rc925e", - "davisorb95", - "wbamberg", - "SphinxKnight", - "Yisus777", - "teoli", - "Yuichiro", - "Nathymig" - ] - }, - "Web/CSS/bottom": { - "modified": "2019-01-16T15:42:01.210Z", - "contributors": [ - "teoli", - "Nathymig", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/box-shadow": { - "modified": "2020-10-15T21:19:58.329Z", - "contributors": [ - "davidpala.dev", - "IsraelFloresDGA", - "Sebastianz", - "Prinz_Rana", - "teoli", - "carloshs92" - ] - }, - "Web/CSS/box-sizing": { - "modified": "2020-10-15T21:37:29.482Z", - "contributors": [ - "amazing79", - "Soyaine", - "manuelizo", - "IsraelFloresDGA", - "GiioBass", - "Derhks", - "Sebastianz", - "juandiegoles" - ] - }, - "Web/CSS/calc()": { - "modified": "2020-11-04T09:08:00.719Z", - "contributors": [ - "chrisdavidmills", - "blanchart", - "mrstork", - "prayash", - "teoli", - "MrBlogger" - ] - }, - "Web/CSS/caret-color": { - "modified": "2019-03-23T22:08:56.287Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/clear": { - "modified": "2020-10-30T03:42:19.832Z", - "contributors": [ - "SphinxKnight", - "Alxbrz19", - "javichito" - ] - }, - "Web/CSS/clip": { - "modified": "2019-03-23T23:33:36.877Z", - "contributors": [ - "Sebastianz", - "teoli", - "nadiafaya" - ] - }, - "Web/CSS/clip-path": { - "modified": "2020-10-15T21:54:58.750Z", - "contributors": [ - "fscholz", - "jorgeherrera9103", - "david-velilla", - "CarlosLinares" - ] - }, - "Web/CSS/color": { - "modified": "2020-10-15T21:15:23.982Z", - "contributors": [ - "rhssr", - "SphinxKnight", - "teoli", - "trada", - "Mgjbot", - "HenryGR" - ] - }, - "Web/CSS/color_value": { - "modified": "2019-03-23T22:37:22.211Z", - "contributors": [ - "blanchart", - "Sebastianz", - "Simplexible", - "pekechis" - ] - }, - "Web/CSS/column-count": { - "modified": "2020-10-15T21:40:29.448Z", - "contributors": [ - "AlePerez92", - "Anonymous", - "Sebastianz", - "Davier182" - ] - }, - "Web/CSS/column-span": { - "modified": "2020-10-15T22:21:55.127Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/CSS/content": { - "modified": "2019-03-23T23:51:59.928Z", - "contributors": [ - "teoli", - "Nathymig", - "HenryGR" - ] - }, - "Web/CSS/cursor": { - "modified": "2019-03-23T23:52:22.554Z", - "contributors": [ - "wbamberg", - "teoli", - "Wrongloop" - ] - }, - "Web/CSS/cursor/Uso_de_URL_como_valor_de_la_propiedad_cursor": { - "modified": "2019-03-24T00:04:04.275Z", - "contributors": [ - "teoli", - "fscholz", - "Mgjbot", - "Jorolo" - ] - }, - "Web/CSS/direction": { - "modified": "2019-01-16T15:40:27.790Z", - "contributors": [ - "teoli", - "Nathymig", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/display": { - "modified": "2020-10-21T14:14:21.533Z", - "contributors": [ - "johanfvn", - "davidpala.dev", - "NeoFl3x", - "wbamberg", - "evaferreira", - "SphinxKnight", - "devCaso", - "FranciscoCastle" - ] - }, - "Web/CSS/env()": { - "modified": "2020-11-10T11:09:30.133Z", - "contributors": [ - "chrisdavidmills", - "severo" - ] - }, - "Web/CSS/filter": { - "modified": "2019-03-23T22:59:24.815Z", - "contributors": [ - "israel-munoz", - "Sebastianz", - "teoli", - "maiky" - ] - }, - "Web/CSS/filter-function": { - "modified": "2019-03-18T21:34:50.284Z", - "contributors": [ - "lajaso", - "mfluehr" - ] - }, - "Web/CSS/filter-function/blur()": { - "modified": "2020-11-05T09:45:32.642Z", - "contributors": [ - "chrisdavidmills", - "lajaso" - ] - }, - "Web/CSS/filter-function/brightness()": { - "modified": "2020-11-05T09:57:09.596Z", - "contributors": [ - "chrisdavidmills", - "mjsorribas" - ] - }, - "Web/CSS/filter-function/url": { - "modified": "2020-01-10T13:46:46.404Z", - "contributors": [ - "roocce" - ] - }, - "Web/CSS/fit-content": { - "modified": "2020-10-15T22:06:18.387Z", - "contributors": [ - "ocamachor" - ] - }, - "Web/CSS/flex": { - "modified": "2019-03-23T22:31:42.324Z", - "contributors": [ - "Luis_Calvo", - "joshitobuba", - "Enfokat" - ] - }, - "Web/CSS/flex-basis": { - "modified": "2020-08-16T18:24:46.422Z", - "contributors": [ - "metrapach", - "joshitobuba", - "jandrade" - ] - }, - "Web/CSS/flex-direction": { - "modified": "2020-10-15T21:29:59.011Z", - "contributors": [ - "Alex_Figueroa", - "evaferreira", - "Manuel-Kas", - "joshitobuba", - "fscholz", - "Sebastianz", - "elkinbernal" - ] - }, - "Web/CSS/flex-flow": { - "modified": "2019-03-18T21:15:12.282Z", - "contributors": [ - "carlos.millan3", - "abaracedo" - ] - }, - "Web/CSS/flex-grow": { - "modified": "2020-05-06T21:30:31.507Z", - "contributors": [ - "soniarecher", - "joshitobuba" - ] - }, - "Web/CSS/flex-shrink": { - "modified": "2020-10-15T22:00:16.924Z", - "contributors": [ - "deluxury", - "Facundo-Corradini" - ] - }, - "Web/CSS/flex-wrap": { - "modified": "2019-03-23T23:02:38.556Z", - "contributors": [ - "joshitobuba", - "fscholz", - "Sebastianz", - "Rober84" - ] - }, - "Web/CSS/float": { - "modified": "2020-11-07T16:01:06.351Z", - "contributors": [ - "ppalma1963", - "melisb3", - "wbamberg", - "SphinxKnight", - "teoli", - "fscholz", - "Mgjbot", - "Nathymig", - "HenryGR" - ] - }, - "Web/CSS/font": { - "modified": "2019-03-23T23:53:27.791Z", - "contributors": [ - "wbamberg", - "fscholz", - "teoli", - "Mgjbot", - "Nathymig", - "Nukeador", - "RickieesES", - "HenryGR" - ] - }, - "Web/CSS/font-family": { - "modified": "2019-03-23T23:52:00.350Z", - "contributors": [ - "wbamberg", - "fscholz", - "teoli", - "Nathymig", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/font-size": { - "modified": "2019-03-23T23:52:02.387Z", - "contributors": [ - "wbamberg", - "fscholz", - "teoli", - "Nathymig", - "RickieesES", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/font-size-adjust": { - "modified": "2019-03-23T23:53:20.314Z", - "contributors": [ - "wbamberg", - "ivangrimaldo", - "fscholz", - "teoli", - "Mgjbot", - "Nathymig", - "HenryGR" - ] - }, - "Web/CSS/font-style": { - "modified": "2019-03-23T23:54:11.290Z", - "contributors": [ - "gustavodibasson", - "ivyixbvp", - "teoli", - "Mgjbot", - "Nathymig", - "RickieesES", - "HenryGR" - ] - }, - "Web/CSS/font-variant": { - "modified": "2019-03-23T23:54:15.244Z", - "contributors": [ - "wbamberg", - "fscholz", - "teoli", - "Mgjbot", - "Nathymig", - "RickieesES", - "HenryGR" - ] - }, - "Web/CSS/font-variant-alternates": { - "modified": "2019-03-23T22:18:05.471Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/font-weight": { - "modified": "2020-10-08T18:46:18.623Z", - "contributors": [ - "jorgetoloza", - "EzeRamirez84", - "UbaldoRosas", - "ivyixbvp", - "SphinxKnight", - "fscholz", - "teoli", - "Mgjbot", - "ethertank", - "Nathymig", - "RickieesES", - "HenryGR" - ] - }, - "Web/CSS/frequency": { - "modified": "2019-03-23T22:22:14.267Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/grid": { - "modified": "2019-03-23T22:08:26.115Z", - "contributors": [ - "macagua", - "andresrisso" - ] - }, - "Web/CSS/grid-auto-columns": { - "modified": "2020-10-15T22:07:00.570Z", - "contributors": [ - "melisb3", - "robyirloreto" - ] - }, - "Web/CSS/grid-auto-rows": { - "modified": "2020-10-15T22:00:41.266Z", - "contributors": [ - "chulesoft", - "deimidis2" - ] - }, - "Web/CSS/grid-column-gap": { - "modified": "2020-10-15T22:01:06.788Z", - "contributors": [ - "agarcilazo", - "klaufel" - ] - }, - "Web/CSS/grid-gap": { - "modified": "2019-03-23T22:13:30.250Z", - "contributors": [ - "ireneml.fr" - ] - }, - "Web/CSS/grid-template-areas": { - "modified": "2019-03-23T22:11:49.454Z", - "contributors": [ - "diroco" - ] - }, - "Web/CSS/grid-template-columns": { - "modified": "2020-10-15T21:57:16.414Z", - "contributors": [ - "fscholz", - "IsraelFloresDGA" - ] - }, - "Web/CSS/grid-template-rows": { - "modified": "2020-10-15T21:57:11.635Z", - "contributors": [ - "AlePerez92", - "fscholz", - "IsraelFloresDGA" - ] - }, - "Web/CSS/height": { - "modified": "2019-03-23T23:54:05.630Z", - "contributors": [ - "israel-munoz", - "teoli", - "Mgjbot", - "Nathymig", - "HenryGR" - ] - }, - "Web/CSS/hyphens": { - "modified": "2020-10-15T22:02:23.515Z", - "contributors": [ - "blanchart", - "AntonioNavajasOjeda" - ] - }, - "Web/CSS/image": { - "modified": "2019-03-23T22:28:08.883Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/image-rendering": { - "modified": "2020-10-15T22:02:06.401Z", - "contributors": [ - "rodrigorila" - ] - }, - "Web/CSS/ime-mode": { - "modified": "2019-01-16T14:38:44.597Z", - "contributors": [ - "teoli", - "fscholz", - "Mgjbot", - "Nathymig", - "HenryGR" - ] - }, - "Web/CSS/inherit": { - "modified": "2019-07-27T06:34:31.498Z", - "contributors": [ - "josepaternina", - "AlejandroJSR7", - "teoli", - "Nathymig", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/inheritance": { - "modified": "2019-03-23T23:53:04.499Z", - "contributors": [ - "joseanpg", - "teoli", - "Mgjbot", - "Nathymig", - "HenryGR" - ] - }, - "Web/CSS/initial": { - "modified": "2019-01-16T15:42:24.130Z", - "contributors": [ - "teoli", - "Nathymig", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/inline-size": { - "modified": "2020-10-15T22:16:34.800Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/inset": { - "modified": "2020-10-15T22:16:40.193Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/inset-block": { - "modified": "2020-10-15T22:16:40.204Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/inset-block-end": { - "modified": "2020-10-15T22:16:39.037Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/inset-block-start": { - "modified": "2020-10-15T22:16:44.127Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/inset-inline": { - "modified": "2020-10-15T22:16:43.251Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/inset-inline-end": { - "modified": "2020-10-15T22:16:39.864Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/inset-inline-start": { - "modified": "2020-10-15T22:16:43.418Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/integer": { - "modified": "2019-03-23T23:50:21.071Z", - "contributors": [ - "fscholz", - "teoli", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/isolation": { - "modified": "2019-03-23T22:32:29.363Z", - "contributors": [ - "SoftwareRVG", - "javichito" - ] - }, - "Web/CSS/justify-content": { - "modified": "2019-03-23T22:48:18.861Z", - "contributors": [ - "amaiafilo", - "angelfeliz", - "teoli", - "Sebastianz", - "JoaquinBedoian" - ] - }, - "Web/CSS/left": { - "modified": "2020-10-15T21:15:23.699Z", - "contributors": [ - "SphinxKnight", - "miltonjosuerivascastro100", - "Sebastianz", - "teoli", - "ethertank", - "Mgjbot", - "fiorella", - "HenryGR" - ] - }, - "Web/CSS/length": { - "modified": "2019-03-23T23:54:15.791Z", - "contributors": [ - "israel-munoz", - "fscholz", - "teoli", - "deibyod", - "Mgjbot", - "HenryGR" - ] - }, - "Web/CSS/line-height": { - "modified": "2019-06-20T19:43:18.097Z", - "contributors": [ - "jalonnun", - "Daniel_Martin", - "wbamberg", - "IsaacAaron", - "SphinxKnight", - "garolard", - "teoli", - "Mgjbot", - "Nathymig", - "RickieesES", - "HenryGR" - ] - }, - "Web/CSS/linear-gradient()": { - "modified": "2020-11-16T08:56:55.739Z", - "contributors": [ - "chrisdavidmills", - "efrenmartinez", - "rgomez", - "Miguelslo27", - "Sebastianz", - "prayash", - "scarnagot" - ] - }, - "Web/CSS/list-style": { - "modified": "2019-03-23T23:52:08.020Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/list-style-image": { - "modified": "2019-03-23T23:52:12.640Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/list-style-position": { - "modified": "2019-03-23T23:52:11.106Z", - "contributors": [ - "magdic", - "SphinxKnight", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/list-style-type": { - "modified": "2019-03-23T23:52:09.967Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Nathymig", - "ethertank" - ] - }, - "Web/CSS/margin": { - "modified": "2019-03-23T22:26:03.547Z", - "contributors": [ - "Limbian" - ] - }, - "Web/CSS/margin-block": { - "modified": "2020-10-15T22:16:43.806Z", - "contributors": [ - "mariadelrosario98", - "teffcode" - ] - }, - "Web/CSS/margin-block-start": { - "modified": "2020-10-15T22:16:40.788Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/margin-bottom": { - "modified": "2019-03-23T23:13:38.811Z", - "contributors": [ - "wbamberg", - "Sebastianz", - "fscholz", - "damesa" - ] - }, - "Web/CSS/margin-inline": { - "modified": "2020-10-15T22:16:41.777Z", - "contributors": [ - "karen-pal", - "teffcode" - ] - }, - "Web/CSS/margin-inline-end": { - "modified": "2020-10-15T22:16:40.105Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/margin-inline-start": { - "modified": "2020-10-15T22:16:38.735Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/margin-right": { - "modified": "2019-03-23T23:54:10.369Z", - "contributors": [ - "teoli", - "Marti1125" - ] - }, - "Web/CSS/max-block-size": { - "modified": "2020-10-15T22:16:39.543Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/max-height": { - "modified": "2019-03-23T23:52:01.295Z", - "contributors": [ - "wbamberg", - "marc31bilbao", - "teoli", - "Mgjbot", - "Nathymig" - ] - }, - "Web/CSS/max-inline-size": { - "modified": "2020-10-15T22:16:37.228Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/max-width": { - "modified": "2020-10-15T21:16:38.209Z", - "contributors": [ - "SphinxKnight", - "teoli", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/min()": { - "modified": "2020-12-03T10:19:50.144Z", - "contributors": [ - "AlePerez92", - "chrisdavidmills", - "meolivares06" - ] - }, - "Web/CSS/min-block-size": { - "modified": "2020-10-15T22:16:39.045Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/min-height": { - "modified": "2019-03-23T23:51:59.533Z", - "contributors": [ - "wbamberg", - "Sebastianz", - "teoli", - "Nathymig" - ] - }, - "Web/CSS/min-inline-size": { - "modified": "2020-10-15T22:16:37.579Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/min-width": { - "modified": "2019-03-23T23:50:19.370Z", - "contributors": [ - "wbamberg", - "SphinxKnight", - "teoli", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/minmax()": { - "modified": "2020-11-16T09:05:45.467Z", - "contributors": [ - "chrisdavidmills", - "jorgemontoyab" - ] - }, - "Web/CSS/normal": { - "modified": "2019-03-23T23:50:19.746Z", - "contributors": [ - "teoli", - "FredB", - "HenryGR" - ] - }, - "Web/CSS/number": { - "modified": "2019-03-23T23:53:45.345Z", - "contributors": [ - "fscholz", - "teoli", - "Mgjbot", - "HenryGR" - ] - }, - "Web/CSS/object-fit": { - "modified": "2020-10-15T21:53:59.281Z", - "contributors": [ - "AlePerez92", - "BubuAnabelas", - "Cristhian-Medina", - "fernandozarco", - "chrisvpr", - "cristianeph" - ] - }, - "Web/CSS/object-position": { - "modified": "2019-03-23T22:31:02.066Z", - "contributors": [ - "thezeeck" - ] - }, - "Web/CSS/opacity": { - "modified": "2019-08-20T11:36:11.809Z", - "contributors": [ - "Armando-Cruz", - "blanchart", - "Manten19", - "UlisesGascon", - "teoli" - ] - }, - "Web/CSS/order": { - "modified": "2019-03-23T22:28:06.551Z", - "contributors": [ - "evaferreira", - "joshitobuba" - ] - }, - "Web/CSS/outline": { - "modified": "2020-10-15T21:49:07.223Z", - "contributors": [ - "danielblazquez", - "IsaacAaron", - "israel-munoz" - ] - }, - "Web/CSS/outline-color": { - "modified": "2019-03-18T21:15:39.790Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/outline-offset": { - "modified": "2019-03-23T22:27:28.876Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/outline-style": { - "modified": "2019-03-18T21:45:18.063Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/outline-width": { - "modified": "2019-03-18T21:16:50.488Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/overflow": { - "modified": "2020-10-15T21:22:11.063Z", - "contributors": [ - "manuelizo", - "SJW", - "marc-ferrer", - "developingo", - "Sebastianz", - "Sheppy", - "teoli", - "_0x" - ] - }, - "Web/CSS/overflow-y": { - "modified": "2020-10-15T21:37:11.176Z", - "contributors": [ - "_deiberchacon", - "Silly-and_Clever", - "teoli", - "Sebastianz", - "yvesmh" - ] - }, - "Web/CSS/padding": { - "modified": "2020-07-02T20:44:00.780Z", - "contributors": [ - "kren.funes17", - "arielnoname", - "Sebastianz", - "fscholz", - "teoli", - "maiky" - ] - }, - "Web/CSS/padding-block": { - "modified": "2020-10-15T22:16:40.169Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/padding-block-end": { - "modified": "2020-10-15T22:16:44.832Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/padding-block-start": { - "modified": "2020-10-15T22:16:44.371Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/padding-bottom": { - "modified": "2019-03-23T22:12:06.885Z", - "contributors": [ - "qsanabria" - ] - }, - "Web/CSS/padding-inline": { - "modified": "2020-10-15T22:16:45.046Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/padding-inline-end": { - "modified": "2020-10-15T22:16:39.998Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/padding-inline-start": { - "modified": "2020-10-15T22:16:41.877Z", - "contributors": [ - "teffcode" - ] - }, - "Web/CSS/padding-top": { - "modified": "2019-03-23T22:12:05.180Z", - "contributors": [ - "qsanabria" - ] - }, - "Web/CSS/perspective": { - "modified": "2019-03-23T23:23:10.717Z", - "contributors": [ - "Sebastianz", - "Prinz_Rana", - "fscholz", - "teoli", - "AngelFQC" - ] - }, - "Web/CSS/porcentaje": { - "modified": "2019-03-23T23:25:05.075Z", - "contributors": [ - "fscholz", - "teoli", - "aerotrink" - ] - }, - "Web/CSS/position": { - "modified": "2020-10-15T21:15:59.180Z", - "contributors": [ - "mollzilla", - "ismamz", - "mauriciopaterninar", - "phurtado1112", - "sejas", - "OttoChamo", - "plaso", - "Aleks07m", - "welm", - "SphinxKnight", - "CarmenCamacho", - "enriqueabsurdum", - "killoblanco", - "teoli", - "Mgjbot", - "HenryGR" - ] - }, - "Web/CSS/quotes": { - "modified": "2020-10-15T21:46:00.335Z", - "contributors": [ - "SJW", - "arroutado" - ] - }, - "Web/CSS/radial-gradient()": { - "modified": "2020-11-18T14:42:09.252Z", - "contributors": [ - "chrisdavidmills", - "hectorcano", - "israel-munoz" - ] - }, - "Web/CSS/repeat()": { - "modified": "2020-11-18T14:44:16.857Z", - "contributors": [ - "chrisdavidmills", - "CrlsMrls", - "IsraelFloresDGA" - ] - }, - "Web/CSS/resize": { - "modified": "2019-03-23T22:49:42.378Z", - "contributors": [ - "SphinxKnight", - "Sebastianz", - "gonzalec" - ] - }, - "Web/CSS/resolución": { - "modified": "2019-03-23T22:38:44.850Z", - "contributors": [ - "Sebastianz", - "Prinz_Rana", - "Conradin88" - ] - }, - "Web/CSS/resolved_value": { - "modified": "2019-03-23T22:16:57.498Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/right": { - "modified": "2019-03-24T00:13:54.957Z", - "contributors": [ - "wbamberg", - "SphinxKnight", - "Sebastianz", - "teoli", - "FredB", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/rtl": { - "modified": "2019-01-16T15:48:03.556Z", - "contributors": [ - "teoli", - "HenryGR" - ] - }, - "Web/CSS/scroll-behavior": { - "modified": "2019-03-23T22:07:41.439Z", - "contributors": [ - "pantuflo" - ] - }, - "Web/CSS/specified_value": { - "modified": "2019-03-23T22:16:53.752Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/text-decoration": { - "modified": "2019-03-23T22:21:38.548Z", - "contributors": [ - "fitojb", - "israel-munoz" - ] - }, - "Web/CSS/text-decoration-color": { - "modified": "2019-03-23T22:27:00.164Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/text-decoration-line": { - "modified": "2020-10-15T21:49:07.335Z", - "contributors": [ - "AlePerez92", - "israel-munoz" - ] - }, - "Web/CSS/text-decoration-style": { - "modified": "2019-03-18T21:17:28.073Z", - "contributors": [ - "JimP99", - "israel-munoz" - ] - }, - "Web/CSS/text-emphasis": { - "modified": "2019-03-23T22:09:46.786Z", - "contributors": [ - "studioArtbliss" - ] - }, - "Web/CSS/text-emphasis-color": { - "modified": "2020-10-15T21:57:48.189Z", - "contributors": [ - "BubuAnabelas", - "mym2013" - ] - }, - "Web/CSS/text-orientation": { - "modified": "2020-10-15T22:02:16.878Z", - "contributors": [ - "MikeOrtizTrivino" - ] - }, - "Web/CSS/text-overflow": { - "modified": "2020-10-15T21:59:14.245Z", - "contributors": [ - "davidelx", - "xpdv", - "plagasul", - "camilobuitrago" - ] - }, - "Web/CSS/text-shadow": { - "modified": "2019-03-23T22:27:32.186Z", - "contributors": [ - "israel-munoz" - ] - }, - "Web/CSS/text-transform": { - "modified": "2019-10-10T16:32:05.528Z", - "contributors": [ - "Makinita", - "evaferreira", - "israel-munoz" - ] - }, - "Web/CSS/time": { - "modified": "2020-10-15T21:50:52.581Z", - "contributors": [ - "lajaso", - "israel-munoz" - ] - }, - "Web/CSS/top": { - "modified": "2020-07-29T21:08:45.361Z", - "contributors": [ - "clancastor05", - "SphinxKnight", - "davidgg", - "solemoris", - "teoli", - "lcamacho", - "jaumesvdevelopers", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/transform": { - "modified": "2020-11-12T03:08:37.391Z", - "contributors": [ - "SphinxKnight", - "rolivo288", - "SoftwareRVG", - "Sebastianz", - "GersonLazaro", - "fscholz", - "bicentenario", - "Xaviju", - "teoli", - "limonada_prototype" - ] - }, - "Web/CSS/transform-function": { - "modified": "2019-03-23T23:10:41.562Z", - "contributors": [ - "israel-munoz", - "mrstork", - "prayash", - "limbus" - ] - }, - "Web/CSS/transform-function/rotate()": { - "modified": "2020-11-19T16:05:17.901Z", - "contributors": [ - "chrisdavidmills", - "danielblazquez", - "pekechis" - ] - }, - "Web/CSS/transform-function/rotate3d()": { - "modified": "2020-11-19T16:07:08.348Z", - "contributors": [ - "chrisdavidmills", - "jeronimonunez", - "jjyepez" - ] - }, - "Web/CSS/transform-function/scale()": { - "modified": "2020-11-30T10:15:28.610Z", - "contributors": [ - "chrisdavidmills", - "ileonpxsp", - "BubuAnabelas", - "lizbethrojano", - "yomar-dev", - "quiqueciria", - "maramal" - ] - }, - "Web/CSS/transform-function/translate()": { - "modified": "2020-11-30T10:30:15.561Z", - "contributors": [ - "chrisdavidmills", - "AlePerez92", - "hectoraldairah", - "Esteban26", - "murielsan", - "ShakMR" - ] - }, - "Web/CSS/transform-function/translateY()": { - "modified": "2020-11-30T13:00:51.105Z", - "contributors": [ - "chrisdavidmills", - "israel-munoz" - ] - }, - "Web/CSS/transform-function/translateZ()": { - "modified": "2020-11-30T13:02:44.123Z", - "contributors": [ - "chrisdavidmills", - "luisdev-works" - ] - }, - "Web/CSS/transform-origin": { - "modified": "2019-03-23T23:20:59.497Z", - "contributors": [ - "Sebastianz", - "fscholz", - "teoli", - "limonada_prototype" - ] - }, - "Web/CSS/transform-style": { - "modified": "2020-10-15T22:31:22.949Z", - "contributors": [ - "luisdev-works" - ] - }, - "Web/CSS/transition": { - "modified": "2019-03-23T22:53:01.094Z", - "contributors": [ - "FedericoMarmo", - "fscholz", - "adlr", - "Sebastianz", - "yvesmh" - ] - }, - "Web/CSS/transition-delay": { - "modified": "2019-03-23T23:21:44.912Z", - "contributors": [ - "mrstork", - "fscholz", - "Sebastianz", - "teoli", - "alcuinodeyork" - ] - }, - "Web/CSS/transition-duration": { - "modified": "2020-10-15T22:27:34.821Z", - "contributors": [ - "luisafvaca" - ] - }, - "Web/CSS/transition-property": { - "modified": "2020-10-15T21:58:20.034Z", - "contributors": [ - "juan-ferrer-toribio" - ] - }, - "Web/CSS/user-select": { - "modified": "2020-10-15T22:22:14.480Z", - "contributors": [ - "qwerty726" - ] - }, - "Web/CSS/var()": { - "modified": "2020-11-04T09:10:15.439Z", - "contributors": [ - "chrisdavidmills", - "jroji" - ] - }, - "Web/CSS/vertical-align": { - "modified": "2019-03-23T23:36:07.945Z", - "contributors": [ - "Sebastianz", - "teoli", - "riledhel" - ] - }, - "Web/CSS/visibility": { - "modified": "2019-03-23T23:52:08.163Z", - "contributors": [ - "wbamberg", - "teoli", - "Nathymig", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/white-space": { - "modified": "2019-06-12T21:57:59.855Z", - "contributors": [ - "jdaison", - "missmakita" - ] - }, - "Web/CSS/widows": { - "modified": "2020-10-15T21:59:52.045Z", - "contributors": [ - "jpmontoya182" - ] - }, - "Web/CSS/width": { - "modified": "2019-03-23T23:50:07.221Z", - "contributors": [ - "israel-munoz", - "diegocanal", - "teoli", - "HenryGR", - "Mgjbot" - ] - }, - "Web/CSS/writing-mode": { - "modified": "2019-03-23T22:28:35.899Z", - "contributors": [ - "fitojb" - ] - }, - "Web/CSS/z-index": { - "modified": "2020-03-20T18:20:08.966Z", - "contributors": [ - "camsa", - "javichito", - "teoli", - "AntonioNavajas" - ] - }, - "Web/CSS/zoom": { - "modified": "2019-03-23T22:35:36.401Z", - "contributors": [ - "carloque", - "Sebastianz", - "pekechis" - ] - }, - "Web/Demos_of_open_web_technologies": { - "modified": "2019-03-23T22:33:45.097Z", - "contributors": [ - "SoftwareRVG", - "elfoxero" - ] - }, - "Web/EXSLT": { - "modified": "2019-03-18T20:59:19.473Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Mgjbot", - "Talisker" - ] - }, - "Web/EXSLT/exsl": { - "modified": "2019-01-16T15:21:39.795Z", - "contributors": [ - "ExE-Boss", - "teoli", - "Anonymous" - ] - }, - "Web/EXSLT/exsl/node-set": { - "modified": "2019-03-18T20:59:21.647Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Mgjbot", - "Talisker" - ] - }, - "Web/EXSLT/exsl/object-type": { - "modified": "2019-03-23T23:51:27.324Z", - "contributors": [ - "ExE-Boss", - "lajaso", - "Mgjbot", - "Talisker" - ] - }, - "Web/EXSLT/math": { - "modified": "2019-01-16T15:25:29.279Z", - "contributors": [ - "ExE-Boss", - "teoli", - "Anonymous" - ] - }, - "Web/EXSLT/math/highest": { - "modified": "2019-03-18T20:59:18.500Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "lajaso", - "Mgjbot", - "Talisker" - ] - }, - "Web/EXSLT/math/lowest": { - "modified": "2019-03-18T20:59:17.805Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "lajaso", - "Mgjbot", - "Talisker" - ] - }, - "Web/EXSLT/math/max": { - "modified": "2019-03-18T20:59:18.804Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "lajaso", - "Talisker" - ] - }, - "Web/EXSLT/math/min": { - "modified": "2019-03-18T20:59:20.254Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "lajaso", - "Talisker" - ] - }, - "Web/EXSLT/regexp": { - "modified": "2019-01-16T15:23:22.952Z", - "contributors": [ - "ExE-Boss", - "teoli", - "Anonymous" - ] - }, - "Web/EXSLT/regexp/match": { - "modified": "2019-03-18T20:59:21.504Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/regexp/replace": { - "modified": "2019-03-18T20:59:20.093Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/regexp/test": { - "modified": "2019-03-18T20:59:20.575Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/set": { - "modified": "2019-01-16T15:23:27.004Z", - "contributors": [ - "ExE-Boss", - "teoli", - "Anonymous" - ] - }, - "Web/EXSLT/set/difference": { - "modified": "2019-03-18T20:59:18.953Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/set/distinct": { - "modified": "2019-03-18T20:59:22.067Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/set/has-same-node": { - "modified": "2019-03-18T20:59:20.421Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/set/intersection": { - "modified": "2019-03-18T20:59:18.660Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/set/leading": { - "modified": "2019-03-18T20:59:17.662Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "teoli", - "Talisker" - ] - }, - "Web/EXSLT/set/trailing": { - "modified": "2019-03-18T20:59:19.267Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "teoli", - "Talisker" - ] - }, - "Web/EXSLT/str": { - "modified": "2019-01-16T15:24:51.477Z", - "contributors": [ - "ExE-Boss", - "teoli", - "Anonymous" - ] - }, - "Web/EXSLT/str/concat": { - "modified": "2019-03-18T20:59:20.717Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/str/split": { - "modified": "2019-03-18T20:59:17.504Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/EXSLT/str/tokenize": { - "modified": "2019-03-18T20:59:19.116Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Talisker" - ] - }, - "Web/Events": { - "modified": "2019-03-23T23:21:27.399Z", - "contributors": [ - "ExE-Boss", - "wbamberg", - "gabo8611" - ] - }, - "Web/Events/DOMContentLoaded": { - "modified": "2019-09-06T00:37:43.389Z", - "contributors": [ - "wbamberg", - "jramcast", - "ExE-Boss", - "fscholz", - "AlexOfSoCal", - "jdmgarcia", - "daniville" - ] - }, - "Web/Events/abort": { - "modified": "2019-04-30T13:47:43.431Z", - "contributors": [ - "wbamberg", - "ExE-Boss", - "fscholz", - "balboag" - ] - }, - "Web/Events/animationend": { - "modified": "2019-03-23T22:31:35.580Z", - "contributors": [ - "ExE-Boss", - "soncco" - ] - }, - "Web/Events/beforeunload": { - "modified": "2019-04-30T14:05:00.135Z", - "contributors": [ - "wbamberg", - "ExE-Boss", - "anasyusef", - "Bant89" - ] - }, - "Web/Events/blur": { - "modified": "2019-03-23T22:40:57.440Z", - "contributors": [ - "ExE-Boss", - "AlePerez92", - "fscholz", - "teoli", - "javier-alba" - ] - }, - "Web/Events/load": { - "modified": "2019-04-30T13:43:52.776Z", - "contributors": [ - "wbamberg", - "ExE-Boss", - "AlePerez92" - ] - }, - "Web/Events/loadend": { - "modified": "2019-03-23T22:09:49.071Z", - "contributors": [ - "ExE-Boss", - "fscholz", - "darioperez" - ] - }, - "Web/Events/pointerlockchange": { - "modified": "2019-03-18T21:16:43.654Z", - "contributors": [ - "ExE-Boss", - "fscholz", - "arquigames" - ] - }, - "Web/Events/transitioncancel": { - "modified": "2019-04-30T14:14:15.478Z", - "contributors": [ - "wbamberg", - "ExE-Boss", - "juan-ferrer-toribio" - ] - }, - "Web/Events/transitionend": { - "modified": "2019-03-23T22:04:18.976Z", - "contributors": [ - "ExE-Boss", - "fscholz", - "juan-ferrer-toribio" - ] - }, - "Web/Guide": { - "modified": "2019-07-18T20:35:32.528Z", - "contributors": [ - "clarii", - "D3Portillo", - "Breaking Pitt", - "VictorAbdon", - "n2nand", - "Puchoti", - "DrTrucho", - "DanielCarron", - "daroswing", - "osodi", - "LeoHirsch", - "hjaguen", - "ethertank", - "Sheppy" - ] - }, - "Web/Guide/AJAX": { - "modified": "2019-03-18T21:14:54.246Z", - "contributors": [ - "AlePerez92", - "chrisdavidmills", - "ccarruitero", - "chukito", - "Mgjbot", - "Nukeador", - "Summit677", - "Pascalc", - "Jorolo", - "Marianov", - "Takenbot", - "Baluart", - "Breaking Pitt", - "Seres" - ] - }, - "Web/Guide/AJAX/Comunidad": { - "modified": "2019-03-23T23:41:30.919Z", - "contributors": [ - "chrisdavidmills", - "teoli", - "Jorolo" - ] - }, - "Web/Guide/AJAX/Primeros_Pasos": { - "modified": "2019-03-23T23:54:11.584Z", - "contributors": [ - "padrecedano", - "chrisdavidmills", - "mili01gm", - "Mgjbot", - "Luis Hidalgo", - "Hegael", - "Tatan", - "Takenbot", - "Jorolo", - "Puxaalonso", - "Nukeador", - "Noctuido", - "Seres" - ] - }, - "Web/Guide/API": { - "modified": "2019-09-11T09:31:45.916Z", - "contributors": [ - "SphinxKnight", - "VictorAbdon", - "Sheppy" - ] - }, - "Web/Guide/API/DOM/Events/Orientation_and_motion_data_explained/Orientation_and_motion_data_explained": { - "modified": "2019-03-23T23:27:10.499Z", - "contributors": [ - "Sheppy", - "rubencidlara" - ] - }, - "Web/Guide/API/Vibration": { - "modified": "2019-03-23T23:03:32.169Z", - "contributors": [ - "juancjara" - ] - }, - "Web/Guide/CSS/Block_formatting_context": { - "modified": "2019-03-23T22:32:27.340Z", - "contributors": [ - "Enesimus", - "javichito" - ] - }, - "Web/Guide/CSS/probando_media_queries": { - "modified": "2019-03-23T23:07:40.812Z", - "contributors": [ - "TibicenasDesign" - ] - }, - "Web/Guide/DOM": { - "modified": "2019-03-23T23:27:17.444Z", - "contributors": [ - "Sheppy" - ] - }, - "Web/Guide/DOM/Events": { - "modified": "2019-03-23T23:27:18.635Z", - "contributors": [ - "Sheppy" - ] - }, - "Web/Guide/DOM/Events/Creacion_y_Activación_Eventos": { - "modified": "2019-03-23T22:58:27.867Z", - "contributors": [ - "gAval997", - "juanpablocarrillo", - "BrunoViera", - "enreda", - "Soid" - ] - }, - "Web/Guide/DOM/Events/eventos_controlador": { - "modified": "2020-08-01T23:47:25.815Z", - "contributors": [ - "Enesimus", - "alesalva" - ] - }, - "Web/Guide/Graphics": { - "modified": "2020-05-19T14:31:25.384Z", - "contributors": [ - ".bkjop0", - "lassergraf", - "CarlosEduardoEncinas", - "pescadito.2007", - "rogeliomtx", - "CarlosQuijano", - "lalo2013" - ] - }, - "Web/Guide/HTML/Canvas_tutorial": { - "modified": "2019-03-23T23:18:23.090Z", - "contributors": [ - "fniwes", - "DeiberChacon", - "jeancgarciaq" - ] - }, - "Web/Guide/HTML/Canvas_tutorial/Advanced_animations": { - "modified": "2019-03-23T22:11:01.831Z", - "contributors": [ - "elagat" - ] - }, - "Web/Guide/HTML/Canvas_tutorial/Applying_styles_and_colors": { - "modified": "2020-05-15T18:35:37.655Z", - "contributors": [ - "dimaio77" - ] - }, - "Web/Guide/HTML/Canvas_tutorial/Basic_animations": { - "modified": "2019-10-10T16:52:52.102Z", - "contributors": [ - "Sergio_Gonzalez_Collado", - "lajaso", - "Huarseral" - ] - }, - "Web/Guide/HTML/Canvas_tutorial/Basic_usage": { - "modified": "2020-04-24T15:40:04.067Z", - "contributors": [ - "Davidaz", - "mariogalan", - "teoli", - "guillermomartinmarco", - "eoasakura", - "mamigove" - ] - }, - "Web/Guide/HTML/Canvas_tutorial/Dibujando_formas": { - "modified": "2019-03-23T23:15:03.361Z", - "contributors": [ - "cepeami01", - "AlexisRC463", - "matiasrvergara", - "Blackangel1965", - "ErikMj69", - "alkaithil", - "faqndo", - "martinzaraterafael", - "gabriel15", - "Marezelej" - ] - }, - "Web/Guide/HTML/Canvas_tutorial/Hit_regions_and_accessibility": { - "modified": "2019-03-18T21:31:01.983Z", - "contributors": [ - "cepeami01" - ] - }, - "Web/Guide/HTML/Canvas_tutorial/Optimizing_canvas": { - "modified": "2019-03-23T23:18:04.030Z", - "contributors": [ - "Cax" - ] - }, - "Web/Guide/HTML/Canvas_tutorial/Pixel_manipulation_with_canvas": { - "modified": "2019-03-18T21:42:58.094Z", - "contributors": [ - "Luis_Gentil", - "JulianSoto", - "anfuca" - ] - }, - "Web/Guide/HTML/Editable_content": { - "modified": "2019-03-23T22:09:49.599Z", - "contributors": [ - "vinyetcg", - "JoaquinGiordano", - "V.Morantes" - ] - }, - "Web/Guide/HTML/Introduction_alhtml_clone": { - "modified": "2019-03-23T23:11:36.473Z", - "contributors": [ - "emanuelvega", - "Cristhoper" - ] - }, - "Web/Guide/HTML/categorias_de_contenido": { - "modified": "2020-09-06T09:32:45.431Z", - "contributors": [ - "Nachec", - "BrayanAvian", - "raecillacastellana", - "eljonims", - "eliasrodeloso" - ] - }, - "Web/Guide/Movil": { - "modified": "2019-03-23T22:48:50.706Z", - "contributors": [ - "miguelsp" - ] - }, - "Web/Guide/Parsing_and_serializing_XML": { - "modified": "2019-03-23T22:10:22.365Z", - "contributors": [ - "FenixAlive" - ] - }, - "Web/Guide/Performance": { - "modified": "2019-03-23T23:21:17.984Z", - "contributors": [ - "DeiberChacon", - "Sheppy" - ] - }, - "Web/Guide/Performance/Usando_web_workers": { - "modified": "2020-09-27T14:14:17.948Z", - "contributors": [ - "hendaniel", - "arbesulo", - "zynt1102", - "albertovelazmoliner", - "luisdos", - "EricMoIr", - "hmorv", - "DeiberChacon", - "rsalgado", - "mvargasmoran" - ] - }, - "Web/Guide/Usando_Objetos_FormData": { - "modified": "2019-03-23T23:19:26.530Z", - "contributors": [ - "ramingar", - "Siro_Diaz", - "wilo" - ] - }, - "Web/HTML": { - "modified": "2020-12-04T02:55:42.795Z", - "contributors": [ - "SphinxKnight", - "cesarmerino.ec71", - "barriosines07", - "Nachec", - "Enesimus", - "Neto503", - "hackertj", - "chrisdavidmills", - "blanchart", - "roocce", - "titox", - "donpaginasweboficial", - "Kenikser", - "RayPL", - "YeseniaMariela", - "gabriel-ar", - "PabloLajarin", - "JoseBarakat", - "raecillacastellana", - "israel-munoz", - "jsx", - "Hteemo", - "eduMXM", - "enesimo", - "MARVINFLORENTINO", - "pekechis", - "monserratcallejaalmazan", - "thzunder", - "roheru", - "vltamara", - "ArcangelZith", - "ronyworld", - "LeoHirsch", - "CarlosQuijano", - "AngelFQC" - ] - }, - "Web/HTML/Atributos": { - "modified": "2019-03-23T23:21:50.772Z", - "contributors": [ - "raecillacastellana", - "Cdam", - "vltamara", - "Shinigami-sama", - "welm", - "noografo", - "Benito", - "LeoHirsch", - "sha" - ] - }, - "Web/HTML/Atributos/accept": { - "modified": "2020-10-15T22:34:00.656Z", - "contributors": [ - "Nachec" - ] - }, - "Web/HTML/Atributos/autocomplete": { - "modified": "2019-04-06T00:39:59.162Z", - "contributors": [ - "qmarquez", - "Raulpascual2" - ] - }, - "Web/HTML/Atributos/min": { - "modified": "2020-10-15T22:33:58.169Z", - "contributors": [ - "Nachec" - ] - }, - "Web/HTML/Atributos/minlength": { - "modified": "2020-10-15T22:33:56.870Z", - "contributors": [ - "Nachec" - ] - }, - "Web/HTML/Atributos/multiple": { - "modified": "2020-09-08T01:48:55.405Z", - "contributors": [ - "Nachec" - ] - }, - "Web/HTML/Atributos_Globales": { - "modified": "2020-10-15T21:39:25.776Z", - "contributors": [ - "Nachec", - "PacoVela", - "imangas", - "vltamara" - ] - }, - "Web/HTML/Atributos_Globales/accesskey": { - "modified": "2019-03-23T22:41:37.238Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/autocapitalize": { - "modified": "2020-10-15T22:12:15.178Z", - "contributors": [ - "Nachec", - "carlosgocereceda", - "WilsonIsAliveClone", - "Raulpascual2" - ] - }, - "Web/HTML/Atributos_Globales/class": { - "modified": "2019-03-23T22:41:38.505Z", - "contributors": [ - "imangas", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/contenteditable": { - "modified": "2019-03-23T22:41:31.507Z", - "contributors": [ - "ManuAlvarado22", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/contextmenu": { - "modified": "2019-03-23T22:41:33.594Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/data-*": { - "modified": "2019-06-27T12:32:36.980Z", - "contributors": [ - "deyvirosado", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/dir": { - "modified": "2019-03-23T22:41:19.442Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/draggable": { - "modified": "2019-03-23T22:41:17.791Z", - "contributors": [ - "JuanSerrano02", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/dropzone": { - "modified": "2019-03-23T22:41:19.266Z", - "contributors": [ - "JuanSerrano02", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/hidden": { - "modified": "2019-03-23T22:41:18.690Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/id": { - "modified": "2019-03-23T22:45:39.709Z", - "contributors": [ - "vanesa", - "DavidZabaleta", - "eoasakura" - ] - }, - "Web/HTML/Atributos_Globales/is": { - "modified": "2020-10-15T22:04:27.264Z", - "contributors": [ - "daniel.duarte" - ] - }, - "Web/HTML/Atributos_Globales/itemid": { - "modified": "2019-03-23T22:37:36.858Z", - "contributors": [ - "pekechis" - ] - }, - "Web/HTML/Atributos_Globales/itemprop": { - "modified": "2019-03-23T22:41:15.543Z", - "contributors": [ - "rhssr", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/itemref": { - "modified": "2019-03-23T22:36:41.055Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/itemscope": { - "modified": "2020-10-15T21:41:28.202Z", - "contributors": [ - "JuanSerrano02", - "chrisvpr", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/lang": { - "modified": "2019-03-23T22:41:11.276Z", - "contributors": [ - "agonzalezml", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/slot": { - "modified": "2020-10-15T22:04:16.315Z", - "contributors": [ - "daniel.duarte" - ] - }, - "Web/HTML/Atributos_Globales/spellcheck": { - "modified": "2019-03-23T22:41:06.455Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/style": { - "modified": "2019-03-23T22:41:09.210Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/tabindex": { - "modified": "2019-07-12T03:22:15.997Z", - "contributors": [ - "ChrisMHM", - "bamvoo", - "cabetancourtc", - "StripTM", - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/title": { - "modified": "2019-03-23T22:40:44.282Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/translate": { - "modified": "2019-03-23T22:40:27.406Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Atributos_Globales/x-ms-acceleratorkey": { - "modified": "2019-03-18T21:20:44.665Z", - "contributors": [ - "WriestTavo" - ] - }, - "Web/HTML/Atributos_de_configuracion_CORS": { - "modified": "2019-03-23T22:46:11.986Z", - "contributors": [ - "eporta88", - "virlliNia", - "vltamara" - ] - }, - "Web/HTML/Block-level_elements": { - "modified": "2019-03-18T20:44:10.775Z", - "contributors": [ - "ManuelPalominochirote", - "raecillacastellana", - "dinael", - "pekechis", - "erdavo", - "vltamara", - "teoli", - "MILTON.AGUILAR" - ] - }, - "Web/HTML/Canvas": { - "modified": "2019-10-10T16:45:32.554Z", - "contributors": [ - "lajaso", - "jagomf", - "teoli", - "ethertank", - "jesusmercado", - "dextra", - "beto21", - "inma_610", - "RickieesES", - "Pgulijczuk", - "kourt_xand", - "Fifthtoe", - "Mgjbot" - ] - }, - "Web/HTML/Canvas/A_basic_ray-caster": { - "modified": "2019-03-19T08:57:21.057Z", - "contributors": [ - "AzazelN28", - "Fandres91", - "dkocho4", - "preteric" - ] - }, - "Web/HTML/Canvas/Drawing_graphics_with_canvas": { - "modified": "2019-03-23T23:19:53.719Z", - "contributors": [ - "teoli", - "rubencidlara" - ] - }, - "Web/HTML/Consejos_para_la_creación_de_páginas_HTML_de_carga_rápida": { - "modified": "2020-07-16T22:22:32.156Z", - "contributors": [ - "ZKoaLa", - "nazhaj", - "JuanC_01" - ] - }, - "Web/HTML/Elemento": { - "modified": "2020-07-13T03:12:39.708Z", - "contributors": [ - "Enesimus", - "IsraelFloresDGA", - "ivanhelo", - "gabriel-ar", - "raecillacastellana", - "imangas", - "jccancelo", - "vltamara", - "teoli", - "LinoJaime", - "Rkovac", - "betoscopio", - "semptrion", - "StripTM", - "deimidis", - "Mgjbot", - "Klosma", - "Jorolo" - ] - }, - "Web/HTML/Elemento/Elementos_títulos": { - "modified": "2019-03-23T23:41:24.635Z", - "contributors": [ - "evaferreira", - "chrisdavidmills", - "israel-munoz", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/Etiqueta_Personalizada_HTML5": { - "modified": "2019-03-23T22:40:57.260Z", - "contributors": [ - "Lazaro" - ] - }, - "Web/HTML/Elemento/Shadow": { - "modified": "2019-03-23T22:06:38.273Z", - "contributors": [ - "H4isan" - ] - }, - "Web/HTML/Elemento/Tipos_de_elementos": { - "modified": "2019-03-23T23:46:22.404Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "ethertank", - "Klosma", - "Jorolo" - ] - }, - "Web/HTML/Elemento/a": { - "modified": "2020-12-02T02:55:47.706Z", - "contributors": [ - "SphinxKnight", - "xtrs84zk", - "HectorFranco", - "sergio_p_d", - "julioematasv", - "ManuelSLemos", - "raecillacastellana", - "teoli", - "Nukeador", - "RickieesES", - "HenryGR", - "Mgjbot" - ] - }, - "Web/HTML/Elemento/abbr": { - "modified": "2019-03-23T23:41:48.686Z", - "contributors": [ - "vanesa", - "abaracedo", - "jigs12", - "welm", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/acronym": { - "modified": "2019-03-23T23:41:54.391Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/address": { - "modified": "2019-03-23T23:41:48.972Z", - "contributors": [ - "abaracedo", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/applet": { - "modified": "2019-03-23T23:42:26.076Z", - "contributors": [ - "Sebastianz", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/area": { - "modified": "2019-03-23T23:41:50.345Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/article": { - "modified": "2020-04-14T03:59:04.779Z", - "contributors": [ - "Jx1ls", - "wbamberg", - "teoli", - "deimidis" - ] - }, - "Web/HTML/Elemento/aside": { - "modified": "2019-05-13T08:38:38.128Z", - "contributors": [ - "blanchart", - "wbamberg", - "teoli", - "trevorh", - "ccarruitero", - "inma_610" - ] - }, - "Web/HTML/Elemento/audio": { - "modified": "2019-03-24T00:17:32.335Z", - "contributors": [ - "wbamberg", - "teoli", - "tregagnon", - "RickieesES", - "inma_610" - ] - }, - "Web/HTML/Elemento/b": { - "modified": "2019-03-23T23:41:59.385Z", - "contributors": [ - "gabrielvol", - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/base": { - "modified": "2019-03-23T23:41:55.648Z", - "contributors": [ - "raecillacastellana", - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/basefont": { - "modified": "2019-03-23T23:42:33.059Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/bdi": { - "modified": "2019-03-23T22:37:44.087Z", - "contributors": [ - "pekechis", - "teoli" - ] - }, - "Web/HTML/Elemento/bdo": { - "modified": "2019-03-23T23:41:59.174Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/bgsound": { - "modified": "2019-10-10T16:35:21.119Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Elemento/big": { - "modified": "2019-03-23T23:42:00.157Z", - "contributors": [ - "Sebastianz", - "jigs12", - "welm", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/blink": { - "modified": "2019-10-10T16:37:40.291Z", - "contributors": [ - "teoli", - "jcr4" - ] - }, - "Web/HTML/Elemento/blockquote": { - "modified": "2019-03-23T23:42:29.095Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/body": { - "modified": "2020-10-15T22:34:39.725Z", - "contributors": [ - "Nachec" - ] - }, - "Web/HTML/Elemento/br": { - "modified": "2019-03-23T23:42:25.427Z", - "contributors": [ - "vanesa", - "abaracedo", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/button": { - "modified": "2020-10-15T21:13:54.408Z", - "contributors": [ - "MarielaBR", - "evaferreira", - "Sebastianz", - "jigs12", - "oece", - "teoli", - "ethertank", - "Jorolo" - ] - }, - "Web/HTML/Elemento/canvas": { - "modified": "2019-03-24T00:07:43.236Z", - "contributors": [ - "wbamberg", - "evaferreira", - "teoli", - "inma_610", - "xaky" - ] - }, - "Web/HTML/Elemento/caption": { - "modified": "2019-03-23T23:42:13.711Z", - "contributors": [ - "camilai", - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/center": { - "modified": "2020-04-23T17:50:49.499Z", - "contributors": [ - "JAMC", - "blanchart", - "Sebastianz", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/cite": { - "modified": "2019-03-23T23:42:34.535Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/code": { - "modified": "2019-03-23T23:41:28.451Z", - "contributors": [ - "BubuAnabelas", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/col": { - "modified": "2019-03-23T23:42:14.518Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/colgroup": { - "modified": "2019-03-23T23:42:18.079Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/command": { - "modified": "2019-10-05T04:48:52.506Z", - "contributors": [ - "titox", - "jcr4" - ] - }, - "Web/HTML/Elemento/content": { - "modified": "2019-03-23T22:36:12.624Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Elemento/data": { - "modified": "2019-07-24T08:09:10.849Z", - "contributors": [ - "SphinxKnight", - "mikecolina", - "raecillacastellana" - ] - }, - "Web/HTML/Elemento/datalist": { - "modified": "2020-10-15T21:13:43.994Z", - "contributors": [ - "mfranzke", - "hernanarica", - "miguelgilmartinez", - "Luuis", - "SphinxKnight", - "teoli", - "translatoon", - "Izel" - ] - }, - "Web/HTML/Elemento/dd": { - "modified": "2020-10-15T21:18:43.107Z", - "contributors": [ - "IsraelFloresDGA", - "jigs12", - "johnmejia", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/del": { - "modified": "2019-03-18T21:11:06.542Z", - "contributors": [ - "duduindo", - "teoli", - "torresnicolas", - "Jorolo" - ] - }, - "Web/HTML/Elemento/details": { - "modified": "2019-07-23T13:52:13.415Z", - "contributors": [ - "Krnan", - "jcr4" - ] - }, - "Web/HTML/Elemento/dfn": { - "modified": "2019-03-18T21:11:06.323Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/dialog": { - "modified": "2020-10-15T21:43:09.315Z", - "contributors": [ - "danielblazquez", - "abaracedo" - ] - }, - "Web/HTML/Elemento/dir": { - "modified": "2019-03-18T21:11:06.122Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/div": { - "modified": "2019-03-23T23:42:24.990Z", - "contributors": [ - "Neto2412", - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/dl": { - "modified": "2020-10-15T21:18:47.033Z", - "contributors": [ - "iign", - "IsraelFloresDGA", - "jigs12", - "johnmejia", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/dt": { - "modified": "2020-10-15T21:18:46.570Z", - "contributors": [ - "IsraelFloresDGA", - "jigs12", - "ander2", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/element": { - "modified": "2019-03-23T22:38:36.820Z", - "contributors": [ - "raecillacastellana", - "kramery" - ] - }, - "Web/HTML/Elemento/em": { - "modified": "2019-03-23T23:41:24.943Z", - "contributors": [ - "BubuAnabelas", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/embed": { - "modified": "2019-03-24T00:07:02.501Z", - "contributors": [ - "wbamberg", - "teoli", - "inma_610" - ] - }, - "Web/HTML/Elemento/fieldset": { - "modified": "2019-03-24T00:04:28.839Z", - "contributors": [ - "dmarchena", - "Sebastianz", - "teoli", - "roperzh", - "ethertank", - "Klosma", - "Jorolo" - ] - }, - "Web/HTML/Elemento/figcaption": { - "modified": "2020-10-15T21:43:37.764Z", - "contributors": [ - "danieltacho", - "danielblazquez", - "BrayanAvian", - "pekechis" - ] - }, - "Web/HTML/Elemento/figure": { - "modified": "2019-03-24T00:07:44.105Z", - "contributors": [ - "wbamberg", - "teoli", - "inma_610", - "translatoon" - ] - }, - "Web/HTML/Elemento/font": { - "modified": "2019-03-23T23:42:25.753Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/footer": { - "modified": "2019-03-24T00:06:10.667Z", - "contributors": [ - "teoli", - "translatoon" - ] - }, - "Web/HTML/Elemento/form": { - "modified": "2019-03-23T23:38:31.636Z", - "contributors": [ - "teoli", - "jesanchez", - "jsalinas" - ] - }, - "Web/HTML/Elemento/frame": { - "modified": "2019-03-23T23:42:33.478Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/frameset": { - "modified": "2019-03-23T23:42:33.678Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/head": { - "modified": "2019-03-23T23:41:19.487Z", - "contributors": [ - "israel-munoz", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/header": { - "modified": "2019-09-22T13:38:40.530Z", - "contributors": [ - "duduindo", - "erix2016", - "wbamberg", - "teoli", - "trevorh", - "deimidis", - "translatoon" - ] - }, - "Web/HTML/Elemento/hgroup": { - "modified": "2020-04-16T18:54:49.840Z", - "contributors": [ - "camsa", - "wbamberg", - "eazel7", - "harthe13", - "teoli", - "ccarruitero", - "percy@mozilla.pe" - ] - }, - "Web/HTML/Elemento/hr": { - "modified": "2019-03-23T23:41:46.133Z", - "contributors": [ - "wissol", - "gabrielvol", - "jigs12", - "teoli", - "welm", - "Jorolo" - ] - }, - "Web/HTML/Elemento/html": { - "modified": "2019-03-23T23:41:20.478Z", - "contributors": [ - "raecillacastellana", - "arturoblack", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/i": { - "modified": "2019-03-18T21:11:05.917Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/iframe": { - "modified": "2020-10-15T21:20:22.917Z", - "contributors": [ - "mirinnes", - "nadya.serrano", - "danielblazquez", - "duduindo", - "wbamberg", - "antoiba86", - "jhonnycano@hotmail.com", - "teoli", - "aguztinrs" - ] - }, - "Web/HTML/Elemento/image": { - "modified": "2019-03-23T22:38:59.070Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Elemento/img": { - "modified": "2020-07-12T20:16:35.983Z", - "contributors": [ - "maodecolombia", - "thzunder", - "teoli", - "makoescalzo" - ] - }, - "Web/HTML/Elemento/input": { - "modified": "2020-07-14T01:15:57.719Z", - "contributors": [ - "maodecolombia", - "KacosPro", - "moisesalmonte", - "israel-munoz", - "Alejandra.B", - "garciaFullana", - "j-light", - "chech", - "dennistobar", - "welm", - "Johsua", - "byverdu", - "chipsweb", - "teoli", - "ovnicraft" - ] - }, - "Web/HTML/Elemento/input/Botón": { - "modified": "2019-04-18T16:11:40.984Z", - "contributors": [ - "IsaacAaron", - "joelarmad", - "LexAenima" - ] - }, - "Web/HTML/Elemento/input/checkbox": { - "modified": "2019-05-13T05:40:59.628Z", - "contributors": [ - "AlePerez92", - "BetsabethTorrres", - "j-light", - "FranRomero", - "JoseEnrique" - ] - }, - "Web/HTML/Elemento/input/color": { - "modified": "2019-03-23T22:37:43.300Z", - "contributors": [ - "fitojb", - "Alesan7" - ] - }, - "Web/HTML/Elemento/input/date": { - "modified": "2019-10-10T16:45:44.142Z", - "contributors": [ - "ANAIDJM1", - "fitojb" - ] - }, - "Web/HTML/Elemento/input/datetime": { - "modified": "2019-03-23T22:36:20.508Z", - "contributors": [ - "AngelMunoz", - "jcr4" - ] - }, - "Web/HTML/Elemento/input/email": { - "modified": "2020-10-15T22:11:48.198Z", - "contributors": [ - "Nachec", - "facuarmo", - "MarielaBR" - ] - }, - "Web/HTML/Elemento/input/hidden": { - "modified": "2020-10-15T22:10:33.714Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/HTML/Elemento/input/number": { - "modified": "2020-10-15T22:26:16.273Z", - "contributors": [ - "roocce" - ] - }, - "Web/HTML/Elemento/input/password": { - "modified": "2019-03-23T22:38:38.107Z", - "contributors": [ - "MarielaBR", - "xxx41", - "AlvaroNieto" - ] - }, - "Web/HTML/Elemento/input/range": { - "modified": "2019-03-18T20:57:13.760Z", - "contributors": [ - "SphinxKnight", - "KikeSan", - "Luis_Calvo" - ] - }, - "Web/HTML/Elemento/input/text": { - "modified": "2020-10-15T22:34:26.828Z", - "contributors": [ - "Nachec" - ] - }, - "Web/HTML/Elemento/ins": { - "modified": "2019-07-06T05:38:19.222Z", - "contributors": [ - "baumannzone", - "duduindo", - "welm", - "teoli", - "torresnicolas", - "Jorolo" - ] - }, - "Web/HTML/Elemento/isindex": { - "modified": "2019-03-23T22:36:13.994Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Elemento/kbd": { - "modified": "2019-03-18T21:11:05.093Z", - "contributors": [ - "duduindo", - "welm", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/keygen": { - "modified": "2019-03-24T00:06:20.618Z", - "contributors": [ - "wbamberg", - "teoli", - "deimidis" - ] - }, - "Web/HTML/Elemento/label": { - "modified": "2019-03-23T23:22:26.460Z", - "contributors": [ - "ardillan", - "gcejas", - "teoli", - "WillyMaikowski" - ] - }, - "Web/HTML/Elemento/legend": { - "modified": "2019-06-05T17:18:09.680Z", - "contributors": [ - "Ivnosing", - "Sebastianz", - "saski", - "teoli", - "Klosma", - "Jorolo" - ] - }, - "Web/HTML/Elemento/li": { - "modified": "2019-03-18T21:11:04.870Z", - "contributors": [ - "duduindo", - "chepegeek", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/link": { - "modified": "2019-03-23T23:41:37.686Z", - "contributors": [ - "pawer13", - "israel-munoz", - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/main": { - "modified": "2019-03-23T23:25:22.761Z", - "contributors": [ - "evaferreira", - "jesusbotella", - "teoli", - "jsalinas" - ] - }, - "Web/HTML/Elemento/map": { - "modified": "2019-03-23T23:41:43.985Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/mark": { - "modified": "2020-10-15T21:04:57.447Z", - "contributors": [ - "danielblazquez", - "feliperomero3", - "wbamberg", - "teoli", - "Flerex", - "hugohabel", - "inma_610", - "translatoon" - ] - }, - "Web/HTML/Elemento/marquee": { - "modified": "2019-03-18T20:57:46.110Z", - "contributors": [ - "gabriell24", - "erix2016", - "alexander171294" - ] - }, - "Web/HTML/Elemento/menu": { - "modified": "2019-03-18T21:11:04.661Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/meta": { - "modified": "2019-03-23T23:42:35.250Z", - "contributors": [ - "Sebastianz", - "feardarkness", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/multicol": { - "modified": "2019-03-23T22:36:14.458Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Elemento/nav": { - "modified": "2020-10-15T21:18:57.198Z", - "contributors": [ - "DagoGuevara", - "driconmax", - "teoli", - "martinbarce", - "makoescalzo" - ] - }, - "Web/HTML/Elemento/nobr": { - "modified": "2019-03-18T21:35:49.711Z", - "contributors": [ - "rhssr", - "Mexicotec" - ] - }, - "Web/HTML/Elemento/noframes": { - "modified": "2019-03-23T23:42:28.640Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/noscript": { - "modified": "2019-03-23T23:42:26.569Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/object": { - "modified": "2020-10-15T22:22:23.263Z", - "contributors": [ - "siregalado", - "iarah" - ] - }, - "Web/HTML/Elemento/ol": { - "modified": "2020-02-03T21:28:29.355Z", - "contributors": [ - "kevinar53", - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/option": { - "modified": "2019-03-23T22:38:56.017Z", - "contributors": [ - "pekechis" - ] - }, - "Web/HTML/Elemento/p": { - "modified": "2019-03-23T23:41:31.103Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/param": { - "modified": "2019-03-23T23:42:31.653Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/picture": { - "modified": "2019-07-20T20:15:37.196Z", - "contributors": [ - "DagoGuevara", - "JulianSoto", - "alexlndn", - "danieltacho", - "IsraelFloresDGA", - "diegos2" - ] - }, - "Web/HTML/Elemento/pre": { - "modified": "2019-03-18T21:11:04.209Z", - "contributors": [ - "duduindo", - "teoli", - "_0x" - ] - }, - "Web/HTML/Elemento/progress": { - "modified": "2020-10-15T21:22:45.390Z", - "contributors": [ - "SphinxKnight", - "androsfenollosa", - "wbamberg", - "teoli", - "rubencidlara" - ] - }, - "Web/HTML/Elemento/q": { - "modified": "2020-10-15T22:34:03.995Z", - "contributors": [ - "Nachec" - ] - }, - "Web/HTML/Elemento/s": { - "modified": "2019-03-18T21:11:03.985Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/samp": { - "modified": "2019-10-11T12:30:51.315Z", - "contributors": [ - "danielblazquez", - "duduindo", - "Johsua", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/script": { - "modified": "2019-03-23T22:38:36.106Z", - "contributors": [ - "ignasivs", - "raecillacastellana", - "ivandevp", - "alexander171294" - ] - }, - "Web/HTML/Elemento/section": { - "modified": "2020-07-15T11:06:51.948Z", - "contributors": [ - "timetrvlr", - "wbamberg", - "diegocanal", - "eljonims", - "teoli", - "ccarruitero", - "artopal" - ] - }, - "Web/HTML/Elemento/select": { - "modified": "2019-03-23T22:38:39.246Z", - "contributors": [ - "Fx-Enlcxx", - "AleV" - ] - }, - "Web/HTML/Elemento/slot": { - "modified": "2020-10-15T22:05:53.326Z", - "contributors": [ - "aguilerajl", - "Carlos-T", - "rhssr" - ] - }, - "Web/HTML/Elemento/small": { - "modified": "2019-04-04T15:23:46.402Z", - "contributors": [ - "danieltacho", - "drakzig", - "SphinxKnight", - "carloque", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/source": { - "modified": "2020-10-15T21:13:44.488Z", - "contributors": [ - "guillermomartinmarco", - "teoli", - "inma_610" - ] - }, - "Web/HTML/Elemento/span": { - "modified": "2019-03-24T00:17:34.814Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "torresnicolas", - "Jorolo" - ] - }, - "Web/HTML/Elemento/strike": { - "modified": "2019-03-18T21:11:03.623Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/strong": { - "modified": "2019-03-18T21:11:02.931Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/style": { - "modified": "2019-03-23T23:42:38.349Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/sub": { - "modified": "2020-10-15T21:18:49.449Z", - "contributors": [ - "IsaacAaron", - "carloque", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/sup": { - "modified": "2020-10-15T21:18:45.044Z", - "contributors": [ - "IsaacAaron", - "carloque", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/table": { - "modified": "2019-09-03T15:32:58.837Z", - "contributors": [ - "teoli", - "jesanchez", - "cortega", - "tany" - ] - }, - "Web/HTML/Elemento/td": { - "modified": "2019-03-23T22:38:37.555Z", - "contributors": [ - "Kerinoxio", - "Zarkiel", - "raecillacastellana", - "tolano97" - ] - }, - "Web/HTML/Elemento/template": { - "modified": "2020-10-15T21:52:05.945Z", - "contributors": [ - "aguilerajl", - "ArtistNeverStop", - "Diego674", - "AlePerez92" - ] - }, - "Web/HTML/Elemento/textarea": { - "modified": "2020-10-15T21:43:13.029Z", - "contributors": [ - "camsa", - "fscholz", - "pekechis" - ] - }, - "Web/HTML/Elemento/th": { - "modified": "2020-04-22T05:00:45.306Z", - "contributors": [ - "blanchart", - "AgustinDPino", - "IXTRUnai", - "sapales" - ] - }, - "Web/HTML/Elemento/time": { - "modified": "2020-10-15T21:18:39.499Z", - "contributors": [ - "pardo-bsso", - "blanchart", - "IsraelFloresDGA", - "dsolism", - "mauriciabad", - "teoli", - "sebasmagri", - "makoescalzo" - ] - }, - "Web/HTML/Elemento/title": { - "modified": "2019-10-10T16:32:45.843Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/tr": { - "modified": "2019-03-23T22:38:35.421Z", - "contributors": [ - "raecillacastellana", - "FelipeGL" - ] - }, - "Web/HTML/Elemento/track": { - "modified": "2020-10-15T22:33:21.321Z", - "contributors": [ - "Pablo-No" - ] - }, - "Web/HTML/Elemento/tt": { - "modified": "2019-03-18T21:11:03.301Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/u": { - "modified": "2019-03-18T21:11:03.114Z", - "contributors": [ - "duduindo", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/ul": { - "modified": "2019-03-23T23:42:39.154Z", - "contributors": [ - "Sebastianz", - "jigs12", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/var": { - "modified": "2019-03-23T23:41:16.113Z", - "contributors": [ - "BubuAnabelas", - "teoli", - "Jorolo" - ] - }, - "Web/HTML/Elemento/video": { - "modified": "2019-03-24T00:06:49.642Z", - "contributors": [ - "wbamberg", - "untilbit", - "AlePerez92", - "teoli", - "inma_610", - "Izel" - ] - }, - "Web/HTML/Elemento/wbr": { - "modified": "2019-04-26T19:10:14.131Z", - "contributors": [ - "reymundus2", - "jcr4" - ] - }, - "Web/HTML/Elemento/xmp": { - "modified": "2019-03-23T22:38:49.554Z", - "contributors": [ - "jcr4" - ] - }, - "Web/HTML/Elementos_en_línea": { - "modified": "2019-03-23T22:46:15.359Z", - "contributors": [ - "juanbrujo", - "raecillacastellana", - "vltamara" - ] - }, - "Web/HTML/Formatos_admitidos_de_audio_y_video_en_html5": { - "modified": "2019-03-23T23:26:59.594Z", - "contributors": [ - "wbamberg", - "vltamara", - "teoli", - "nekside" - ] - }, - "Web/HTML/Imagen_con_CORS_habilitado": { - "modified": "2019-03-23T22:46:06.691Z", - "contributors": [ - "MrCesar107", - "antoiba86", - "vltamara" - ] - }, - "Web/HTML/La_importancia_de_comentar_correctamente": { - "modified": "2019-03-23T23:53:31.079Z", - "contributors": [ - "teoli", - "Mgjbot", - "Jorolo" - ] - }, - "Web/HTML/Microdatos": { - "modified": "2019-03-23T22:12:50.480Z", - "contributors": [ - "fitojb" - ] - }, - "Web/HTML/Optimizing_your_pages_for_speculative_parsing": { - "modified": "2019-03-23T23:15:52.979Z", - "contributors": [ - "jsapiains", - "joeljose", - "vltamara", - "manufosela", - "Montherdez" - ] - }, - "Web/HTML/Quirks_Mode_and_Standards_Mode": { - "modified": "2019-03-23T22:00:35.023Z", - "contributors": [ - "chrisdavidmills", - "alvaromontoro", - "mamptecnocrata", - "ungatoquecomesushi" - ] - }, - "Web/HTML/Recursos_offline_en_firefox": { - "modified": "2019-03-19T07:43:37.221Z", - "contributors": [ - "pixelmin", - "dmoralesm", - "teoli", - "vltamara", - "CodeMaxter", - "LuisArt", - "FCuchietti", - "MPoli", - "hugohabel", - "RickieesES", - "inma_610", - "Izel" - ] - }, - "Web/HTML/Referencia": { - "modified": "2019-09-09T07:16:42.154Z", - "contributors": [ - "SphinxKnight", - "wbamberg", - "raecillacastellana", - "cosmesantos", - "vltamara", - "MegaChrono" - ] - }, - "Web/HTML/Tipos_de_enlaces": { - "modified": "2019-03-23T22:46:17.969Z", - "contributors": [ - "cmmp0112", - "_delta_", - "moisesalmonte", - "alvaromontoro", - "ivansx", - "vltamara" - ] - }, - "Web/HTML/Transision_adaptativa_DASH": { - "modified": "2019-03-23T22:46:14.015Z", - "contributors": [ - "AzazelN28", - "vltamara" - ] - }, - "Web/HTML/Usando_audio_y_video_con_HTML5": { - "modified": "2019-10-10T16:52:54.661Z", - "contributors": [ - "ElNobDeTfm", - "estebanz01", - "hedmon", - "blanchart", - "teoli", - "ciroid", - "cesar_ortiz_elPatox", - "StripTM", - "AngelFQC" - ] - }, - "Web/HTML/anipular_video_por_medio_de_canvas": { - "modified": "2019-03-24T00:07:00.528Z", - "contributors": [ - "teoli", - "inma_610" - ] - }, - "Web/HTML/microformatos": { - "modified": "2019-03-23T22:46:15.016Z", - "contributors": [ - "vltamara" - ] - }, - "Web/HTML/Índice": { - "modified": "2019-01-16T22:12:02.767Z", - "contributors": [ - "raecillacastellana", - "pekechis" - ] - }, - "Web/HTTP": { - "modified": "2019-03-18T20:34:58.542Z", - "contributors": [ - "IsraelFloresDGA", - "MarioECU", - "locolauty97", - "Sergio_Gonzalez_Collado", - "Ferrmolina", - "raecillacastellana", - "migdonio1", - "Erto", - "teoli" - ] - }, - "Web/HTTP/Access_control_CORS": { - "modified": "2020-08-10T16:23:20.546Z", - "contributors": [ - "wbamberg", - "afelopez", - "jbarcas", - "cefaloide", - "alcastic", - "franklevel", - "JuanMacias", - "psyban", - "manatico4", - "signados", - "Ricardolau", - "afbayonac", - "aurigadl", - "dcruz", - "Manhru", - "maedca" - ] - }, - "Web/HTTP/Authentication": { - "modified": "2019-10-24T13:52:25.126Z", - "contributors": [ - "bood-dev", - "Gochip", - "fcanellas", - "diegorec", - "kraneok", - "JuanMacias", - "_deiberchacon", - "DavidPeniafiel" - ] - }, - "Web/HTTP/Basics_of_HTTP": { - "modified": "2020-04-20T02:59:31.392Z", - "contributors": [ - "obed3113", - "sanxofon", - "Sergio_Gonzalez_Collado", - "cissoid" - ] - }, - "Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs": { - "modified": "2019-03-18T21:22:07.450Z", - "contributors": [ - "Adorta4", - "carlosgocereceda" - ] - }, - "Web/HTTP/Basics_of_HTTP/Datos_URIs": { - "modified": "2019-03-23T22:24:54.977Z", - "contributors": [ - "Sergio_Gonzalez_Collado", - "AzazelN28", - "uclides" - ] - }, - "Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP": { - "modified": "2019-03-23T22:10:11.567Z", - "contributors": [ - "Sergio_Gonzalez_Collado", - "ChrisMHM" - ] - }, - "Web/HTTP/Basics_of_HTTP/Identificación_recursos_en_la_Web": { - "modified": "2019-03-23T22:24:51.387Z", - "contributors": [ - "DaniNz", - "Sergio_Gonzalez_Collado", - "ChrisMHM", - "uclides" - ] - }, - "Web/HTTP/Basics_of_HTTP/MIME_types": { - "modified": "2019-11-18T08:03:54.325Z", - "contributors": [ - "IsaacAaron", - "sanxofon", - "Sergio_Gonzalez_Collado", - "kevinmont", - "juanrarodriguez18", - "strattadb" - ] - }, - "Web/HTTP/Basics_of_HTTP/MIME_types/Common_types": { - "modified": "2020-02-28T13:10:45.613Z", - "contributors": [ - "chrisdavidmills", - "sanxofon", - "franklevel", - "gabrielnoe" - ] - }, - "Web/HTTP/CORS/Errors": { - "modified": "2019-03-18T21:26:43.815Z", - "contributors": [ - "nchevobbe" - ] - }, - "Web/HTTP/CORS/Errors/CORSDidNotSucceed": { - "modified": "2020-03-20T09:22:59.137Z", - "contributors": [ - "javier.camus", - "rotcl", - "MarianoRDZ" - ] - }, - "Web/HTTP/CORS/Errors/CORSMissingAllowOrigin": { - "modified": "2020-03-10T05:27:13.697Z", - "contributors": [ - "HermosinNunez", - "danhiel98", - "pyumbillo", - "rewin23" - ] - }, - "Web/HTTP/CORS/Errors/CORSNotSupportingCredentials": { - "modified": "2020-03-25T19:41:08.379Z", - "contributors": [ - "pablogalvezfotografiadeportiva" - ] - }, - "Web/HTTP/CORS/Errors/CORSPreflightDidNotSucceed": { - "modified": "2019-10-08T04:58:57.176Z", - "contributors": [ - "Concatenacion" - ] - }, - "Web/HTTP/CORS/Errors/CORSRequestNotHttp": { - "modified": "2020-07-09T00:32:19.159Z", - "contributors": [ - "agf0710", - "advica2016", - "BubuAnabelas", - "Juan_Pablo" - ] - }, - "Web/HTTP/CSP": { - "modified": "2020-10-15T22:03:58.031Z", - "contributors": [ - "lautaropaske", - "herleym", - "BubuAnabelas", - "vk496", - "CarlosRomeroVera" - ] - }, - "Web/HTTP/Caching": { - "modified": "2019-03-18T21:21:15.259Z", - "contributors": [ - "WilsonIsAliveClone", - "serarroy", - "ulisestrujillo" - ] - }, - "Web/HTTP/Cookies": { - "modified": "2020-06-27T19:11:54.360Z", - "contributors": [ - "vinjatovix", - "SphinxKnight", - "g.baldemar.77", - "alexlndn", - "rayrojas", - "jesuscampos", - "nachoperassi", - "cguimaraenz", - "eortizromero", - "omertafox" - ] - }, - "Web/HTTP/Gestion_de_la_conexion_en_HTTP_1.x": { - "modified": "2019-03-23T22:03:37.565Z", - "contributors": [ - "jose89gp", - "Sergio_Gonzalez_Collado" - ] - }, - "Web/HTTP/Headers": { - "modified": "2019-12-10T13:29:15.931Z", - "contributors": [ - "OneLoneFox", - "hamethassaf", - "darianbenito", - "MrcRjs", - "Watermelonnable", - "JurgenBlitz", - "ampersand89", - "fjuarez", - "fscholz" - ] - }, - "Web/HTTP/Headers/Accept": { - "modified": "2020-10-15T21:55:42.853Z", - "contributors": [ - "gabriel-ar" - ] - }, - "Web/HTTP/Headers/Accept-Charset": { - "modified": "2020-10-15T22:13:56.858Z", - "contributors": [ - "ArnoldFZ" - ] - }, - "Web/HTTP/Headers/Accept-Ranges": { - "modified": "2020-10-15T21:52:24.088Z", - "contributors": [ - "gerardo1sanchez" - ] - }, - "Web/HTTP/Headers/Access-Control-Allow-Credentials": { - "modified": "2020-10-15T22:29:00.518Z", - "contributors": [ - "BubuAnabelas", - "IsraelFloresDGA" - ] - }, - "Web/HTTP/Headers/Access-Control-Allow-Headers": { - "modified": "2020-10-15T22:07:25.027Z", - "contributors": [ - "_deiberchacon" - ] - }, - "Web/HTTP/Headers/Access-Control-Allow-Methods": { - "modified": "2020-10-15T21:54:50.843Z", - "contributors": [ - "irsequisious" - ] - }, - "Web/HTTP/Headers/Access-Control-Allow-Origin": { - "modified": "2020-10-15T21:56:44.483Z", - "contributors": [ - "estrelow", - "IsraelFloresDGA", - "aranzuze35", - "_deiberchacon", - "anxobotana", - "JhonAguiar" - ] - }, - "Web/HTTP/Headers/Access-Control-Expose-Headers": { - "modified": "2020-10-15T22:06:29.086Z", - "contributors": [ - "jorgeCaster", - "kraneok" - ] - }, - "Web/HTTP/Headers/Age": { - "modified": "2020-10-15T22:10:53.345Z", - "contributors": [ - "0xCGonzalo" - ] - }, - "Web/HTTP/Headers/Allow": { - "modified": "2019-03-18T21:23:10.971Z", - "contributors": [ - "ogaston" - ] - }, - "Web/HTTP/Headers/Authorization": { - "modified": "2019-03-18T21:34:28.554Z", - "contributors": [ - "kraneok", - "Watermelonnable" - ] - }, - "Web/HTTP/Headers/Cache-Control": { - "modified": "2020-10-28T14:39:35.644Z", - "contributors": [ - "noksenberg", - "IsraelFloresDGA", - "ervin_santos" - ] - }, - "Web/HTTP/Headers/Content-Disposition": { - "modified": "2020-10-15T21:58:39.489Z", - "contributors": [ - "kbono", - "lagwy" - ] - }, - "Web/HTTP/Headers/Content-Encoding": { - "modified": "2020-10-15T21:53:14.848Z", - "contributors": [ - "IT-Rafa", - "sevillacode" - ] - }, - "Web/HTTP/Headers/Content-Length": { - "modified": "2020-10-15T22:07:26.889Z", - "contributors": [ - "aliciava00", - "efrencruz" - ] - }, - "Web/HTTP/Headers/Content-Location": { - "modified": "2020-10-15T22:29:48.071Z", - "contributors": [ - "hecmonter" - ] - }, - "Web/HTTP/Headers/Content-Security-Policy": { - "modified": "2020-10-15T22:18:45.176Z", - "contributors": [ - "rayrojas", - "mauril26", - "27z" - ] - }, - "Web/HTTP/Headers/Content-Type": { - "modified": "2020-10-15T21:58:35.257Z", - "contributors": [ - "ivanfretes", - "omertafox", - "ValeriaRamos" - ] - }, - "Web/HTTP/Headers/Cookie": { - "modified": "2020-10-15T21:55:41.792Z", - "contributors": [ - "SSantiago90" - ] - }, - "Web/HTTP/Headers/Cross-Origin-Resource-Policy": { - "modified": "2020-10-15T22:29:00.325Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/HTTP/Headers/ETag": { - "modified": "2020-10-15T21:57:09.273Z", - "contributors": [ - "zechworld", - "evalenzuela", - "stwilberth", - "edgarrod71" - ] - }, - "Web/HTTP/Headers/Expires": { - "modified": "2020-10-15T21:56:44.738Z", - "contributors": [ - "ernesto.palafox" - ] - }, - "Web/HTTP/Headers/Host": { - "modified": "2020-10-15T22:24:56.306Z", - "contributors": [ - "escatel.bernal10", - "Alvarito-056" - ] - }, - "Web/HTTP/Headers/Keep-Alive": { - "modified": "2020-10-15T22:02:52.123Z", - "contributors": [ - "fernomenoide" - ] - }, - "Web/HTTP/Headers/Link": { - "modified": "2020-10-15T22:28:59.441Z", - "contributors": [ - "threevanny" - ] - }, - "Web/HTTP/Headers/Origin": { - "modified": "2020-10-15T22:00:47.248Z", - "contributors": [ - "IsraelFloresDGA", - "Abelhg" - ] - }, - "Web/HTTP/Headers/Pragma": { - "modified": "2020-10-15T22:09:54.700Z", - "contributors": [ - "ervin_santos" - ] - }, - "Web/HTTP/Headers/Referer": { - "modified": "2020-10-15T21:53:10.093Z", - "contributors": [ - "LastCyborg", - "fitojb", - "UltimoOrejonDelTarro" - ] - }, - "Web/HTTP/Headers/Referrer-Policy": { - "modified": "2020-10-15T22:01:34.403Z", - "contributors": [ - "fitojb" - ] - }, - "Web/HTTP/Headers/Server": { - "modified": "2020-10-15T21:55:40.335Z", - "contributors": [ - "sevillacode", - "TheSgtPepper23", - "irsequisious" - ] - }, - "Web/HTTP/Headers/Set-Cookie": { - "modified": "2020-10-26T12:24:29.884Z", - "contributors": [ - "ignacio-ifm", - "IsraelFloresDGA", - "rayrojas", - "ramonserrano", - "garolard" - ] - }, - "Web/HTTP/Headers/Strict-Transport-Security": { - "modified": "2020-10-15T21:54:14.546Z", - "contributors": [ - "AmadPS", - "pipe01", - "heilop", - "JulianSoto", - "pablolopezmera", - "Oxicode" - ] - }, - "Web/HTTP/Headers/Transfer-Encoding": { - "modified": "2020-10-15T22:24:54.193Z", - "contributors": [ - "0xCGonzalo" - ] - }, - "Web/HTTP/Headers/User-Agent": { - "modified": "2020-10-15T22:00:44.883Z", - "contributors": [ - "LeoOliva", - "Imvi10" - ] - }, - "Web/HTTP/Headers/Vary": { - "modified": "2020-10-15T21:56:44.020Z", - "contributors": [ - "JhonAguiar" - ] - }, - "Web/HTTP/Headers/WWW-Authenticate": { - "modified": "2020-10-15T22:19:30.337Z", - "contributors": [ - "malonso", - "Gytree" - ] - }, - "Web/HTTP/Headers/X-Content-Type-Options": { - "modified": "2020-10-15T21:59:06.832Z", - "contributors": [ - "clbustos", - "tonialfaro" - ] - }, - "Web/HTTP/Headers/X-Forwarded-For": { - "modified": "2020-10-15T22:16:47.635Z", - "contributors": [ - "choadev", - "martinfrad", - "camsa" - ] - }, - "Web/HTTP/Headers/X-Frame-Options": { - "modified": "2020-10-15T21:57:01.709Z", - "contributors": [ - "ervin_santos", - "Luiggy", - "setlord" - ] - }, - "Web/HTTP/Headers/X-XSS-Protection": { - "modified": "2020-10-15T21:59:06.897Z", - "contributors": [ - "JulioMoreyra", - "francinysalles", - "tonialfaro" - ] - }, - "Web/HTTP/Messages": { - "modified": "2019-11-12T11:40:26.816Z", - "contributors": [ - "emiedes", - "jose89gp", - "anibalortegap", - "Sergio_Gonzalez_Collado" - ] - }, - "Web/HTTP/Methods": { - "modified": "2020-10-15T21:51:09.574Z", - "contributors": [ - "andrpueb", - "eddydeath", - "JRaiden", - "JulianSoto", - "RamsesMartinez" - ] - }, - "Web/HTTP/Methods/CONNECT": { - "modified": "2020-10-15T22:09:12.273Z", - "contributors": [ - "jadiosc" - ] - }, - "Web/HTTP/Methods/GET": { - "modified": "2020-10-15T22:07:33.379Z", - "contributors": [ - "SphinxKnight", - "sercorc.12", - "oespino", - "RetelboP" - ] - }, - "Web/HTTP/Methods/PATCH": { - "modified": "2020-10-04T20:15:30.024Z", - "contributors": [ - "hamishwillee", - "cnietoc", - "SackmannDV", - "noecende" - ] - }, - "Web/HTTP/Methods/POST": { - "modified": "2020-11-06T16:08:25.707Z", - "contributors": [ - "Max_Gremory", - "JGarnica", - "qmarquez", - "DavidGalvis", - "sammye70", - "Sheppy", - "mtnalonso", - "Juenesis" - ] - }, - "Web/HTTP/Methods/PUT": { - "modified": "2020-10-15T21:58:39.134Z", - "contributors": [ - "mtnalonso" - ] - }, - "Web/HTTP/Methods/TRACE": { - "modified": "2020-10-15T22:12:36.763Z", - "contributors": [ - "pablobiedma" - ] - }, - "Web/HTTP/Overview": { - "modified": "2020-08-07T11:46:49.430Z", - "contributors": [ - "marcusdesantis", - "Enesimus", - "Rafasu", - "ChrisMHM", - "LuisGalicia", - "jose89gp", - "DaniNz", - "cabaag", - "Sergio_Gonzalez_Collado" - ] - }, - "Web/HTTP/Peticiones_condicionales": { - "modified": "2019-03-18T21:19:37.220Z", - "contributors": [ - "christianmg99" - ] - }, - "Web/HTTP/Sesión": { - "modified": "2019-03-23T22:05:36.352Z", - "contributors": [ - "Sergio_Gonzalez_Collado" - ] - }, - "Web/HTTP/Status": { - "modified": "2020-10-01T02:41:07.109Z", - "contributors": [ - "SphinxKnight", - "gonzalestino924", - "manuelguido", - "juliocesardeveloper", - "ismanapa", - "santiago.lator", - "leticia-acib", - "josecarbajalbolbot", - "StarViruZ", - "amircp", - "SebastianBar", - "serivt", - "Jens.B" - ] - }, - "Web/HTTP/Status/100": { - "modified": "2020-10-15T21:56:53.445Z", - "contributors": [ - "serivt" - ] - }, - "Web/HTTP/Status/101": { - "modified": "2019-03-18T21:22:02.098Z", - "contributors": [ - "jlamasfripp" - ] - }, - "Web/HTTP/Status/200": { - "modified": "2020-10-15T22:05:24.611Z", - "contributors": [ - "SphinxKnight", - "alexibarra55", - "jlamasfripp", - "gbarriosf", - "snaven10", - "Adriel_from_Nav" - ] - }, - "Web/HTTP/Status/201": { - "modified": "2020-10-15T22:08:02.661Z", - "contributors": [ - "WriestTavo" - ] - }, - "Web/HTTP/Status/202": { - "modified": "2019-04-19T16:13:12.876Z", - "contributors": [ - "Hibot12" - ] - }, - "Web/HTTP/Status/203": { - "modified": "2020-06-14T20:53:26.311Z", - "contributors": [ - "rayrojas" - ] - }, - "Web/HTTP/Status/206": { - "modified": "2020-10-15T22:02:08.111Z", - "contributors": [ - "qpdian" - ] - }, - "Web/HTTP/Status/301": { - "modified": "2020-10-15T22:24:06.781Z", - "contributors": [ - "nullxx" - ] - }, - "Web/HTTP/Status/302": { - "modified": "2020-10-15T21:59:00.277Z", - "contributors": [ - "B1tF8er", - "kraptor", - "astrapotro" - ] - }, - "Web/HTTP/Status/304": { - "modified": "2020-10-15T22:12:46.751Z", - "contributors": [ - "jairoFg12" - ] - }, - "Web/HTTP/Status/400": { - "modified": "2019-08-03T10:06:53.857Z", - "contributors": [ - "molavec", - "Hibot12" - ] - }, - "Web/HTTP/Status/401": { - "modified": "2020-10-15T21:55:15.004Z", - "contributors": [ - "Clipi", - "JuanMacias", - "mjaque", - "andreximo" - ] - }, - "Web/HTTP/Status/403": { - "modified": "2020-10-15T21:58:50.466Z", - "contributors": [ - "JuanMacias" - ] - }, - "Web/HTTP/Status/404": { - "modified": "2020-10-15T21:56:47.503Z", - "contributors": [ - "BrodaNoel" - ] - }, - "Web/HTTP/Status/408": { - "modified": "2019-03-18T21:30:00.279Z", - "contributors": [ - "juusechec" - ] - }, - "Web/HTTP/Status/418": { - "modified": "2020-10-15T22:21:28.070Z", - "contributors": [ - "joseluisq", - "paolo667" - ] - }, - "Web/HTTP/Status/500": { - "modified": "2020-12-07T12:32:25.820Z", - "contributors": [ - "dayanhernandez353", - "karenonaly", - "duduindo", - "marcelokruk", - "Viejofon" - ] - }, - "Web/HTTP/Status/502": { - "modified": "2020-10-15T21:56:55.208Z", - "contributors": [ - "josecarbajalbolbot", - "AlePerez92", - "josmelnoel" - ] - }, - "Web/HTTP/Status/503": { - "modified": "2020-10-15T22:10:17.555Z", - "contributors": [ - "Parodper", - "ajuni880", - "diego-bustamante" - ] - }, - "Web/HTTP/Status/504": { - "modified": "2020-10-15T22:08:08.336Z", - "contributors": [ - "ojeanicolas" - ] - }, - "Web/HTTP/Status/505": { - "modified": "2020-04-03T20:59:26.896Z", - "contributors": [ - "lp4749791" - ] - }, - "Web/HTTP/Status/8080": { - "modified": "2020-03-18T21:09:54.600Z", - "contributors": [ - "guzmanoscaralexis" - ] - }, - "Web/HTTP/mecanismo_actualizacion_protocolo": { - "modified": "2019-03-18T21:45:03.291Z", - "contributors": [ - "patoezequiel", - "Sergio_Gonzalez_Collado" - ] - }, - "Web/HTTP/recursos_y_especificaciones": { - "modified": "2019-03-23T22:03:46.656Z", - "contributors": [ - "_deiberchacon" - ] - }, - "Web/JavaScript": { - "modified": "2020-11-23T12:49:37.646Z", - "contributors": [ - "SphinxKnight", - "kramosr68", - "ivanfernandez5209", - "Tonatew", - "alejogomes944", - "Nachec", - "victitor800", - "Enesimus", - "franchesco182001", - "pauli.rodriguez.c", - "jhonarielgj", - "Fegaan", - "OOJuanferOO", - "nicolas25ramirez", - "andreamv2807", - "tomasvillarragaperez", - "Yel-Martinez-Consultor-Seo", - "rodririobo", - "isabelsvelasquezv", - "fedegianni04", - "jaomix1", - "TheJarX", - "clarii", - "NataliaCba", - "NicoleCleto1998", - "JavScars", - "untilbit", - "AlePerez92", - "aluxito", - "luisNavasArg", - "jsx", - "carlossuarez", - "Pablo_Ivan", - "teoli", - "LeoHirsch", - "smarchioni", - "ricardo777", - "CarlosQuijano", - "Scipion", - "alquimista", - "Nukeador", - "ethertank", - "Jorge.villalobos", - "arleytriana", - "arpunk", - "inma_610", - "StripTM", - "Mgjbot", - "Superruzafa", - "Verruckt", - "Jorolo", - "Vyk", - "Takenbot", - "RJacinto" - ] - }, - "Web/JavaScript/Acerca_de_JavaScript": { - "modified": "2020-09-12T13:33:01.910Z", - "contributors": [ - "Nachec", - "fscholz", - "teoli", - "arpunk", - "inma_610", - "RickieesES", - "StripTM" - ] - }, - "Web/JavaScript/Closures": { - "modified": "2020-04-08T19:26:44.700Z", - "contributors": [ - "camsa", - "wbamberg", - "AzazelN28", - "JonasBrandel", - "fscholz", - "guty", - "Siro_Diaz", - "luigli", - "teoli", - "FNK", - "juanc.jara", - "Josias", - "neosergio", - "hjoaco" - ] - }, - "Web/JavaScript/Data_structures": { - "modified": "2020-08-30T02:21:59.996Z", - "contributors": [ - "Nachec", - "edwinmunguia", - "arzr", - "rayrojas", - "melgard", - "mmngreco", - "AngryDev", - "Gorzas", - "alejandrochung", - "IXTRUnai", - "damnyorch", - "devconcept", - "sancospi" - ] - }, - "Web/JavaScript/Descripción_de_las_tecnologías_JavaScript": { - "modified": "2020-09-02T05:54:39.004Z", - "contributors": [ - "Nachec", - "duduindo", - "threevanny", - "Bluterg", - "jairoambunad", - "geinerjv" - ] - }, - "Web/JavaScript/Equality_comparisons_and_sameness": { - "modified": "2020-03-24T18:47:23.011Z", - "contributors": [ - "camsa", - "abestrad1", - "EduardoCasanova", - "pekechis" - ] - }, - "Web/JavaScript/EventLoop": { - "modified": "2020-03-12T19:43:05.672Z", - "contributors": [ - "AzazelN28", - "omonteon", - "guillermojmc", - "eljonims", - "MrCoffey", - "Anonymous" - ] - }, - "Web/JavaScript/Gestion_de_Memoria": { - "modified": "2020-03-12T19:40:38.018Z", - "contributors": [ - "Jairgc", - "sergio_p_d", - "heliogabalo", - "elenatorro", - "JavierHspn", - "cesaralvarado9" - ] - }, - "Web/JavaScript/Guide": { - "modified": "2020-09-12T21:03:22.983Z", - "contributors": [ - "Nachec", - "AmazonianCodeGuy", - "tezece", - "MarcyG1", - "nhuamani", - "manuhdez", - "e.g.m.g.", - "Pablo_Ivan", - "nelson6e65", - "walterpaoli", - "joanvasa", - "fscholz", - "Benjalorc", - "teoli", - "mitogh", - "xavo7" - ] - }, - "Web/JavaScript/Guide/Bucles_e_iteración": { - "modified": "2020-10-21T16:48:14.421Z", - "contributors": [ - "sofi8825", - "Asj-code", - "edutangoeap", - "Nachec", - "AmazonianCodeGuy", - "Leopohf", - "Daniel_Martin", - "SphinxKnight", - "hmorv", - "01luisrene", - "danielfer", - "Pablo_Ivan", - "joanvasa" - ] - }, - "Web/JavaScript/Guide/Control_de_flujo_y_manejo_de_errores": { - "modified": "2020-09-14T09:17:05.043Z", - "contributors": [ - "Nachec", - "AmazonianCodeGuy", - "sergioqa123", - "Parziva_1", - "dcarmal-dayvo", - "Rovis", - "Enesimus", - "abelosky", - "Alfacoy", - "ashanterius", - "enriqueabsurdum", - "D4nny-dev", - "roadavid", - "eljonims", - "Nanyin", - "Igomezd", - "leandropio", - "MaFranceschi", - "Cleon", - "humbertaco", - "fscholz", - "isnardi" - ] - }, - "Web/JavaScript/Guide/Details_of_the_Object_Model": { - "modified": "2020-08-17T15:38:30.288Z", - "contributors": [ - "Nachec", - "MariaBarros", - "AmazonianCodeGuy", - "wbamberg", - "fherce", - "SphinxKnight", - "ObsoleteHuman", - "ValentinTapiaTorti", - "brodriguezs", - "DiegoA1114", - "montogeek", - "fscholz", - "teoli", - "pheras" - ] - }, - "Web/JavaScript/Guide/Expressions_and_Operators": { - "modified": "2020-09-13T21:58:37.783Z", - "contributors": [ - "Nachec", - "gcjuan", - "Orlando-Flores-Huanca", - "wajari", - "anglozm", - "recortes", - "Ernesto385291", - "Jkierem", - "gsalinase", - "abestrad1", - "milouri23", - "Odol", - "victorsanchezm", - "ElChiniNet", - "UshioSan", - "siluvana", - "juanbrujo", - "01luisrene", - "gustavgil", - "Jaston", - "Alexis88", - "smarquez1", - "ricardochavarri", - "fscholz", - "spachecojimenez" - ] - }, - "Web/JavaScript/Guide/Funciones": { - "modified": "2020-10-02T18:21:48.240Z", - "contributors": [ - "alejandro.fca", - "Nachec", - "AmazonianCodeGuy", - "Leopohf", - "BubuAnabelas", - "marscr", - "SantiagoHdez", - "beckod", - "sergio_p_d", - "01luisrene", - "yozen", - "gersonfa", - "HeberRojo", - "GabrielaMcr93", - "yakashiro", - "Cleon", - "fscholz", - "Glaucius", - "teoli", - "chebit", - "epcode" - ] - }, - "Web/JavaScript/Guide/Grammar_and_types": { - "modified": "2020-09-12T23:09:43.446Z", - "contributors": [ - "Nachec", - "luis-al-merino", - "AmazonianCodeGuy", - "teknotica", - "feliperomero3", - "nullx5", - "abelosky", - "jlopezfdez", - "enriqueabsurdum", - "Ayman", - "AnthonyGareca", - "chuyinEF", - "estebancito", - "bytx", - "Pablo_Ivan", - "cgsramirez", - "eugenioNovas", - "marioalvazquez", - "joanvasa", - "fscholz", - "Cleon", - "angelnajera", - "vinixio", - "diegogaysaez", - "teoli", - "Amatos" - ] - }, - "Web/JavaScript/Guide/Introducción": { - "modified": "2020-09-14T00:29:05.489Z", - "contributors": [ - "Nachec", - "jlopezfdez", - "Th3Cod3", - "enriqueabsurdum", - "arfuengo", - "gfvcastro", - "RamiroNeher", - "fscholz", - "MauroEldritch", - "Cleon", - "orasio", - "angelnajera", - "rianby64" - ] - }, - "Web/JavaScript/Guide/Iterators_and_Generators": { - "modified": "2020-03-12T19:42:41.976Z", - "contributors": [ - "camsa", - "DJphilomath", - "mjaque", - "lassmann", - "eycopia", - "nefter", - "dieguezz", - "Breaking_Pitt" - ] - }, - "Web/JavaScript/Guide/Keyed_collections": { - "modified": "2020-09-02T02:09:58.803Z", - "contributors": [ - "Nachec", - "MariaBarros", - "jesus92gz", - "eljonims" - ] - }, - "Web/JavaScript/Guide/Meta_programming": { - "modified": "2020-08-18T02:34:39.284Z", - "contributors": [ - "Nachec", - "asamajamasa", - "jaomix1", - "jzatarain" - ] - }, - "Web/JavaScript/Guide/Módulos": { - "modified": "2020-10-15T22:27:31.770Z", - "contributors": [ - "Nachec", - "luis.m1tech", - "antonioHigueron", - "jorgeherrera9103", - "FDSoil" - ] - }, - "Web/JavaScript/Guide/Numbers_and_dates": { - "modified": "2020-09-14T23:27:03.154Z", - "contributors": [ - "Nachec", - "ds-developer1", - "la-syl", - "IsraelFloresDGA", - "ingcarlosperez", - "georgenevets", - "yakashiro" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions": { - "modified": "2020-10-15T21:29:34.015Z", - "contributors": [ - "Nachec", - "wilmer2000", - "Ricardo_F.", - "lebubic", - "franklevel", - "recortes", - "LuisSevillano", - "pangeasi", - "Jabi", - "bartolocarrasco", - "fortil", - "BoyFerruco", - "Lehmer", - "wffranco", - "eljonims", - "jpmontoya182", - "guillermomartinmarco", - "fscholz", - "eespitia.rea", - "jcvergar" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions/Aserciones": { - "modified": "2020-09-16T20:45:25.257Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions/Clases_de_caracteres": { - "modified": "2020-09-17T03:20:44.595Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions/Cuantificadores": { - "modified": "2020-09-15T21:48:26.513Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions/Escapes_de_propiedades_Unicode": { - "modified": "2020-09-17T10:02:16.387Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions/Grupos_y_rangos": { - "modified": "2020-09-17T10:14:04.470Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Guide/Regular_Expressions/Hoja_de_referencia": { - "modified": "2020-08-16T23:08:15.173Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Guide/Text_formatting": { - "modified": "2020-09-15T10:00:50.941Z", - "contributors": [ - "Nachec", - "surielmx", - "IsraelFloresDGA", - "diegarta", - "Enesimus", - "jalmeida" - ] - }, - "Web/JavaScript/Guide/Trabajando_con_objectos": { - "modified": "2020-08-18T17:28:58.690Z", - "contributors": [ - "Nachec", - "GonzaloFlores", - "asamajamasa", - "atascii", - "davidlondonor", - "4rturd13", - "GasGen", - "MariaBarros", - "jmlocke1", - "jccuevas", - "alerd0895", - "elin3t", - "SERGIOGLL", - "SphinxKnight", - "gsalinase", - "MarkelCuesta", - "Nalex6248", - "soulminato", - "imNicoSuarez", - "jigs12", - "rippe2hl", - "ajspadial", - "fscholz", - "acamposg71", - "chebit", - "teoli", - "fmagrosoto", - "neosergio", - "bluesky777" - ] - }, - "Web/JavaScript/Guide/Usar_promesas": { - "modified": "2020-05-16T20:15:48.240Z", - "contributors": [ - "angelmartinez", - "asamajamasa", - "javigallego", - "MariaBarros", - "JoseVf", - "hamfree" - ] - }, - "Web/JavaScript/Guide/colecciones_indexadas": { - "modified": "2020-08-20T18:50:37.500Z", - "contributors": [ - "Nachec", - "EstebanRK", - "ccasadom", - "jreyesgs", - "recortes", - "Cxistian", - "douwiD", - "frantcisko", - "joanvasa" - ] - }, - "Web/JavaScript/Herencia_y_la_cadena_de_protipos": { - "modified": "2020-03-12T19:41:32.707Z", - "contributors": [ - "LeChonch", - "SphinxKnight", - "Arcandres", - "cocososo", - "blaipas", - "Anonymous", - "abnerey", - "kdex", - "zgluis", - "mariodev12", - "tavofigse", - "guumo", - "alagos", - "metalback", - "MartinIbarra", - "10537", - "blacknack" - ] - }, - "Web/JavaScript/Introducción_a_JavaScript_orientado_a_objetos": { - "modified": "2020-03-12T19:36:14.050Z", - "contributors": [ - "ivanagui2", - "libre8bit", - "alejandrochung", - "victorsanchezm", - "gchifflet", - "hmorv", - "Lorenzoygata", - "xxxtonixxx", - "joan.leon", - "fscholz", - "DeiberChacon", - "chebit", - "teoli", - "arpunk", - "inma_610", - "StripTM" - ] - }, - "Web/JavaScript/Introduction_to_using_XPath_in_JavaScript": { - "modified": "2019-05-08T19:05:57.937Z", - "contributors": [ - "AlbertoPrado70", - "caber", - "chrisdavidmills", - "fscholz", - "joakku" - ] - }, - "Web/JavaScript/Language_Resources": { - "modified": "2020-03-12T19:47:17.832Z", - "contributors": [ - "lajaso", - "jpmontoya182" - ] - }, - "Web/JavaScript/Reference/Errors": { - "modified": "2020-03-12T19:45:01.208Z", - "contributors": [ - "JavScars", - "Sheppy" - ] - }, - "Web/JavaScript/Reference/Errors/Bad_octal": { - "modified": "2020-03-12T19:45:41.442Z", - "contributors": [ - "HaroldV" - ] - }, - "Web/JavaScript/Reference/Errors/Deprecated_source_map_pragma": { - "modified": "2020-03-12T19:45:51.961Z", - "contributors": [ - "BubuAnabelas", - "Andres62", - "ingjosegarrido", - "JaimeNorato" - ] - }, - "Web/JavaScript/Reference/Errors/Falta_puntoycoma_antes_de_declaracion": { - "modified": "2020-03-12T19:46:13.102Z", - "contributors": [ - "jonatanroot", - "Lunacye" - ] - }, - "Web/JavaScript/Reference/Errors/Indicador_regexp_no-val": { - "modified": "2020-09-01T13:12:41.234Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Reference/Errors/Invalid_array_length": { - "modified": "2020-03-12T19:46:48.651Z", - "contributors": [ - "Tlauipil" - ] - }, - "Web/JavaScript/Reference/Errors/Invalid_date": { - "modified": "2020-03-12T19:47:15.708Z", - "contributors": [ - "untilbit" - ] - }, - "Web/JavaScript/Reference/Errors/Malformed_formal_parameter": { - "modified": "2019-10-12T12:26:22.919Z", - "contributors": [ - "JGmr5" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_curly_after_property_list": { - "modified": "2020-03-12T19:46:53.938Z", - "contributors": [ - "DGun17" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_formal_parameter": { - "modified": "2020-03-12T19:47:16.712Z", - "contributors": [ - "TheEpicSimple" - ] - }, - "Web/JavaScript/Reference/Errors/Missing_parenthesis_after_argument_list": { - "modified": "2020-03-12T19:46:54.683Z", - "contributors": [ - "hiuxmaycry", - "ivandevp" - ] - }, - "Web/JavaScript/Reference/Errors/More_arguments_needed": { - "modified": "2020-03-12T19:49:21.407Z", - "contributors": [ - "dragonmenorka" - ] - }, - "Web/JavaScript/Reference/Errors/No_variable_name": { - "modified": "2020-03-12T19:48:33.901Z", - "contributors": [ - "CatalinaCampos" - ] - }, - "Web/JavaScript/Reference/Errors/Not_a_codepoint": { - "modified": "2020-03-12T19:46:46.603Z", - "contributors": [ - "DGun17" - ] - }, - "Web/JavaScript/Reference/Errors/Not_a_function": { - "modified": "2020-03-12T19:45:06.322Z", - "contributors": [ - "PatoDeTuring", - "untilbit", - "josegarciaclm95" - ] - }, - "Web/JavaScript/Reference/Errors/Not_defined": { - "modified": "2020-10-08T09:22:13.757Z", - "contributors": [ - "ludoescribano.2016", - "FacuBustamaante", - "ozavala", - "ccorcoles", - "Heranibus", - "jsgaonac", - "Luis_Armando" - ] - }, - "Web/JavaScript/Reference/Errors/Precision_range": { - "modified": "2020-08-10T12:14:52.122Z", - "contributors": [ - "Sgewux" - ] - }, - "Web/JavaScript/Reference/Errors/Property_access_denied": { - "modified": "2020-03-12T19:46:35.795Z", - "contributors": [ - "untilbit", - "Tlauipil" - ] - }, - "Web/JavaScript/Reference/Errors/Stmt_after_return": { - "modified": "2020-03-12T19:46:14.065Z", - "contributors": [ - "WCHARRIERE", - "NanoSpicer", - "marco_Lozano" - ] - }, - "Web/JavaScript/Reference/Errors/Strict_y_parámetros_complejos": { - "modified": "2020-08-31T05:09:49.990Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Reference/Errors/Too_much_recursion": { - "modified": "2020-03-12T19:45:04.878Z", - "contributors": [ - "josegarciaclm95" - ] - }, - "Web/JavaScript/Reference/Errors/Undefined_prop": { - "modified": "2020-03-12T19:47:46.684Z", - "contributors": [ - "antixsuperstar" - ] - }, - "Web/JavaScript/Reference/Errors/Unexpected_token": { - "modified": "2020-03-12T19:46:40.968Z", - "contributors": [ - "dariomaim" - ] - }, - "Web/JavaScript/Reference/Errors/Unexpected_type": { - "modified": "2020-03-12T19:45:53.118Z", - "contributors": [ - "BubuAnabelas", - "JaimeNorato" - ] - }, - "Web/JavaScript/Reference/Errors/caracter_ilegal": { - "modified": "2020-03-12T19:47:34.313Z", - "contributors": [ - "kaycdc" - ] - }, - "Web/JavaScript/Reference/Errors/in_operator_no_object": { - "modified": "2020-03-12T19:47:18.421Z", - "contributors": [ - "presercomp" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/handler": { - "modified": "2020-10-15T21:58:11.434Z", - "contributors": [ - "fscholz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/handler/getOwnPropertyDescriptor": { - "modified": "2020-10-15T21:58:10.848Z", - "contributors": [ - "tutugordillo" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Proxy/handler/set": { - "modified": "2020-10-15T21:58:32.473Z", - "contributors": [ - "tutugordillo" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RangeError": { - "modified": "2019-03-23T22:47:01.907Z", - "contributors": [ - "gfernandez", - "fscholz" - ] - }, - "Web/JavaScript/Reference/Global_Objects/RangeError/prototype": { - "modified": "2019-01-16T21:30:19.248Z", - "contributors": [ - "gfernandez" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect": { - "modified": "2019-03-18T21:14:43.908Z", - "contributors": [ - "javierlopm", - "trofrigo", - "lecruz01", - "roberbnd", - "jameshkramer" - ] - }, - "Web/JavaScript/Reference/Global_Objects/Reflect/set": { - "modified": "2019-03-23T22:08:25.189Z", - "contributors": [ - "pedro-otero" - ] - }, - "Web/JavaScript/Referencia": { - "modified": "2020-03-12T19:36:20.902Z", - "contributors": [ - "fscholz", - "teoli", - "zerospalencia", - "Scipion", - "ADP13", - "DSN_XP", - "Talisker", - "Sheppy", - "Nathymig", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Acerca_de": { - "modified": "2020-03-12T19:36:12.769Z", - "contributors": [ - "fscholz", - "teoli", - "Garf", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Características_Desaprobadas": { - "modified": "2020-08-12T05:30:59.632Z", - "contributors": [ - "Nachec", - "arturotena", - "teoli", - "Mgjbot", - "DSN XP" - ] - }, - "Web/JavaScript/Referencia/Características_Desaprobadas/The_legacy_Iterator_protocol": { - "modified": "2020-03-12T19:42:42.667Z", - "contributors": [ - "clystian" - ] - }, - "Web/JavaScript/Referencia/Classes": { - "modified": "2020-08-20T12:39:55.631Z", - "contributors": [ - "jorendorff-moz", - "PatoDeTuring", - "jenrrypc", - "superyaz", - "Alejandro_Hr_Mt", - "ivanagui2", - "sebaLinares", - "nadieenespecial", - "SphinxKnight", - "damianpm", - "andrpueb", - "carlosviteri", - "danielsalgadop", - "kdex", - "romanll", - "pipo02mix", - "coins5", - "ragutimar", - "jhia", - "Erto", - "Siro_Diaz", - "mishelashala", - "Albizures", - "fscholz", - "GoToLoop" - ] - }, - "Web/JavaScript/Referencia/Classes/Class_fields": { - "modified": "2020-10-15T22:24:11.873Z", - "contributors": [ - "mgg.isco", - "carlos.valicenti", - "juanarbol" - ] - }, - "Web/JavaScript/Referencia/Classes/Private_class_fields": { - "modified": "2020-10-15T22:33:54.045Z", - "contributors": [ - "aronvx" - ] - }, - "Web/JavaScript/Referencia/Classes/constructor": { - "modified": "2020-10-15T21:40:30.999Z", - "contributors": [ - "Mar.vin.26", - "kant", - "fscholz", - "SphinxKnight", - "balboag", - "bryanvargas" - ] - }, - "Web/JavaScript/Referencia/Classes/extends": { - "modified": "2020-03-12T19:43:14.828Z", - "contributors": [ - "miguelusque", - "PauPeinado" - ] - }, - "Web/JavaScript/Referencia/Classes/static": { - "modified": "2020-03-12T19:41:02.475Z", - "contributors": [ - "mizhac", - "SphinxKnight", - "rbonvall", - "fscholz", - "MauroEldritch" - ] - }, - "Web/JavaScript/Referencia/Funciones": { - "modified": "2020-03-12T19:37:38.529Z", - "contributors": [ - "ricardosikic", - "JoseHernan", - "sergioqa123", - "DavidGalvis", - "miguelitolaparra", - "FranciscoCastle", - "SantiagoHdez", - "arai", - "estebancito", - "hugoatenco", - "mishelashala", - "teoli", - "javiertarrio", - "Nathymig", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Funciones/Arrow_functions": { - "modified": "2020-10-15T21:39:05.489Z", - "contributors": [ - "Nachec", - "camsa", - "MateoOlarteCampo", - "Ivnosing", - "DavidGalvis", - "fcanellas", - "AlePerez92", - "crisaragon", - "SebastianHondarza", - "AVRILALEJANDRO", - "slam", - "frank-orellana", - "DiegoA1114", - "Omar.VzqzAc", - "oagarcia", - "davecarter" - ] - }, - "Web/JavaScript/Referencia/Funciones/Method_definitions": { - "modified": "2020-03-12T19:44:13.294Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/JavaScript/Referencia/Funciones/Parametros_por_defecto": { - "modified": "2020-10-15T21:39:27.233Z", - "contributors": [ - "Nachec", - "SphinxKnight", - "danielsalgadop", - "pancheps" - ] - }, - "Web/JavaScript/Referencia/Funciones/arguments": { - "modified": "2020-10-15T21:08:39.471Z", - "contributors": [ - "Nachec", - "gorydev", - "AlePerez92", - "oblomobka", - "teoli", - "DeiberChacon", - "leopic", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Funciones/arguments/callee": { - "modified": "2020-03-12T19:37:01.881Z", - "contributors": [ - "fscholz", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Funciones/arguments/length": { - "modified": "2020-03-12T19:44:25.066Z", - "contributors": [ - "hmorv", - "NestorAlbelo" - ] - }, - "Web/JavaScript/Referencia/Funciones/get": { - "modified": "2020-03-12T19:37:59.268Z", - "contributors": [ - "ramadis", - "DarkScarbo", - "MarkelCuesta", - "fscholz", - "teoli", - "carloshs92", - "jesanchez", - "ccarruitero" - ] - }, - "Web/JavaScript/Referencia/Funciones/parametros_rest": { - "modified": "2020-08-05T19:22:32.660Z", - "contributors": [ - "paching12", - "rlothbrock", - "Rhawen", - "DavidGalvis", - "deluxury", - "lacf95", - "angelcuenca", - "mikicegal14" - ] - }, - "Web/JavaScript/Referencia/Funciones/set": { - "modified": "2020-10-20T12:54:09.106Z", - "contributors": [ - "alejandro.fca", - "alannungaray", - "DavidBernal" - ] - }, - "Web/JavaScript/Referencia/Gramatica_lexica": { - "modified": "2020-10-15T22:24:10.289Z", - "contributors": [ - "Nachec", - "fitojb" - ] - }, - "Web/JavaScript/Referencia/Iteration_protocols": { - "modified": "2020-03-12T19:41:22.496Z", - "contributors": [ - "SphinxKnight", - "oagarcia" - ] - }, - "Web/JavaScript/Referencia/Modo_estricto": { - "modified": "2020-08-30T21:51:49.146Z", - "contributors": [ - "Nachec", - "martin_jaime", - "javier-aguilera", - "olijyat", - "Sotelio", - "juangpc", - "MateoVelilla", - "krthr", - "Phoneix", - "nhuamani", - "octopusinvitro", - "frasko21", - "Anonymous", - "federicobond", - "elkinbernal21", - "migueljo_12", - "seeker8" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales": { - "modified": "2020-03-12T19:36:16.167Z", - "contributors": [ - "Jethrotul", - "yohanolmedo", - "JoseGB", - "lajaso", - "Imvi10", - "chavesrdj", - "SphinxKnight", - "teoli", - "KENARKI", - "chebit", - "ethertank", - "Garf", - "tiangolo", - "Sheppy", - "Nathymig", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/AggregateError": { - "modified": "2020-10-15T22:31:08.318Z", - "contributors": [ - "Nachec", - "Gardeky" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array": { - "modified": "2020-10-15T21:15:06.394Z", - "contributors": [ - "JotaCé", - "Daniel1404", - "MartinCJ08", - "lorenzo-sc", - "Pagua", - "Marito10", - "lajaso", - "AlePerez92", - "patoezequiel", - "FranciscoCastle", - "Pulits", - "Th3Cod3", - "rec", - "BubuAnabelas", - "abaracedo", - "Pablo_Bangueses", - "gfernandez", - "davegomez", - "viartola", - "Albizures", - "germanio", - "a0viedo", - "teoli", - "LuisArt", - "Nukeador", - "ADP13", - "Errepunto", - "Sheppy", - "Nathymig", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/@@iterator": { - "modified": "2020-10-15T22:06:23.853Z", - "contributors": [ - "lajaso" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/@@species": { - "modified": "2020-10-15T22:07:11.429Z", - "contributors": [ - "lajaso" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/@@unscopables": { - "modified": "2020-10-15T22:04:47.805Z", - "contributors": [ - "lajaso" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/concat": { - "modified": "2020-10-15T21:38:20.137Z", - "contributors": [ - "AlePerez92", - "lajaso", - "germun", - "joseluisq", - "KurtPoehler", - "dgrcode", - "gonzalog" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/copyWithin": { - "modified": "2020-10-15T21:46:52.733Z", - "contributors": [ - "lajaso", - "chabisoriano", - "Aldomolina", - "eljonims" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/entries": { - "modified": "2020-10-15T21:45:28.326Z", - "contributors": [ - "lajaso", - "danielfelipe113", - "imNicoSuarez" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/every": { - "modified": "2020-10-15T21:38:36.565Z", - "contributors": [ - "camsa", - "thepianist2", - "lajaso", - "devrodriguez", - "cagodoy", - "vltamara" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/fill": { - "modified": "2020-10-15T21:37:55.734Z", - "contributors": [ - "camsa", - "lajaso", - "ticdenis", - "luisNavasArg", - "eljonims", - "cesarve77" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/filter": { - "modified": "2020-10-15T21:30:44.260Z", - "contributors": [ - "SphinxKnight", - "tenthlive", - "AlePerez92", - "lajaso", - "robe007", - "AdrianSkar", - "krthr", - "joseluisq", - "cesargtzyanez", - "josegarciaclm95", - "ezain", - "dgrcode", - "vltamara", - "averdion", - "li0t", - "matajm" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/find": { - "modified": "2020-10-15T21:37:55.410Z", - "contributors": [ - "AlePerez92", - "orgcompany", - "sancospi", - "chokozzy", - "adictovirtual", - "alo5" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/findIndex": { - "modified": "2020-10-15T21:46:40.264Z", - "contributors": [ - "AlePerez92", - "dannyjhonston", - "Aldomolina", - "luisrodriguezchaves", - "andrpueb" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/flat": { - "modified": "2020-10-15T22:04:41.717Z", - "contributors": [ - "amarin95", - "AlePerez92", - "BubuAnabelas", - "fscholz", - "lajaso" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/flatMap": { - "modified": "2020-10-15T22:04:40.380Z", - "contributors": [ - "alejandro.figuera", - "amarin95", - "lajaso" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/forEach": { - "modified": "2020-10-15T21:25:13.328Z", - "contributors": [ - "maximocapital", - "AlePerez92", - "lajaso", - "MiSStakes", - "Aldomolina", - "gfvcastro", - "Arnaldof", - "estebanav", - "pakitometal", - "007lva", - "fcomabella", - "everblut", - "fernandomg", - "teoli", - "elfoxero" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/from": { - "modified": "2020-10-15T21:41:11.903Z", - "contributors": [ - "AlePerez92", - "lajaso", - "Aldomolina", - "GiuMagnani", - "joakku", - "thzunder" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/includes": { - "modified": "2020-10-15T21:41:08.738Z", - "contributors": [ - "emilianot", - "AlePerez92", - "lajaso", - "jorgeyp", - "patoezequiel", - "Estoja", - "degj21", - "wffranco", - "DRayX" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/indexOf": { - "modified": "2020-10-15T21:21:34.369Z", - "contributors": [ - "ChristianMarca", - "lajaso", - "estrellalazaro", - "Aldomolina", - "Castillo05", - "teoli", - "AntonioNavajas" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/isArray": { - "modified": "2020-10-15T21:36:49.146Z", - "contributors": [ - "lajaso", - "Guatom", - "AlePerez92", - "sergiolunagarcia", - "EddieV1" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/join": { - "modified": "2020-10-15T21:37:05.645Z", - "contributors": [ - "lajaso", - "juanluisrp", - "davegomez" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/keys": { - "modified": "2020-10-15T21:46:47.383Z", - "contributors": [ - "lajaso", - "eljonims" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/lastIndexOf": { - "modified": "2020-10-15T21:44:42.909Z", - "contributors": [ - "luchosr", - "lajaso", - "AlePerez92", - "cesiztel" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/length": { - "modified": "2020-10-15T21:36:04.137Z", - "contributors": [ - "lajaso", - "abaracedo", - "gfernandez", - "martinweingart" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/map": { - "modified": "2019-07-29T10:38:41.705Z", - "contributors": [ - "AndCotOli", - "david_ru", - "ardillan", - "alejandrochung", - "shades3002", - "AlePerez92", - "VictorAbdon", - "andrxs", - "fcomabella" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/of": { - "modified": "2020-10-15T21:39:43.805Z", - "contributors": [ - "lajaso", - "missmakita", - "egosum", - "luisNavasArg", - "adelamata" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/pop": { - "modified": "2020-10-15T21:34:39.833Z", - "contributors": [ - "AlePerez92", - "abimael67", - "Insitu", - "VulpisDev", - "fceacero", - "estrellalazaro", - "Guitxo" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/prototype": { - "modified": "2020-10-15T21:35:31.913Z", - "contributors": [ - "lajaso", - "humbertaco" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/push": { - "modified": "2020-10-15T21:20:34.074Z", - "contributors": [ - "AlePerez92", - "_cuco_", - "fcojgodoy", - "Aldomolina", - "alvarouribe", - "teoli", - "mhauptma73" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/reduce": { - "modified": "2020-10-15T21:16:20.520Z", - "contributors": [ - "AlePerez92", - "ShakMR", - "bogdanned", - "diegoazh", - "UlisesGascon", - "eljonims", - "jeduan", - "vltamara", - "cpf", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/reduceRight": { - "modified": "2019-03-23T23:50:45.331Z", - "contributors": [ - "fuzzyalej", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/reverse": { - "modified": "2020-10-15T21:34:38.313Z", - "contributors": [ - "AlePerez92", - "JulianSoto", - "polacrin", - "eduardosada", - "Omar.VzqzAc", - "khrizenriquez", - "arthusu" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/shift": { - "modified": "2020-08-27T12:47:35.128Z", - "contributors": [ - "AlePerez92", - "Dandarprox", - "DsEsteban", - "gfernandez" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/slice": { - "modified": "2019-03-23T22:52:20.266Z", - "contributors": [ - "olijyat", - "DaFont", - "parzibyte", - "kosme", - "kdex", - "atl3", - "eljonims", - "Grijander81", - "asero82", - "oillescas" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/some": { - "modified": "2020-10-15T21:36:10.705Z", - "contributors": [ - "AlePerez92", - "thepianist2", - "Serabe", - "oillescas", - "fcomabella", - "martinweingart" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/sort": { - "modified": "2020-10-10T21:23:15.977Z", - "contributors": [ - "Gardeky", - "frfernandezdev", - "sebastian_romerola", - "Tepexic", - "carlosazaustre", - "jesuslombardo", - "reymundus2", - "CatalinaCampos", - "LuisSevillano", - "Newtrino", - "cristobal.pina", - "alejandrochung", - "AlePerez92", - "eljonims", - "rubenpizarrov", - "luisbd", - "lombareload" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/splice": { - "modified": "2020-10-15T21:33:06.435Z", - "contributors": [ - "AlePerez92", - "_cuco_", - "FelixJMaxwell", - "Joshuete1997", - "NoTengoBattery", - "pawer13", - "Guitxo", - "alvarouribe" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/toLocaleString": { - "modified": "2020-10-15T22:10:13.626Z", - "contributors": [ - "estebanpanelli" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/toSource": { - "modified": "2019-03-23T22:08:25.338Z", - "contributors": [ - "teoli", - "pedro-otero" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/toString": { - "modified": "2020-10-15T21:37:53.754Z", - "contributors": [ - "AlePerez92", - "juanluisrp", - "Dorumin", - "dgrizzla" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/unshift": { - "modified": "2020-10-15T21:36:39.291Z", - "contributors": [ - "AlePerez92", - "elhesuu" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Array/values": { - "modified": "2020-10-15T21:47:36.548Z", - "contributors": [ - "AlePerez92", - "chabisoriano", - "clystian" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/ArrayBuffer": { - "modified": "2020-10-15T21:40:07.554Z", - "contributors": [ - "lajaso", - "joseluisq", - "mlealvillarreal", - "AzazelN28", - "tamat" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/ArrayBuffer/@@species": { - "modified": "2020-10-15T22:05:03.686Z", - "contributors": [ - "lajaso" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/ArrayBuffer/byteLength": { - "modified": "2020-10-15T22:05:03.452Z", - "contributors": [ - "lajaso" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/ArrayBuffer/prototype": { - "modified": "2020-10-15T21:51:49.315Z", - "contributors": [ - "lajaso", - "AzazelN28" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Boolean": { - "modified": "2020-10-15T21:16:58.681Z", - "contributors": [ - "Nachec", - "jtenclay", - "IsaacAaron", - "MarkelCuesta", - "teoli", - "Talisker", - "Nathymig", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Boolean/Boolean": { - "modified": "2020-10-15T22:33:47.964Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Boolean/toSource": { - "modified": "2019-09-14T17:25:31.875Z", - "contributors": [ - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date": { - "modified": "2019-10-10T16:53:04.977Z", - "contributors": [ - "wbamberg", - "Eduardo_66", - "teoli", - "Talisker", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/UTC": { - "modified": "2019-03-23T23:48:17.886Z", - "contributors": [ - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getDate": { - "modified": "2019-03-23T22:47:58.851Z", - "contributors": [ - "DanielFRB", - "helmantika", - "ycanales" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getDay": { - "modified": "2019-03-23T22:41:58.390Z", - "contributors": [ - "odelrio", - "davElsanto", - "thzunder" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getFullYear": { - "modified": "2020-04-12T08:54:11.729Z", - "contributors": [ - "Clipi", - "Guitxo" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getHours": { - "modified": "2019-03-23T22:25:54.207Z", - "contributors": [ - "davElsanto" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getMilliseconds": { - "modified": "2019-03-23T22:19:54.449Z", - "contributors": [ - "Undre4m" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getMinutes": { - "modified": "2019-03-23T22:50:56.451Z", - "contributors": [ - "jezdez", - "jorgeLightwave" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getMonth": { - "modified": "2019-03-23T22:51:30.861Z", - "contributors": [ - "cristobalramos" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getSeconds": { - "modified": "2020-10-15T22:04:39.573Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getTime": { - "modified": "2020-10-18T16:10:45.747Z", - "contributors": [ - "feliperomero3", - "maxbalter", - "Marttharomero" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getUTCFullYear": { - "modified": "2019-03-23T22:20:31.228Z", - "contributors": [ - "e.g.m.g." - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/getUTCHours": { - "modified": "2019-03-23T22:23:56.170Z", - "contributors": [ - "eltrikiman" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/now": { - "modified": "2019-03-23T23:48:17.746Z", - "contributors": [ - "teoli", - "ethertank", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/parse": { - "modified": "2019-03-23T23:48:18.384Z", - "contributors": [ - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/prototype": { - "modified": "2019-03-23T23:11:22.072Z", - "contributors": [ - "teoli" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/setFullYear": { - "modified": "2019-03-23T22:20:28.916Z", - "contributors": [ - "e.g.m.g." - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/setMonth": { - "modified": "2020-10-15T22:26:32.061Z", - "contributors": [ - "mavega998" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/toDateString": { - "modified": "2020-10-15T22:00:03.156Z", - "contributors": [ - "thisisalexis" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/toISOString": { - "modified": "2020-10-18T16:02:20.913Z", - "contributors": [ - "feliperomero3", - "Dandarprox", - "guillermomontero", - "chinogarcia", - "thzunder", - "developingo" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/toJSON": { - "modified": "2020-10-15T22:34:58.674Z", - "contributors": [ - "w3pdsoft" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/toLocaleDateString": { - "modified": "2020-10-15T22:26:52.505Z", - "contributors": [ - "AntonioM." - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/toLocaleString": { - "modified": "2020-10-15T22:28:03.714Z", - "contributors": [ - "jestebans", - "Juanpredev" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/toLocaleTimeString": { - "modified": "2020-10-15T22:28:25.409Z", - "contributors": [ - "antixsuperstar" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Date/toUTCString": { - "modified": "2020-10-15T22:26:46.954Z", - "contributors": [ - "batik" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error": { - "modified": "2020-10-15T21:17:01.621Z", - "contributors": [ - "Nachec", - "akadoshin", - "gfernandez", - "teoli", - "Talisker", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error/constructor_Error": { - "modified": "2020-10-15T22:33:54.309Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error/fileName": { - "modified": "2020-10-15T22:33:52.450Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error/lineNumber": { - "modified": "2019-03-23T22:44:34.178Z", - "contributors": [ - "KikinRdz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error/message": { - "modified": "2019-03-23T22:31:48.655Z", - "contributors": [ - "RiazaValverde" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error/name": { - "modified": "2020-10-15T21:51:31.702Z", - "contributors": [ - "Nachec", - "Bumxu" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error/prototype": { - "modified": "2019-03-23T22:31:40.887Z", - "contributors": [ - "RiazaValverde" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error/toSource": { - "modified": "2020-10-15T22:33:54.410Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Error/toString": { - "modified": "2020-10-15T22:33:57.174Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/EvalError": { - "modified": "2020-08-30T20:35:42.248Z", - "contributors": [ - "YHWHSGP88", - "Undre4m" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Funcionesasíncronas": { - "modified": "2020-10-15T22:06:23.441Z", - "contributors": [ - "akacoronel", - "rayrojas", - "miguelrijo" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function": { - "modified": "2020-10-15T21:14:31.534Z", - "contributors": [ - "Nachec", - "Tzikin100", - "teoli", - "ethertank", - "Skorney", - "ADP13", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/Función": { - "modified": "2020-10-15T22:33:51.294Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/apply": { - "modified": "2019-03-23T23:31:02.682Z", - "contributors": [ - "AdrianSkar", - "swsoftware", - "jdmgarcia", - "juliandavidmr", - "JuanMaRuiz", - "elenatorro", - "eespitia.rea", - "emazarrasa", - "yakashiro", - "teoli", - "chebit", - "gtoroap" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/arguments": { - "modified": "2019-03-23T23:48:35.727Z", - "contributors": [ - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/bind": { - "modified": "2019-03-23T23:02:28.323Z", - "contributors": [ - "Imvi10", - "Silverium", - "marinatouceda", - "dimun", - "lennarth.anaya", - "Javingka", - "cobogt" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/call": { - "modified": "2020-11-13T21:36:49.496Z", - "contributors": [ - "alejandro.fca", - "saulrp7", - "cristianmartinez", - "teoli", - "bluesky777" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/caller": { - "modified": "2019-03-23T22:52:58.734Z", - "contributors": [ - "DavidBernal", - "fabianlucena" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/displayName": { - "modified": "2020-10-15T21:59:29.332Z", - "contributors": [ - "juliandavidmr" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/length": { - "modified": "2020-02-10T13:03:52.789Z", - "contributors": [ - "kant", - "Nanyin", - "HyMaN" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/name": { - "modified": "2019-03-18T20:38:56.122Z", - "contributors": [ - "SunWithIssues", - "pedro-otero", - "kdex", - "jorgecasar" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/prototype": { - "modified": "2019-03-23T23:53:55.022Z", - "contributors": [ - "mcardozo", - "teoli", - "shaggyrd", - "Mgjbot", - "Wrongloop", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/toSource": { - "modified": "2019-03-23T22:42:12.644Z", - "contributors": [ - "teoli", - "gpdiaz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Function/toString": { - "modified": "2019-03-23T22:31:32.582Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Generador": { - "modified": "2020-09-30T15:33:08.419Z", - "contributors": [ - "alejandro.fca", - "sdotson", - "Chofoteddy", - "nicolasolmos" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Generador/next": { - "modified": "2020-10-15T22:03:24.006Z", - "contributors": [ - "DJphilomath" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Generador/return": { - "modified": "2020-10-15T22:03:25.741Z", - "contributors": [ - "DJphilomath" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Generador/throw": { - "modified": "2020-10-15T22:03:23.876Z", - "contributors": [ - "DJphilomath" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Infinity": { - "modified": "2020-03-12T19:36:58.042Z", - "contributors": [ - "SphinxKnight", - "teoli", - "jarneygm", - "ADP13", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/InternalError": { - "modified": "2020-10-15T22:33:54.342Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/InternalError/Constructor_InternalError": { - "modified": "2020-10-15T22:33:52.933Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Intl": { - "modified": "2020-10-15T21:58:20.138Z", - "contributors": [ - "LucasDeFarias", - "eespitia.rea", - "puentesdiaz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Intl/NumberFormat": { - "modified": "2020-10-15T21:29:49.289Z", - "contributors": [ - "fscholz", - "IsraelFloresDGA", - "eespitia.rea" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Intl/NumberFormat/format": { - "modified": "2020-10-15T22:26:32.434Z", - "contributors": [ - "fscholz", - "Daniel7Byte" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Intl/RelativeTimeFormat": { - "modified": "2020-10-15T22:33:27.123Z", - "contributors": [ - "midudev" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/JSON": { - "modified": "2020-09-19T17:44:12.200Z", - "contributors": [ - "cristian.valdivieso", - "Kroneaux", - "ulisestrujillo", - "lfottaviano", - "JefferHXC", - "rossif", - "teoli", - "fscholz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/JSON/parse": { - "modified": "2019-03-23T23:09:22.011Z", - "contributors": [ - "bufalo1973", - "aminguez", - "mbarbancho", - "rossif", - "PepeBeat" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/JSON/stringify": { - "modified": "2020-10-15T21:26:39.053Z", - "contributors": [ - "AlePerez92", - "Ivan-Perez", - "kip-13", - "imagentleman", - "raistmaj", - "JoseBarakat", - "danielbenedi6", - "inawrath", - "lfottaviano", - "julesdel", - "teland", - "teoli", - "carlosgctes" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map": { - "modified": "2020-10-15T21:30:28.950Z", - "contributors": [ - "Almiqui", - "AntonioSalazar", - "SphinxKnight", - "Sebastiancbvz", - "vaavJSdev", - "timgivois", - "aeroxmotion", - "PepeAleu", - "xavier.gallofre", - "rn3w", - "Grijander81", - "GustavoFernandez", - "rec", - "Kouen", - "facundoj" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/clear": { - "modified": "2019-03-23T22:33:57.332Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/delete": { - "modified": "2019-06-22T21:43:58.894Z", - "contributors": [ - "gerardonavart", - "Grijander81" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/entries": { - "modified": "2019-03-23T22:33:46.712Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/forEach": { - "modified": "2020-10-15T21:59:58.539Z", - "contributors": [ - "gerardonavart", - "PabloContreras", - "katuno1981" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/get": { - "modified": "2020-10-15T22:01:57.424Z", - "contributors": [ - "Marte", - "Sebastiancbvz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/has": { - "modified": "2020-10-15T22:32:18.735Z", - "contributors": [ - "fredydeltoro" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/keys": { - "modified": "2019-03-23T22:31:40.425Z", - "contributors": [ - "jesusfchavarro" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/prototype": { - "modified": "2019-03-23T22:06:29.334Z", - "contributors": [ - "JuanMacias" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/set": { - "modified": "2019-03-23T22:28:28.999Z", - "contributors": [ - "guillermojmc" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/size": { - "modified": "2019-03-23T22:34:02.057Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Map/values": { - "modified": "2020-10-15T22:12:33.830Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math": { - "modified": "2020-10-15T21:17:08.782Z", - "contributors": [ - "RomnSD", - "Pedro-vk", - "lajaso", - "Enesimus", - "maxbalter", - "raecillacastellana", - "mrajente47", - "enesimo", - "Jaston", - "AugustoEsquen", - "teoli", - "ethertank", - "Talisker", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/E": { - "modified": "2020-10-15T21:21:06.485Z", - "contributors": [ - "lajaso", - "teoli", - "jessest" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/LN10": { - "modified": "2020-10-15T21:21:04.066Z", - "contributors": [ - "lajaso", - "teoli", - "jessest" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/LN2": { - "modified": "2020-10-15T21:21:06.933Z", - "contributors": [ - "lajaso", - "teoli", - "jessest" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/LOG10E": { - "modified": "2019-03-23T22:21:51.531Z", - "contributors": [ - "aocodermx" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/LOG2E": { - "modified": "2019-03-23T23:35:28.496Z", - "contributors": [ - "teoli", - "jessest" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/PI": { - "modified": "2019-03-23T22:21:48.729Z", - "contributors": [ - "aocodermx" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/SQRT1_2": { - "modified": "2019-03-23T22:22:44.049Z", - "contributors": [ - "aocodermx" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/SQRT2": { - "modified": "2019-03-23T22:18:15.216Z", - "contributors": [ - "geradrum" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/abs": { - "modified": "2019-10-29T19:51:46.768Z", - "contributors": [ - "jaomix1", - "jezdez", - "Sotelio" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/acos": { - "modified": "2020-10-15T21:58:17.630Z", - "contributors": [ - "Enesimus" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/acosh": { - "modified": "2020-10-15T21:59:09.931Z", - "contributors": [ - "nickobre", - "Enesimus" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/asin": { - "modified": "2019-03-23T22:11:21.124Z", - "contributors": [ - "hckt" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/asinh": { - "modified": "2020-10-15T22:00:15.403Z", - "contributors": [ - "josegarciamanez" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/atan": { - "modified": "2020-10-15T22:02:19.566Z", - "contributors": [ - "alejocas" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/atan2": { - "modified": "2019-03-23T22:52:46.887Z", - "contributors": [ - "maik10s" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/atanh": { - "modified": "2020-11-01T00:27:58.552Z", - "contributors": [ - "carlitosnu41" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/cbrt": { - "modified": "2020-11-01T15:23:46.179Z", - "contributors": [ - "carlitosnu41" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/ceil": { - "modified": "2020-10-15T21:49:24.207Z", - "contributors": [ - "RubiVG", - "AlePerez92", - "d-go", - "abestrad1", - "ManuelRubio", - "ars1614", - "Roberto2883" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/cos": { - "modified": "2020-10-15T22:32:41.209Z", - "contributors": [ - "JGalazan" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/exp": { - "modified": "2019-03-23T22:13:13.656Z", - "contributors": [ - "maramal" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/expm1": { - "modified": "2020-11-19T20:10:09.526Z", - "contributors": [ - "lpg7793" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/floor": { - "modified": "2020-11-03T13:27:31.226Z", - "contributors": [ - "LuisGalicia", - "reymundus2", - "dherrero", - "teoli", - "ethertank", - "harleshinn" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/fround": { - "modified": "2020-10-15T22:21:30.568Z", - "contributors": [ - "Itaiu" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/hypot": { - "modified": "2020-10-15T22:01:35.023Z", - "contributors": [ - "AzazelN28", - "MarioECU" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/log": { - "modified": "2020-10-15T22:16:12.754Z", - "contributors": [ - "reymundus2" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/log10": { - "modified": "2019-03-23T22:26:16.691Z", - "contributors": [ - "amcrsanchez" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/log2": { - "modified": "2020-10-15T22:02:09.980Z", - "contributors": [ - "asdrubalivan" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/max": { - "modified": "2019-03-23T22:58:23.136Z", - "contributors": [ - "roberbnd", - "kutyel", - "alonso.vazquez", - "teoli", - "allangonzalezmiceli" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/min": { - "modified": "2019-03-23T22:39:26.032Z", - "contributors": [ - "kutyel", - "alonso.vazquez" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/pow": { - "modified": "2020-05-11T01:41:03.777Z", - "contributors": [ - "paguilar", - "carral" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/random": { - "modified": "2019-03-23T23:00:21.676Z", - "contributors": [ - "hdesoto", - "CarlosLinares", - "Sotelio", - "daiant" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/round": { - "modified": "2020-07-28T16:21:17.637Z", - "contributors": [ - "FacundoF1", - "herediando", - "Maletil", - "emergugue", - "YerkoPalma" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/seno": { - "modified": "2019-03-23T22:51:39.313Z", - "contributors": [ - "jezdez", - "germanfr" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/sign": { - "modified": "2019-03-23T22:16:42.806Z", - "contributors": [ - "Vickysolo", - "frankman123" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/sqrt": { - "modified": "2019-03-23T22:28:35.014Z", - "contributors": [ - "MarioECU", - "periplox", - "javodg", - "LotarMC" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/tan": { - "modified": "2020-10-15T22:30:22.119Z", - "contributors": [ - "spaceinvadev" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/tanh": { - "modified": "2020-10-15T22:08:08.543Z", - "contributors": [ - "smuurf" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Math/trunc": { - "modified": "2020-06-23T08:00:29.509Z", - "contributors": [ - "GioSJ47", - "UlisesGascon", - "AldenGate", - "kenin4" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/NaN": { - "modified": "2020-03-12T19:36:10.137Z", - "contributors": [ - "jaomix1", - "mjimcua", - "SphinxKnight", - "teoli", - "Garf", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number": { - "modified": "2020-11-24T10:13:32.926Z", - "contributors": [ - "gise-s", - "charlietaracenadrums", - "carlintrujillo11", - "luispro19", - "Jethrotul", - "KamerrOficial", - "AlePerez92", - "olijyat", - "teoli", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/MAX_SAFE_INTEGER": { - "modified": "2020-10-15T22:00:45.784Z", - "contributors": [ - "urielmx" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/MAX_VALUE": { - "modified": "2019-03-23T22:40:03.550Z", - "contributors": [ - "abaracedo", - "UlisesGascon" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/MIN_VALUE": { - "modified": "2019-03-23T22:39:33.277Z", - "contributors": [ - "abaracedo" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/NEGATIVE_INFINITY": { - "modified": "2019-03-23T23:20:29.197Z", - "contributors": [ - "teoli", - "jarneygm" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/NaN": { - "modified": "2020-10-15T22:30:30.437Z", - "contributors": [ - "oldanirenzo" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/POSITIVE_INFINITY": { - "modified": "2019-03-23T23:20:30.481Z", - "contributors": [ - "teoli", - "jarneygm" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/isFinite": { - "modified": "2020-10-15T22:02:19.829Z", - "contributors": [ - "dahsser" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/isInteger": { - "modified": "2020-10-15T21:44:12.806Z", - "contributors": [ - "AlePerez92", - "Rafaelox" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/isNaN": { - "modified": "2020-10-14T19:49:07.774Z", - "contributors": [ - "alejandro.fca", - "abaracedo" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/isSafeInteger": { - "modified": "2020-10-15T22:02:33.932Z", - "contributors": [ - "chrishenx" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/parseFloat": { - "modified": "2020-10-15T22:11:38.614Z", - "contributors": [ - "pilichanampe", - "Chstrange", - "IsraelFloresDGA" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/parseInt": { - "modified": "2020-10-15T22:29:44.854Z", - "contributors": [ - "HarryzMoba_10" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/prototype": { - "modified": "2019-03-23T23:46:16.155Z", - "contributors": [ - "teoli", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/toFixed": { - "modified": "2020-05-26T21:48:51.844Z", - "contributors": [ - "EtelS", - "HarryzMoba_10", - "BubuAnabelas", - "Apkahym", - "capgros", - "isabido" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/toLocaleString": { - "modified": "2020-11-04T23:22:26.363Z", - "contributors": [ - "ccarruitero-mdn" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/toPrecision": { - "modified": "2020-10-15T22:05:51.600Z", - "contributors": [ - "jtorresheredia" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/toString": { - "modified": "2019-06-15T08:43:31.612Z", - "contributors": [ - "IbraBach", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Number/valueOf": { - "modified": "2020-10-15T21:58:23.022Z", - "contributors": [ - "Enesimus" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object": { - "modified": "2020-10-15T21:17:02.144Z", - "contributors": [ - "luisjorquera", - "fedoroffs", - "ramirobg94", - "marcelorodcla", - "hecsoto1", - "gabrielrincon", - "fscholz", - "DanielAmaro", - "taniaReyesM", - "pedro-otero", - "ragutimar", - "hmorv", - "mishelashala", - "teoli", - "diegogaysaez", - "neosergio", - "Talisker", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/__defineGetter__": { - "modified": "2019-03-23T22:39:13.909Z", - "contributors": [ - "p1errot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/__lookupGetter__": { - "modified": "2020-10-15T21:59:55.328Z", - "contributors": [ - "al-shmlan", - "jerssonjgar" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/assign": { - "modified": "2020-10-15T21:34:18.548Z", - "contributors": [ - "camsa", - "AlePerez92", - "sillo01", - "garolard", - "kdex", - "aelena", - "sgmonda", - "dzegarra", - "fortil", - "raerpo", - "Anonymous", - "mishelashala", - "fscholz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/constructor": { - "modified": "2019-03-23T23:16:25.847Z", - "contributors": [ - "alejandrochung", - "hugoleon46", - "teoli", - "chebit", - "carlosmantilla" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/create": { - "modified": "2020-11-08T21:02:55.557Z", - "contributors": [ - "Hunter3195", - "jescas248", - "AlePerez92", - "jacoborus", - "teoli", - "Siro_Diaz", - "carlosmantilla" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/defineProperties": { - "modified": "2019-03-23T23:15:47.453Z", - "contributors": [ - "Thargelion", - "mishelashala", - "teoli", - "guillermojmc" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/defineProperty": { - "modified": "2019-03-23T23:08:49.016Z", - "contributors": [ - "JoanSerna", - "thejavo", - "EstherAF", - "mishelashala", - "victorgavilan", - "Siro_Diaz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/entries": { - "modified": "2019-07-12T06:16:58.372Z", - "contributors": [ - "ajuanjojjj", - "datencia", - "JooseNavarro" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/freeze": { - "modified": "2020-10-15T21:40:07.065Z", - "contributors": [ - "D3Portillo", - "mariogl", - "AndresSepar", - "tw1ttt3r", - "mishelashala" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/fromEntries": { - "modified": "2020-10-15T22:16:55.358Z", - "contributors": [ - "emileond", - "Belquira" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/getOwnPropertyDescriptor": { - "modified": "2020-04-01T17:55:45.485Z", - "contributors": [ - "SoyZatarain", - "vcastrejont", - "UlisesGascon", - "mishelashala" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/getOwnPropertyDescriptors": { - "modified": "2020-10-15T22:04:17.154Z", - "contributors": [ - "cbalderasc" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/getOwnPropertyNames": { - "modified": "2019-03-23T23:11:13.666Z", - "contributors": [ - "teland" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/getOwnPropertySymbols": { - "modified": "2019-03-23T22:44:20.977Z", - "contributors": [ - "SphinxKnight", - "mishelashala" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/getPrototypeOf": { - "modified": "2019-03-23T23:08:23.955Z", - "contributors": [ - "tutugordillo", - "Siro_Diaz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/hasOwnProperty": { - "modified": "2019-03-23T23:16:40.759Z", - "contributors": [ - "mlealvillarreal", - "teoli", - "Siro_Diaz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/is": { - "modified": "2020-10-25T20:02:03.267Z", - "contributors": [ - "Cesaraugp", - "SphinxKnight", - "nothnk", - "adelamata" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/isExtensible": { - "modified": "2019-03-23T22:44:00.950Z", - "contributors": [ - "mishelashala" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/isFrozen": { - "modified": "2019-03-23T22:44:03.171Z", - "contributors": [ - "mishelashala" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/isPrototypeOf": { - "modified": "2019-03-23T22:31:29.220Z", - "contributors": [ - "Grijander81" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/isSealed": { - "modified": "2020-10-15T22:04:16.292Z", - "contributors": [ - "cbalderasc" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/keys": { - "modified": "2020-10-15T21:31:27.965Z", - "contributors": [ - "jose-setaworkshop", - "SphinxKnight", - "animanoir", - "D3Portillo", - "_cuco_", - "MarkelCuesta", - "kdex", - "andrpueb", - "PBartrina", - "Sanuzzi", - "cristianjav", - "rcchristiane" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/preventExtensions": { - "modified": "2019-04-27T00:07:22.331Z", - "contributors": [ - "mishelashala" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/propertyIsEnumerable": { - "modified": "2019-03-23T22:50:44.591Z", - "contributors": [ - "aldoromo88" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/proto": { - "modified": "2019-03-23T22:45:52.056Z", - "contributors": [ - "swsoftware", - "mishelashala", - "adelamata" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/prototype": { - "modified": "2020-10-15T21:28:24.470Z", - "contributors": [ - "lajaso", - "Sergio_Gonzalez_Collado", - "educalleja", - "AlexanderEstebanZapata1994", - "emilianodiaz", - "mishelashala", - "teoli", - "diegogaysaez" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/seal": { - "modified": "2019-04-27T00:05:41.633Z", - "contributors": [ - "JoniJnm", - "Grijander81" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/setPrototypeOf": { - "modified": "2019-03-23T22:43:30.332Z", - "contributors": [ - "SphinxKnight", - "imangas", - "mishelashala" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/toLocaleString": { - "modified": "2020-10-15T22:31:29.977Z", - "contributors": [ - "JotaCé" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/toSource": { - "modified": "2020-10-15T21:59:52.415Z", - "contributors": [ - "taniaReyesM" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/toString": { - "modified": "2019-03-23T23:48:33.504Z", - "contributors": [ - "gutyfas", - "pctux", - "lfottaviano", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/valueOf": { - "modified": "2019-03-23T23:07:28.561Z", - "contributors": [ - "JuanMacias", - "Gorzas", - "emiliot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Object/values": { - "modified": "2020-10-15T21:51:49.001Z", - "contributors": [ - "camsa", - "kraneok", - "AlePerez92", - "ramses512" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise": { - "modified": "2020-10-15T21:34:31.961Z", - "contributors": [ - "chrisdavidmills", - "javigaralva", - "ManuelEsp", - "atpollmann", - "jwhitlock", - "zgluis", - "joseconstela", - "luisrodriguezchaves", - "LazaroOnline", - "leopic", - "teoli", - "JhonAlx", - "dennistobar", - "alagos", - "jorgecasar" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise/all": { - "modified": "2020-10-15T21:50:20.796Z", - "contributors": [ - "baumannzone", - "isaies", - "jwhitlock", - "AlePerez92", - "FranBacoSoft" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise/catch": { - "modified": "2020-10-15T21:54:38.286Z", - "contributors": [ - "JuanMacias", - "JoseGB", - "walbuc" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise/finally": { - "modified": "2020-10-15T22:16:46.629Z", - "contributors": [ - "javigallego", - "smvilar" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise/prototype": { - "modified": "2020-10-15T21:52:03.650Z", - "contributors": [ - "atpollmann" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise/race": { - "modified": "2020-10-15T21:50:20.173Z", - "contributors": [ - "JuanMacias", - "jwhitlock", - "FranBacoSoft" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise/reject": { - "modified": "2020-10-15T22:00:43.489Z", - "contributors": [ - "edeyglez95", - "kalozoya", - "giturra" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise/resolve": { - "modified": "2020-10-15T22:06:37.624Z", - "contributors": [ - "HappyEduardoMilk", - "ChristianMarca" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Promise/then": { - "modified": "2020-11-30T12:11:41.749Z", - "contributors": [ - "StripTM", - "MichaelOrdaz", - "PatoDeTuring", - "FreakLevel", - "snake77se", - "Takyo", - "smvilar", - "Knskan3", - "JurgenBlitz", - "DaniLaguna", - "MarkelCuesta", - "manumora" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Proxy": { - "modified": "2020-10-30T19:48:13.357Z", - "contributors": [ - "Ramdhei-codes", - "CristalT", - "carloslfu", - "pedro-otero", - "eContento", - "kdex", - "pedropablomt95" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/ReferenceError": { - "modified": "2020-10-15T22:33:51.476Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/RegExp": { - "modified": "2020-10-15T21:12:12.221Z", - "contributors": [ - "Nachec", - "lord-reptilia", - "wbamberg", - "angeldomp49", - "F94Olivera", - "EstebanVictorio", - "teoli", - "fmvilas", - "Sole", - "marcoslhc", - "lmorchard", - "Scipion", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/RegExp/RegExp": { - "modified": "2020-10-15T22:34:22.734Z", - "contributors": [ - "Nachec" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/RegExp/compile": { - "modified": "2020-10-15T22:23:39.381Z", - "contributors": [ - "raiman264" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/RegExp/exec": { - "modified": "2019-03-23T22:08:57.043Z", - "contributors": [ - "Sebastiancbvz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/RegExp/ignoreCase": { - "modified": "2019-03-23T22:10:00.611Z", - "contributors": [ - "Cuadraman" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/RegExp/rightContext": { - "modified": "2020-10-15T22:22:06.547Z", - "contributors": [ - "higuitadiaz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/RegExp/test": { - "modified": "2019-03-23T22:20:42.368Z", - "contributors": [ - "Undre4m" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/RegExp/toString": { - "modified": "2019-03-23T22:20:44.971Z", - "contributors": [ - "Undre4m" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set": { - "modified": "2020-10-15T21:43:41.104Z", - "contributors": [ - "camsa", - "IsraelFloresDGA", - "albertor21", - "robe007", - "taniaReyesM", - "mjlescano", - "germanio", - "frank-orellana", - "Chofoteddy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set/@@iterator": { - "modified": "2020-10-15T22:23:37.310Z", - "contributors": [ - "devtoni" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set/add": { - "modified": "2019-03-23T22:37:23.989Z", - "contributors": [ - "Chofoteddy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set/clear": { - "modified": "2019-03-23T22:25:09.145Z", - "contributors": [ - "frank-orellana" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set/delete": { - "modified": "2019-03-23T22:25:14.047Z", - "contributors": [ - "frank-orellana" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set/entries": { - "modified": "2020-10-15T22:06:44.315Z", - "contributors": [ - "AMongeMoreno" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set/has": { - "modified": "2019-03-23T22:25:15.879Z", - "contributors": [ - "frank-orellana" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set/size": { - "modified": "2019-03-23T22:37:32.002Z", - "contributors": [ - "albertor21", - "Chofoteddy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Set/values": { - "modified": "2020-10-15T22:23:08.370Z", - "contributors": [ - "jvelasquez-cl" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String": { - "modified": "2020-10-15T21:15:27.929Z", - "contributors": [ - "Nachec", - "robertsallent", - "sujumayas", - "AriManto", - "BubuAnabelas", - "wbamberg", - "SphinxKnight", - "Gilbertrdz", - "vik231982", - "alejandrochung", - "DevManny", - "teoli", - "ADP13", - "Talisker", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/Trim": { - "modified": "2019-08-18T16:00:14.454Z", - "contributors": [ - "valen2004vega", - "raulgg", - "baumannzone", - "andrpueb", - "thzunder", - "AnuarMB" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/anchor": { - "modified": "2019-03-23T23:48:20.117Z", - "contributors": [ - "paradoja", - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/big": { - "modified": "2019-03-23T23:48:12.468Z", - "contributors": [ - "Feder1997Clinton", - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/blink": { - "modified": "2019-03-23T23:48:14.789Z", - "contributors": [ - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/bold": { - "modified": "2019-03-23T23:48:17.641Z", - "contributors": [ - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/charAt": { - "modified": "2019-03-23T23:48:14.397Z", - "contributors": [ - "manatico4", - "thepianist2", - "Undre4m", - "AnuarMB", - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/charCodeAt": { - "modified": "2019-03-23T23:48:12.586Z", - "contributors": [ - "GermanRodrickson", - "VGamezz19", - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/codePointAt": { - "modified": "2020-10-15T21:56:01.225Z", - "contributors": [ - "thepianist2" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/concat": { - "modified": "2020-11-17T12:46:24.732Z", - "contributors": [ - "AlePerez92", - "thepianist2", - "Aldomolina", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/endsWith": { - "modified": "2020-11-17T13:03:14.946Z", - "contributors": [ - "AlePerez92", - "emibloque", - "SphinxKnight", - "thzunder" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/fixed": { - "modified": "2019-03-23T23:48:13.182Z", - "contributors": [ - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/fontcolor": { - "modified": "2019-03-23T22:43:01.091Z", - "contributors": [ - "thzunder" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/fontsize": { - "modified": "2019-03-23T22:42:58.033Z", - "contributors": [ - "thzunder" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/fromCharCode": { - "modified": "2019-03-23T23:48:18.539Z", - "contributors": [ - "pierina27", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/fromCodePoint": { - "modified": "2019-03-23T22:54:48.266Z", - "contributors": [ - "SphinxKnight", - "iKenshu" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/includes": { - "modified": "2020-11-17T13:18:02.027Z", - "contributors": [ - "AlePerez92", - "Fjaguero", - "JuanMacias", - "mikekrn", - "jairoFg12" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/indexOf": { - "modified": "2019-03-18T21:12:49.473Z", - "contributors": [ - "aalmadar", - "diegoazh", - "ArisChuck", - "WillyMaikowski", - "teoli", - "Tetrix", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/italics": { - "modified": "2019-03-23T23:48:19.418Z", - "contributors": [ - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/lastIndexOf": { - "modified": "2019-03-23T23:48:26.628Z", - "contributors": [ - "chepegeek", - "imNicoSuarez", - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/length": { - "modified": "2020-11-17T13:10:35.617Z", - "contributors": [ - "AlePerez92", - "perezale", - "padrecedano", - "thzunder", - "DevManny", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/link": { - "modified": "2019-03-23T23:48:12.131Z", - "contributors": [ - "germun", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/localeCompare": { - "modified": "2020-10-15T22:04:12.741Z", - "contributors": [ - "DesarrolloJon" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/match": { - "modified": "2019-03-23T23:48:25.734Z", - "contributors": [ - "germun", - "facugon", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/matchAll": { - "modified": "2020-10-15T22:22:31.534Z", - "contributors": [ - "juanarbol" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/normalize": { - "modified": "2020-10-15T22:04:13.627Z", - "contributors": [ - "daniel.duarte" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/padStart": { - "modified": "2019-03-23T22:19:55.544Z", - "contributors": [ - "teoli", - "Mamgui", - "EdgarOrtegaRamirez" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/prototype": { - "modified": "2019-03-23T23:53:48.515Z", - "contributors": [ - "DevManny", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/raw": { - "modified": "2020-10-15T21:58:34.921Z", - "contributors": [ - "leomicheloni", - "RaulRueda" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/repeat": { - "modified": "2020-10-15T21:38:22.279Z", - "contributors": [ - "SphinxKnight", - "josegarciamanez", - "chabisoriano", - "GabrielNicolasAvellaneda" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/replace": { - "modified": "2020-01-29T20:30:57.565Z", - "contributors": [ - "camsa", - "Fardenz", - "JasonGlez", - "xaviesteve", - "joselix", - "miljan-aleksic", - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/search": { - "modified": "2019-03-23T23:48:25.507Z", - "contributors": [ - "AlePerez92", - "diegoazh", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/slice": { - "modified": "2019-03-23T23:48:27.527Z", - "contributors": [ - "ibejarano", - "alejandrochung", - "vltamara", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/small": { - "modified": "2019-03-23T23:48:20.862Z", - "contributors": [ - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/split": { - "modified": "2019-03-23T23:52:25.005Z", - "contributors": [ - "germun", - "narigondelsiglo", - "davegomez", - "teoli", - "Juanromerocruz", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/startsWith": { - "modified": "2020-11-17T06:29:46.581Z", - "contributors": [ - "AlePerez92", - "ArianJM", - "SphinxKnight", - "mautematico" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/strike": { - "modified": "2019-03-23T23:48:19.929Z", - "contributors": [ - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/sub": { - "modified": "2019-03-23T23:48:12.360Z", - "contributors": [ - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/substr": { - "modified": "2019-03-23T23:59:51.386Z", - "contributors": [ - "olijyat", - "manuhdez", - "JaimeNorato", - "vltamara", - "teoli", - "Julien.stuby", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/substring": { - "modified": "2019-03-24T00:03:43.568Z", - "contributors": [ - "alejandrochung", - "teoli", - "ethertank", - "StripTM", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/sup": { - "modified": "2019-03-23T23:48:12.249Z", - "contributors": [ - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/toLocaleLowerCase": { - "modified": "2020-10-15T22:11:36.514Z", - "contributors": [ - "MarkCBB" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/toLocaleUpperCase": { - "modified": "2020-10-15T21:55:35.801Z", - "contributors": [ - "padrecedano" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/toLowerCase": { - "modified": "2019-03-23T23:48:13.663Z", - "contributors": [ - "Daniel_Martin", - "AncaorDev", - "JaderLuisDiaz", - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/toSource": { - "modified": "2020-10-15T22:22:52.809Z", - "contributors": [ - "SoyZatarain" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/toString": { - "modified": "2019-03-23T23:48:26.799Z", - "contributors": [ - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/toUpperCase": { - "modified": "2019-03-23T23:48:19.033Z", - "contributors": [ - "hgutierrez", - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/trimEnd": { - "modified": "2020-10-15T22:32:40.984Z", - "contributors": [ - "cardotrejos" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/String/valueOf": { - "modified": "2019-03-23T23:48:30.713Z", - "contributors": [ - "teoli", - "Talisker", - "Mgjbot" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Symbol": { - "modified": "2019-06-24T09:01:16.062Z", - "contributors": [ - "PCASME", - "AnaDallos", - "MateoVelilla", - "onit4ku", - "Lenninlasd", - "SphinxKnight", - "roberbnd", - "javiergarciagonzalez", - "joseanpg" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Symbol/for": { - "modified": "2019-03-23T22:06:38.566Z", - "contributors": [ - "dariomaim" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Symbol/hasInstance": { - "modified": "2019-03-23T22:06:44.647Z", - "contributors": [ - "aeroxmotion" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Symbol/iterator": { - "modified": "2020-10-15T22:03:24.581Z", - "contributors": [ - "leovenezia", - "rderandom", - "DJphilomath" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/SyntaxError": { - "modified": "2019-03-23T22:31:22.099Z", - "contributors": [ - "BubuAnabelas" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/SyntaxError/prototype": { - "modified": "2019-03-23T22:31:16.833Z", - "contributors": [ - "BubuAnabelas" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/TypedArray": { - "modified": "2020-10-15T21:54:18.777Z", - "contributors": [ - "Nachec", - "DJphilomath", - "SphinxKnight", - "fscholz" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/TypedArray/buffer": { - "modified": "2019-03-23T22:12:04.645Z", - "contributors": [ - "SphinxKnight", - "joseluisq" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/URIError": { - "modified": "2020-10-15T22:14:48.739Z", - "contributors": [ - "omoldes" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/Uint8Array": { - "modified": "2019-03-23T22:26:47.572Z", - "contributors": [ - "joseluisq", - "misan", - "pelu" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WeakMap": { - "modified": "2020-10-06T14:36:19.625Z", - "contributors": [ - "oleksandrstarov", - "SphinxKnight", - "kdex", - "frank-orellana", - "oagarcia", - "willemsh" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WeakMap/clear": { - "modified": "2020-10-15T22:13:14.699Z", - "contributors": [ - "xochilpili" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WeakMap/delete": { - "modified": "2019-03-23T22:25:14.754Z", - "contributors": [ - "xochilpili", - "frank-orellana" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WeakMap/get": { - "modified": "2020-10-15T22:13:26.011Z", - "contributors": [ - "xochilpili" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WeakMap/has": { - "modified": "2020-10-15T22:13:17.587Z", - "contributors": [ - "xochilpili" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WeakMap/prototype": { - "modified": "2019-03-23T22:25:12.395Z", - "contributors": [ - "frank-orellana" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WeakMap/set": { - "modified": "2020-10-15T22:13:19.744Z", - "contributors": [ - "xochilpili" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WeakSet": { - "modified": "2019-03-23T22:06:27.270Z", - "contributors": [ - "OliverAcosta", - "roberbnd" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/WebAssembly": { - "modified": "2020-10-15T22:00:20.969Z", - "contributors": [ - "jvalencia" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/decodeURI": { - "modified": "2020-03-12T19:36:57.753Z", - "contributors": [ - "teoli", - "SphinxKnight", - "ADP13", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/decodeURIComponent": { - "modified": "2020-03-12T19:37:00.546Z", - "contributors": [ - "jabarrioss", - "SphinxKnight", - "teoli", - "ADP13", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/encodeURI": { - "modified": "2020-03-12T19:36:55.391Z", - "contributors": [ - "espipj", - "SphinxKnight", - "teoli", - "ADP13", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/encodeURIComponent": { - "modified": "2020-03-12T19:37:33.179Z", - "contributors": [ - "jazjay", - "SphinxKnight", - "teoli", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/escape": { - "modified": "2020-10-15T21:56:14.356Z", - "contributors": [ - "SphinxKnight", - "RozyP", - "IXTRUnai" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/eval": { - "modified": "2020-03-12T19:37:01.878Z", - "contributors": [ - "driera", - "sergio_p_d", - "_cuco_", - "ericmartinezr", - "SphinxKnight", - "teoli", - "Mgjbot", - "Talisker", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/isFinite": { - "modified": "2020-03-12T19:37:31.231Z", - "contributors": [ - "SphinxKnight", - "teoli", - "jarneygm", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/isNaN": { - "modified": "2020-10-15T21:17:00.242Z", - "contributors": [ - "jmmarco", - "juanarbol", - "SphinxKnight", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/null": { - "modified": "2020-03-12T19:42:06.401Z", - "contributors": [ - "mkiramu", - "ivanagui2", - "diegoazh", - "BubuAnabelas", - "hmorv", - "AugustoEsquen", - "AsLogd" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/parseFloat": { - "modified": "2020-07-04T20:00:21.182Z", - "contributors": [ - "pilichanampe", - "SphinxKnight", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/parseInt": { - "modified": "2020-03-12T19:37:31.195Z", - "contributors": [ - "mitsurugi", - "teoli", - "daiant", - "SphinxKnight", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/undefined": { - "modified": "2020-03-12T19:36:57.621Z", - "contributors": [ - "IsaacAaron", - "Undre4m", - "BubuAnabelas", - "SphinxKnight", - "teoli", - "ADP13", - "Talisker", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Objetos_globales/unescape": { - "modified": "2020-03-12T19:43:34.960Z", - "contributors": [ - "DracotMolver" - ] - }, - "Web/JavaScript/Referencia/Operadores": { - "modified": "2020-10-15T21:16:41.341Z", - "contributors": [ - "Nachec", - "BubuAnabelas", - "oagarcia", - "Alaon", - "SphinxKnight", - "Siro_Diaz", - "teoli", - "Mgjbot", - "Nathymig", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Operadores/Adición": { - "modified": "2020-10-15T22:31:13.303Z", - "contributors": [ - "lord-reptilia" - ] - }, - "Web/JavaScript/Referencia/Operadores/Aritméticos": { - "modified": "2020-10-15T21:17:29.666Z", - "contributors": [ - "lajaso", - "nelruk", - "enesimo", - "SphinxKnight", - "teoli", - "Mgjbot", - "Nathymig" - ] - }, - "Web/JavaScript/Referencia/Operadores/Asignacion": { - "modified": "2020-10-15T22:33:15.275Z", - "contributors": [ - "FranciscoImanolSuarez" - ] - }, - "Web/JavaScript/Referencia/Operadores/Assignment_Operators": { - "modified": "2020-07-23T18:11:35.190Z", - "contributors": [ - "n306r4ph", - "esreal12", - "BrodaNoel", - "maxbfmv55", - "maxbfmv" - ] - }, - "Web/JavaScript/Referencia/Operadores/Bitwise_Operators": { - "modified": "2020-03-12T19:42:13.818Z", - "contributors": [ - "Binariado", - "hugomosh", - "EduardoSebastian", - "jnreynoso", - "mizhac", - "lizzie136", - "josewhitetower", - "miparnisari", - "elenatorro", - "CarlosRuizAscacibar" - ] - }, - "Web/JavaScript/Referencia/Operadores/Comparacion": { - "modified": "2020-10-15T22:33:16.730Z", - "contributors": [ - "FranciscoImanolSuarez" - ] - }, - "Web/JavaScript/Referencia/Operadores/Comparison_Operators": { - "modified": "2020-10-15T21:37:54.340Z", - "contributors": [ - "FranciscoImanolSuarez", - "lajaso", - "mfuentesg" - ] - }, - "Web/JavaScript/Referencia/Operadores/Conditional_Operator": { - "modified": "2020-03-12T19:42:08.865Z", - "contributors": [ - "mauroflamig", - "osmar-vil", - "maedca", - "CesarBustios", - "eacp", - "cornezuelo", - "joeljose" - ] - }, - "Web/JavaScript/Referencia/Operadores/Decremento": { - "modified": "2020-11-17T13:27:35.616Z", - "contributors": [ - "FranciscoImanolSuarez" - ] - }, - "Web/JavaScript/Referencia/Operadores/Destructuring_assignment": { - "modified": "2020-10-15T21:38:20.062Z", - "contributors": [ - "Nachec", - "oscaretu", - "camsa", - "nstraub", - "FiliBits", - "SphinxKnight", - "emtsnz", - "moyadf", - "kdex", - "Anyulled", - "seleenne", - "rvazquezglez" - ] - }, - "Web/JavaScript/Referencia/Operadores/Division": { - "modified": "2020-10-15T22:33:13.828Z", - "contributors": [ - "FranciscoImanolSuarez" - ] - }, - "Web/JavaScript/Referencia/Operadores/Encadenamiento_opcional": { - "modified": "2020-10-15T22:30:07.517Z", - "contributors": [ - "glrodasz" - ] - }, - "Web/JavaScript/Referencia/Operadores/Grouping": { - "modified": "2020-03-12T19:41:24.847Z", - "contributors": [ - "oagarcia" - ] - }, - "Web/JavaScript/Referencia/Operadores/Miembros": { - "modified": "2020-03-12T19:37:28.144Z", - "contributors": [ - "fpoumian", - "MarkelCuesta", - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Operadores/Operadores_lógicos": { - "modified": "2020-03-12T19:42:52.811Z", - "contributors": [ - "albertor21", - "JuanMacias", - "lifescripter" - ] - }, - "Web/JavaScript/Referencia/Operadores/Operator_Precedence": { - "modified": "2020-03-12T19:39:15.282Z", - "contributors": [ - "lopezz", - "fscholz", - "teoli", - "aerotrink" - ] - }, - "Web/JavaScript/Referencia/Operadores/Pipeline_operator": { - "modified": "2020-10-15T22:24:00.271Z", - "contributors": [ - "nachofelpete" - ] - }, - "Web/JavaScript/Referencia/Operadores/Resto": { - "modified": "2020-12-04T18:18:23.327Z", - "contributors": [ - "lucasmmaidana" - ] - }, - "Web/JavaScript/Referencia/Operadores/Sintaxis_Spread": { - "modified": "2020-10-15T22:05:27.684Z", - "contributors": [ - "jeissonh", - "samm0023", - "jelduran", - "Aerz", - "duttyapps", - "alegnaaived" - ] - }, - "Web/JavaScript/Referencia/Operadores/Spread_operator": { - "modified": "2020-03-12T19:41:27.743Z", - "contributors": [ - "SphinxKnight", - "Scipion", - "oagarcia" - ] - }, - "Web/JavaScript/Referencia/Operadores/Strict_equality": { - "modified": "2020-10-15T22:31:14.496Z", - "contributors": [ - "lord-reptilia" - ] - }, - "Web/JavaScript/Referencia/Operadores/Sustracción": { - "modified": "2020-10-15T22:31:11.477Z", - "contributors": [ - "lord-reptilia" - ] - }, - "Web/JavaScript/Referencia/Operadores/async_function": { - "modified": "2020-10-15T22:26:51.970Z", - "contributors": [ - "IsraelFloresDGA" - ] - }, - "Web/JavaScript/Referencia/Operadores/await": { - "modified": "2020-10-15T21:58:10.309Z", - "contributors": [ - "esjuanma", - "jpinto7", - "JavierHspn", - "rcchristiane" - ] - }, - "Web/JavaScript/Referencia/Operadores/class": { - "modified": "2020-03-12T19:45:04.654Z", - "contributors": [ - "AlePerez92" - ] - }, - "Web/JavaScript/Referencia/Operadores/delete": { - "modified": "2020-03-12T19:40:27.821Z", - "contributors": [ - "abaracedo", - "elenatorro", - "oagarcia", - "rippe2hl" - ] - }, - "Web/JavaScript/Referencia/Operadores/function": { - "modified": "2020-03-12T19:37:57.703Z", - "contributors": [ - "germanf", - "SphinxKnight", - "teoli", - "jesanchez", - "artopal" - ] - }, - "Web/JavaScript/Referencia/Operadores/function*": { - "modified": "2020-10-15T22:04:00.800Z", - "contributors": [ - "daniel.duarte" - ] - }, - "Web/JavaScript/Referencia/Operadores/in": { - "modified": "2020-10-15T21:19:59.064Z", - "contributors": [ - "AlePerez92", - "MMarinero", - "SphinxKnight", - "teoli", - "carloshs92" - ] - }, - "Web/JavaScript/Referencia/Operadores/instanceof": { - "modified": "2020-03-12T19:37:27.128Z", - "contributors": [ - "KikeSan", - "oliverhr", - "SphinxKnight", - "olivercs", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Operadores/new": { - "modified": "2020-10-15T21:27:34.155Z", - "contributors": [ - "Nachec", - "fercreek", - "fel.gaete", - "edsonjmv", - "fscholz", - "SphinxKnight", - "teoli", - "jansanchez" - ] - }, - "Web/JavaScript/Referencia/Operadores/new.target": { - "modified": "2020-03-12T19:45:24.263Z", - "contributors": [ - "jorgecas" - ] - }, - "Web/JavaScript/Referencia/Operadores/operador_coma": { - "modified": "2020-03-12T19:43:05.807Z", - "contributors": [ - "aeroxmotion", - "eduardogm" - ] - }, - "Web/JavaScript/Referencia/Operadores/super": { - "modified": "2020-10-15T21:36:09.783Z", - "contributors": [ - "caepalomo", - "lajaso", - "SphinxKnight", - "oagarcia" - ] - }, - "Web/JavaScript/Referencia/Operadores/this": { - "modified": "2020-04-05T17:39:51.929Z", - "contributors": [ - "ridry", - "AugustoBarco", - "Litchstarken", - "xabitrigo", - "alejandrochung", - "garciadecastro", - "Miguel-Ramirez", - "FMauricioS", - "SphinxKnight", - "teoli", - "chebit", - "carloshs92" - ] - }, - "Web/JavaScript/Referencia/Operadores/typeof": { - "modified": "2020-03-12T19:37:27.888Z", - "contributors": [ - "dashaus", - "maurodibert", - "ggomez91", - "area73", - "carmelo12341", - "SphinxKnight", - "teoli", - "Siro_Diaz", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Operadores/void": { - "modified": "2020-03-12T19:37:37.188Z", - "contributors": [ - "JuanMaRuiz", - "mauroc8", - "dongerardor", - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Operadores/yield": { - "modified": "2020-10-15T21:59:31.243Z", - "contributors": [ - "Nachec", - "nicoan", - "Binariado", - "hamfree", - "juliandavidmr" - ] - }, - "Web/JavaScript/Referencia/Operadores/yield*": { - "modified": "2020-03-12T19:43:03.721Z", - "contributors": [ - "germanf" - ] - }, - "Web/JavaScript/Referencia/Palabras_Reservadas": { - "modified": "2019-03-23T23:46:34.387Z", - "contributors": [ - "gsalinase", - "Gabrielth2206", - "Heramalva", - "teoli", - "Sheppy", - "Nathymig" - ] - }, - "Web/JavaScript/Referencia/Sentencias": { - "modified": "2020-05-11T14:52:51.956Z", - "contributors": [ - "chrisdavidmills", - "Daniel_Martin", - "ffulgencio", - "BubuAnabelas", - "katrina.warsaw", - "SphinxKnight", - "teoli", - "Nathymig", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Sentencias/Empty": { - "modified": "2020-03-12T19:45:08.866Z", - "contributors": [ - "Undre4m" - ] - }, - "Web/JavaScript/Referencia/Sentencias/block": { - "modified": "2020-03-12T19:37:26.144Z", - "contributors": [ - "IsaacAaron", - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/break": { - "modified": "2020-03-12T19:37:25.893Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/class": { - "modified": "2020-03-12T19:43:15.247Z", - "contributors": [ - "AlePerez92", - "PauPeinado" - ] - }, - "Web/JavaScript/Referencia/Sentencias/const": { - "modified": "2020-05-18T16:35:39.912Z", - "contributors": [ - "jorgetoloza", - "Daniel_Martin", - "SphinxKnight", - "calbertts", - "IsaacAaron", - "MarkelCuesta", - "zucchinidev", - "teoli", - "Scipion" - ] - }, - "Web/JavaScript/Referencia/Sentencias/continue": { - "modified": "2020-03-12T19:37:24.424Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/debugger": { - "modified": "2020-03-12T19:43:07.073Z", - "contributors": [ - "VictorAbdon", - "ericpennachini" - ] - }, - "Web/JavaScript/Referencia/Sentencias/default": { - "modified": "2020-10-15T22:11:48.475Z", - "contributors": [ - "Davids-Devel" - ] - }, - "Web/JavaScript/Referencia/Sentencias/do...while": { - "modified": "2020-03-19T20:41:26.735Z", - "contributors": [ - "danielclavijo19380", - "AlePerez92", - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/export": { - "modified": "2020-10-15T21:13:05.178Z", - "contributors": [ - "AlePerez92", - "frank-orellana", - "fxisco", - "hmorv", - "guumo", - "Jdiaz", - "SphinxKnight", - "teoli", - "Scipion" - ] - }, - "Web/JavaScript/Referencia/Sentencias/for": { - "modified": "2020-03-12T19:37:24.852Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/for-await...of": { - "modified": "2020-10-15T22:22:58.735Z", - "contributors": [ - "daniel.duarte" - ] - }, - "Web/JavaScript/Referencia/Sentencias/for...in": { - "modified": "2020-10-15T21:14:45.435Z", - "contributors": [ - "Nachec", - "VichoReyes", - "antonygiomarx", - "tenthlive", - "enmanuelduran", - "manatico4", - "pardo-bsso", - "jsinner", - "Carlos-T", - "mariosotoxoom", - "SphinxKnight", - "teoli", - "angeldiaz", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/for...of": { - "modified": "2020-03-12T19:43:09.602Z", - "contributors": [ - "camsa", - "chabisoriano", - "petermota", - "Bumxu", - "jdazacon", - "Angarsk8" - ] - }, - "Web/JavaScript/Referencia/Sentencias/funcion_asincrona": { - "modified": "2020-10-15T21:53:45.353Z", - "contributors": [ - "docxml", - "fitojb", - "mnax001", - "lexnapoles", - "JooseNavarro", - "feserafim" - ] - }, - "Web/JavaScript/Referencia/Sentencias/function": { - "modified": "2020-03-12T19:37:28.203Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/function*": { - "modified": "2020-03-12T19:41:28.405Z", - "contributors": [ - "SphinxKnight", - "kdex", - "cnexans", - "mlealvillarreal", - "TheBronx", - "mrtuto2012", - "rippe2hl", - "germanfr" - ] - }, - "Web/JavaScript/Referencia/Sentencias/if...else": { - "modified": "2020-03-12T19:35:35.125Z", - "contributors": [ - "IsaacAaron", - "SphinxKnight", - "teoli", - "Pablo_Cabrera", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Sentencias/import": { - "modified": "2020-10-15T21:37:35.456Z", - "contributors": [ - "AlePerez92", - "frank-orellana", - "feserafim", - "guumo", - "javiernunez", - "Siro_Diaz", - "jepumares" - ] - }, - "Web/JavaScript/Referencia/Sentencias/import.meta": { - "modified": "2020-10-15T22:29:50.934Z", - "contributors": [ - "cinthylli" - ] - }, - "Web/JavaScript/Referencia/Sentencias/label": { - "modified": "2020-03-12T19:37:26.348Z", - "contributors": [ - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/let": { - "modified": "2020-12-07T12:54:41.333Z", - "contributors": [ - "FacuBustamaante", - "Nachec", - "jomoji", - "SphinxKnight", - "IsaacAaron", - "Braulyw8", - "MarkelCuesta", - "Th3Cod3", - "kdex", - "devlcp", - "fjcapdevila", - "mishelashala", - "madroneropaulo", - "nicobot", - "jtanori" - ] - }, - "Web/JavaScript/Referencia/Sentencias/return": { - "modified": "2020-03-12T19:37:28.480Z", - "contributors": [ - "devconcept", - "rrodriguez", - "SphinxKnight", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/switch": { - "modified": "2020-06-26T05:28:30.446Z", - "contributors": [ - "EliottoYT", - "RubiVG", - "nahif", - "jesusvillalta", - "SSantiago90", - "Herkom", - "renetejada7", - "rafaelgus", - "garciadecastro", - "MarioAr", - "Cubo", - "esmarti", - "christpher_c" - ] - }, - "Web/JavaScript/Referencia/Sentencias/throw": { - "modified": "2020-03-12T19:37:27.469Z", - "contributors": [ - "imNicoSuarez", - "SphinxKnight", - "teoli", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/try...catch": { - "modified": "2020-05-28T10:16:13.325Z", - "contributors": [ - "dkmstr", - "BubuAnabelas", - "henryvanner", - "AlePerez92", - "ManuelRubio", - "JooseNavarro", - "juanrapoport", - "habax", - "SphinxKnight", - "teoli", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/var": { - "modified": "2020-03-12T19:36:22.778Z", - "contributors": [ - "IsaacAaron", - "carlo.romero1991", - "SphinxKnight", - "teoli", - "Scipion", - "Mgjbot", - "Sheppy" - ] - }, - "Web/JavaScript/Referencia/Sentencias/while": { - "modified": "2020-03-12T19:35:40.292Z", - "contributors": [ - "MaurooRen", - "SphinxKnight", - "teoli", - "Pablo_Cabrera", - "Mgjbot", - "Talisker" - ] - }, - "Web/JavaScript/Referencia/Sentencias/with": { - "modified": "2020-03-12T19:42:08.065Z", - "contributors": [ - "MarkelCuesta", - "lokcito" - ] - }, - "Web/JavaScript/Referencia/template_strings": { - "modified": "2020-10-14T18:58:58.164Z", - "contributors": [ - "Magdiel", - "sanchezalvarezjp", - "JuanWTF", - "IsaacLf", - "theelmix", - "SphinxKnight", - "MarkelCuesta", - "kdex", - "mishelashala", - "orasio" - ] - }, - "Web/JavaScript/Shells": { - "modified": "2020-03-12T19:44:40.392Z", - "contributors": [ - "davidenriq11", - "mamptecnocrata" - ] - }, - "Web/JavaScript/Una_re-introducción_a_JavaScript": { - "modified": "2020-09-01T08:31:36.135Z", - "contributors": [ - "Nachec", - "pmcarballo", - "VictorSan45", - "DaniNz", - "jlopezfdez", - "mariodev12", - "javier_junin", - "GdoSan", - "unaisainz", - "oleurud", - "JavierHspn", - "jlmurgas", - "rivacubano", - "aaguilera", - "StripTM", - "bicentenario", - "NatiiDC", - "NicolasMendoza", - "LeoHirsch", - "lomejordejr", - "rogeliomtx", - "Jarkaos" - ] - }, - "Web/JavaScript/Vectores_tipados": { - "modified": "2020-10-15T21:37:33.978Z", - "contributors": [ - "Nachec", - "LeoE" - ] - }, - "Web/JavaScript/enumeracion_y_propietario_de_propiedades": { - "modified": "2020-08-30T03:56:15.697Z", - "contributors": [ - "Nachec", - "teoli", - "LeoHirsch" - ] - }, - "Web/Manifest": { - "modified": "2020-07-18T01:40:57.131Z", - "contributors": [ - "angelmlucero", - "ardillan", - "Zellius", - "Pablo_Bangueses", - "luisabarca", - "malonson", - "AlePerez92" - ] - }, - "Web/MathML": { - "modified": "2020-10-15T21:24:26.572Z", - "contributors": [ - "Undigon", - "teoli", - "fred.wang", - "ChaitanyaGSNR" - ] - }, - "Web/MathML/Attribute": { - "modified": "2019-03-23T23:26:57.621Z", - "contributors": [ - "LuifeR", - "ccarruitero", - "maedca" - ] - }, - "Web/MathML/Authoring": { - "modified": "2019-03-23T23:27:02.180Z", - "contributors": [ - "rafaqtro", - "fred.wang", - "voylinux", - "robertoasq", - "maedca" - ] - }, - "Web/MathML/Elemento": { - "modified": "2019-03-23T23:37:26.121Z", - "contributors": [ - "teoli", - "emejotados" - ] - }, - "Web/MathML/Elemento/math": { - "modified": "2020-10-15T22:06:20.810Z", - "contributors": [ - "Undigon" - ] - }, - "Web/MathML/Examples": { - "modified": "2019-03-23T23:25:26.042Z", - "contributors": [ - "nielsdg" - ] - }, - "Web/MathML/Examples/MathML_Pythagorean_Theorem": { - "modified": "2019-03-23T23:25:28.102Z", - "contributors": [ - "osvaldobaeza" - ] - }, - "Web/Media": { - "modified": "2020-07-15T09:47:41.711Z", - "contributors": [ - "Sheppy" - ] - }, - "Web/Media/Formats": { - "modified": "2020-07-15T09:47:42.018Z", - "contributors": [ - "Sheppy" - ] - }, - "Web/Media/Formats/Containers": { - "modified": "2020-07-15T09:47:51.166Z", - "contributors": [ - "hugojavierduran9" - ] - }, - "Web/Performance": { - "modified": "2019-04-04T19:28:41.844Z", - "contributors": [ - "arekucr", - "chrisdavidmills" - ] - }, - "Web/Performance/Fundamentals": { - "modified": "2019-05-05T06:54:02.458Z", - "contributors": [ - "c-torres" - ] - }, - "Web/Performance/How_browsers_work": { - "modified": "2020-09-10T10:11:23.592Z", - "contributors": [ - "sancarbar" - ] - }, - "Web/Performance/mejorando_rendimienot_inicial": { - "modified": "2019-04-04T17:42:18.542Z", - "contributors": [ - "c-torres" - ] - }, - "Web/Progressive_web_apps": { - "modified": "2020-09-20T04:18:55.064Z", - "contributors": [ - "Nachec", - "Enesimus", - "chrisdavidmills", - "hypnotic-frog", - "javichito" - ] - }, - "Web/Progressive_web_apps/App_structure": { - "modified": "2020-09-20T03:39:21.273Z", - "contributors": [ - "Nachec", - "NicolasKuhn" - ] - }, - "Web/Progressive_web_apps/Developer_guide": { - "modified": "2020-09-20T03:25:40.381Z", - "contributors": [ - "Deng_C1" - ] - }, - "Web/Progressive_web_apps/Developer_guide/Instalar": { - "modified": "2020-09-20T03:25:41.762Z", - "contributors": [ - "Nachec" - ] - }, - "Web/Progressive_web_apps/Installable_PWAs": { - "modified": "2020-09-20T03:54:28.154Z", - "contributors": [ - "Nachec" - ] - }, - "Web/Progressive_web_apps/Introduction": { - "modified": "2020-09-20T03:34:06.424Z", - "contributors": [ - "Nachec", - "gastono.442", - "tw1ttt3r", - "santi324", - "chrisdavidmills" - ] - }, - "Web/Progressive_web_apps/Loading": { - "modified": "2020-09-20T04:08:37.661Z", - "contributors": [ - "Nachec" - ] - }, - "Web/Progressive_web_apps/Offline_Service_workers": { - "modified": "2020-09-20T03:45:55.671Z", - "contributors": [ - "Nachec" - ] - }, - "Web/Progressive_web_apps/Re-engageable_Notifications_Push": { - "modified": "2020-09-20T04:04:04.639Z", - "contributors": [ - "Nachec" - ] - }, - "Web/Progressive_web_apps/Ventajas": { - "modified": "2019-11-03T14:52:14.998Z", - "contributors": [ - "totopizzahn" - ] - }, - "Web/Reference": { - "modified": "2019-03-23T23:21:27.898Z", - "contributors": [ - "raecillacastellana", - "vltamara", - "asero82", - "atlas7jean", - "Nickolay" - ] - }, - "Web/Reference/API": { - "modified": "2019-03-23T23:20:25.941Z", - "contributors": [ - "AlePerez92", - "jhia", - "welm", - "vggallego", - "DeiberChacon", - "angmauricio", - "vitoco", - "CristianMar25", - "gesifred", - "cmeraz", - "davy.martinez" - ] - }, - "Web/SVG": { - "modified": "2019-03-23T23:44:20.243Z", - "contributors": [ - "Undigon", - "Noradrex", - "teoli", - "Verruckt", - "Jorolo", - "Mgjbot", - "Josebagar" - ] - }, - "Web/SVG/Attribute": { - "modified": "2019-08-04T03:46:23.452Z", - "contributors": [ - "jcortesa", - "chrisdavidmills" - ] - }, - "Web/SVG/Attribute/stop-color": { - "modified": "2020-10-15T22:06:34.292Z", - "contributors": [ - "andcal" - ] - }, - "Web/SVG/Attribute/transform": { - "modified": "2019-03-23T22:07:32.328Z", - "contributors": [ - "dimuziop" - ] - }, - "Web/SVG/Element": { - "modified": "2019-03-19T13:42:20.553Z", - "contributors": [ - "borja", - "jmanquez", - "kscarfone" - ] - }, - "Web/SVG/Element/a": { - "modified": "2020-10-15T22:16:15.979Z", - "contributors": [ - "borja" - ] - }, - "Web/SVG/Element/animate": { - "modified": "2020-10-15T22:09:39.514Z", - "contributors": [ - "evaferreira" - ] - }, - "Web/SVG/Element/circle": { - "modified": "2019-03-23T22:57:12.727Z", - "contributors": [ - "wbamberg", - "Sebastianz", - "humbertaco" - ] - }, - "Web/SVG/Element/foreignObject": { - "modified": "2019-03-23T23:05:21.297Z", - "contributors": [ - "Sebastianz", - "THernandez03" - ] - }, - "Web/SVG/Element/g": { - "modified": "2019-03-23T22:54:18.875Z", - "contributors": [ - "Sebastianz", - "teoli", - "FrankzWolf" - ] - }, - "Web/SVG/Element/glifo": { - "modified": "2019-03-23T22:53:24.929Z", - "contributors": [ - "Sebastianz", - "saeioul" - ] - }, - "Web/SVG/Element/rect": { - "modified": "2019-03-23T23:02:06.920Z", - "contributors": [ - "wbamberg", - "roadev", - "Sebastianz", - "jdgarrido" - ] - }, - "Web/SVG/Element/style": { - "modified": "2019-03-23T22:54:27.955Z", - "contributors": [ - "Sebastianz", - "teoli", - "rippe2hl" - ] - }, - "Web/SVG/Element/svg": { - "modified": "2020-11-04T10:23:00.659Z", - "contributors": [ - "hardy.rafael17", - "Mcch", - "diegovinie", - "BubuAnabelas", - "mbenitez01" - ] - }, - "Web/SVG/Element/text": { - "modified": "2020-05-14T06:42:53.448Z", - "contributors": [ - "danielhiguerasgoold", - "Sebastianz", - "emorc" - ] - }, - "Web/SVG/Element/use": { - "modified": "2019-03-23T22:58:09.476Z", - "contributors": [ - "andysierra", - "Sebastianz", - "jorge_castro" - ] - }, - "Web/SVG/Index": { - "modified": "2019-01-16T22:36:49.773Z", - "contributors": [ - "jwhitlock", - "ComplementosMozilla" - ] - }, - "Web/SVG/SVG_en_Firefox_1.5": { - "modified": "2019-03-23T23:42:07.791Z", - "contributors": [ - "teoli", - "Mgjbot", - "Jorolo", - "Arcnor" - ] - }, - "Web/SVG/Tutorial": { - "modified": "2020-01-15T20:06:40.249Z", - "contributors": [ - "dago.d.havana", - "jpriet0", - "d-go", - "Npmada", - "teoli", - "Jeremie" - ] - }, - "Web/SVG/Tutorial/Getting_Started": { - "modified": "2019-03-23T23:19:26.348Z", - "contributors": [ - "kevinricardojs", - "teoli", - "Alberpat" - ] - }, - "Web/SVG/Tutorial/Introducción": { - "modified": "2019-03-18T21:32:37.330Z", - "contributors": [ - "Undigon", - "d-go" - ] - }, - "Web/SVG/Tutorial/SVG_In_HTML_Introduction": { - "modified": "2019-03-23T23:21:05.945Z", - "contributors": [ - "chrisdavidmills", - "matrimonio", - "verma21", - "marelin" - ] - }, - "Web/SVG/Tutorial/Tools_for_SVG": { - "modified": "2019-03-20T13:46:46.393Z", - "contributors": [ - "James-Yaakov" - ] - }, - "Web/Security": { - "modified": "2019-09-10T16:32:01.356Z", - "contributors": [ - "SphinxKnight", - "npcsayfail", - "lejovaar7", - "fgcalderon", - "pablodonoso", - "marumari" - ] - }, - "Web/Security/CSP": { - "modified": "2019-03-23T22:48:09.013Z", - "contributors": [ - "Anteojudo", - "Nydv" - ] - }, - "Web/Security/CSP/CSP_policy_directives": { - "modified": "2019-03-23T22:46:40.903Z", - "contributors": [ - "rafamagno", - "maedca" - ] - }, - "Web/Security/CSP/Introducing_Content_Security_Policy": { - "modified": "2019-01-16T21:25:25.758Z", - "contributors": [ - "Anteojudo", - "Nydv" - ] - }, - "Web/Security/Same-origin_politica": { - "modified": "2019-10-30T15:38:34.673Z", - "contributors": [ - "robertsallent", - "Abelhg" - ] - }, - "Web/Security/Securing_your_site": { - "modified": "2019-03-23T22:04:13.465Z", - "contributors": [ - "fgcalderon", - "mbm" - ] - }, - "Web/Security/Securing_your_site/desactivar_autocompletado_formulario": { - "modified": "2019-03-23T22:04:06.546Z", - "contributors": [ - "samus128", - "Hoosep" - ] - }, - "Web/Tutoriales": { - "modified": "2020-11-30T04:19:10.869Z", - "contributors": [ - "blanchart", - "mastertrooper", - "Enesimus", - "ewan-m", - "Yes197", - "VlixesItaca", - "pucherico", - "CristopherAE", - "fperaltaN", - "isabelcarrod", - "Sheppy", - "iKenshu", - "JuanC_01", - "ubermensch79", - "cynthia", - "rubencidlara", - "fmagrosoto", - "CarlosQuijano", - "diegogaysaez" - ] - }, - "Web/Web_Components": { - "modified": "2020-05-21T13:06:07.299Z", - "contributors": [ - "aguilerajl", - "Ktoxcon", - "IsraelFloresDGA", - "mboo", - "Rodmore", - "maybe" - ] - }, - "Web/Web_Components/Custom_Elements": { - "modified": "2019-03-23T22:21:51.809Z", - "contributors": [ - "cawilff", - "AlePerez92", - "fipadron", - "V.Morantes" - ] - }, - "Web/Web_Components/Using_custom_elements": { - "modified": "2020-06-28T18:39:06.239Z", - "contributors": [ - "lupomontero", - "aguilerajl" - ] - }, - "Web/Web_Components/Using_shadow_DOM": { - "modified": "2020-10-24T17:36:39.409Z", - "contributors": [ - "jephsanchez", - "Charlemagnes", - "quintero_japon", - "DavidGalvis" - ] - }, - "Web/Web_Components/Using_templates_and_slots": { - "modified": "2020-03-26T15:38:45.869Z", - "contributors": [ - "olalinv", - "quintero_japon", - "BrunoUY", - "ulisestrujillo" - ] - }, - "Web/XML": { - "modified": "2019-03-18T21:18:03.528Z", - "contributors": [ - "ExE-Boss" - ] - }, - "Web/XML/Introducción_a_XML": { - "modified": "2019-07-25T12:38:17.842Z", - "contributors": [ - "jugonzalez40", - "ExE-Boss", - "npcsayfail", - "israel-munoz", - "Mgjbot", - "Superruzafa", - "Fedora-core", - "Jorolo" - ] - }, - "Web/XPath": { - "modified": "2019-01-16T14:32:30.886Z", - "contributors": [ - "ExE-Boss", - "fscholz", - "Mgjbot", - "Jorolo" - ] - }, - "Web/XPath/Ejes": { - "modified": "2019-03-18T20:59:19.791Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Mgjbot", - "Jorolo", - "Cmayo" - ] - }, - "Web/XPath/Ejes/ancestor": { - "modified": "2019-01-16T16:11:09.049Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/ancestor-or-self": { - "modified": "2019-01-16T16:11:00.606Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/attribute": { - "modified": "2019-01-16T16:11:03.106Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/child": { - "modified": "2019-01-16T16:11:02.142Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/descendant": { - "modified": "2019-01-16T16:11:00.301Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/descendant-or-self": { - "modified": "2019-01-16T16:11:00.088Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/following": { - "modified": "2019-01-16T16:10:55.079Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/following-sibling": { - "modified": "2019-01-16T16:11:02.465Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/namespace": { - "modified": "2019-01-16T16:10:55.086Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/parent": { - "modified": "2019-01-16T16:10:56.130Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/preceding": { - "modified": "2019-01-16T16:11:08.778Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Ejes/preceding-sibling": { - "modified": "2019-01-16T16:10:57.298Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Funciones": { - "modified": "2019-03-23T22:09:03.742Z", - "contributors": [ - "ExE-Boss", - "Zoditu" - ] - }, - "Web/XPath/Funciones/contains": { - "modified": "2019-01-16T15:50:22.864Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Funciones/substring": { - "modified": "2019-01-16T15:50:01.578Z", - "contributors": [ - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XPath/Funciones/true": { - "modified": "2019-03-18T20:59:19.925Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "Mgjbot", - "Cmayo" - ] - }, - "Web/XSLT": { - "modified": "2019-03-23T23:44:23.657Z", - "contributors": [ - "chrisdavidmills", - "Verruckt", - "Mgjbot", - "Jorolo", - "Nukeador", - "Piltrafeta" - ] - }, - "Web/XSLT/Element": { - "modified": "2019-03-18T20:59:16.316Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "chrisdavidmills", - "fscholz", - "Jorolo", - "ErickCastellanos" - ] - }, - "Web/XSLT/Element/element": { - "modified": "2019-03-18T20:59:21.788Z", - "contributors": [ - "SphinxKnight", - "ExE-Boss", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/Transformando_XML_con_XSLT": { - "modified": "2019-01-16T16:11:59.562Z", - "contributors": [ - "chrisdavidmills", - "Superruzafa", - "Mgjbot", - "Jorolo", - "Ivanfrade", - "Piltrafeta", - "Nukeador" - ] - }, - "Web/XSLT/apply-imports": { - "modified": "2019-03-18T20:59:15.544Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/apply-templates": { - "modified": "2019-03-18T20:59:18.352Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/attribute": { - "modified": "2019-03-18T20:59:20.857Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/attribute-set": { - "modified": "2019-03-18T20:59:20.997Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/call-template": { - "modified": "2019-03-18T20:59:16.448Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/choose": { - "modified": "2019-03-18T20:59:21.136Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos", - "Cmayo" - ] - }, - "Web/XSLT/comment": { - "modified": "2019-03-18T20:59:15.680Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos", - "Cmayo" - ] - }, - "Web/XSLT/copy": { - "modified": "2019-03-18T20:59:16.879Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/copy-of": { - "modified": "2019-03-18T20:59:18.212Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/decimal-format": { - "modified": "2019-03-18T20:59:17.054Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/fallback": { - "modified": "2019-03-18T20:59:15.971Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/for-each": { - "modified": "2019-03-18T20:59:16.114Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/if": { - "modified": "2019-03-18T20:59:17.200Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Jrbellido", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/import": { - "modified": "2019-03-18T20:59:15.818Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/include": { - "modified": "2019-03-18T20:59:17.940Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/key": { - "modified": "2019-03-18T20:59:21.931Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/message": { - "modified": "2019-03-18T20:59:16.585Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos", - "Cmayo" - ] - }, - "Web/XSLT/namespace-alias": { - "modified": "2019-03-18T20:59:19.621Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/number": { - "modified": "2019-03-18T20:59:21.341Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos" - ] - }, - "Web/XSLT/otherwise": { - "modified": "2019-03-18T20:59:16.726Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos", - "Cmayo" - ] - }, - "Web/XSLT/when": { - "modified": "2019-03-18T20:59:18.078Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos", - "Cmayo" - ] - }, - "Web/XSLT/with-param": { - "modified": "2019-03-18T20:59:17.348Z", - "contributors": [ - "SphinxKnight", - "chrisdavidmills", - "Mgjbot", - "ErickCastellanos", - "Cmayo" - ] - }, - "WebAPI": { - "modified": "2019-03-23T23:32:09.157Z", - "contributors": [ - "wbamberg", - "fscholz", - "ccarruitero", - "maedca", - "ethertank", - "Jeremie" - ] - }, - "WebAPI/Estado_de_Bateria": { - "modified": "2019-03-23T23:25:28.703Z", - "contributors": [ - "sinfallas" - ] - }, - "WebAPI/Pointer_Lock": { - "modified": "2019-03-23T23:28:21.712Z", - "contributors": [ - "fscholz", - "arquigames", - "joredjs" - ] - }, - "WebAPI/Using_geolocation": { - "modified": "2019-05-04T15:09:02.013Z", - "contributors": [ - "mauroarcet", - "claudionebbia", - "pixelmin", - "guissellavillarreal", - "untilbit", - "BRIGIDAMATTERA", - "cizquierdof", - "rubencidlara", - "lfentanes", - "diegogarcia" - ] - }, - "WebAssembly": { - "modified": "2020-10-15T22:25:36.765Z", - "contributors": [ - "jonathan.reyes33" - ] - }, - "WebAssembly/Concepts": { - "modified": "2020-12-06T14:14:45.486Z", - "contributors": [ - "Sergio_Gonzalez_Collado", - "mastertrooper" - ] - }, - "WebAssembly/Loading_and_running": { - "modified": "2020-09-15T19:19:35.117Z", - "contributors": [ - "mastertrooper" - ] - }, - "WebRTC": { - "modified": "2019-03-23T23:26:58.291Z", - "contributors": [ - "sebasmagri" - ] - }, - "WebRTC/Introduction": { - "modified": "2019-03-23T23:26:58.387Z", - "contributors": [ - "maedca", - "voylinux" - ] - }, - "WebRTC/MediaStream_API": { - "modified": "2019-03-23T23:26:56.897Z", - "contributors": [ - "palfrei", - "maedca" - ] - }, - "WebRTC/Peer-to-peer_communications_with_WebRTC": { - "modified": "2019-03-23T23:27:02.999Z", - "contributors": [ - "pablocubico", - "maedca" - ] - }, - "WebRTC/Taking_webcam_photos": { - "modified": "2019-03-23T23:26:57.758Z", - "contributors": [ - "robertoasq", - "maedca" - ] - }, - "WebSockets": { - "modified": "2019-01-16T13:56:47.847Z", - "contributors": [ - "inma_610" - ] - }, - "Web_Audio_API": { - "modified": "2019-03-23T23:31:19.634Z", - "contributors": [ - "estebanborai", - "AngelFQC", - "Pau_Ilargia", - "maedca" - ] - }, - "Web_Development/Mobile": { - "modified": "2019-03-23T23:32:51.331Z", - "contributors": [ - "wbamberg" - ] - }, - "Web_Development/Mobile/Diseño_responsivo": { - "modified": "2019-03-23T23:32:50.922Z", - "contributors": [ - "fitojb", - "pacommozilla", - "wfranck", - "rafael_mora", - "htrellez" - ] - }, - "XHTML": { - "modified": "2019-03-23T23:46:04.272Z", - "contributors": [ - "Mgjbot", - "Jorolo", - "Nukeador" - ] - }, - "XPInstall_API_Reference": { - "modified": "2019-01-16T15:37:54.457Z", - "contributors": [ - "Eddomita" - ] - }, - "Zoom_a_página_completa": { - "modified": "2019-03-23T23:50:26.114Z", - "contributors": [ - "wbamberg", - "Nukeador", - "Mariano", - "Mgjbot" - ] - }, - "nsDirectoryService": { - "modified": "2019-03-23T23:40:31.943Z", - "contributors": [ - "teoli", - "Breaking Pitt" - ] - } -} \ No newline at end of file diff --git a/files/es/administrador_de_perfiles/index.html b/files/es/administrador_de_perfiles/index.html deleted file mode 100644 index ff800899ce..0000000000 --- a/files/es/administrador_de_perfiles/index.html +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Administrador de perfiles -slug: Administrador_de_perfiles -tags: - - perfiles -translation_of: Mozilla/Profile_Manager ---- -

Firefox y otras aplicaciones XULRunner guardan la configuración y los datos de los usuarios en carpetas especiales llamadas perfiles. Firefox proporciona un applet integrado para la gestión de estos perfiles, pero con el tiempo va a desaparecer (ver bug 214675), por lo que se ha creado una nueva aplicación de Administrador de perfiles independiente que funciona con cualquier aplicación XULRunner y que tiene muchas características que no se encuentran en la versión integrada de Firefox versión.

-

Descargar

-

Binarios

-


Puedes descargar el binario del  Administrador de perfiles desde ftp://ftp.mozilla.org/pub/mozilla.org/utilities/profilemanager/1.0/. No hay instalador, sólo tienes que  extraer los archivos desde el archivo.

Requisitos del sistema:

- -

El código fuente

-

También puedes descargar el código fuente:

hg clone http://hg.mozilla.org/automation/profilemanager/

Las Instrucciones para la compilación pueden encontrarse en BUILD.txt.

-

Informar sobre fallos

-

Los errores sobre el Administrador de perfiles deberán cursarse en Bugzilla, en Testing - ProfileManager.

-


Iniciar el Administrador de perfiles

-

Para iniciar el Administrador de perfiles, simplemente lanza profilemanager.exe (en Windows) o profilemanager-bin (en Linux y Mac). De forma predeterminada, el Administrador de perfiles gestionará los perfiles de Firefox, pero también se puede utilizar para trabajar con perfiles de otras aplicaciones de xulrunner, como Thunderbird o SeaMonkey. Para utilizar el Administrador de perfiles con una aplicación distinta a Firefox, tienes que lanzarla utilizando el nombre de la aplicación como un argumento, por ejemplo:

bin profilemanager-seamonkey

-

 

-

Perfiles y versiones de las aplicaciones

-

El Administrador de perfiles gestiona dos listas diferentes: una de los perfiles de usuario y la otra de las versiones de aplicaciones que pueden ser utilizadas con los perfiles. De forma predeterminada, esto significa que sigue una lista de aplicaciones de Firefox que están instalados en tu sistema y ​​una lista de perfiles para el uso de Firefox.

Un perfil individual puede vincularse a una instalación específica de Firefox, de modo que la versión de Firefox se iniciará cuando ese perfil se haya seleccionado. Por ejemplo, Perfil A podría estar vinculado con una copia de Firefox 3.6.10, mientras que Perfil B podría estar vinculado con una copia de Firefox 3.5.3.

Cuando se inicia, el Administrador de perfiles se verá en algunas ubicaciones predeterminadas para las versiones instaladas de Firefox (u otra aplicación con la que estés utilizando el Administrador de perfiles). Además, puedes agregar manualmente las versiones de Firefox haciendo clic en el botón "Administrar versiones de Firefox ..." :

-



 

Cada versión de Firefox en la lista tiene las siguientes propiedades: la ruta, la versión y predeterminada. La propiedad predeterminada indica que esta versión de Firefox se puede utilizar con perfiles que no tienen una versión de la aplicación específica asociada con ellos.

-

Creación de un perfil

-


Para crear un nuevo perfil, haz clic en el botón Nuevo de la barra de herramientas del Administrador de perfiles de. Aparecerá un diálogo que te permite especificar el nombre del perfil y, opcionalmente, la ruta del perfil, y la versión de Firefox (u otra aplicación) que se usará con este perfil:

-

-

 

-

Lanzar Firefox con un perfil

-


Para lanzar Firefox con un perfil específico, selecciona el perfil en la ventana principal y pulsa el botón "Iniciar Firefox": Firefox se iniciará con ese perfil y se cerrará el Administrador de perfiles. La versión de Firefox que se lanzará se indica en el menú desplegable de la "versión de Firefox" situado en el cuadro Opciones de lanzamiento:

-



Hay varias opciones de lanzamiento adicionales disponibles para Firefox que permiten lanzar el navegador con varios argumentos de línea de comandos. Ver
opciones de línea de comandos para obtener una descripción de los mismos.

- -
Opción de lanzamiento Argumento de línea de comandos
Ejecutar Firefox en modo desconexión

-offline

 

Ejecutar Firefox  en modo seguro -safe-mode
Iniciar Firefox con una consola -console
Iniciar nueva instancia -no-remote
-


Nota: no es posible iniciar una segunda instancia de Firefox sin pasarle el argumento de línea de comandos -no-remote. Por esta razón, si se intenta lanzar Firefox usando el Administrador de perfiles y detecta que hay otra instancia de Firefox que ya se está ejecutando, se agregará automáticamente el argumento -no-remote, independientemente de si marcaste esta opción de lanzamiento.

-

Perfiles bloqueados

-

Algunos perfiles pueden mostrarse como bloqueados en la ventana principal. Estos perfiles están siendo utilizados por una instancia de Firefox. Si intentas realizar cualquier operación en un perfil bloqueado, recibirás una advertencia. Y si decides continuar a pesar de la advertencia, pueden producirse errores o dañar un perfil.

Es muy recomendable evitar las operaciones en los perfiles bloqueados. Si necesitas hacer algo con un perfil bloqueado, cierra la instancia de Firefox que está utilizando el primer perfil.

-

 

-

Realizar copias de seguridad y restaurar perfiles

-

El Administrador de perfiles ofrece dos mecanismos diferentes para realizar copias de seguridad y restauración de perfiles.

-

Carpeta de la copia de seguridad

-

El Administrador de perfiles tiene una carpeta de copia de seguridad local donde se pueden gestionar copias de seguridad del perfil. Esta es la forma más sencilla de hacer copias de seguridad y restauración de perfiles.

Para realizar copias de seguridad de un perfil: selecciona el perfil del que deseas hacer copia de seguridad y elige la opción "copia de seguridad"->"carpeta de copia de seguridad" en el menú de Copia de seguridad e la barra de herramientas. Se creará una copia de seguridad del perfil que aparecerá en la columna de copias de seguridad en la pantalla principal:

-

-


Para restaurar un perfil: selecciona la copia de seguridad en la pantalla principal, abre el menú contextual y elige la opción "restaurar". Cuando se restaura un perfil, la copia de seguridad se mantiene, por lo que se puede restaurar desde la misma copia de seguridad en una fecha posterior.

Para eliminar una copia de seguridad: selecciona la copia de seguridad en la pantalla principal, abre el menú contextual y elige la opción "borrar".

-


Perfil de archivos

-

El Administrador de perfiles también puede realizar copias de seguridad y restaurar desde archivos zip. El Administrador de perfiles no hace un seguimiento de estas copias de seguridad en la interfaz de usuario, pero la utilización de archivos de perfil es una manera fácil de mover los perfiles entre diferentes equipos.

Para realizar copias de seguridad de un perfil a un archivo: selecciona el perfil del que deseas hacer copia de seguridad y elige la opción "copia de seguridad->archivo" desde el menú Copia de seguridad de la barra de herramientas. Se te pedirá un nombre y una ubicación para el archivo.

Para crear un perfil de un archivo de perfil: Selecciona "restaurar-> archivo" desde el menú Copia de seguridad de la barra de herramientas. Se te pedirá la ubicación del archivo y luego el nombre del perfil que deseas crear desde el archivo.

-

Otras operaciones

-

Al hacer clic en el menú contextual de alguno de los perfiles de la lista de perfiles aparecerá un menú emergente con los siguientes comandos:

- -


Mejoras futuras

- -

{{ languages( { "en" : "en/Profile_Manager" } ) }}

diff --git a/files/es/almacenamiento/index.html b/files/es/almacenamiento/index.html deleted file mode 100644 index fc56ce3e72..0000000000 --- a/files/es/almacenamiento/index.html +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Almacenamiento -slug: Almacenamiento -tags: - - Toolkit API - - para_revisar -translation_of: Mozilla/Tech/XPCOM/Storage ---- -

 

-

Almacenamiento en Firefox 2 es un API de base de datos y una forma de respaldo en sqlite. Es un recurso sólo disponible para peticiones seguras, lo que significa su uso exclusivo para código chrome y extensiones, no así para páginas web. Actualmente está "descongelada", lo que significa que la API está sujeta a cambiar en cualquier momento. Es probable que la API sufra algunas modificaciones entre la versión Alfa 2 y la versión final de Firefox 2, así como entre Firefox 2 y Firefox 3.

-

Aunque a veces se confunde el Almacenamiento con el WHATWG DOM #scs-del-lado-del-cliente (una característica de Firefox 2 que permite el almacenamiento persistente de datos) la API Almacenamiento, está reservada sólo para extensiones de autoría y componentes de Firefox.

-

El presente documento abarca la API mozStorage y algunas peculiaridades de sqlite. No cubre SQL o el sqlite "regular". Para esos casos usted debe consultar sus manuales de SQL. Es recomendable que revise también su documentación de sqlite y especialmente el lenguaje de consultas de sqlite. Para acceder a la ayuda de la API mozStorage, debe consultar en mozilla.dev.apps.firefox o al servicio de informaciones en news.mozilla.org. En caso de querer reportar errores, use el Bugzilla (Producto: "Herramientas", Componente: "Almacenamiento").

-

Revise Almacenamiento:Funcionamiento para indagar sobre el buen funcionamiento de la conexión a su base de datos.

-

Comenzando

-

mozStorage está diseñada como muchos otros sistemas de bases de datos. El procedimiento general para usarlo es:

- -

Abriendo una Conexión

-

La primera inicialización del servicio de almacenamiento debe hacerse en el hilo principal (un "hilo" es una unidad básica de ejecución). Se producirá un error si usted lo inicializa por cualquier otro hilo. Por lo tanto, si usted quisiera usar el servicio desde otro hilo, verifique llamando al getService desde el hilo principal para asegurarse que el servicio ha sido creado.

-

Ejemplo en C++ de la apertura de una conexión para "asdf.sqlite" en el directorio raiz del usuario:

-
nsCOMPtr<nsIFile> dbFile;
-rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,
-                            getter_AddRefs(dbFile));
-NS_ENSURE_SUCCESS(rv, rv);
-rv = dbFile->Append(NS_LITERAL_STRING("asdf.sqlite"));
-NS_ENSURE_SUCCESS(rv, rv);
-
-mDBService = do_GetService(MOZ_STORAGE_SERVICE_CONTRACTID, &rv);
-NS_ENSURE_SUCCESS(rv, rv);
-rv = mDBService->OpenDatabase(dbFile, getter_AddRefs(mDBConn));
-NS_ENSURE_SUCCESS(rv, rv);
-
-

MOZ_STORAGE_SERVICE_CONTRACTID está definido en storage/build/mozStorageCID.h, y su valor es "@mozilla.org/storage/service;1"

-

Ejemplo en JavaScript:

-
var file = Components.classes["@mozilla.org/file/directory_service;1"]
-                     .getService(Components.interfaces.nsIProperties)
-                     .get("ProfD", Components.interfaces.nsIFile);
-file.append("asdf.sqlite");
-
-var storageService = Components.classes["@mozilla.org/storage/service;1"]
-                        .getService(Components.interfaces.mozIStorageService);
-var mDBConn = storageService.openDatabase(file);
-
-
Nota: La función OpenDatabase está sujeta a cambios. Esta deberá ser destacada y simplificada al máximo para hacerla menos accesible a problemas.
-
-
Atención: Evite la tendencia a darle a su base de datos la terminación ".sdb" (por 's'qlite 'd'ata 'b'ase). Esta extensión está     reservada en Windows para una "Base de datos de Aplicación Compatible" y sus modificaciones son guardadas automáticamente como parte del sistema para restaurar su funcionalidad.
-

Crear una sentencia

-

Existen dos formas de crear una sentencia. Si no hay parámetros y la sentencia no devuelve nada, use mozIStorageConnection.executeSimpleSQL.

-
C++:
-rv = mDBConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING("CREATE TABLE foo (a INTEGER)"));
-
-JS:
-mDBConn.executeSimpleSQL("CREATE TABLE foo (a INTEGER)");
-
-

En otro caso, se debería componer una sentencia utilizando mozIStorageConnection.createStatement:

-
C++:
-nsCOMPtr<mozIStorageStatement> statement;
-rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING("SELECT * FROM foo WHERE a = ?1"),
-                              getter_AddRefs(statement));
-NS_ENSURE_SUCCESS(rv, rv);
-
-JS:
-var statement = mDBConn.createStatement("SELECT * FROM foo WHERE a = ?1");
-
-

Este ejemplo utiliza un comodín "?1" para un parámetro que será referenciado más tarde (véase la siguiente sección).

-

Tras componer la sentencia se pueden enlazar parámetros a ella, ejecutarla y reiniciarla una y otra vez. Si una sentencia se ejecuta muchas veces, el uso de una sentencia precompilada derivará en una mejora notable del rendimiento ya que la consulta SQL no necesita ser analizada sintácticamente cada vez.

-

Si está familiarizado con sqlite, sabrá que las sentencias preparadas son invalidadas cuando el esquema de la base de datos cambia. Afortunadamente, mozIStorageStatement detecta el error y recompilará la sentencia según se necesite. Por tanto, una vez que se ha creado una sentencia, no es necesario preocuparse ante un cambio de esquema. Todas las sentencias continuarán trabajando de forma transparente.

-

Asignando parámetros

-

Por lo general es mejor asignar todos los parámetros por separado en lugar de intentar construir cadenas SQL al vuelo que contengan los parámetros. Entre otras cosas, esto evita ataques de inyección SQL, ya que un parámetro asignado nunca podrá ser ejecutado como SQL.

-

Se pueden asignar parámetros cualquier sentencia que tenga comodines. Los comodines son accedidos mediante índice empezando por "?1", luego "?2"... Para asignar dichos comodines hay que usar funciones de sentencia BindXXXParameter(0) BindXXXParameter(1)...

-
Cuidado: Los índices en los comodines empiezan en 1. Los enteros pasados a las funciones de asignación cuentan desde 0. Esto significa que "?1" se corresponde al parámetro 0, "?2" al 1, etc...
-
-

Un comodín puede aparecer múltiples veces en la cadena SQL y todas sus instancias serán reemplazadas con el valor asignado. Los parámetros no asignados se interpretarán como NULL.

-

Las funciones de asignación disponibles en mozIStorageStatement (véase storage/public/mozIStorageStatement.idl) son:

- -

Ejemplo C++:

-
nsCOMPtr<mozIStorageStatement> statement;
-rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING("SELECT * FROM foo WHERE a = ?1 AND b > ?2"),
-                              getter_AddRefs(statement));
-NS_ENSURE_SUCCESS(rv, rv);
-rv = statement->BindUTF8StringParameter(0, "hello"); // "hello" will be substituted for "?1"
-NS_ENSURE_SUCCESS(rv, rv);
-rv = statement->BindInt32Parameter(1, 1234); // 1234 will be substituted for "?2"
-NS_ENSURE_SUCCESS(rv, rv);
-
-

Ejemplo Javascript:

-
var statement = mDBConn.createStatement("SELECT * FROM foo WHERE a = ?1 AND b > ?2");
-statement.bindUTF8StringParameter(0, "hello");
-statement.bindInt32Parameter(1, 1234);
-
-

Ejecutar una sentencia

-

La forma principal de ejecutar una sentencia es con mozIStorageStatement.executeStep. Esta función te permite enumerar todas las filas resultantes que la sentencia ha producido y te avisará cuando ya no haya más resultados.

-

Tras llamar a executeStep se pueden usar las funciones get de mozIStorageValueArray (véase storage/public/mozIStorageValueArray.idl. mozIStorageStatement implementa mozIStorageValueArray. Estas funciones son:

- -

Se puede obtener el tipo de un valor con mozIStorageValueArray.getTypeOfIndex el cual devuelve el tipo de la columna especificada. Cuidado: sqlite no es una base de datos tipada. Se puede poner cualquier tipo en cualquier celda sin importar el tipo declarado para la columna. Si se pide un tipo diferente, sqlite hará lo que pueda para convertirlo y devolverá algún valor predeterminado si le es imposible. Por tanto, es imposible obtener errores a la hora de recuperar tipos aunque puede que te lleguen datos raros.

-

El código de C++ puede además usar las funciones AsInt32, AsDouble, etc... que devuelven el valor como valor devuelto de C++ más apropiado. Aunque hay que tener cuidado ya que no tendrás errores si el índice es inválido. Es imposible obtener cualquier otro error debido a que sqlite siempre convertirá los tipos, incluso cuando al hacerlo dejen de tener sentido.

-

Ejemplo C++:

-
PRBool hasMoreData;
-while (NS_SUCCEEDED(statement->ExecuteStep(&hasMoreData)) && hasMoreData) {
-  PRInt32 value = statement->AsInt32(0);
-  // use the value...
-}
-
-

Ejemplo Javascript:

-
while (statement.executeStep()) {
-  var value = statement.GetInt32(0);
-  // use the value...
-}
-
-

mozIStorageStatement.execute() en una función apropiada cuando no se esperan datos al ejecutar la sentencia. Itera una vez la sentencia y la reinicia. Esto puede ser útil para sentencias de inserción ya que simplifica el código:

-
var statement = mDBConn.createStatement("INSERT INTO my_table VALUES (?1)");
-statement.bindInt32Parameter(52);
-statement.execute();
-
-

Reiniciar una sentencia

-

Es importante reiniciar sentencias que ya no van a ser usadas más. Las sentencias de escritura no reiniciadas mantendrán bloqueadas las tablas e impedirán a otras sentencias acceder a ellas. Las sentencias de lectura no reiniciadas impedirán la escritura.

-

Cuando un objeto sentencia es liberado, su sentencia de base de datos correspondiente es cerrada. Si estás usando C++ y sabes que todas las referencias serán destruidas, no tienes porque reiniciar explícitamente la sentencia. Además, si usas mozIStorageStatement.execute(), tampoco necesitas reiniciar explícitamente la sentencia; esta función la reiniciará por ti. En otro caso, hay que llamar a mozIStorageStatement.reset().

-

Los que utilicen JavaScript deben asegurarse de que las sentencias son reiniciadas, siendo particularmente cuidadoso con las excepciones. Seguro que querrás estar seguro de que reinicias tus sentencias incluso cuando una excepción es lanzada o de lo contrario los siguientes accesos a la base de datos no serán posibles. El reinicio de una sentencia es un proceso relativamente sencillo y no ocurrirá nada si ya estaba reiniciada, por lo que no hay que preocuparse por reinicios innecesarios.

-
var statement = connection.createStatement(...);
-try {
-  // uso de la sentencia...
-} finally {
-  statement.reset();
-}
-
-

Los que usen C++ deben de hacer lo mismo. Existe un objeto de ámbito en storage/public/mozStorageHelper.h llamado mozStorageStatementScoper que asegura que una sentencia dada es reiniciada cuando se sale del ámbito al que pertenece. Es muy recomendable usar este objeto si es posible.

-
void someClass::someFunction()
-{
-  mozStorageStatementScoper scoper(mStatement)
-  // uso de la sentencia
-}
-
-

Transacciones

-

mozIStorageConnection posee funciones para comenzar y finalizar transacciones. Si no se usan transacciones de modo explícito, se creará una implícita para cada sentencia. Esto tiene consecuencias más directas relacionadas con el rendimiento. Existe algo así para cada transacción, especialmente para las confirmaciones (commits). Por tanto al final se notará una mejora en el rendimiento cuando se realicen múltiples sentencias en una fila si se ponen en una transacción. Véase Storage:Performance para más información relacionada con el rendimiento.

-

La gran diferencia entre otros sistemas de base de datos es que sqlite no soporta transacciones anidadas. Esto significa que una vez se ha abierto una transacción no se puede abrir otra. Se puede comprobar mozIStorageConnection.transactionInProgress para ver si una transacción está actualmente en progreso.

-

También se puede ejecutar "BEGIN TRANSACTION" y "END TRANSACTION" directamente como sentencias SQL (esto es lo que hace la conexión cuando se llaman a las funciones). Sin embargo, el uso de mozIStorageConnection.beginTransaction y las funciones relacionadas se recomienda encarecidamente ya que guarda el estado de la transacción en la conexión. De otro modo el atributo transacionInProgress tendrá un valor erróneo.

-

sqlite posee varios tipos de transacciones:

- - - -

Se puede pasar este tipo de transacción a mozIStorageConnection.beginTransactionAs para determinar qué clase de transacción se necesita, teniendo en mente que si otra transacción se ha iniciado esta operación no tendrá éxito. Generalmente, el tipo predeterminado TRANSACTION_DEFERRED es suficiente y no se debería usar el resto de tipos a menos que realmente sepas por qué lo necesitas. Para más información, véase la documentación de sqlite sobre BEGIN TRANSACTION ybloqueos.

-
var ourTransaction = false;
-if (mDBConn.transactionInProgress) {
-  ourTransaction = true;
-  mDBConn.beginTransactionAs(mDBConn.TRANSACTION_DEFERRED);
-}
-
-// ... uso de la conexión ...
-
-if (ourTransaction)
-  mDBConn.commitTransaction();
-
-

En C++ se puede usar la clase de ayuda mozStorageTransaction definida en storage/public/mozStorageHelper.h. Esta clase comenzará una transacción del tipo especificado utilizando la conexión especificada cuando se alcance el ámbito y confirmará o deshará la transacción cuando salga del ámbito. Si ya había una transacción en progreso, la clase de ayuda de transacciones no hará nada.

-

También tiene funciones para confirmaciones explícitas. El uso típico es cuando se crea la clase para que deshaga los cambios de modo predeterminado para luego confirmar explícitamente la transacción cuando el proceso haya concluido con éxito.

-
nsresult someFunction()
-{
-  // deferred transaction (the default) with rollback on failure
-  mozStorageTransaction transaction(mDBConn, PR_FALSE);
-
-  // ... uso de la conexión ...
-
-  // todo ha ido bien, ahora confirmamos explícitamente
-  return transaction.Commit();
-}
-
-

Cómo corromper la base de datos

- - - - - - -

Seguridad en hilos

-

Tanto el servicio mozStorage como sqlite son seguros a nivel de hilo. Sin embargo ningún otro objeto de mozStorage o de sqlite u operación es segura.

- - - -

Bloqueo en SQLite

-

SQLite bloquea por completo la base de datos, es decir, se devolverá un SQLITE_BUSY a aquellos que estén leyendo e intenten escribir y lo mismo ocurrirá con aquellos que estén escribiendo e intenten leer. Una sentencia se considera activa desde el primer step() hasta que reset() es llamado. execute() llama tanto a step() como a reset(). Un problema común ocurre cuando se olvida reiniciar con reset() una sentencia después de haberla iterado con step().

-

Mientras que una conexión SQLite dada es capaz de manejar múltiples sentencias abiertas, su modelo de bloqueo limita lo que dichas sentencias pueden hacer concurrentemente (leer o escribir). De hecho es posible que múltiples sentencias estén activas leyendo a la vez. Sin embargo no es posible que múltiples sentencias estén leyendo y escribiendo a la vez en la misma tabla, incluso si son derivadas de la misma conexión.

-

SQLite posee un modelo de bloqueo a dos niveles: a nivel de conexión y a nivel de tabla. La mayoría de la gente estará familiarizada con el bloqueo a nivel de conexión (base de datos): múltiples lectores aunque sólo un escritor. Lo que bloquea el nivel de tabla (Árbol-B) es lo que puede a veces ser confundido (internamente, cada tabla en la base de datos posee su propio Árbol-B, por lo que "tabla" y "Árbol-B" son técnicamente sinónimos).

-
Bloqueo a nivel de tabla
-

Se podría pensar que si sólo se tiene una conexión y se bloquea la base de datos para escritura, se podrían usar múltiples sentencias para hacer todo lo que se quisiera. No del todo cierto. Hay que ser consciente del bloqueo a nivel de tabla (Árbol-B) el cual es mantenido por manejadores de sentencias a través de la base de datos (p.e. sentencias SELECT abiertas).

-

La regla general es esta: un manejador de sentencia puede no modificar una tabla (Árbol-B) la cual otros manejadores de sentencia están leyendo (tienen abiertos cursores sobre ella), incluso si ese manejador de sentencia comparte la misma conexión (contexto de transacción, bloqueo de base de datos, etc...) con otros manejadores de sentencias. Intentar hacerlo provocará el bloqueo (o devolverá SQLITE_BUSY).

-

Este problema generalmente aparece cuando se intenta iterar una tabla con una sentencia y modificar registros dentro de ella utilizando otra sentencia. Esto no funcionará (o conlleva una alta probabilidad de no funcionar, dependiendo de la implicación del optimizador (véase más abajo)). La sentencia de modificación provocará bloqueo ya que la sentencia de lectura tiene un cursor abierto en la tabla.

-
Trabajar con problemas de bloqueo
-

La solución es seguir (1) como se describe arriba. Teóricamente, (2) realmente no debería funcionar con SQLite 3.x. En este escenario, el bloqueo de la base de datos entra en juego (con múltiples conexiones) además del bloque de la tabla. La conexión 2 (conexión de modificación) no será capaz de modificar (escribir) en la base de datos mientras que la conexión 1 esté leyendo. La conexión 2 necesita un acceso exclusivo para ejecutar un comando SQL de modificación, acceso que no puede obtener mientras la conexión 1 tenga sentencias activas leyendo la base de datos (la conexión 1 posee un bloque de lectura compartido durante este tiempo el cual prohibe a cualquier otra conexión obtener un acceso exclusivo).

-

Otra opción es usar una tabla temporal. Crear una tabla temporal que contenga los resultados de la tabla en cuestión, iterarla (poniendo el bloqueo de la tabla de la sentencia de lectura en la tabla temporal) para que luego la sentencia de modificación pueda hacer cambios en la tabla real sin ningún problema. Esto puede ser hecho con sentencias derivadas de una única conexión (contexto de transacción). Este escenario a veces sucede en segundo plano ya que cosas como ORDER BY pueden producir tablas temporales internamente. Sin embargo, no es seguro asumir que el optimizador hará esto en todos los casos. Crear una tabla temporal explícitamente es la única forma segura de realizar esta última opción.

- -

diff --git a/files/es/api_de_acceso_a_canales/index.html b/files/es/api_de_acceso_a_canales/index.html deleted file mode 100644 index 7c21ceb776..0000000000 --- a/files/es/api_de_acceso_a_canales/index.html +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: API de acceso a canales -slug: API_de_acceso_a_canales -tags: - - Complementos - - Todas_las_Categorías - - extensiones -translation_of: Mozilla/Tech/Feed_content_access_API ---- -

Firefox 2 y Thunderbird 2 introducen una serie de interfaces que  hacen más sencillo que los autores de extensiones accedan a los canales RSS y Atom.

-

Interfaces del canal

-
-
- nsIFeed
-
- Representa un canal RSS o Atom.
-
- nsIFeedContainer
-
- Una clase básica subclasificada por varias interfaces relacionadas al canal.
-
- nsIFeedElementBase
-
- Una clase básica subclasificada por varias de las otras interfaces relacionadas con el canal.
-
- nsIFeedEntry
-
- Representa una única entrada en un canal RSS o Atom.
-
- nsIFeedGenerator
-
- Describe el programa que generó un canal RSS o Atom.
-
- nsIFeedPerson
-
- Representa a una persona. Contiene el nombre de la persona, la dirección de correo electrónico, y la dirección de la página personal.
-
- nsIFeedProcessor
-
- Analiza canales RSS y Atom.
-
- nsIFeedProgressListener
-
- Implementada por el programa que quiere analizar un canal RSS o Atom, para recibir mensajes durante el proceso de análisis.
-
- nsIFeedResult
-
- Describe el resultado al analizar un canal.
-
- nsIFeedResultListener
-
- Implementado por el programa que quiere analizar un canal RSS o Atom para recibir avisos cuando el análisis se complete.
-
- nsIFeedTextConstruct
-
- Representa valores de texto en un canal; incluye funciones que permiten traer el texto como texto sin formato o como HTML.
-
- nsIScriptableUnescapeHTML
-
- Una clase de utilidad que elimina las secuencias de escape de las cadenas HTML.
-
-

Ejemplo: Leer un canal de la Web

-

Realmente es bastante fácil leer y analizar un canal: Usa un XMLHttpRequest para cargar el canal, y luego pasa su cadena a un nsIFeedProcessor para analizarlo.

-

Cargar el canal y enviarlo al analizador sintáxtico se hace usando un código similar a éste:

-
  fetch: function(feedUrl)
-  {
-    var httpRequest = null;
-
-    function infoReceived() {
-      var data = httpRequest.responseText;
-
-      var ioService = Components.classes['@mozilla.org/network/io-service;1']
-                                         .getService(Components.interfaces.nsIIOService);
-      var uri = ioService.newURI(feedUrl, null, null);
-
-      if (data.length) {
-        var parser = Components.classes["@mozilla.org/feed-processor;1"]
-                                        .createInstance(Components.interfaces.nsIFeedProcessor);
-        var listener = new FeedTestResultListener();
-        try {
-          parser.listener = listener;
-          parser.parseFromString(data, uri);
-        }
-        catch(e) {
-          alert("Error al analizar el canal.");
-        }
-      }
-    }
-
-    httpRequest = new XMLHttpRequest();
-
-    httpRequest.open("GET", feedUrl, true);
-    try {
-      httpRequest.onload = infoReceived;
-      httpRequest.send(null);
-    }
-    catch(e) {
-      alert(e);
-    }
-  }
-
-

La interfaz nsIFeedProcessor te permite analizar los datos del canal desde varias fuentes distintas; en este caso, estamos cargando un documento en una cadena, para seguidamente analizar la cadena usando su método parseFromString(). Sin embargo, también se podría analizar desde un archivo usando parseFromStream(), o directamente desde una URL usando parseAsync().

-

El procesamiento real de análisis del canal se hace por un método llamado handleResult() en el objeto FeedTestResultListener. Ese código es similar a éste:

-
    FeedTestResultListener.prototype = {
-      handleResult: function(result) {
-        var feed = result.doc;
-
-        feed.QueryInterface(Components.interfaces.nsIFeed);
-
-        // Abre una nueva ventana
-
-        var win = window.open("", "FeedTest_Window");
-        var doc = win.document;
-
-        doc.open();
-
-        // Escribe la cabecera HTML y el título de la página
-
-        doc.write("<html><head><title>Feed: " + feed.title.text + "</title></head><body>");
-        doc.write("<h1>" + feed.title.text + "</h1><p>");
-
-        var itemArray = feed.items;
-        var numItems = itemArray.length;
-
-        // Write the article information
-
-        if (!numItems) {
-          doc.write("<i>¡Que no haya noticias es buena noticia!</i>");
-        }
-        else {
-          var i;
-          var theEntry;
-          var theUrl;
-          var info;
-
-          for (i=0; i<numItems; i++) {
-            theEntry = itemArray.queryElementAt(i, Components.interfaces.nsIFeedEntry);
-
-            if (theEntry) {
-              theUrl =
-              doc.write('<b><a href="' + theEntry.link.resolve("") + '">' + theEntry.title.text + '</a></b><br>');
-              if (theEntry.summary) {
-                info = theEntry.summary.text + "<p><hr><p>";
-              }
-              else {
-                info = theEntry.content.text + "<p><hr><p>";
-              }
-              doc.write("<blockquote>" + info);
-              doc.write("</blockquote><p>");
-            }
-          }
-        }
-
-        // Cerramos el documento; ¡hemos acabado!
-
-        doc.write("</body></html>");
-        doc.close();
-      }
-    }
-
-

La función handleResult() recibe como argumento un nsIFeedResult que describe un canal; su propiedad doc es un nsIFeed que contiene todos los datos del canal.

-

Para obtener el título del canal, se consulta la propiedad feed.title. El título es un nsIFeedTextConstruct que puede representar el texto en varios formatos; obtenemos su propiedad text para representar el título del canal como un texto codificado en HTML. Podríamos, alternativamente, usar su método plainText() para obtener una copia del título traducido a texto sin formato.

-

Luego examinamos el array (arreglo) de artículos en el canal consultando el feed.items nsIArray. Este array contiene los objetos nsIFeedEntry que describen cada artículo del canal.

-

Construimos el contenido de los documentos accediendo a las propiedades del título, enlace, resumen y contenido para cada artículo. La URL completa del enlace se recupera usando el método resolve() del enlace.

-

Para iniciar la lectura de un canal, simplemente llamamos fetch(url). Esto abre una nueva ventana con el contenido del canal, pudiendo hacer clic en cada título de las entradas que nos llevarán al artículo en sí.

-

Para los detalles de cada uno de las interfaces de acceso al canal, visita sus respectivas páginas de referencia.

diff --git a/files/es/api_del_toolkit/index.html b/files/es/api_del_toolkit/index.html deleted file mode 100644 index b639c14d6c..0000000000 --- a/files/es/api_del_toolkit/index.html +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: API del Toolkit -slug: API_del_Toolkit -tags: - - Toolkit API -translation_of: Mozilla/Tech/Toolkit_API ---- -

El Mozilla Toolkit es un conjunto de interfaces de programación (APIs) construidas sobre Gecko que proporcionan servicios avanzados a las aplicaciones XUL. Estos servicios incluyen:

- - -

Referencia oficial

- -

Official References. Do not add to this list without contacting Benjamin Smedberg. Note that this page is included from the pages listed below. So: Don't Add Breadcrumbs! -

-
- -

Más información

- -

La siguientes páginas para desarrolladores contienen ejemplos y discusiones sobre temas concretos:

- -

XUL; Overlays XUL; Desarrollar extensiones; XULRunner; Desarrollar temas; DOM; RDF; Almacenamiento; Crear documentación de ayuda

diff --git "a/files/es/archive/add-ons/api_de_restauraci\303\263n_de_sesi\303\263n/index.html" "b/files/es/archive/add-ons/api_de_restauraci\303\263n_de_sesi\303\263n/index.html" deleted file mode 100644 index 237857bc2e..0000000000 --- "a/files/es/archive/add-ons/api_de_restauraci\303\263n_de_sesi\303\263n/index.html" +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: API de restauración de sesión -slug: Archive/Add-ons/API_de_restauración_de_sesión -tags: - - Complementos - - NecesitaRevisiónTécnica - - Todas_las_Categorías - - extensiones -translation_of: Archive/Add-ons/Session_store_API ---- -

Firefox 2 introduce el almacenamiento de sesiones, una nueva caracteristica que hace posible que las extensiones puedan fácilmente, guardar y restaurar datos a lo largo de sesiones de Firefox. Existe una API simple que permite que las extensiones accedan a la caracterìstica de almacenamiento de sesión.

-

Un escenario clave en el cual proveer esta caracteristica puede ser crucial para una extensión: Firefox 2 deja revertir el cerrado de pestañas. Para poder restaurar correctamente el estado de la extension cuando una pestaña es restaurada, necesita usar el metodo setTabValue() de la API de almacenamiento de sesion, para guardar la informaciòn que necesitarà para restaurar su estado, y luego invocar getTabValue() para obtener la configuraciòn previa cuando la pestaña es recuperada.

-

La API Almacenamiento de Sesion es implementada usando la interfaz nsISessionStore

-

Saber cuando restaurar

-

Cada vez que Firefox està por restaurar una pestaña, un evento de tipo SSTabRestoring es enviado. Si se quiere que la extensión sea capaz de restaurar los datos cuando las pestañas son restauradas, puede instalar un "centinela" como este:

-
function myExtensionHandleRestore(aEvent) {
-  Components.classes["@mozilla.org/consoleservice;1"].
-             getService(Components.interfaces.nsIConsoleService).
-             logStringMessage("restoring tabs");
-};
-
-document.addEventListener("SSTabRestoring", myExtensionHandleRestore, false);
-
-

Simplemente se debe reemplazar los contenidos de la función myExtensionHandleRestore() con cualquier cosa que se necesite hacer cuando la pestaña sea restaurada. En este ejemplo, nsIConsoleService es usado para desplegar un mensaje a la Consola.

-

Este evento es enviado justo antes de la restauracion de una pestaña. Un evento del tipo SSTabRestored es enviado después que la última pestaña ha sido restaurada.

-

El proceso de restauración de sesión

-

La secuencia exacta de eventos que ocurre cuando una sesión està siendo restaurada es:

-
  1. El estado de una sesión está a punto de ser restaurado. Esto puede ser al inicio del programa,o en respuesta a Deshacer Cerrar Pestaña, dado que las pestañas cerradas son restauradas como sesiones de una sola pestaña.
  2. Nuevas ventanas son abiertas como se requirieron (una por cada ventana que fue salvada durante el almacenamiento de sesión), y tanto cookies como la lista de pestañas recièn cerradas son restauradas.
  3. -
-

Después de esto, los siguientes pasos son seguidos por cada pestaña que està siendo restaurada:

-
  1. Se reutiliza una pestaña o se crea una nueva. En el último caso, el evento TabOpen es enviado.
  2. Los atributos persistentes XUL de la pestaña (aquellos que fueron salvados, debido a invocaciones de persistTabAttribute()) y permisos son restaurados.
  3. El evento SSTabRestoring es enviado.
  4. Se le ordena a la pestaña que cargue el URL que deberìa desplegar.
  5. Cuando la página ha terminado de cargar, los campos de texto y barras de desplazamiento son restaurados.
  6. Finalmente, el evento SSTabRestored es enviado.
  7. -
-

Si se quiere configurar permisos o manipular de alguna otra forma  una pestaña restaurada antes de que la página sea cargada, debería observar SSTabRestoring. Si se desea hacer algo después de que la pagina ha sido cargada, debería observar SSTabRestored.

-

Ambos eventos son siempre enviados por cada pestaña que està siendo restaurada. Se puede determinar cual pestaña esta siendo restaurada mirando el campo originalTarget del evento.

-

No existe una forma para determinar cuàndo ha sido restaurada la última pestaña, a menos que se determine cuantas pestañas necesitan ser restauradas y luego contar los eventos sSTabRestored.

-

Usando la API de almacenamiento de sesión

-

Esta sección provee algunos ejemplos de còmo usar la API de almacenamiento de sesión.

-

Guardando un valor con una pestaña.

-

El siguiente código adherirà un par llave/valor a una pestaña, asi-cuando èsta sea restaurada-, este par todavía estará asociada a ella.

-
 var ss = Components.classes["@mozilla.org/browser/sessionstore;1"].
-                             getService(Components.interfaces.nsISessionStore);
- var currentTab = getBrowser().selectedTab;
- var dataToAttach = "Yo quiero adherir esto";
- ss.setTabValue(currentTab, "nombre-llave-aqui", dataToAttach);
-
-

El código asigna el valor de la llave "nombre-llave-aqui" a dataToAttach. Se puede usar cualquier objeto JavaScript como datos.

-

Recuperar un valor guardado

-

Se puede recuperar un valor asociado a una pestaña en cualquier momento (ya sea mientras la pestaña este siendo restaurada o no), usando un código similar al siguiente:

-
 var ss = Components.classes["@mozilla.org/browser/sessionstore;1"].
-                             getService(Components.interfaces.nsISessionStore);
- var currentTab = getBrowser().selectedTab;
- var retrievedData = ss.getTabValue(currentTab, "nombre-llave-aqui");
-
-

Despuès  que el código ha sido ejecutado, la variable retrievedData contiene el valor guardado en la llave "nombre-llave-aqui". retrievedData está indefinida si no existe un valor guardado para ese nombre de llave.

-

Borrando un valor asociado a una pestaña

-

Para borrar un valor de una pestaña, se puede utilizar un código como el siguiente:

-
 var ss = Components.classes["@mozilla.org/browser/sessionstore;1"].
-                             getService(Components.interfaces.nsISessionStore);
- var currentTab = getBrowser().selectedTab;
- deleteTabValue(currentTab, "nombre-llave-aqui");
-
-

Comentarios

-

El guardado de valores de la ventana y las funciones de restauración, funcionan exactamente como las funciones basadas en pestañas con nombres similares.

-

Ver También:

-

nsISessionStore

-

diff --git a/files/es/archive/add-ons/index.html b/files/es/archive/add-ons/index.html deleted file mode 100644 index d1851bd7ee..0000000000 --- a/files/es/archive/add-ons/index.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Add-ons -slug: Archive/Add-ons -translation_of: Archive/Add-ons ---- -

In progress. Archived add-ons documentation.

- -

diff --git a/files/es/archive/add-ons/observer_notifications/index.html b/files/es/archive/add-ons/observer_notifications/index.html deleted file mode 100644 index 571cebc9d4..0000000000 --- a/files/es/archive/add-ons/observer_notifications/index.html +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: Notificaciones Observer -slug: Archive/Add-ons/Observer_Notifications -translation_of: Mozilla/Tech/XPCOM/Observer_Notifications ---- -

-

« AnteriorSiguiente »

-

- -

Sometimes you need your code to send a message to other parts of your code. For example, you might want to notify that a task is completed, and then several different actions must be performed. You could do that by calling all those functions directly, but XPCOM offers you a better and cleaner way to achieve that using observers and the observer service.

- -

An observer is an object that is responsible to observe (wait for) notifications and then to carry out subsequent actions. To create an observer, you need to implement the nsIObserver interface. The interface has only one method observe() which takes three parameters. The first parameter (subject) can be any XPCOM object, the second parameter is a notification topic, and the final parameter is a string that further describes the notification.

- -

This example code shows you what an implementation of the nsIObserver interface looks like:

- -
-
-
let testObserver = {
-  observe : function(aSubject, aTopic, aData) {
-    if (aTopic == "xulschoolhello-test-topic") {
-      window.alert("Data received: " + aData);
-    }
-  }
-}
-
-
- -

In order for this observer to work, you need to use the observer service that provides methods for you to add, remove, notify and enumerate observers.

- -

Adding an observer to the observer service is simple, invoking the addObserver method with three parameters. The first parameter is an observer object, the second parameter is a notification topic, and the third parameter is a boolean which indicates whether the observer service should hold a weak reference to the observer. You should normally set the third parameter to false.

- -
-
-
let observerService = Components.classes["@mozilla.org/observer-service;1"].
-    getService(Components.interfaces.nsIObserverService);
-
-observerService.addObserver(testObserver, "xulschoolhello-test-topic", false);
-
-
- -
-
-
You should come up with a notification topic that is unique so you know it will not conflict with Firefox or other extensions topics.
-
-
- -

To remove an observer for a specific topic, you use the removeObserver method. The method takes the observer object and notification topic as parameters.

- -
-
-
observerService.removeObserver(testObserver, "xulschoolhello-test-topic");
-
-
- -

After you have registered some observers to listen to a notification topic, you can then use the notifyObservers method to send a notification to all of them. The method takes three parameters. The first parameter can be any XPCOM object to pass to those observers (can be null), the second parameter is the notification topic and the last parameter is an additional string to pass to those observers (can be null).

- -
-
-
observerService.notifyObservers(null, "xulschoolhello-test-topic", "hello");
-
-
- -

Non-chrome to chrome communication

- -

Non-chrome to chrome communication is one of the main uses of observers. By non-chrome we mean JavaScript Code Modules or XPCOM. As we saw in previous sections, you can use JavaScript Code Module and XPCOM objects very easily from the chrome. But given that chrome is window-dependent and non-chrome objects are not, it's tricky to send a message to the chrome. You would have to invoke a method for the chrome objects in all windows. It's much easier to use observers in this case.

- -

Let's see the following example code on how to send out a notification from non-chrome code.

- -
-
-
/**
- * Notifies all the registered observers with the test notification topic.
- */
-notifyTest : function() {
-  let observerService = Components.classes["@mozilla.org/observer-service;1"].
-      getService(Components.interfaces.nsIObserverService);
-  let subject = Components.classes["@mozilla.org/supports-string;1"].
-      createInstance(Components.interfaces.nsISupportsString);
-
-  // assign some text to data attribute
-  subject.data = "This is a test.";
-  // notify all registered observers
-  observerService.notifyObservers(
-    subject, "xulschoolhello-test-topic", "hello");
-}
-
-
- -

In the notifyTest method, the notifyObservers call is used to notify all registered observers about the notification topic "xs-hw-test-topic". The input parameter is an instance of nsISupportsString with some text and the last input parameter is a string "Hello".

- -

In a chrome browser overlay file, we register an observer to listen to the notification topic "xs-hw-test-topic" when the window loads. Keep in mind that you have to remove observers that are not longer needed. Not doing so will result in memory leaks. Therefore, the registered observer is unregistered when the browser window is unloaded.

- -
-
-
/**
- * Controls the browser overlay for the Hello World extension.
- */
-XULSchoolChrome.BrowserOverlay = {
-  /* Observer service. */
-  _observerService : null,
-
-  /**
-   * Initializes this object.
-   */
-  init : function() {
-    this._observerService = Components.classes["@mozilla.org/observer-service;1"].
-       getService(Components.interfaces.nsIObserverService);
-    this._observerService.addObserver(this, "xulschoolhello-test-topic", false);
-  },
-
-  /**
-   * Unitializes this object.
-   */
-  uninit : function() {
-    this._observerService.removeObserver(
-      this, "xulschoolhello-test-topic");
-  },
-
-  /**
-   * Observes the registered notification topics.
-   * @param aSubject The nsISupports object associated with the notification.
-   * @param aTopic The notification topic.
-   * @param aData The additional string associated with the notification.
-   */
-  observe : function(aSubject, aTopic, aData) {
-    if (aTopic == "xulschoolhello-test-topic") {
-      aSubject.QueryInterface(Ci.nsISupportsString);
-      window.alert("Subject: " + aSubject.data);  // => "This is a test"
-      window.alert("Data: " + aData);  // => "Hello"
-    }
-  }
-}
-
-window.addEventListener(
-  "load", function() { XULSchoolChrome.BrowserOverlay.init(); }, false);
-window.addEventListener(
-  "unload", function() { XULSchoolChrome.BrowserOverlay.uninit(); }, false);
-
-
- -

In the observe method the notification topic is verified because you can have one observer listening to several topics. You may notice that we explicitly set the interface of the aSubject object to nsISupportsString using the QueryInterface method. This is because the first parameter of the observe method is typed as nsISupports (the generic interface, as seen before), therefore its properties and methods cannot be accessed unless the correct interface is set to it.

- -

When the notifyTest method is called, all observers registered with xulschoolhello-test-topic will get notified and display two alerts. If there are 2 Firefox windows open, the observer will be notified in both and the alerts will show up on both.

- -

You can always listen for multiple notification topics using the same observer. Also, be careful not to add the same observer to a notification topic more than once, otherwise the same code in the observer will be run several times when a notification is sent.

- -

Useful Firefox notifications

- -

We have covered sending and receiving custom notification topics using observers and the observer service. In Firefox, there are many built-in observer topics that you can observe as well. The Observer Notifications page lists some useful topics and is definitely worth spending time studying it.

- -

-

« AnteriorSiguiente »

-

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/es/archive/add-ons/permitir_sugerencias_en_los_plugins_de_b\303\272squeda/index.html" "b/files/es/archive/add-ons/permitir_sugerencias_en_los_plugins_de_b\303\272squeda/index.html" deleted file mode 100644 index 7e5d1f33de..0000000000 --- "a/files/es/archive/add-ons/permitir_sugerencias_en_los_plugins_de_b\303\272squeda/index.html" +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Permitir sugerencias en los plugins de búsqueda -slug: Archive/Add-ons/Permitir_sugerencias_en_los_plugins_de_búsqueda -tags: - - Plugins_de_búsqueda -translation_of: Archive/Add-ons/Supporting_search_suggestions_in_search_plugins ---- -

MozSearch admite sugerencias mientras el usuario escribe el la barra de búsqueda, Firefox 2 pregunta a la URL especificada por el plugins del motor de búsqueda para devolver sugerencias en tiempo real. -

Una vez que se ha obtenido la lista, se muestra en un cuadro emergente que aparece debajo de la barra de búsqueda, que permite al usuario seleccionar un término sugerido. Si el usuario continua escribiendo, se solicita una nueva lista de sugerencias al motor de búsqueda, y se muestra actualizada. -

Los plugins de Yahoo y Google incluidos en Firefox 2 admiten sugerencias de búsqueda. -

-

Implementar soporte para sugerencias en un plugin de búsqueda

-

Para soportar sugerencias, un plugin de búsquedaa necesita definir un elemento extra <Url> con su atributo type definido como "application/x-suggestions+json". (esto significa que los plugins con soporte para sugerencias tendrán dos elementos <Url>, siendo el otro la URL principal text/html.) -

Por ejemplo, el plugin de búsqueda de Yahoo tiene esta <Url>: -

-
<Url type="application/x-suggestions+json" template="http://ff.search.yahoo.com/gossip?output=fxjson&command={searchTerms}"/>
-
-

Si el usuario escribe "fir" en la barra de búsqueda, y se detiene, Firefox insertará "fir" en el lugar de {searchTerms} y consultará esa URL: -

-
<Url type="application/x-suggestions+json" template="http://ff.search.yahoo.com/gossip?output=fxjson&command=fir"/>
-
-

Los resultados son usados para construir el diálogo con la lista de sugerencias. -

Lee Creación de plugins MozSearch para conocer mas sobre como implementar un plugin de búsqueda. -

-

Implementar las sugerencias en el servidor

-

La mayor parte del trabajo para manipular las sugerencias de búsqueda es realmente implementada en el lado del servidor. Si eres desarrollador web, y quieres soportar las sugerencias de búsqueda, necesitas implementar el soporte para devolver las sugerencias en JavaScript Object Notation (JSON) dado un termino de búsqueda. -

Cuando el navegador desea obtener posibles resultados de un término de búsqueda, envia una solicitud HTTP GET a la URL especificada por el elemento <Url>. -

Tu servidor debe entonces decidir que sugerencias debe ofrecer usando los medios que vea necesarios, y construyedo un JSON que consista en al menos dos, y como mucho cuatro, elementos: -

-
query string -
El primer elemento en el JSON es la cadena de búsqueda original. Esto permite a Firefox verificar que la sugerencia concuerda con el término de búsqueda actual. -
-
completion list -
Un array de los términos sugeridos. El array debe estar entre corchetes. Por ejemplo: <tt>["termino 1", "termino 2", "termino 3", "termino 4"]</tt> -
-
descriptions -
Este elemento opcional es un array de descripciones de cada sugerencia en la completion list. Esto puede ser cualquier información que el motor de búsqueda quiera devolver para que se muestre en el navegador, como el numero de resultados disponibles para dicha búsqueda. -
-
Las descripciones no son soportadas en Firefox 2, y son ignoradas si alguna es espeficificada.
-
query URLs -
Este elemento opcional es un array de URLs alternativas para cada sugerencia de la completion list. Por ejemplo, si quieres ofrecer un enlace a un mapa en vez de simplemente un resultado de búsqueda para una sugerencia, puedes devolver una URL a un mapa en este array. -
-
Si no especificas una URL para la petición, la petición por defecto se manda por defecto al elemento <Url> definido en la descripción XML del plugin. -
-
Las query URLs no son soportadas en Firefox 2, y son ignoradas.
-

Por ejemplo, si el término a buscar es "fir", y no necesitas devolver descripciones o urls alternativas, puedes devolver el siguiente JSON: -

-
["fir", ["firefox", "first choice", "mozilla firefox"]]
-
-

Date cuenta que en este ejemplo, solo se especifican la query string y el completion array, sin especificar los elementos opcionales. -

Tu completion list puede incluir tantas sugerencias como quieras, aunque debe mantenerse manejable, dado que los datos se estarán actualizando en tiempo real mientras el usuario está escribiendo una palabra. Además, el método que usas para elegir las sugerencias depende de ti. -

-
-
diff --git "a/files/es/archive/add-ons/versionado,_actualizaci\303\263n_y_compatibilidad_de_extensiones/index.html" "b/files/es/archive/add-ons/versionado,_actualizaci\303\263n_y_compatibilidad_de_extensiones/index.html" deleted file mode 100644 index 45a3a213ca..0000000000 --- "a/files/es/archive/add-ons/versionado,_actualizaci\303\263n_y_compatibilidad_de_extensiones/index.html" +++ /dev/null @@ -1,295 +0,0 @@ ---- -title: 'Versionado, actualización y compatibilidad de extensiones' -slug: 'Archive/Add-ons/Versionado,_actualización_y_compatibilidad_de_extensiones' -tags: - - Complementos - - Todas_las_Categorías - - extensiones - - páginas_a_traducir -translation_of: 'Archive/Add-ons/Extension_Versioning,_Update_and_Compatibility' ---- -

Las versiones de extensiones

- -

Las extensiones deberán especificar su versión utilizando la herramienta para el formato de versión. En general son unas cadenas de caracteres cortadas por un punto, algunos ejemplos:

- - - -

Como determinan la compatibilidad las aplicaciones

- -

Al instalar extensiones/complementos las aplicaciones (programas) comprueban las entradas targetApplication en el archivo de instalación (install.rdf) de la extensión. La identificación (ID) de una entrada debe coincidir con la ID de la aplicación. Además, el número de versión de la aplicación debe encontrarse dentro del rango definido en minVersion y maxVersion.

- -

Si la aplicación tiene una entrada targetApplication pero es para una versión incompatible, la aplicación intentará obtendrá información actualizada sobre su compatibilidad del archivo updateURL.

- -

Si el archivo de instalación tiene entradas en targetPlatform, la plataforma utilizada para instalar la aplicación debe aparecer listada en ella o se cancelará la instalación.

- -

En las aplicaciones basadas en Gecko 1.9 se puede utilizar una entrada targetApplication con una ID toolkit@mozilla.org; minVersion, y maxVersion que coincidan con la versión de la aplicación. Esto permitirá garantizar que la extensión se podrá instalar en cualquier aplicación basada en Toolkit.

- -

Cancelar el control de compatibilidad

- -

Para la evaluación de extensiones se puede hacer que la aplicación ignore los controles de compatibilidad durante la instalación. Lo único que hay que hacer es crear la preferencia extensions.checkCompatibility y darle valor False.

- -

Antes de la versión 1.5 de Firefox, se podía utilizar la preferencia app.extensions.version para que la aplicación ignorase su versión e instalar así extensiones de otra forma incompatibles.

- -

Elección de minVersion y maxVersion

- -

minVersion y maxVersion deberían especificar las diferentes versiones de la aplicación que se han probado. No se debe introducir un valor maxVersion superior a la versión disponible ya que no se saben qué cambios podrían introducirse en su interfaz de programación (API) y de usuario. Con la actualización de compatibilidad no hace falta publicar una versión nueva completa de la extensión, sólo habrá que aumentar su maxVersion.

- -

Generalmente, en maxVersion es permitido sustituir el número de versión secundario de la aplicación por un asterisco '*', por ejemplo: 2.0.0.* significaría que admite cualquier actualización secundaria de la versión 2 de la aplicación. Normalmente, la aplicación suele sugerir al autor de extensiones con qué parte de la versión conviene más hacer lo antedicho.

- -

El asterisco '*' no representa una versión por sí mismo. En realidad el * representa un número infinitamente alto, por lo que es más sensato usarlo en maxVersion que en minVersion ya que no suele producir el efecto deseado.

- -

Comprobación automática de actualización de extensiones

- -

Periódicamente, las aplicaciones buscarán actualizaciones de las extensiones instaladas recuperando el archivo updateURL. La información recuperada puede servir para notificar al usuario que existe una actualización de la extensión e informar a la aplicación de las nuevas versiones compatibles con la extensión.

- -

Actualizaciones de compatibilidad

- -

Durante la comprobación automática de actualizaciones, las aplicaciones buscan nuevas versiones e información actualizada sobre la compatibilidad de la versión instalada de una extensión. Esto quiere decir que si el manifiesto de la actualización incluye una entrada para la versión actual de la extensión instalada y el targetApplication de la entrada especifica un maxVersion mayor, la aplicación utilizará este valor en lugar del especificado en el archivo install.rdf de la extensión. Esto puede causar que se activen extensiones que estaban desactivadas por ser incompatibles y que se instalen aquellas que normalmente no se instalarían.

- -

Formato RDF de actualización

- -

Si alberga uno mismo el archivo updateURL del complemento será necesario devolver la información de la versión en un formato RDF. Encontrará un ejemplo de manifiesto de actualización más abajo. Muestra información sobre dos versiones diferentes de la extensión para la 'id' foobar@developer.mozilla.org. Las versiones incluidas son 2.2 y 2.5, y cada una especifica la compatibilidad con las versiones de Firefox 1.5 a 2.0.0.*. Para la versión 2.2 se utiliza un enlace de actualización https mientras que para la 2.5 es un enlace regular http con un 'hash' para verificar el archivo recuperado.

- -

Es importante recuperar correctamente la descripción RDF inicial del atributo 'about'. Permite saber de que complemento se trata:

- - - -

urn:mozilla:theme:<id>

- - - -

En cualquiera de los ejemplos siguientes, la secuencia ordenada de las versiones dentro del elemento <RDF:Seq> es importante, con las versiones más nuevas después que las más antiguas. No hay que escribir todas las versiones intermedias si la última es suministrada.

- -
<?xml version="1.0" encoding="UTF-8"?>
-
-<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-         xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-
-  <!-- Esta forma de descripción incluye toda la
-       información de actualización y compatibilidad
-       para un simple complemento con la id
-       foobar@developer.mozilla.org.
-       Un único archivo RDF admite listados con
-       información de varios complementos. -->
-  <RDF:Description about="urn:mozilla:extension:foobar@developer.mozilla.org">
-    <em:updates>
-      <RDF:Seq>
-
-        <!-- Cada "li" es una versión diferente
-             del mismo complemento -->
-        <RDF:li>
-          <RDF:Description>
-            <em:version>2.2</em:version> <!-- Esto
-           es el número de la versión del complemento -->
-
-            <!-- Un targetApplication para cada aplicación
-                 compatible con el complemento -->
-            <em:targetApplication>
-              <RDF:Description>
-                <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-                <em:minVersion>1.5</em:minVersion>
-                <em:maxVersion>2.0.0.*</em:maxVersion>
-
-                <!-- Dice donde hay que ir para descargar
-                     esa versión del complemento -->
-                <em:updateLink>https://www.mysite.com/foobar2.2.xpi</em:updateLink>
-
-                <!-- Una página sobre lo nuevo
-                     de esta actualización -->
-                <em:updateInfoURL>http://www.mysite.com/updateinfo2.2.xhtml</em:updateInfoURL>
-              </RDF:Description>
-            </em:targetApplication>
-          </RDF:Description>
-        </RDF:li>
-
-        <RDF:li>
-          <RDF:Description>
-            <em:version>2.5</em:version>
-            <em:targetApplication>
-              <RDF:Description>
-                <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-                <em:minVersion>1.5</em:minVersion>
-                <em:maxVersion>2.0.0.*</em:maxVersion>
-                <em:updateLink>http://www.mysite.com/foobar2.5.xpi</em:updateLink>
-                <um:updateHash>sha1:78fc1d2887eda35b4ad2e3a0b60120ca271ce6e6</em:updateHash>
-              </RDF:Description>
-            </em:targetApplication>
-          </RDF:Description>
-        </RDF:li>
-
-      </RDF:Seq>
-    </em:updates>
-
-    <!-- Una firma sólo es necesaria en el caso de haber
-         incluido un 'updateKey' en el archivo de
-         instalación 'install.rdf' del complemento. -->
-    <em:signature>MIGTMA0GCSqGSIb3DQEBBQUAA4GBAMO1O2gwSCCth1GwYMgscfaNakpN40PJfOWt
-                  ub2HVdg8+OXMciF8d/9eVWm8eH/IxuxyZlmRZTs3O5tv9eWAY5uBCtqDf1WgTsGk
-                  jrgZow1fITkZI7w0//C8eKdMLAtGueGfNs2IlTd5P/0KH/hf1rPc1wUqEqKCd4+L
-                  BcVq13ad</em:signature>
-  </RDF:Description>
-</RDF:RDF>
-
- -

Mucha gente prefiere este formato alternativo (se ha quitado mucha información en este ejemplo para ver mejor la estructura básica):

- -
<?xml version="1.0" encoding="UTF-8"?>
-
-<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-         xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-
-  <!-- Esta forma de descripción incluye toda la
-       información de actualización y compatibilidad
-       para un simple complemento con la id
-       foobar@developer.mozilla.org.
-       Un único archivo RDF admite listados con
-       información de varios complementos. -->
-  <RDF:Description about="urn:mozilla:extension:foobar@developer.mozilla.org">
-    <em:updates>
-      <RDF:Seq>
-        <!-- El atributo de recurso apunta a una entrada
-             de descripción 'about' que está más abajo.
-             La uri actual puede ser cualquier cosa -->
-        <RDF:li resource="urn:mozilla:extension:foobar@developer.mozilla.org:2.2"/>
-        <RDF:li resource="urn:mozilla:extension:foobar@developer.mozilla.org:2.5"/>
-      </RDF:Seq>
-    </em:updates>
-    <em:signature>MIGTMA0GCSqGSIb3DQEBBQUAA4GBAMO1O2gwSCCth1GwYMgscfaNakpN40PJfOWt
-                  ub2HVdg8+OXMciF8d/9eVWm8eH/IxuxyZlmRZTs3O5tv9eWAY5uBCtqDf1WgTsGk
-                  jrgZow1fITkZI7w0//C8eKdMLAtGueGfNs2IlTd5P/0KH/hf1rPc1wUqEqKCd4+L
-                  BcVq13ad</em:signature>
-  </RDF:Description>
-
-  <!-- Esto es lo mismo que la descripción con
-       'li' del ejemplo anterior -->
-  <RDF:Description about="urn:mozilla:extension:foobar@developer.mozilla.org:2.2">
-    <em:version>2.2</em:version>
-
-    <!-- El contenido de esta parte se ha quitado -->
-
-  </RDF:Description>
-  <RDF:Description about="urn:mozilla:extension:foobar@developer.mozilla.org:2.5">
-    <em:version>2.5</em:version>
-
-    <!-- El contenido de esta parte se ha quitado -->
-
-  </RDF:Description>
-</RDF:RDF>
-
- -

Facilitar detalles sobre las actualizaciones

- -

- -

En general

- -

Podemos dar a conocer a los usuarios las novedades incluidas en la versión actualizada de nuestro complemento. El usuario al recibir una notificación de que hay una nueva versión puede ver de un vistazo esa información que contiene las mejoras y los arreglos de cualquier problema de seguridad.

- -

Para que así sea, hay que agregar una entrada updateInfoURL en el manifiesto de actualización (ver el ejemplo de encima). La página de esta URL será recuperada y mostrada, al usuario, fuera del contexto normal de una página web por lo cual su contenido es mucho más "limpio", lo que significa que hay muy pocas opciones de formatos y que las secuencias de órdenes e imágenes no están permitidas. Como regla general, sólo se admite el uso de las etiquetas siguientes (cualquier otra cosa se ignorará):

- - - -

Dentro de las listas se usará la etiqueta habitual 'li' para cada ítem de la lista.

- -

Dentro de las etiquetas 'h1', 'h2', 'h3', 'p' y 'li' se utilizará:

- - - -

La página de información recuperada debe ser completamente válida en XHTML, y entregada con el tipo MIME application/xhtml+xml.

- -

Para poder personalizar el texto según la configuración regional/local del usuario se colocará %APP_LOCALE% en updateInfoURL para que esta información esté incluida en la URL, o bien cualquier otras cadenas de substitución admitidas por updateURL, pero no es tan funcional.

- -

Lo que ve el usuario final

- -

El contenido de updateInfoURL será mostrado al usuario en una pantalla del complemento, con una lista de todas las actualizaciones disponibles. Entonces, el usuario puede hacer clic en el botón "Mostrar la información" y la verá a la derecha. (El botón cambiará a "Esconder la información")

- -

Image:Example_updateInfoURL2.PNG

- -

Asegurando las actualizaciones

- -

- -

Gecko 1.9 has added additional requirements designed to protect users from man-in-the-middle attacks and the like during add-on updates. In the install.rdf of the already installed add-on updateURL must be specified in one of the following ways:

- - - -

Si se especifica una actualización de clave/firma (updateKey) en el archivo de instalación ( install.rdf), hay que incluir una firma digital en el manifiesto de actualización sino la información será rechazada.

- -

In the update manifest delivered from the updateURL the updateLink must be specified in one of the following ways:

- - - -

Any entries in the update manifest that do not meet one of those two requirements will be ignored when checking for new versions.

- -

Note that https links to sites with invalid certificates or that redirect to http sites will fail for both the update.rdf and updateLink cases.

- -

Los cifrados de actualización

- -

Al fin de verificar la integridad del XPI descargado se puede proveer una entrada updateHash (cifrado de actualización) junto a updateLink. Este debe ser un cifrado generado desde los datos del fichero según un algoritmo admitido ('sha1', 'sha256', 'sha384' y 'sha512'). El algoritmo de cifrado utilizado debe anteponerse y separarse del cifrado en sí con ':'.

- -
  <em:updateHash>sha1:78fc1d2887eda35b4ad2e3a0b60120ca271ce6e6</em:updateHash>
-
- -

El valor updateHash, debe empezar con la cadena del algoritmo de cifrado, es un error común quitar ese prefijo al poner un valor nuevo en updateHash:\nsha1:78fc1d2887eda35b4ad2e3a0b60120ca271ce6e6"

- -

Además el cifrado del archivo descargado y el cifrado especificado también deben coincidir, sino dará un error.

- -

Varias herramientas permiten generar un cifrado:

- -

Diversas variantes de Unix incluyen: sha1sum, sha256sum y demás. Los usuarios de Windows pueden utilizar HashTab para un uso interactivo (fuera de compilación). Tienen también las utilidades para Win (aparte de los clásicos como Cygwin), las cuales son buenas para un uso no-interactivo:

- -
sha1sum ARCHIVO
-
- -

Además de md5deep que es múlti-plataforma

- -
sha1deep FILE
-
- -

OpenSSL también genera cifrado:

- -
openssl sha1 FILE
-
- -

Para los usuarios de Windows, HashTab es una extensión shell... un simple clic da valores de cifrado para cualquier archivo.

- -

Aquí hay además un bug de mejoras sobre como insertar a McCoy la generación automática de cifrado en archivos XPI.

- -

Y todos los lenguajes (de programación) populares lo ofrecen, por ejemplo: Python, Perl: CPAN Digest, PHP

- -

Firmar el manifiesto de actualización

- -

- -

If you wish to serve your update RDF over regular http, Gecko 1.9 based applications will require that you digitally sign the update manifest to ensure that it's information isn't tampered with between you creating it and applications retrieving it. The McCoy tool should be used to sign the update RDF.

- -

The technical details of the signing mechanism are beyond the scope of this document however the basics are as follows:

- -

The add-on author creates a public/private RSA cryptographic key pair.

- -

The public part of the key is DER encoded and then base 64 encoded and added to the add-on's install.rdf as an updateKey entry.

- -

When the author creates the update rdf file a tool is used to sign it using the private part of the key. Roughly speaking the update information is converted to a string, then hashed using a sha512 hashing algorithm and this hash is signed using the private key. The resultant data is DER encoded then base 64 encoded for inclusion in the update rdf as an em:signature entry.

diff --git a/files/es/archive/api/index.html b/files/es/archive/api/index.html deleted file mode 100644 index 02c6cf7eab..0000000000 --- a/files/es/archive/api/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: API -slug: Archive/API -tags: - - API - - Archive - - NeedsTranslation - - TopicStub -translation_of: Archive/API ---- -

In progress. Archived documentation about obsolete web standards APIs.

- -

Navigator
In progress. Features that used to hang off the Navigator interface, but have since been removed.

diff --git a/files/es/archive/api/navigator/index.html b/files/es/archive/api/navigator/index.html deleted file mode 100644 index 37284b83b6..0000000000 --- a/files/es/archive/api/navigator/index.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Navigator -slug: Archive/API/Navigator -translation_of: Archive/API/Navigator ---- -

In progress. Features that used to hang off the Navigator interface, but have since been removed.

- -

diff --git a/files/es/archive/api/navigator/moznotification/index.html b/files/es/archive/api/navigator/moznotification/index.html deleted file mode 100644 index 6cc45f16e6..0000000000 --- a/files/es/archive/api/navigator/moznotification/index.html +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: navigator.mozNotification -slug: Archive/API/Navigator/mozNotification -translation_of: Archive/API/Navigator/mozNotification ---- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

Proporciona soporte para la creación de objetos notification, que son usados para mostrar alertas de notificaciones de escritorio al usuario. Actualmente, estos son admitidos sólamente en Firefox Mobile y Firefox OS. Vea Mostrar notificaciones para un ejemplo.

- -

Resumen del método

- - - - - - - -
notification createNotification(in DOMString title, in DOMString description, in DOMString iconURL Optional);
- -

Métodos

- -

createNotification()

- -

Crea y devuelve un objeto notification que puede ser usado para mostrar el mensaje especificado con una URL opcional.

- -
notification createNotification(
-  in DOMString title,
-  in DOMString description,
-  in DOMString iconURL Optional
-);
-
- -
Parámetros
- -
-
title
-
El título de la notificación.
-
description
-
El texto que se muestra en la notificación.
-
iconURL Optional
-
Un identificador URL de la imagen que se mostrará en la notificación.
-
- -
Valor de retorno
- -

Un nuevo objeto notification.

- -

Permisos

- -

Asegúrese de agregar en su archivo manifiesto el permiso "desktop-notification".

- -
"permissions": {
-    "desktop-notification":{}
-}
- -

Véase también

- - diff --git a/files/es/archive/apps/advanced_topics/index.html b/files/es/archive/apps/advanced_topics/index.html deleted file mode 100644 index 0db5a55e2b..0000000000 --- a/files/es/archive/apps/advanced_topics/index.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Temas avanzados -slug: Archive/Apps/Advanced_topics -translation_of: Archive/Apps/Advanced_topics ---- -

Este artículo provée información extra en temas más avanzados de Open Web Apps.

-
-

Documentación de arquitectura de apps

-
-
- Arquitectura de web apps
-
- Una revisión de la arquitectura detrás de los proyectos de Open Web Apps diseño e implementación.
-
- Detalles específicos de la plataforma de instalación de apps
-
- Hay algunas diferencias en cómo las apps son instaladas a través de varias plataformas que soportan Open Web Apps; este artículo te ayudará a entenderlas.
-
- Open Web Apps para Android
-
- Información acerca de instalar y testear Open Web Apps en un dispositivo Android.
-
- Notas sobre el tiempo de ejecución de la App
-
- Saca notas para las corridas y el funcionamiento en ejecución de las Web app para varias plataformas.
-
-

Otra documentación

-
-
- Creando almacenamiento
-
- Información qe podrá ser útil para ti si quieres compilar tu propio almacenamiento para la venta o distribución de las Open Web Apps.
-
-

Ver todo...

-
-
-

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/es/archive/apps/index.html b/files/es/archive/apps/index.html deleted file mode 100644 index 10bb499435..0000000000 --- a/files/es/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.

- -

diff --git a/files/es/archive/b2g_os/api/callevent/index.html b/files/es/archive/b2g_os/api/callevent/index.html deleted file mode 100644 index ceb6219d5a..0000000000 --- a/files/es/archive/b2g_os/api/callevent/index.html +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: CallEvent -slug: Archive/B2G_OS/API/CallEvent -translation_of: Archive/B2G_OS/API/CallEvent ---- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

-

This API is available on Firefox OS for internal applications only.

-

- -

Resumen

- -

El DOM CallEvent representa eventos relacionados con las llamadas telefonicas.

- -

Propiedades

- -
-
CallEvent.call Read only
-
Un objeto TelephonyCall representa la llamada de la que se originó el evento.
-
- -

Especificaciones

- -

No es una implementacion estandar, pero se dicote en el W3C como parte del Grupo de trabajo de aplicaciones del sistema.

- - - - - - - - - - - - - - - - -
EspecificacionEstatusComentario
Web TelephonyDraftEditor Draft (WIP).
- -

Compatibilidad de navegador

- -

Por razones obvias, el apoyo se espera principalmente en los navegadores móviles.

- -

We're converting our compatibility data into a machine-readable JSON format. - This compatibility table still uses the old format, - because we haven't yet converted the data it contains. - Find out how you can help!

- -
- - -

- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte basicoSin soporteSin soporteSin soporteSin soporteSin soporte
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidFirefox Mobil (Gecko)IE MobilOpera MobilSafari Mobil
Soporte basicoSin soporte12.0 (12.0)Sin soporteSin soporteSin soporte
-
- -

Ver también

- - diff --git a/files/es/archive/b2g_os/api/cameramanager/getcamera/index.html b/files/es/archive/b2g_os/api/cameramanager/getcamera/index.html deleted file mode 100644 index 605e8229b7..0000000000 --- a/files/es/archive/b2g_os/api/cameramanager/getcamera/index.html +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: CameraManager.getCamera() -slug: Archive/B2G_OS/API/CameraManager/getCamera -translation_of: Archive/B2G_OS/API/CameraManager/getCamera ---- -
-

This API is available on Firefox OS for privileged or certified applications only.

-
- -

Resumen

- -

Este método es usado para acceder a una de las camaras validas en el dispositivo basado en el identificador. Puedes obtener una lista de las camaras validas para ser llamadas por el método CameraManager.getListOfCameras() .

- -

Sintaxis (pre Firefox OS 2.2)

- -
CameraManager.getCamera(camera, cameraConfiguration, onsuccess[, onerror]);
- -

Parametros

- -
-
camera
-
Especifica la camara que desea usarse (el dispositivo puede tener mas de una camara).
-
cameraConfiguration
-
Un objeto permite al conjunto de opciones de la camara por esta camara: mode, previewSize y recorderProfile
-
onsuccess
-
una función de llamada que toma un objeto CameraControl como parametro.
-
onerror
-
Una opcional función de llamada que acepta una cadena de error como un parametro.
-
- -

Ejemplo

- -
var options = {
-  mode: 'picture',
-  recorderProfile: 'jpg',
-  previewSize: {
-    width: 352,
-    height: 288
-  }
-};
-
-var camera = navigator.mozCameras.getListOfCameras()[0];
-
-function onSuccess(camera) {
-  // Do stuff with the camera
-};
-
-function onError(error) {
-  console.warn(error);
-};
-
-navigator.mozCameras.getCamera(camera, options, onSuccess, onError);
-
- -

Sintaxis (Firefox OS 2.2+)

- -
Promise CameraManager.getCamera(camera, cameraConfiguration);
- -

Parametros

- -
-
camera
-
Especifica la camara que deseas usar (El dispositivo puede tener mas de una camara).
-
cameraConfiguration
-
Un objeto permite al conjunto de opciones de la camara por esta camara: mode, previewSize y recorderProfile
-
- -

Valor de retorno

- -

retorna un Promise.  La función Promise's .then() acepta dos argumentos en la función:

- -
-
onsuccess
-
Una función de llamada que toma un objeto como parametro. Este objeto tiene la propiedad camara como objeto CameraControl y la configuracion de la propiedad como actual cameraConfiguration del dispositivo.
-
onerror
-
Una opcional función de llamada que acepta una cadena de error como un parametro.
-
- -

Ejemplo

- -
var options = {
-  mode: 'picture',
-  recorderProfile: 'jpg',
-  previewSize: {
-    width: 352,
-    height: 288
-  }
-};
-
-var camera = navigator.mozCameras.getListOfCameras()[0];
-
-function onSuccess(cameraObj) {
-  var cameraControl = cameraObj.camera;
-  // Do stuff with the cameraControl
-};
-
-function onError(error) {
-  console.warn(error);
-};
-
-navigator.mozCameras.getCamera(camera, options).then(onSuccess, onError);
-
- -

Especificaciones

- -

no forma parte de cualquier especificación aun; este propablemente será reemplazado por  WebRTC cuando este gane mas soporte generalizado en dispositivos moviles .

- -

Permisos

- -

Hasta Firefox OS 1.4, la api de la camara es una api certificada, pero no es accesible para aplicaciones  de tercera partes. Para Firefox OS 2.0 en adelante, el nivel de permisos han sido degradado a privilegiado, pero este es ahora valido para desarrolladores  que usen en sus aplicaciones.

- -
"type": "privileged"
- -
"permissions": {
-  "camera": {
-    "description": "Required for accessing cameras on the device."
-  }
-}
- -

Ver también

- - diff --git a/files/es/archive/b2g_os/api/cameramanager/index.html b/files/es/archive/b2g_os/api/cameramanager/index.html deleted file mode 100644 index 492feb0803..0000000000 --- a/files/es/archive/b2g_os/api/cameramanager/index.html +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: CameraManager -slug: Archive/B2G_OS/API/CameraManager -tags: - - API - - B2G - - Certified Only - - DOM - - DOM Reference - - Firefox OS - - Graphics - - JavaScript - - NeedsTranslation - - Non-standard - - Reference - - Référence(2) - - TopicStub - - WebAPI - - camera -translation_of: Archive/B2G_OS/API/CameraManager ---- -

- -

-

This API is available on Firefox OS for privileged or certified applications only.

-

- -

The CameraManager interface provides access to any cameras available on the device being used.

- -

Properties

- -

This interface doesn't implements, nor inherits any property.

- -

Methods

- -
-
CameraManager.getCamera()
-
Gets a camera instance based on its identifier.
-
CameraManager.getListOfCameras()
-
Returns an Array of all camera identifiers available on the device.
-
- -

Specification

- -

Not part of any specification as yet; this will probably be replaced by WebRTC when it gains more widespread support on mobile devices.

- -

Permissions

- -

Up until Firefox OS 1.4, The Camera API was a certified API, so not accessible to third party apps. From Firefox OS 2.0 onwards, the permission level has been downgraded to privileged, so it is now available for developers to use in their apps.

- -
"permissions": {
-  "camera": {
-    "description": "Required for accessing cameras on the device."
-  }
-}

- -

See also

- - diff --git a/files/es/archive/b2g_os/api/index.html b/files/es/archive/b2g_os/api/index.html deleted file mode 100644 index 8826729643..0000000000 --- a/files/es/archive/b2g_os/api/index.html +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: Firefox OS APIs -slug: Archive/B2G_OS/API -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/B2G_OS/API ---- -

- -

This page lists all Firefox OS-specific APIs.

- -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

diff --git a/files/es/archive/b2g_os/api/mozactivity/index.html b/files/es/archive/b2g_os/api/mozactivity/index.html deleted file mode 100644 index d3fb6a28fe..0000000000 --- a/files/es/archive/b2g_os/api/mozactivity/index.html +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: MozActivity -slug: Archive/B2G_OS/API/MozActivity -translation_of: Archive/B2G_OS/API/MozActivity ---- -

-

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

-

-

This API is available on Firefox or Firefox OS for installed or higher privileged applications.

-

-

Summary

-

The MozActivity interface allows apps to delegate an activity to another app.

-

This interface fully inherits from the DOMRequest interface excepts that it has a constructor that it takes a MozActivityOptions as a parameter.

-
-

Note: As soon as a MozActivity is instentiated, the system will prompt the user to choose an activity handler. It's not possible to instentiate an activity and wait to use it.

-
-

Properties

-

Inherited from DOMRequest:

-

-
DOMRequest.onsuccess
-
A callback handler called when the operation represented by the DOMRequest is completed.
-
DOMRequest.onerror
-
A callback handler that gets called when an error occurs while processing the operation.
-
DOMRequest.readyState
-
A string indicating whether or not the operation is finished running. Its value is either "done" or "pending".
-
DOMRequest.result
-
The operation's result.
-
DOMRequest.error
-
Error information, if any.
-

-
-
-

Methods

-

None.

-

Example

-
var activity = new MozActivity({
-  // The name of the activity the app wants to delegate the action
-  name: "pick",
-
-  // Data requierd by the activity. Each application acting as an activity handler
-  // can have it's own requirement for the activity. If the data does not fulfill
-  // all the requirement of any activity handler, the error event will be sent
-  // otherwise, the event sent depend on the activity handler itself.
-  data: {
-    type: "image/jpeg"
-  }
-});
-
-activity.onsuccess = function() {
-  console.log("Activity successfuly handled");
-
-  var imgSrc = this.result.blob;
-}
-
-activity.onerror = function() {
-  console.log("The activity encouter en error: " + this.error);
-}
-
-

Specification

-

Web Activities is not part of any specification. However, it has some overlap with the proposed Web Intents specification. Mozilla actually proposed Web Activities as a counter proposal to Web Intents. For more information about this, see discussion on the Web Intents Task Force ML.

-

See also

- diff --git a/files/es/archive/b2g_os/api/mozvoicemailstatus/index.html b/files/es/archive/b2g_os/api/mozvoicemailstatus/index.html deleted file mode 100644 index b00c181193..0000000000 --- a/files/es/archive/b2g_os/api/mozvoicemailstatus/index.html +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: MozVoicemailStatus -slug: Archive/B2G_OS/API/MozVoicemailStatus -translation_of: Archive/B2G_OS/API/MozVoicemailStatus ---- - - -
-

This API is available on Firefox OS for internal applications only.

-
- - - -

Summary

- -

The MozVoicemailStatus API provides access to a voicemail status.

- -

Interface overview

- -
interface MozVoicemailStatus
-{
-  readonly attribute unsigned long serviceId;
-  readonly attribute boolean hasMessage;
-  readonly attribute long messageCount;
-  readonly attribute DOMString returnNumber;
-  readonly attribute DOMString returnMessage;
-};
- -

Properties

- -
-
MozVoicemailStatus.serviceId Read only
-
A number indicating the voicemail service ID.
-
MozVoicemailStatus.hasMessage Read only
-
A boolean indicating if there are messages available within the voicemail box.
-
MozVoicemailStatus.messageCount Read only
-
A number indicating the total message count.
-
MozVoicemailStatus.returnNumber Read only
-
A string representing the return call number for the voicemail status.
-
MozVoicemailStatus.returnMessage Read only
-
A string representing a displayable return call message for the voicemail status.
-
- -

Methods

- -

None.

- -

Specification

- -

Not part of any specification yet.

- -

See also

- - diff --git a/files/es/archive/b2g_os/api/navigator/index.html b/files/es/archive/b2g_os/api/navigator/index.html deleted file mode 100644 index 1760c18acd..0000000000 --- a/files/es/archive/b2g_os/api/navigator/index.html +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Navigator (Firefox OS extensions) -slug: Archive/B2G_OS/API/Navigator -translation_of: Archive/B2G_OS/API/Navigator ---- -

(es translation)

- -

The Navigator interface represents the state and the identity of the user agent. It allows scripts to query it and to register themselves to carry on some activities. This page represents the list of properties and methods added to Navigator on Firefox OS devices. For the list of properties and methods available to any Web sites, consult Navigator.

- -

A Navigator object can be retrieved using the read-only Window.navigator property.

- -

Navigator.mozApps
Retorna un objecto Apps que puedes usar para instalar, manejar y controlar Open Web Apps en el navegador.
Navigator.mozTelephony
Devuelve un objeto  Telephony que se puede utilizar para iniciar y controlar las llamadas telefónicas del navegador.
window.navigator.mozAlarms
Retorna un objeto MozAlarmsManager que puede usar para programar notificaciones o aplicaciones que se inicien en un momento determinado.

diff --git a/files/es/archive/b2g_os/api/navigator/mozalarms/index.html b/files/es/archive/b2g_os/api/navigator/mozalarms/index.html deleted file mode 100644 index d83b3dc520..0000000000 --- a/files/es/archive/b2g_os/api/navigator/mozalarms/index.html +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: window.navigator.mozAlarms -slug: Archive/B2G_OS/API/Navigator/mozAlarms -translation_of: Archive/B2G_OS/API/Navigator/mozAlarms ---- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

-

This API is available on Firefox or Firefox OS for installed or higher privileged applications.

-

- -

Resumen

- -

Retorna un objeto MozAlarmsManager que puede usar para programar notificaciones o aplicaciones que se inicien en un momento determinado.

- -

Sintaxis

- -
var alarms = window.navigator.mozAlarms;
-
- -

Valor

- -

navigator.mozAlarms es un objeto MozAlarmsManager.

- -

Especificación

- - - - - - - - - - - - - - -
EspecificaciónEstadoComentario
Web Alarms APIObsoleteDefine la extensión para el objeto navigator .
- -

Compatibilidad de navegadores

- -

We're converting our compatibility data into a machine-readable JSON format. - This compatibility table still uses the old format, - because we haven't yet converted the data it contains. - Find out how you can help!

- -
- - -

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Basic supportSin soporteSin soporteSin soporteSin soporteSin soporte
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidFirefox OSFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic supportSin soporte1.0Sin soporteSin soporteSin soporteSin soporte
-
- -

Nota de implementación en Gecko

- -

Esta API es disponible actualmente solo en Firefox OS para cualquier aplicación instalada. La especificación actual para esta API no es considerada lo suficientemente estable como para utilizar sin prefijo actualmente.

- -

Ver también

- - diff --git a/files/es/archive/b2g_os/api/navigator/mozapps/index.html b/files/es/archive/b2g_os/api/navigator/mozapps/index.html deleted file mode 100644 index a0df89d37c..0000000000 --- a/files/es/archive/b2g_os/api/navigator/mozapps/index.html +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: Navigator.mozApps -slug: Archive/B2G_OS/API/Navigator/mozApps -tags: - - API - - API de aplicaciones - - No estandar - - aplicaciones -translation_of: Archive/B2G_OS/API/Navigator/mozApps ---- -

- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

Descripción

- -

Retorna un objecto Apps que puedes usar para instalar, manejar y controlar Open Web Apps en el navegador.

- -

Sintaxis

- -
var apps = window.navigator.mozApps;
-
- -

Valor

- -

navigator.mozApps es un objecto Apps que puedes usar para instalar, manejar y controlar Open Web Apps en el navegador.

- -

Especificación

- -

No es parte de ninguna especificación; implementado en Gecko en la base del error 697383.

- -

Compatibilidad de navegadores

- -

We're converting our compatibility data into a machine-readable JSON format. - This compatibility table still uses the old format, - because we haven't yet converted the data it contains. - Find out how you can help!

- -
- - -

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte basico---11.0 (11.0)---------
-
- -
- - - - - - - - - - - - - - - - - - - -
FeatureAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte basico---11.0 (11.0)---------
-
- -

 

diff --git a/files/es/archive/b2g_os/api/navigator/moztelephony/index.html b/files/es/archive/b2g_os/api/navigator/moztelephony/index.html deleted file mode 100644 index 9a67f43f5c..0000000000 --- a/files/es/archive/b2g_os/api/navigator/moztelephony/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Navigator.mozTelephony -slug: Archive/B2G_OS/API/Navigator/MozTelephony -translation_of: Archive/B2G_OS/API/Navigator/MozTelephony ---- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

-

This API is available on Firefox OS for internal applications only.

-

- -

Resumen

- -

Devuelve un objeto  Telephony que se puede utilizar para iniciar y controlar las llamadas telefónicas del navegador.

- -

Sintaxis

- -
var phone = window.navigator.mozTelephony;
-
- -

Valor

- -

navigator.mozTelephony es un objeto de Telephony que se puede utilizar para controlar las funciones de teléfono del dispositivo en el que se está ejecutando el navegador.

- -

Especificaciones

- -

Esta es una implementación no estándar, pero se discute en el W3C como parte del Grupo de trabajo de aplicaciones del sistema.

- - - - - - - - - - - - - - - - -
EspecificaciónEstatusComentario
Web TelephonyDraftEditor Draft (WIP).
- -

Compatibilidad del navegador

- -

Por razones obvias, el apoyo se espera principalmente en los navegadores móviles.

- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidFirefox Mobil (Gecko)IE MobilOpera MobilSafari Mobil
Soporte básicoSin soporte12.0 (12.0)Sin soporteSin soporteSin soporte
-
- -

Ver también

- - diff --git a/files/es/archive/b2g_os/api/telephony/index.html b/files/es/archive/b2g_os/api/telephony/index.html deleted file mode 100644 index 840ff8fbe0..0000000000 --- a/files/es/archive/b2g_os/api/telephony/index.html +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: Telephony -slug: Archive/B2G_OS/API/Telephony -translation_of: Archive/B2G_OS/API/Telephony ---- -
-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-
-

This API is available on Firefox OS for internal applications only.

-
- -

Resumen

- -

Proporciona soporte para marcar, contestar y manejar llamadas de teléfono en un dispositivo con soporte de telefonía.

- -

Propiedades

- -
-
Telephony.active
-
Un objeto TelephonyCall indicanda la llamada que está activa en ese momento. La llamada activa es la que recibe la entrada del micrófono y cualquier tono generado utilizando el metodo Telephony.startTone().
-
Telephony.calls
-
Matriz de objetos TelephonyCall, uno para cada llamada que está conectado en ese momento.
-
Telephony.muted
-
Se establece en true para silenciar el micrófono o false para activar el micrófono.
-
Telephony.speakerEnabled
-
Se establece en true para habilitar la funcionalidad de altavoz o false para desactivarla.
-
- -

Manejo de eventos

- -
-
Telephony.oncallschanged
-
Un controlador para el evento callschanged; este evento CallEvent se envía cada vez que la lista de llamadas presenta cambios.
-
Telephony.onincoming
-
Un controlador para el evento de entrada, lo que CallEvent envía cada vez que hay una nueva llamada entrante.
-
- -

Metodos

- -
-
Telephony.dial()
-
Marca el número de teléfono especificado, que se especifica como una cadena.
-
Telephony.startTone()
-
Comienza la generación del tono DTMF especificado.
-
Telephony.stopTone()
-
Detiene la generación del tono DTMF actualmente sonando.
-
- -

Especificaciones

- -

Esta es una implementación no estándar, pero se discute en el W3C como parte del Grupo de trabajo de aplicaciones del sistema.

- - - - - - - - - - - - - - - - -
EspecificaciónEstatusComentario
Web TelephonyDraftEditor Draft (WIP).
- -

Browser compatibility

- -

Por razones obvias, el apoyo se espera principalmente en los navegadores móviles.

- -

We're converting our compatibility data into a machine-readable JSON format. - This compatibility table still uses the old format, - because we haven't yet converted the data it contains. - Find out how you can help!

- -
- - -

- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básicoSin soporteSin soporteSin soporteSin soporteSin soporte
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidFirefox Mobil (Gecko)IE MobilOpera MobilSafari Mobil
Soporte básicoSin soporte12.0 (12.0)Sin soporteSin soporteSin soporte
-
- -

Ver también

- - diff --git a/files/es/archive/b2g_os/api/telephonycall/hangup/index.html b/files/es/archive/b2g_os/api/telephonycall/hangup/index.html deleted file mode 100644 index 1afab7cee9..0000000000 --- a/files/es/archive/b2g_os/api/telephonycall/hangup/index.html +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: TelephonyCall.hangUp -slug: Archive/B2G_OS/API/TelephonyCall/hangUp -translation_of: Archive/B2G_OS/API/TelephonyCall/hangUp ---- -

- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

-

This API is available on Firefox OS for internal applications only.

-

- -

Resumen

- -

Este método cuelga una llamada en curso.

- -

Sintaxis

- -
instanceOfTelephonyCall.hangUp();
-
- -

Especificaciones

- -

Esta es una implementación no estándar, pero se discute en el W3C como parte del Grupo de trabajo de aplicaciones del sistema.

- - - - - - - - - - - - - - - - -
EspecificaciónEstatusComentario
Web TelephonyDraftEditor Draft (WIP).
- -

Compatibilidad del navegador

- -

Por razones obvias, el apoyo se espera principalmente en los navegadores móviles.

- -

We're converting our compatibility data into a machine-readable JSON format. - This compatibility table still uses the old format, - because we haven't yet converted the data it contains. - Find out how you can help!

- -
- - -

- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte basicoSin soporteSin soporteSin soporteSin soporteSin soporte
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidFirefox Mobil (Gecko)IE MobilOpera MobilSafari Mobil
Soporte basicoSin soporte12.0 (12.0)Sin soporteSin soporteSin soporte
-
- -

See also

- - diff --git a/files/es/archive/b2g_os/api/telephonycall/index.html b/files/es/archive/b2g_os/api/telephonycall/index.html deleted file mode 100644 index 118b5126fc..0000000000 --- a/files/es/archive/b2g_os/api/telephonycall/index.html +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: TelephonyCall -slug: Archive/B2G_OS/API/TelephonyCall -translation_of: Archive/B2G_OS/API/TelephonyCall ---- -

-

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

-

-

This API is available on Firefox OS for internal applications only.

-

-

Resumen

-

Representa una llamada telefonica, proporciona información sobre la llamada y ofreciendo mecanismos para controlar y detectar los cambios en su estado.

-

Propiedades

-
-
- TelephonyCall.number Read only
-
- Cadena que indica el número de teléfono correspondiente a la llamada.
-
- TelephonyCall.state Read only
-
- Una cadena que indica el estado de la llamada.
-
-

Controladores de eventos

-
-
- TelephonyCall.onalerting
-
- A function to be called when the call alerts. What does this mean?
-
- TelephonyCall.onbusy
-
- Una función que se llamará cuando se recibe una señal de ocupado al intentar marcar.
-
- TelephonyCall.onconnected
-
- Una función que se llamará una vez que se conecte la llamada.
-
- TelephonyCall.onconnecting
-
- Una función que se llamará después de marcar, a la espera de una conexión.
-
- TelephonyCall.ondialing
-
- Una función que se llamará cuando la llamada comienza a marcar el number.
-
- TelephonyCall.ondisconnected
-
- Una función que se llamará después de que la llamada haya terminado de desconectar.
-
- TelephonyCall.ondisconnecting
-
- Una función que se llamará cuando la llamada comienza a desconectar.
-
- TelephonyCall.onincoming
-
- Una función a llamar cuando se detecta una llamada entrante.
-
- TelephonyCall.onstatechange
-
- A function to be called when the state of the call changes.
-
-

Metodos

-
-
- TelephonyCall.answer()
-
- Responde a una llamada entrante
-
- TelephonyCall.hangUp()
-
- Cuelga la llamada
-
- TelephonyCall.hold()
-
- Permite poner una llamada en espera.
-
- TelephonyCall.resume()
-
- Permite recuperar una llamada en espera.
-
-

TelephonyCall también hereda métodos de EventTarget:

-

-
EventTarget.addEventListener()
-
Register an event handler of a specific event type on the EventTarget.
-
EventTarget.removeEventListener()
-
Removes an event listener from the EventTarget.
-
EventTarget.dispatchEvent()
-
Dispatch an event to this EventTarget.
-
- -

Additional methods for Mozilla chrome code

- -

Mozilla extensions for use by JS-implemented event targets to implement on* properties. See also WebIDL bindings.

- -

-

Especificaciones

-

Se trata de una implementación no estándar, pero se está discutiendo en el W3C, como parte del Grupo de trabajo de aplicación del sistea.

- - - - - - - - - - - - - - - -
EspecificaciónEstatusComentario
Web TelephonyDraftEditor Draft (WIP).
-

Compatibilidad de navegador

-

Por razones obvias, el apoyo se espera principalmente en los navegadores móviles.

-

We're converting our compatibility data into a machine-readable JSON format. - This compatibility table still uses the old format, - because we haven't yet converted the data it contains. - Find out how you can help!

- -
- - -

-
- - - - - - - - - - - - - - - - - - - -
CaracteristicaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte basicoSin soporteSin soporteSin soporteSin soporteSin soporte
-
-
- - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidFirefox Mobil (Gecko)IE MobilOpera MobilSafari Mobil
Soporte basicoSin soporte12.0 (12.0)Sin soporteSin soporteSin soporte
-
-

Ver también

- diff --git a/files/es/archive/b2g_os/api/telephonycall/number/index.html b/files/es/archive/b2g_os/api/telephonycall/number/index.html deleted file mode 100644 index 7ac9efa096..0000000000 --- a/files/es/archive/b2g_os/api/telephonycall/number/index.html +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: TelephonyCall.number -slug: Archive/B2G_OS/API/TelephonyCall/number -translation_of: Archive/B2G_OS/API/TelephonyCall/number ---- -

- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

-

This API is available on Firefox OS for internal applications only.

-

- -

Resumen

- -

El número de teléfono asociado con una llamada telefónica. Solo lectura.

- -

Sintaxis

- -
var phoneNum = window.navigator.mozTelephony.number;
-
- -

Valor

- -


- Una cadena (String) que indica el número asociado a la llamada. Esto puede ser o bien el número marcado durante una llamada saliente, o el número de teléfono informado por ID de llamada entrante.

- -
Nota: El valor devuelto es probablemente "" para llamadas de personas con identificador de llamadas bloqueadas. ¡Esto es solo una conjetura! Por favor actualice esto cuando lo sepa a ciencia cierta.
- -

Especificaciones

- -

No es una implementacion estandar, pero se dicute en el W3C como parte del Grupo de trabajo de aplicaciones del sistema.

- - - - - - - - - - - - - - - - -
EspecificaciónEstatusComentario
Web TelephonyDraftEditor Draft (WIP).
- -

Compatibilidad de navegador

- -

Por razones obvias, el apoyo se espera principalmente en los navegadores móviles.

- -

We're converting our compatibility data into a machine-readable JSON format. - This compatibility table still uses the old format, - because we haven't yet converted the data it contains. - Find out how you can help!

- -
- - -

- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte basicoSin soporteSin soporteSin soporteSin soporteSin soporte
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidFirefox Mobil (Gecko)IE MobilOpera MobilSafari Mobil
Soporte basicoSin soporte12.0 (12.0)Sin soporteSin soporteSin soporte
-
- -

See also

- - diff --git a/files/es/archive/b2g_os/api/telephonycall/onincoming/index.html b/files/es/archive/b2g_os/api/telephonycall/onincoming/index.html deleted file mode 100644 index 38514ab777..0000000000 --- a/files/es/archive/b2g_os/api/telephonycall/onincoming/index.html +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: TelephonyCall.onincoming -slug: Archive/B2G_OS/API/TelephonyCall/onincoming -translation_of: Archive/B2G_OS/API/TelephonyCall/onincoming ---- -

- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

-

This API is available on Firefox OS for internal applications only.

-

- -

Resumen

- -

Una referencia a una función que se llamará para manejar evento de incoming de la API de telefonía. Este evento se produce cuando se detecta una llamada entrante. El controlador de eventos se llama con un CallEvent como único parámetro.

- -

Sintaxis

- -
instanceOfTelephonyCall.onincoming = funcRef;
-
- -

Donde funcRef es una función que se llamara cuando se resiva una llamda entrante incoming. Estos eventos son de tipo CallEvent.

- -

Especificaciones

- -

No es una implementacion estandar, pero se discute en el W3C como parte del Grupo de trabajo de aplicaciones del sistema.

- - - - - - - - - - - - - - - - -
EspecificaciónEstatusComentario
Web TelephonyDraftEditor Draft (WIP).
- -

Compatibilidad de navegador

- -

Por razones obvias, el apoyo se espera principalmente en los navegadores móviles.

- -

We're converting our compatibility data into a machine-readable JSON format. - This compatibility table still uses the old format, - because we haven't yet converted the data it contains. - Find out how you can help!

- -
- - -

- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte basicoSin soporteSin soporteSin soporteSin soporteSin soporte
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidFirefox Mobil (Gecko)IE MobilOpera MobilSafari Mobil
Soporte basicoSin soporte12.0 (12.0)Sin soporteSin soporteSin soporte
-
- -

See also

- - diff --git a/files/es/archive/b2g_os/api/window/index.html b/files/es/archive/b2g_os/api/window/index.html deleted file mode 100644 index b5e3bcf899..0000000000 --- a/files/es/archive/b2g_os/api/window/index.html +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Window (Firefox OS extensions) -slug: Archive/B2G_OS/API/Window -tags: - - Navegado -translation_of: Archive/B2G_OS/API/Window ---- - - - - -

The Window interface represents a window containing a DOM document. This page represents the list of properties and methods added to Window on Firefox OS devices. For the list of properties and methods available to any Web sites, consult Window.

- -

Properties

- -
-
Window.onmoztimechange
-
Contains the event handler to be called whent the event moztimechange is sent.
-
- -

Methods

- -

There is no Firefox OS-specific method on the Window interface.

diff --git a/files/es/archive/b2g_os/application_development/index.html b/files/es/archive/b2g_os/application_development/index.html deleted file mode 100644 index 95eb0170fd..0000000000 --- a/files/es/archive/b2g_os/application_development/index.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Desarrollo de aplicaciones en Firefox OS -slug: Archive/B2G_OS/Application_development -translation_of: Archive/B2G_OS/Firefox_OS_apps/Building_apps_for_Firefox_OS ---- -

Las aplicaciones de Firefox OS no son mas que Open Web apps, esto es Aplicaciones HTML5, que estan instaladas en un dispositivo que ejecuta Firefox OS. Esto significa que puedes usar tus conocimientos que tienes actualmente sobre desarrollo front-end para crear aplicaciones que corran en los teléfonos Firefox OS.

-

Para más información sobre cómo desarrollar aplicaciones para Firefox OS en vez de sitios web puedes ver el tutorial Comenzando a construir aplicaciones. Desarrollar una aplicación para un sistema específico tiene algunas advertencias. Puedes obtener informaciton relevante sobre ellas en la guía: Escribiendo una aplicación web para B2G.

-

Una vez familiarizado con los puntos básicos, quizá puedas necesitar consultar la información sobre la API de Desarrollo de Aplicaciones. Para información básica sobre el desarrollo de apps en Firefox OS, puedes ver el Firefox Marketplace Developer Hub.

-

 

-
- Nota: Actualmente Firefox OS se identifica usando la misma cadena UA que Firefox para los sistemas Android, excepto sin la clausula Android. Por ejemplo: Mozilla/5.0 (Mobile; rv:15.0) Gecko/15.0 Firefox/15.0a1.
diff --git a/files/es/archive/b2g_os/apps/escribiendo_una_aplicacion_web_para_b2g/index.html b/files/es/archive/b2g_os/apps/escribiendo_una_aplicacion_web_para_b2g/index.html deleted file mode 100644 index e3ca09ccb8..0000000000 --- a/files/es/archive/b2g_os/apps/escribiendo_una_aplicacion_web_para_b2g/index.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Escribiendo una aplicación web para B2G -slug: Archive/B2G_OS/Apps/Escribiendo_una_aplicacion_web_para_B2G -tags: - - Firefox OS - - aplicaciones - - aplicación -translation_of: Web/Apps/Fundamentals/Quickstart ---- -

Las aplicaciones de B2G son solo aplicaciones Web escritas con HTML, CSS y JavaScript. Las puedes publicar en la Web tal como publicarías cualquier otro sitio Web. Con el fin de hacer instalable el sitio Web como una aplicación Web en el dispositivo, solo tienes que adornarlo con un manifiesto y conectar un botón de instalación tal como se explica a continuación.

-

Los siguientes temas son puntos de partida recomendados:

- -

Por supuesto, ¡no dudes en profundizar aún más en Open Web Apps!

-

Instalando la aplicación Web

-

Con la aplicación y el manifiesto publicados en la Web, necesitas hacer que Gecko sea conciente de ello. Al momento de la instalación, Gecko busca el manifiesto y agrega las entradas necesarias para la pantalla de inicio, etc.

-

Para instalar una aplicación, llamar a la  API navigator.mozApps.install. Aquí un ejemplo de un botón de instalación que podrías incluir en tu aplicación cuando la estas organizando:

-
<script>
-var manifest_url = "http://my.webapp.com/manifest.json";
-</script>
-
-<button onclick="navigator.mozApps.install(manifest_url); return false;">
-  ¡Instala esta impresionante aplicación en tu pantalla de inicio!
-</button>
-
-

Nota: El botón de instalación podría estar también en el app market, tal como el Firefox Marketplace, pero a menudo es muy importante tener un un botón "Instalar como una apliación web" en la página principal de tu sitio.

-

Ahora visita tu sitio web en el navegador de B2G y pulsa el botón de instalación.

diff --git a/files/es/archive/b2g_os/apps/index.html b/files/es/archive/b2g_os/apps/index.html deleted file mode 100644 index 83e26c0f3f..0000000000 --- a/files/es/archive/b2g_os/apps/index.html +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Creando Aplicaciones para Firefox OS -slug: Archive/B2G_OS/Apps -translation_of: Web/Apps/Fundamentals ---- -

Las aplicaciones para dispositivos Firefox OS son simplemente aplicaciones Web; ellas consisten enteramente de tecnologías Web abiertas como JavaScript, HTML, y CSS. Mientras nuestra documentación primaria para aplicaciones cubre casi todo lo que necesitas saber, aquí hay algunos documentos específicos para desarrollar y probar Firefox OS.

-
-
-

DOCUMENTACIón y tutoriales

-
-
- Escribiendo una aplicación web para Firefox OS
-
- Un tutorial para crear tu primera aplicación para Firefox OS.
-
- Experiencia de usuario
-
- Guías para ayudarte a desarrollar aplicaciones con experiencia de usuario consistente y atractiva, incluyendo ejemplos de código y plantillas.
-
- Tips y técnicas
-
- Una surtida variedad de tips y trucos (tanto como soluciones a los problemas) que nuestros desarrolladores sugieren para ti.
-
-

Ver más...

-
-
-

recibiendo ayuda de la comunidad

-

¿Necesitas ayuda en un problema relacionado con tu aplicación y no encuentras la solución en la documentación?

- -

No olvides la etiqueta de la red...

-

Herramientas

- -

Ver más...

- - -
-
-

 

diff --git a/files/es/archive/b2g_os/architecture/index.html b/files/es/archive/b2g_os/architecture/index.html deleted file mode 100644 index 875eac916d..0000000000 --- a/files/es/archive/b2g_os/architecture/index.html +++ /dev/null @@ -1,759 +0,0 @@ ---- -title: Arquitectura del Sistema Operativo Firefox OS -slug: Archive/B2G_OS/Architecture -translation_of: Archive/B2G_OS/Architecture ---- -
-

Este artículo es un panorama de alto nivel de la arquitectura de la plataforma Firefox OS, que introduce conceptos fundamentales y explica cómo sus componentes interactúan a un nivel básico.

-
- -
-

Nota: recuerda que Firefox OS todavía se encuentra en estado de pre-lanzamiento. La arquitectura descrita aquí no necesariamente es la final y que otros elementos todavía pueden estar sujetos a cambios.

-
- -

Terminología de Firefox OS

- -

Existen algunos términos que debes entender antes de continuar leyendo nuestra documentación sobre Firefox OS.

- -
-
B2G
-
Sigla de Boot to Gecko.
-
Boot to Gecko
-
El nombre código de ingeniería para el sistema operativo Firefox OS.
-
Firefox OS
-
Es básicamente la marca y servicios de soporte de Mozilla (y sus socios de OEM) aplicados sobre Boot to Gecko para crear el producto final de lanzamiento.
-
Gaia
-
La interfaz de usuario de la plataforma Firefox OS. Cualquier cosa dibujada en la pantalla una vez que Firefox OS ha sido iniciado es un producto de la capa Gaia. La misma implementa la pantalla de seguridad (lock screen), pantalla principal (home screen) y todas las aplicaciones estándares de cualquier teléfono inteligente moderno. Gaia se implementa en su totalidad empleando HTML, CSS y JavaScript. Las interfaces subyacentes al sistema operativo son Web APIs de código abierto, que se implementan por medio de la capa Gecko. Las aplicaciones de terceros se pueden instalar en paralelo con la capa Gaia.
-
Gecko
-
Este es el runtime de aplicaciones de Firefox OS, es decir, la capa que provee todo el soporte para el trío de estándares de código abierto: HTML, CSS y JavaScript. Es responsable de que esas APIs funcionen bien en cualquier sistema operativo soportado por Gecko. Esto implica que Gecko incluya, además de otras cosas, paquetes de redes y de gráficos, un motor de diagramación, una máquina virtual de JavaScript y capas de adaptación (porting).
-
Gonk
-
Gonk es el sistema operativo de bajo nivel de la plataforma Firefox OS que consiste un núcleo/kernel Linux (basado sobre el Android Open Source Project (AOSP)) y una capa de abstracción de hardware de espacio de usuario (HAL por su sigla en inglés). El kernel y varias de las librerías de espacio de usuario son proyectos comunes de código abierto: Linux, libusb, bluez, y sucesivos. Algunas de las otras partes de la HAL se comparten con la AOSP: GPS, cámara y otros. Se podría decir que Gonk es una distribución de Linux muy sencilla. Gonk es una capa de adaptación (port) de dispositivos: un adaptador entre el hardware y Gecko. Gonk es una distribución de Linux bastante sencilla que puede ser tratada como un adaptador Gecko empardado con capas de adaptación Gecko —entonces Gonk es un objetivo para adaptar Gecko a Firefox OS así como también hay adaptadores de Gecko para OS X, Windows y Android. Como el Proyecto Firefox OS goza de control total sobre Gonk, podemos exponer interfaces a Gecko que no podrían ser expuestas en otros sistemas operativos. Por ejemplo, Gecko posee a través de Gonk acceso directo al conjunto completo de telefonía y al buffer de pantalla pero no tiene este acceso en otros sistemas operativos.
-
Jank
-
Este término, generalmente empleado en el área de las aplicaciones móviles, se refiere al efecto causado por código lento o ineficiente en una aplicación, que podría bloquear la actualización de la interfaz de usuario y provocar su lentitud o que no responda. Nuestros ingenieros de Gaia se valen de numerosas técnicas de optimización para evitar esto lo mejor posible.
-
- -

Diagrama estructural

- -

Firefox OS Architecture

- -

Procedimiento de arranque de Firefox OS

- -

Esta sección describe el proceso por el que los dipositivos con Firefox OS arrancan (butean), cuáles partes están involucradas en el proceso y dónde. A modo de referencia rápida, el flujo del arranque general del sistema va desde los cargadores de arranque (bootloaders) en el espacio del núcleo/kernel al init en el código nativo, a B2G y después a Geko en el espacio de usuario y después finalmente a la aplicación de sistema, gestor de ventanas y posteriormente a la pantalla de inicio de la aplicación en Gecko. Sobre ese conjunto se ejecutan todas las otras aplicaciones.

- -

- -

El proceso de arranque encadenado (bootstrapping)

- -

Cuando un dispositivo con FirefoxOS se enciende, la ejecución se inicia en el cargador del arranque primario (bootloader). Desde allí, el proceso de la carga del SO principal procede normalmene; una sucesión de arranques de jerarquías crecientes inicia el siguiennte arranque en la cadena. Al final del proceso, se delega la ejecución al núcleo/kernel Linux.

- -

Hay algunos puntos destcables sobre el proceso de arranque:

- - - -

El kernel Linux

- -

El núcleo Linux empleado por Gonk es muy similar a la versión de Linux difundida (upstreamed) de la que deriva (basada sobre el Android Open Source Project). Existen cambios hehos por el AOSP que todavía no han sido difundidos. Además, los fabricantes y vendedores a veces modifican el núcleo y cargan esos cambios a la versión de difusión de acuerdo con su intinerario. En términos generales, el núcleo Linux es muy parecido al original.

- -

El proceso de arranque de Linux se encuentra bien documentado en la internet por lo tanto este artículo no lo cubrirá.

- -

El núcleo Linux activará dispositivos y ejecutará procesos esenciales definidos en init.rc y su sucesor init.b2g.rc para arrancar procesos esenciales como b2g [procesos básicos de Firefox OS, contenedores de Gecko] y rild [un proceso relacionado con la telefonía que puede ser específico de cada chip] —vaya más abajo para ver más detalles. Al final del proceso, un proceso init de espacio de usuario (userspace) se lanza, como ocurre en la mayoría de los sistemas operativos del tipo UNIX.

- -

Una vez que el proceso init se ha lanzado, el núcleo Linux administra las llamadas del sistema desde el espacio de usuario, las interrupciones y semejantes desde los dispositivos de hardware. Algunas de las características de hardware se exponen al espacio de usuario a través de sysfs. Por ejemplo, aquí hay un fragmento de código que lee el estado de la batería en 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);
-}
- -

Más sobre el proceso init

- -

El proceso init en Gonk gestiona el montaje de los archivos de sistema requeridos y activa los procesos de systema. Después de eso, se mantiene activo como gestor de procesos. Esto es muy similar al init en otros sistemas operativos similares a UNIX. Interpreta scripts [los archivos init.rc] que consisten de comandos que describen lo que debería ser hecho para iniciar servicios varios. El init.rc de FirefoxOS suele ser el init.rc original de Android para ese dispositivo, parchado para incluir los requisitos de arranque de FirefoxOS, y varía de dispositivo a dispositivo.

- -

Una de las tareas fundamentales que maneja el proceso init es el inicio del proceso b2g; éste es el núcleo del sistema operativo FirefoxOS.

- -

El código para tal init.rc es el siguiente:

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

Nota: las variaciones de init.rc dependerán de dispositivo a dispositivo; a veces init.b2g.rc sólo es anexadoo, y a veces los parches son más significativos.

-
- -

Arquitectura de los procesos del espacio de usuario (userspace)

- -

Resulta muy útil echar un vistazo de alto nivel a cómo varios componentes del Firefox OS se articulan e interactúan entre sí. Este diagrama muestra los procesos primarios de espacio de usuario en Firefox OS.

- -

Userspace diagram

- -
-

Nota: recuerda que como Firefox OS se encuentra en desarrollo activo, este diagrama puede estar sujeto a cambios y puede ser impreciso parcialmente.

-
- -

El proceso b2g es el proceso primario de sistema. Se ejecuta con privilegios altos; tiene acceso a la mayoría del hardware. b2g se comunica con el módem, almacena en el buffer de pantalla e interactúa con el GPS, cámaras y otros dispositivos. Internamemte, se ejecuta con una capa de Gecko (implementada por libxul.so). Ver Gecko para más detalles sobre cómo funciona la capa Gecko y cómo b2g se comunica con ella.

- -

b2g

- -

El proceso b2g puede dar lugar a un número de procesos de contenido de privilegios limitados. Estos procesos albergan la carga de aplicaciones web y otros contenidos. Estos procesos se comunican con el proceso principal del servidor Gecko a través de IPDL, un sistema de envio de mensajes.

- -

El proceso b2g ejecuta lixbul, el cual referencia a b2g/app/b2g.js para obtener las preferencias de fábrica. De las preferencias se abrirá el archivo HTML descriptor b2g/chrome/content/shell.html, que es compilado en un archivo omni.ja. El shell.html incluye el archivo b2g/chrome/content/shell.js , que dispara la aplicación system de Gaia.

- -

rild

- -

El proceso rild es la interfaz del proceso del módem. rild es el daemon que implementa La capa de Interfaz de la Radio [Radio Interface Layer (RIL)]. Es un componente de codigo cerrado implementado por el fabricante/vendedor de hardware para comunicarse con el hardware del módem. rild hace posible que el código cliente se comunique con un empalme de dominio-UNIX al que se enlaza. Se inicia con un código como este en el init script:

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

rilproxy

- -

En Firefox OS, el cliente rild client es el proceso rilproxy. Este actúa como un proxy de reenvio mudo (dumb proxy) entre rild y b2g. Este proxy es necesario como un detalle de implementación; es de hecho necesario. El código de rilproxy se encuentra en GitHub.

- -

mediaserver

- -

El proceso mediaserver controla la reproducción de audio y video. Gecko se comunica con él a través de un mecanismo de Llamada de Procedimiento Remota de Android [Android Remote Procedure Call (RPC)]. Algunos de los contenidos multimedia que Gecko puede reproducir (OGG Vorbis audio, OGG Theora video, y WebM video) son decodificados por Gecko y enviados directamente al proceso mediaserver. Otros archivos multimedia son decodificados por libstagefright, que puede acceder códecs del fabricante y codificadores del hardware.

- -
-

Nota: El proceso mediaserver es un componente "provisional" de Firefox OS; existe sólo para ayudar en el trabajo de desarrollo inicial pero se espera que se descarte con el tiempo; lo que seguramente no ocurrirá antes de la version 2.0 de Firefox OS.

-
- -

netd

- -

El proceso netd se usa para configurar interfaces de red.

- -

wpa_supplicant

- -

El proceso wpa_supplicant process es el daemon estándar tipo UNIX que maneja la conectividad con los puntos de acceso WiFi.

- -

dbus-daemon

- -

El dbus-daemon implementa el D-Bus, un sistema de mensajes de bus que Firefox OS emplea para las comunicaciones por Bluetooth.

- -

Gecko

- -

Gecko, como se lo mencionó previamente, es la implementación de estándares web (HTML, CSS, y JavaScript) que se usa para implementar todos lo que el usuario ve en Firefox OS, y controlar las interacciones con el hardware del telefono.

- -

Las aplicaciones Web conectan HTML5 con el hardware de forma controlada a traves de API's web seguras, implementadas en Gecko. Las API's Web proveen de acceso programado a las caracteristicas implicitas en el hardware del dispositivo (como la bateria, o la vibracion), a medida que los datos son guardados, o estan disponibles, en el dispositivo. El contenido web invoca a las API's web accesibles con HTML5.

- -

Una app consiste en una coleccion de codigos web HTML5 relacionados. Para construir aplicaciones web que funcionen en dispositivos Firefox OS, los desarrolladores simplemento ensamblan, empaquetan y distribuyen este contenido web. En tiempo de ejecucion, este contenido web es interpretado, compilado y renderizado en una navegador web. Para mas informacion sobre Apps, puedes consultar el App Center

- -
-

Note: Para buscar en la base de código de Gecko, se puede usar http://dxr.mozilla.org. Es más elegante y ofrece buenas características de referemcias. pero con repositorios limitados. También podría usar el tradicional http://mxr.mozilla.org, que contiene más proyectos de Mozilla.

-
- -

Diagrama de arquitectura de Gecko

- -

- -

 

- - - -

 

- -

Archivos de Gecko relacionados con Firefox OS

- -

b2g/

- -

La carpeta b2g contiene es su mayoría funciones relacionadas con Firefox OS.

- -
b2g/chrome/content
- -

Contiene archivos de Javascript ejecutados sobre la aplicación de sistema.

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

El punto de entrada a Gaia — el HTML para la aplicación de sistema. shell.html toma de settings.js and shell.js:

- -
 
- -

settings.js contiene parámetros de configuración básicos (default) de sistema.

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

shell.js es el primer script que se carga en la aplicación de sistema de Gaia.

- -

shell.js importa todos los módulos requeridos, registra los detectores de clave (key listeners), define sendCustomEvent y sendChromeEvent para que se cominiquen con Gaia, y provee ayudantes de instalación de aplicaciones web: indexedDB quota, RemoteDebugger, ayudante de teclado, y la herramienta para captura de pantalla.

- -

Pero la función más importante de shell.js es lanzar la aplicación de sistema de Gaia, después entregarle todo el trabajo general de administración del sistema.

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

Este script contiene configuraciones predefinidas, como about:config en el navegador, y la misma que Gaia's pref.js. Estas configuraciones se pueden cambiar desde la aplicación de congifuraciones y se pueden sobreescribir con user.js en el script de construcción Gaia.

- -

dom/{API}

- -

Nuevas implementaciones de la API (post-b2g) se localizarán en dom/. Las APIs anteiores se localizarán en dom/base, for example Navigator.cpp.

- -
dom/apps
- -

.jsm se cargarán implementaciones de API — .js API tales como webapp.js install, getSelf, etc.

- -
dom/apps/PermissionsTable.jsm
- -

Se definen todos los permisos en PermissionsTable.jsm

- -

dom/webidl

- -

WebIDL es el lenguaje empleado para definir web APIs. La información sobre los atributos soportados se encuentra en WebIDL_bindings.

- -

hal/gonk

- -

Este directorio contiene archivos sobre la capa de adaptación gonk..

- -

Archivos generados

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

Contiene todos los archivos de configuración.

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

Contiene el paquete de estilos para los recursos en el dispositivo.

- -

Proceso de eventos de ingreso

- -

La mayor parte de las acciones en Gecko se activan por acciones de usuario. Estas acciones son representadas por eventos de emtrada (tales como presionar botones, tocar la pantalla y similar). Estos eventos entran a Gecko a través de Gonk implementation perteneciente a nsIAppShell, que es una interfaz de Gecko empleada para representar los puntos de entrada primaria de una aplicación de Gecko, es decir, el controlador del dispositivo de ingreso llama métodos en el objeto nsAppShell que representa el subsistema de Gecko para así enviar eventos a la interfaz de usuario.

- -

 

- -

Por ejemplo:

- -

 

- -
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();
-}
- -

Estos eventos provienen del sistema estándar Linux input_event. Firefox OS emplea light abstraction layer sobre eso; lo que provee algunas características útiles como filtrar los eventos. Se puede ver el código que crea eventos de ingreso en el método EventHub::getEvents() que se encuentra en widget/gonk/libui/EventHub.cpp.

- -

Un vez que Gecko recivió los eventos, se envían a DOM por 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);
-}
-
- -

Después de lo anterior, los eventos son consumidos por el propio Gecko o despachados a aplicaciones web como Eventos DOM para ser procesados posteriormente.

- -

Graficos

- -

En si nivel más inferior, Gecko emplea OpenGL ES 2.0 para establecer un contexto GL que envuelva los buffers del hardware. Esto es realizado en la implementación de Gonk en nsWindow por medio de un código similar a este:

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

La clase FramebufferNativeWindow es obtenida directamente desde Android; ver FramebufferNativeWindow.cpp. Este emplea la API de gralloc para acceder al controlador de gráficos con el fin de mapear los buffers del dispositivo framebuffer a la memoria del dispositivo.

- -

Gecko emplea su sistema (de) Layers para componer contenido dibujado en la pantalla. En resumen, ocurre lo siguiente:

- -
    -
  1. Gecko dibuja regiones distintas de las páginas en los buffers de memoria, A veces, estos buffers están en la memoria del sistema; otras veces, son texturas mapeadas en el espacio de direcciones de Gecko, lo que siginifica que Gecko está dibujando directamente en la memoria de video. Esto se realiza generalmente en el método BasicThebesLayer::PaintThebes().
  2. -
  3. Entonces, Gecko, compone todas estas texturas en la pantalla empleando comandos OpenGL. Esta composición tiene lugar en ThebesLayerOGL::RenderTo().
  4. -
- -

Los detalles de cómo Gecko maneja el muestreo (rendenring) de contenido web se encuentra fuera del alcance de este documento.

- -

Capa de Abstracción de Hardware (HAL)

- -


- La capa de abstracción de hardware de Gecko es una de sus capas de adaptación (porting). Gestiona los accesos de bajo nivel a las interfaces del sistema a lo largo de múltiples plataformas usando una API de C++ accesible desde los niveles superiores de Gecko. Estas APIs son implementadas plataforma a plataforma dentro de la HAL de Gecko. Esta capa de abstracción de hardware no es expuesta directamente a código JavaScript dentro de Gecko.

- -

Cómo funciona HAL

- -

Vamos a considerar la API Vibration como ejemplo. la HAL para esta API se define en hal/Hal.h. Resumiendo (simplificando el método de firma para hacerlo más claro), tienes esta función:

- -
void Vibrate(const nsTArray &pattern);
- -

Esta es la función que el código de Gecko llama par activar la vibración del dispositivo de acuerdo con un patrón específico; una función correspondiente existe para cancelar la vibración activa. La implementación de GONK para este método está en hal/gonk/GonkHal.cpp:

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

Este código envía la petición para el inicio de la vibración a otro conjunto de procesos, que se implementa en VibratorRunnable::Run(). El bucle principal de este hilo seria parecido a esto:

- -
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() es la API HAL de GONK que enciende el motor de vibración. Internamente, este método envía un mensaje al controlador de núcleo (kernel driver) al escribir un valor en un objeto de kernel empleando sysfs.

- -

Implementaciones de la Fallback HAL API

- -


- Las APIs HAL de Gecko tienen soporte en todas las plataformas. Cuando se construye Gecko para una plataforma que no expone una interfaz a los motores de vibración (como una computadora de escritorio) entonces se vale de una implemenación de fallback de la API de HAL. Para la vibración, este esta implementado en hal/fallback/FallbackVibration.cpp.

- -
void Vibrate(const nsTArray &pattern) {
-}
- -

Implementaciones de Sandbox (entorno cerrado)

- -

Debido a que la mayoría del contenido de la red se ejecuta en procesos de contenido con privilegios bajos, no podemos suponer que esos procesos tienen los privilegios necesarios para poder (por ejemplo) activar o desactivar el motor de vibración. Además, queremos tener una ubicación central para controlar las posibles condiciones de carrera (race conditions). En la HAL de Gecko, esto es realizado por medio de la implementación de una sandbox de la HAL. Esta sandbox simplemente funciona como un proxy para la peticiones realizadas por los procesos de contenido y las reenvía al proceso del "servidor Gecko". Las peticiones de proxy se envían empleando IPDL.

- -

Para la vibración, la función Vibrate() se encarga de la gestión y se la implementa en hal/sandbox/SandboxHal.cpp:

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

Esto envía un mensaje definido por la interfaz PHal, descrita por IPDL en hal/sandbox/PHal.ipdl. El método se describe aproximadamente de la siguiente manera:

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

El receptor de este mensaje es la HalParent::RecvVibrate() method in hal/sandbox/SandboxHal.cpp, el cual seria algo parecido a esto:

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

Este omite algunos detalles que no son relevantes a este punto pero, en cualquier caso, demuestra cómo el mensaje progresa desde un proceso de contenido a través de Gecko hasta Gonk, luego a la implementación de la HAL de Gonk Vibrate(), y finalmente al controlador de vibración.

- -

APIs DOM

- -

Las interfaces DOM son, esencialmente, la forma en la que el contenido web se comunica con Gecko. Hay más información al respecto y, si estás interesado en detalles extras, puedes leer sobre el DOM. Las interfaces DOM se definen empleando IDL, que compone una interfaz de función foránea (foreign function interface, FFI) y un objeto modelo (OM) entre JavaScript y C++.

- -

La API de vibración se expone al contenido web por medio de una interfaz IDL, que se la provee en nsIDOMNavigator.idl:

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

El argumento jsval indica que mozVibrate() (que es nuestra implementación vendedor-prefijada de esta especificación no finalazida de vibración) acepta como ingreso cualquier valor de JavaScript. El compilador IDL, xpidl, genera una interfaz C++ que entonces se implementa por la clase Navigator en Navigator.cpp.

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

Hay mucho más código en este método de lo que ves aquí, pero no es importante para el proposito que estamos tratando. El hecho es que la llamada a hal::Vibrate() transfiere el control de DOM a la HAL Gecko. Desde allí, entramos a la implementación de HAL tratada en la sección previa y continuamos hacia el controlador. Además, la implementación DOM no se preocupa por la plataforma en la que está corriendo (Gonk, Windows, OS X, o cualquier otra). Tampoco le interesa si el código está corriendo en un proceso de contenido o en un proceso del servidor Gecko. Esos detalles se dejan de lado para que los gestionen los procesos de nivel bajo del sistema.

- -

La API de vibración es muy simple, lo que la convierte un ejemplo excelente. La API de SMS es más compleja porque emplea su propia capa de envío remoto que conecta los procesos de contenido con el servidor.

- -

Capa de Interfaz de Radio (CIR/RIL)

- -

La RIL (Radio Interface Lyer) ya se mencionó en la sección The userspace process architecture. Esta sección examinará con más detalle cómo las diferentes partes de esta capa interactúan.

- -

Los componentes principales involucrados en la RIL son los siguientes:

- -
-
rild
-
El daemon que habla al firmware del módem de fábrica.
-
rilproxy
-
El daemon que referencia mensajes (proxy) entre rild y Gecko (que está implementado en el proceso b2g). Esto soluciona el problema de permisos que surje cuando se trata de comunicar con rild directamente ya que sólo se puede comunicar con rild desde el grupo radio.
-
b2g
-
Este proceso, también conocido como el proceso chrome, implementa Gecko. Las partes de el que se relacionan con la Capa de Interfaz de Radio son dom/system/gonk/ril_worker.js, las cuales implementan una cadena de procesos de trabajo (worker thread) que se comunica con rild a través de rilproxy es implementa el estadio radial (radio state machine) y la interfaz nsIRadioInterfaceLayer, que es el servicio XPCOM de la cadena de procesos principal, que actúa principalmente como un intercambio de mensajes entre la cadena ril_worker.js y otros numerosos componentes de Gecko, incluidos el proceso de contenido de Gecko.
-
Proceso de contenido de Gecko (Gecko's content process)
-
Dentro del proceso de contenido de Gecko, la interfaz nsIRILContentHelper provee un servicio XPCOM que permite a algunas partes de código implementado de DOM, tales como las APIs Telephony y SMS, comunicarse con la interfaz de radio, la cual es un proceso chrome.
-
- -

Ejemplo: comunicación desde rild a DOM

- -

Echemos una mirada al ejemplo de cómo las partes del nivel inferior del sistema se comunican con código DOM. Cuando el módem recibe una llamada entrante, la notifica a rild empleando un mecanismo de fábrica. entonces rild prepara un mensaje para su cliente de acuerdo con el protocolo "open", que se describe en ril.h. En el caso de una llamada entrante, se genera un mensaje RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED y lo envía rild a rilproxy.

- -

rilproxy, implementada en rilproxy.c, recibe este mensaje en bucle principal, que envía (poll) la conexión a rild utilizando código como éste:

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

Una vez que el mensaje es recibido por rild, se lo reenvía a Gecko en el empalme que conecta rilproxy con Gecko. Gecko recibe el mensaje enviado en su IPC thread:

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

El consumidor de estos mensajes es SystemWorkerManager, que reempaqueta los mensajer y los envía a la cadena ril_worker.js que implementa la máquina de estado RIL; que se realia en the RILReceiver::MessageReceived() method:

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

La tarea postada en esa cadena a su vez llama la función onRILMessage(), que se implemente en JavaScript. Esto se realiza empleando la función JS_CallFunctionName() de la API de JavaScript:

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

onRILMessage() está implementada en dom/system/gonk/ril_worker.js, que procesa los bytes del mensaje y los corta en fragmentos. Cada fragmento completo se envía a métodos de gestión (handler) individuales apropiadamente:

- -
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);
-  }
-}
-
- -

Este código trabaja por medio del tipo de petición (request) del objeto, asegurándose de que sea definido como una función en código de JavaScript, para después llamar al método. Ya que ril_worker.js implementa cada tipo de petición (request type) en un método con el mismo nombre que el tipo de petición, es muy sencillo.

- -

En nuestro ejemplo RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, se llama al siguiente handler:

- -
RIL[UNSOLICITED_RESPONSE_CALL_STATE_CHANGED] = function UNSOLICITED_RESPONSE_CALL_STATE_CHANGED() {
-  this.getCurrentCalls();
-};
- -

Como puedes ver en el código de más arriba, cuando se recibe la notificación que el estado de la llamada ha cambiado, la máquina de estado (state machine) simplemente trae para sí el estado actual de la llamafa invocando el método getCurrentCall():

- -
getCurrentCalls: function getCurrentCalls() {
-  Buf.simpleRequest(REQUEST_GET_CURRENT_CALLS);
-}
- -

Esto envía una petición de vuelta a rild para solicitar el estado de todas las llamadas actuales. La petición regresa por un camino similar al que siguió el mensaje RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED message pero en la dirección opuesta (es decir, desde ril_worker.js a SystemWorkerManager a Ril.cpp, después a rilproxy y finalmente al rild socket). rild responde por el camino inverso y la respuesta llega al handler de ril_worker.js's handler para el mensaje REQUEST_GET_CURRENT_CALLS. Así es como se da lugar la comunicación bidireccional.

- -

El estado de la llamda se procesay compara con el estado previo; si hay un cambio de estado, ril_worker.js notifica al servicio nsIRadioInterfaceLayer de la cadena principal:

- -
_handleChangedCallState: function _handleChangedCallState(changedCall) {
-  let message = {type: "callStateChange",
-                 call: changedCall};
-  this.sendDOMMessage(message);
-}
- -

Se implementa nsIRadioInterfaceLayer en dom/system/gonk/RadioInterfaceLayer.js; se recibe el mensaje por su método onmessage():

- -
 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;
-   ...
-
- -

Lo que todo esto realmente hace es enviar el mensaje al proceso de contenidos empleando el Administrador de Mensajes de Procesos Principales [Parent Process Message Manager (PPMM)]:

- -
handleCallStateChange: function handleCallStateChange(call) {
-  [some internal state updating]
-  ppmm.sendAsyncMessage("RIL:CallStateChanged", call);
-}
- -

En el proceso de contenidos, el mensaje es recibido por el método receiveMessage() en el servicio nsIRILContentHelper, del Administrador de Mensajes de Procesos Secundarios [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;
- -

Esto, a su vez, llama a los métodos nsIRILTelephonyCallback.callStateChanged() de cada uno de los objetos registrados de las respuesta de telefonía (registered telephony callback object). Cada aplicación web que accede la API window.navigator.mozTelephony API ha registrado uno de ese tipo de objeto que envía los eventos al código JavaScript code en la aplicación web, así sea como un cambio de estado de un objeto de llamada existente o un nuevo evento de llamada incoming.

- -
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 call =
-          TelephonyCall::Create(this, aNumber, aCallState, aCallIndex);
-  nsRefPtr event = CallEvent::Create(call);
-  nsresult rv = event->Dispatch(ToIDOMEventTarget(), NS_LITERAL_STRING("incoming"));
-  NS_ENSURE_SUCCESS(rv, rv);
-  return NS_OK;
-}
- -

Las aplicaciones pueden recibir estos eventos y actualizar su interfaz de usuario:

- -
handleEvent: function fm_handleEvent(evt) {
-  switch (evt.call.state) {
-    case 'connected':
-      this.connected();
-      break;
-    case 'disconnected':
-      this.disconnected();
-      break;
-    default:
-      break;
-  }
-}
- -

Echa una mirada a la implementación de handleEvent() in the Dialer application como un ejemplo más.

- -

Datos 3G

- -

Hay un mensaje RIL que inicia una "petición de datos" al servicio móvil; este activa el modo de transferencia de datos en el modem. Esta petición de datos termina creando y activando una interfaz Point-to-Point Protocol (PPP) en el kernel Linux que pueden ser configuradas usando las interfaces comunes.

- -
-

Nota: Esta sección necesita ser redactada

-
- -

APIs relacionadas con DOM

- -

Esta sección lista las APIs de DOM que estan relacionadas con comunicaciones RIL.

- - - -

WiFi

- -

El backend de WiFi para Firefox OS simplemente usa wpa_supplicant para hacer la mayor parte del trabajo.
- Esto significa que el principal trabajo del backend es simplemente gestionar el supplicant, y hacer algunas tareas auxiliares como cargar el driver del WiFI y activar o desactivar la interfaz de red.
- En resumen, esto significa que el backend es una maquina de estados, con los estados que indican el estado del supplicant.

- -
-

Note: Muchas cosas interesantes que suceden en WiFi dependen profundamente de posibles cambios de estado en el proceso wpa_supplicant.

-
- -

La implementación del componente WiFi esta dividida en dos archivos.

- -
-
dom/wifi/DOMWifiManager.js
-
Implementa lo que la API muestra al contenido web, tal como esta definido en nsIWifi.idl.
-
dom/wifi/WifiWorker.js
-
Implementa la máquina de estados y el código que controla el supplicant.
-
- -

Estos dos archivos se comunican con otro usando el gestor de mensajes.
- El backend escucha los mensajes que requieran una determinada acción, como "asociar" y responde con una mensaje cuando la acción requerida ha sido completada.

- -

El lado del DOM escucha los métodos de respuesta, asi como muchos mensajes de eventos que indican cambios de estado y actualización de información.

- -
-

Note: Algunas API's síncronas de DOM son implementadas leyendo datos en el otro extremo de la tubería. Los mensajes síncronos son evitados siempre que es posible

-
- -

WifiWorker.js

- -

Este archivo implementa la logica principal detras de la interfaz WiFi. Se ejecuta en el proceso chrome (en construcciones multiproceso) y es instanciado por el SystemWorkerManager. El fichero es generalmente dividido en dos secciones: una gigantesca funcion anonima y WifiWorker (y su prototipo). La funcion anonima termina siendo el WifiManager proveyendo una API local, incluyendo notificaciones para eventos como una conexion al supplicant y escaneando los resultados cuando estan disponibles. En general. este contiene la logica simple y manda a su control exclusivo de consumidor sus acciones mientras estas simplemente responden a la informacion requerida y controla los detalles de la conexion con el supplicant.

- -

El objeto WifiWorker se situa entre el WifiManager y el DOM. Este reacciona a eventos y los sigue al DOM; a su vez, este recibe las peticiones del DOM y realiza las acciones apropiadas en el supplicant. Este tambien mantiene informacion sobre el supplicant y lo siguiente que necesita hacer.

- -

DOMWifiManager.js

- -

Este implementa la API de DOM, transmitiendo mensajes hacia atras y llamadas de regreso y el actual WiFi worker. Hay muy poca logica envuelta aqui.

- -
-

Nota: Para poder permitir mensajes sincronos al proceso chrome, el WiFi Manager necesita cachear el estado basado en el envio recibido.

-
- -

Hay un solo mensaje sincrono, el cual es enviado en cuanto la API DOM se instancia, para poder obtener el estado actual del supplicant.

- -

DHCP

- -

DHCP y DND van de la mano con dhcpcd, el cliente DHCP estandar en Linux.
- Sin embargo, este no permite reaccionar cuando la conexion de red se pierde.
- Por eso, Firefox OS mata y reinicia dhcpcd cada vez que se conecta a una red inalambrica dada.

- -

dhcpcd es tambien responsable de ajustar la ruta por defecto; nosotros llamamos al gestor de redes para informar al kernel sobre los servidores DNS.

- -

Gestor de Redes

- -

El Gestor de Redes configura las interfaces de red abiertas por los datos 3G y los componentes WiFi

- -
-

Nota: Esto necesita ser redactado.

-
- -

Procesos e hilos

- -

Firefox OS usa los hilos de POSIX para implementar todos los hilos de las aplicaciones - esto incluye los hilos principales de cada aplicación asi como los trabajadores web y los hilos de ayuda. Los grupos de control son usados para priorizar procesos e hilos de ejecución que dependen del planificador completamente justo del kernel Linux. Dependiendo del estado del proceso le asignaremos un grupo de control distinto. Actualmente tenemos 6 niveles de prioridad correspondientes a 5 grupos de control

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Process priority levels
PriorityNiceUsed for
MASTER0proceso principal de b2g
FOREGROUND_HIGH0aplicaciones criticas que sostienen la cpu y el wakelock de alta prioridad.
- Este es actualmente reservado para el reloj y las aplicaciones de comunicacion
FOREGROUND1aplicaciones en primer plano
FOREGROUND_KEYBOARD1aplicacion de teclado
BACKGROUND_PERCEIVABLE7aplicaciones en segundo plano que ejecuten audio o sostengan la CPU o el wakelock de alta prioridad y tengan al menos un controlador de mensajes de sistema registrado
BACKGROUND_HOMESCREEN18aplicacion de pantalla principal
BACKGROUND18resto de aplicaciones que se ejecuten en segundo plano
   
- -

Algunos niveles comparten el mismo grupo de control, esto es asi porque dichos niveles actualmente difieren en la manera que son tratados por el liberador de memoria. Todas las prioridades pueden ser ajustadas en tiempo de ejecucion mediante preferencias; las entradas relativas a esto se pueden encontrar en el b2g/app/b2g.js file.

- -

Actualmente se usan los siguientes grupos de control:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Grupos de Control
RutaOcupación de la CPUDescripción
 50% del tiempo total de CPUGrupo de control de Root reservado para el proceso principal de b2g y los servicios del sistema
apps50% del tiempo total de CPUAplicaciones comunes
apps/critical95% de las appsAplicaciones criticas
apps/bg_perceivable10% de las appsAplicaciones perceptibles en segundo plano
apps/bg_non_interactive5% de las appsAplicaciones en segundo plano
- -
-

Nota: para mas informacion sobre el liberador de memoria, y como Firefox OS gestiona las situaciones de memoria baja, lease Out of memory management on Firefox OS

-
- -

Sin un proceso, el hilo principal hereda el "valor seguro" del proceso, mientras que los procesos web en curso toman un "valor seguro" que es un punto mas alto que el hilo principal, que corre la prioridad mas baja.
- Esto esta hecho para prevenir que los ciclos intensivos en curso de la CPU ralenticen excesivamente el hilo principal. Todos los hilos de una aplicación son actualmente asignados al mismo grupo de control. Las prioridades de los procesos son cambiadas cuando un evento importante sucede, como cuando una aplicación cambia de segundo plano al primer plano, o una nueva aplicación inicia, o una aplicación acapara la CPU.

- -
-

Nota: los cgroups soportados en dispositivos ICS estan actualmente rotos debido a un bug del kernel.

-
- -

 

diff --git a/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/dispositivos_compatibles/index.html b/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/dispositivos_compatibles/index.html deleted file mode 100644 index 009e1c5ab5..0000000000 --- a/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/dispositivos_compatibles/index.html +++ /dev/null @@ -1,360 +0,0 @@ ---- -title: Dispositivos compatibles -slug: Archive/B2G_OS/Building_and_installing_Boot_to_Gecko/Dispositivos_compatibles -translation_of: Archive/B2G_OS/Building_and_installing_B2G_OS/Compatible_Devices ---- -
-

Instalar B2G OS en tu dispositivo es fácil con el instalador de B2G (Add-on de Firefox)

-
- -
-

Nota: Todos los dispositivos tienen debajo de su nombre (ver el nombre). Por ejemplo para construir la imagen para Nexus 6 haz ./build.sh nexus-6-1. Los nombres en código de los dispositivos es proporcionado por los fabricantes. Puedes encontrar el archivo build.prop en una ROM stock.

-
- -

Dispositivos de Desarrollo

- -

Estos dispositivos son de referencia oficial para el desarrollo de B2G

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Imagen
Nombre
- (Versión android)
Z3 Compact (Kitkat)
- Sony Shinano platform
Z3 (Kitkat)
- Sony Shinano platform
Flame (Kitkat)
Nombre en códigoaries-kkleo-kkflame-kk
Información de construcción e instalaciónhttps://discourse.mozilla-community.org/t/building-b2g-os-for-aries-z3c/8082 https://discourse.mozilla-community.org/t/flame-builds/8548
Disponible en B2G InstallerNo
- -

Dispositivos Soportados por la Comunidad

- -

Estos dispositivos son mantenidos por los esfurzos de la comunidad. ¡Siéntete libre de ayudar!

- -
-

La frecuencia de la distribución de las builds depende del número de voluntarios y del tiempo disponible.

-
- -

Dispositivos disponibles

- -

Estos dispositivos tienen builds disponible para ejecutar B2G:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ImageN
Nombre
- (Versión de Android)
ZTE Open CNexus 5WileyFox SwiftFairphone 2
Nombre en códigoopenc-fr / openc-ebay                         
Información de construcción e instalaciónhttps://discourse.mozilla-community.org/t/zte-open-c/8402/ -

https://discourse.mozilla-community.org/t/test-b2gos-on-nexus-5/9405/1

-
  -

https://discourse.mozilla-community.org/t/fairphone-2-build/8641/
- https://discourse.mozilla-community.org/t/fairphone-2-support-for-b2g-installer-landed/8334

-
Disponible en B2G Installer -

No

- -

(but a buildbot is available)

-
-

Dentro de poco.

- -

Blobfull build working.

-
- -

En progeso

- -

Trabajando en soporte para estos dispositivos.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Imagen 
Nombre
- (Versión de Android)
E3
- Sony Yukon platform
Z1 Compact (Lollipop)
- Sony Rhine platform
Xiaomi Redmi 1S
Nombre en códigoflamingo-lamami-larmani
Información de construcción e instalaciónhttps://discourse.mozilla-community.org/t/b2g-os-flamingo-sony-xperia-e3-builds/8361https://discourse.mozilla-community.org/t/support-for-amami-xperia-z1c-building-debugging-providing-builds/8348https://discourse.mozilla-community.org/t/wip-xiaomi-redmi-1s-hongmi-1s/10273
Estado de soporteBloqueado, hay problemas con las herramientas de flasheo.Versiones previas de pruebas.Versiones previas de pruebas
- -

Dispositivos con posibilidad de portar el SO

- -

Esto es una lista de dispositivos con potencial para portar B2G, gracias a las versiones de AOSP y Cyanogen Mod disponibles, o porque soportaban versiones anteriores de Firefox OS hasta la versión 2.6

- -
-

Nota: No hay ports para estos dispositivos, pero es posible construir B2G. Mira la sección de cómo construir para más información. Eres bienvenido para ayudar al mantenimiento de estas builds.

-
- -

Dispositivos Nexus

- -

Estos dispositivos son (en parte) soportados por B2G porque son dispositivos de referencia de Google para AOSP

- - - - - - - - - - - - - - - - -
Nexus 6Nexus 4
  
- -

Dispositivos de Sony

- -

Estos dispositivos pertenecen a la iniciativa Sony Mobile´s Open Devices, que tiene como objetivo el soporte de los móviles Xperia en AOSP

- -

Estos dispositivos están construidos en base a AOSP Lollipop.

- -
-

Ahora mismo la mayoría de los dispositivos Sony no tienen soporte para cámara. Esto depende del avance del trabajo de los desarrolladores de Sony. Además, nosotros contribuimos con el mantenimiento de estos ports.

-
- -

Los dispositivos que está en curso el soporte para B2G no están listados aquí.

- -

Sony Shinano Platform

- - - - - - - - - - - - - - - - - - - - - - -
 
Z3 Z3 Tablet CompactZ2
leo-l scorpion-lsirius-l
- -
-
- -

Sony Rhine Platform

- -
-

Los dispositivos Rhine utilizan un chip NFC Legacy, así que esta función no está disponible. Mira el bug 1226720. Necesitamos contribuidores para el mantenimiento de estos ports.

-
- - - - - - - - - - - - - -
Z1
honami-l
- -

Sony Yukon Platform

- - - - - - - - - - - - - - - - - - - -
T2 UltraT3M2
tianchi-lseagull-leagle-l
- -

Dispositivos Soportados CyanogenMod

- -

Hay que completar.

- -

Dispositivos Legacy

- -

Muchos dispositivos antiguos no son mantenidos por la comunidad, pero es posible que voluntarios puedan mantenerlos vivos. El estado actual de estos dispositivos es desconocido, así que es probable que no se pueda instalar B2G.

- -

No hay dispositivos aquí actualmente.

- -

Obsolete Devices

- -
-

Olvídate del soporte para estos dispositivos si tenes uno.

-
- -

Varios dispositivos antiguos ya no son soportados por B2G OS, y no tenemos voluntarios para mantenerlos vivos. El estado actual de estos dispositivos es desconocido, lo que probablemente significa que no se puede actualizar B2G.

- - - - - - - - - - - - - - - - - - - - - - -
Geeksphone PeakGeeksphone KeonZTE OpenTCL Fire
peakkeoninarihamachi
- - - - - - - - - - - - - - - - - - - - - - -
Samsung Galaxy S2Galaxy NexusNexus SNexus S 4G
galaxy-s2galaxy-nexusnexus-snexus-s-4g
- - - - - - - - - - - - - - - - - - - - - - -
Foxconn InFocusVia VixenPandaboardRaspberry Pi
flatfishvixenpandaboardrpi
diff --git a/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/firefox_os_build_process_summary/index.html b/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/firefox_os_build_process_summary/index.html deleted file mode 100644 index 2ba4b7b7b6..0000000000 --- a/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/firefox_os_build_process_summary/index.html +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Resumen del proceso de compilación de Firefox OS -slug: >- - Archive/B2G_OS/Building_and_installing_Boot_to_Gecko/Firefox_OS_build_process_summary -tags: - - Firefox OS - - compilar - - instalación - - instalar -translation_of: Archive/B2G_OS/Building_and_installing_B2G_OS/B2G_OS_build_process_summary ---- -
-

Compilar e Instalar Firefox OS requiere una significante cantidad de tiempo, ancho de banda de red, y poder computacional. Desafortunadamente, a lo largo del camino, las cosas son susceptibles de salir mal. Esta página describe los objetivos del proceso de compilación y  los pasos de este proceso con el fin de ayudar a los usuarios a lo largo del camino. Los detalles de cada paso son mostrados en los enlaces de su respectiva página.

-
-
-

Nota: El proceso de compilación de Firefox OS está lleno de referencias a 'B2G' o 'Boot2Gecko'. 'Boot2Gecko' fué el nombre clave original del proyecto Firefox OS.

-
-

El objetivo de la compilación: cuatro archivos 'image'

-

El objetivo general del proceso de compilación es la compilacióno de cuatro archivos que puedan ser copiados a un dispositivo Firefox OS.

- - - - - - - - - - - - - - - - - - - -
boot.imgEl Kernel Linux y un root filesystem image, este último provee un útil conjunto de herramientas básicas de Unix.
system.imgEl núcleo de Firefox OS incluye partes de Gonk, el puerto de Gecko, y el ejecutable b2g.
userdata.imgEl perfil Gecko del usuario y la aplicación web Gaia para el dispositivo.
recovery.imgUn kernel Linux y una imagen del sistema de ficheros raíz, junto con una herramienta sencilla para que los usuarios puedan arreglar una mala instalación.
-

Una vez que se han creado las cuatro imágenes, estas pueden ser transferidas al dispositivo.

-

Firefox OS está compilado sobre la base de Android Open Source Project (AOSP). Las herramientas AOSP, adb y fastboot, proveen una potente vía para acceder y manipular un dispositivo. Notablemente, el comando adb reboot-bootloader puede ocasionar que un dispositivo conectado se reinicie (reboot) y se detenga en la fase inicial del  bootloader donde el comando fastboot flash $partition $image puede ser usado para copiar una imágen al dispositivo.

-

La imagen de arranque

-

La imagen de arranque (boot.img) es una combinación del Kernel Linux y una partición inicial del root proveyendo el software núcleo de utilidad y el script de inicialización. Este último será copiado en la memoria del dispositivo para uso eficiente por el dispositivo y por consiguiente es llamado "ramdisk". La imagen de arranque será copiada en la partición 'boot' en el dispositivo y el contenido del  ramdisk es visible iniciando en el directorio raíz (root) cuando el  filesystem del dispositivo es accedido en tiempo de ejecución (runtime), tal como cuando se usa adb shell.

-

La imágen de arranque también establece los permisos de los usuarios root en el archivo default.prop  en el directorio raíz.

-

También es posible modificar una imágen de arranque existente mediante la inspección de archivo, dividiendo el archivo en el Kernel y ramdisk image, extrayendo los contenidos de la imagen ramdisk, modificando esos contenidos, reensamblando la imagen ramdisk, entonces recompilando una boot.img funcional. Ver, por ejemplo, la página de Alcatel One Touch Fire Hacking (Mini) Guide.

-

La imagen de arranque puede ser probada antes de ser instalada por  'sideloading'; el dispositivo puede ser inicializado y pausado en el  bootloader y luego un  fastboot puede ser usado para arrancar desde la imagen de arranque sin instalarla usando el comando fastboot boot /some/path/to/boot.img.

-

La imagen del sistema

-

La imagen del sistema (system.img) provee el núcleo de  Firefox OS:

- -
-

Vea la guía la pataforma Firefox OS para más información acerca de la arquitectura de la plataforma.

-
-

La imagen del sistema será copiada a la partición system  en el dispositivo y será visible en el directorio /system/ cuando el  filesystem del dispositivo sea accedido en tiempo de ejecución.

-
-

Nota: La Imagen del Sistema también provee las manchas binarias (blobs) que pueden ser usadas por el dispositivo, notablemente el RIL (Radio Interface Layer) controla la radio celular en el dispositivo.

-
-

La imagen de los datos de usuario

-

La imagen de los datos de usuario (userdata.img) provee las aplicaciones Gaia cargadas en tiempo de ejecución.

-

La imagen de los datos de usuario será copiada a la partición userdata en el dispositivo y los contenidos serán visibles en el directorio /data/ cuando el filesystem del dispositivo sea accedido en tiempo de ejecución. Notablemente el directorio /data/b2g/  contiene el   profile  de Mozilla Gecko del dispositivo del usuario mientras el directorio /data/local/webapps/ contiene la aplicación web actual disponible para el usuario.

-

La imagen de recuperación

-

La imagen de recuperación (recovery.img) contiene lo mismo que el Kernel y un similar ramdisk que están presentes en la partición de la imagen de arranque. La imagen de recuperación sin embargo utiliza un script de inicialización diferente, lo que lleva al usuario a un conjunto de recuperación de comandos de acceso utilizando los botones de hardware en el dispositivo.

-

La Imagen de recuperación será copiada a la partición recovery en el dispositivo,  que no es montada en el filesystem en tiempo de ejecución normal.

-

El proceso de compilación:  ajustar, configurar,  compilar, instalar

-

El proceso general de construcción e instalación de Firefox OS consta de cuatro pasos:

- - - - - - - - - - - - - - - - - - - -
AjustarObtener copias de todos los programas usados por el proceso de construcción, tales como los compiladores y librerías.
ConfigurarDescargar el código fuente que será utilizado en la creación y construcción del archivo .configure que define las variables del entorno especificando las direcciones y otros valores utilizados en la construcción.
CompilarCompilar el perfil Gecko del usuario y la aplicación web Gaia para el dispositivo.
InstalarInstalar los archivos en el dispositivo.
-

 

-

Ajustar

-

El ajuste inicial debe ser hecho para asegurar el equipo que corre la compilación tenga todos el software requerido durante la compilación, tal como compiladores y herramientas de construcción.

-

Esta paso puede ser hecho a mano o usando un script. Los detalles los podemos ver en la página Prerrequisitos para compilar Firefox OS.

-
-

Nota: En UNIX y máquinas UNIX, la presencia de los software requeridos pueden ser comprobados usando el comando unix which con el nombre del programa requerido como parámetro.

-
-

Configuración

-

El actual proceso de compilación inicia obteniendo una copia del software Firefox OS (o B2G), por lo general mediante la creación de un clon Git del proyecto B2G. La configuración de compilación obtendrá copias de todo el código fuente que es compilado y crea el archivo .config que especifica las variables para la compilación.

-

Esto se ejecuta con el script config.sh. Más detalles podemos encontrar en la página Preparandote para tu primer binario B2G .

-

Es script necesario de configuración y parámetros especificando el tipo de dispositivo a compilar. Los nombre de compilación son códigos nombre enlazados a la arquitectura del CPU en lugar de un dispositivo específico, y actualmente no hay manera de establecer qué compilación trabaja para qué dispositivo físico. Una lista de códigos nombres  disponibles puede encontrarse aquí.

-

El paso de configuración también utilizará la herramienta Android Open Source Project repo para descargar (o actualizar) una copia de todo el código utilizado en la compilación. Estas copias serán almacenadas en el directorio .repo/projects. Debido a esta actividad, el paso de configuración puede tardar bastante tiempo y descargará una gran cantidad de datos.

-

Compilar

-

El paso de compilación lo qe hace es compilar todo el código fuente y produce como resultado las imagenes.

-

Esto se ejecuta con el script  build.sh. Para más detalles podemos encontrar en la página Compilando Firefox OS .

-

Por defecto, el paso de compilación es monolítico, intentando compilar todo a la vez desde las herramientas Android Open Source Project para el  kernel Linux a la aplicación web Gaia. Cuando la compilación falla,  puede a veces no ser claro en que paso ha fallado.

-

Es posible compilar solo ciertas partes de toda la pila Firefox. Por ejemplo, el sistema Gecko solo puede ser compilado mediante una llamada al script de compilación con el parámetro gecko. De igual manera, Gaia puede ser compilado de forma independiente utilizando el parámetro gaia. Estas partes pueden ser instaladas de forma separada en el dispositivo como se explica a mas adelante.

-

También se pueden compilar las imágenes mostradas en la primera parte de esta página. Por ejemplo, el sistema de imagen puede ser compilado utilizando./build.sh out/platform/$target/system.img, donde el parámetro $target es el mismo que el dado en el paso de configuración.

-

Instalar

-

El paso de instalación colocará nuevamente el código compilado en el dispositivo. Esto es ejecutado con el script flash.sh .

-

Partes individuales de la compilación pueden ser instaladas agregando un parámetro al script flash. Por ejemplo, es posible instalar sólo la aplicación web gaia especificando ./flash.sh gaia.

diff --git a/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/index.html b/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/index.html deleted file mode 100644 index 0e2cc7d35d..0000000000 --- a/files/es/archive/b2g_os/building_and_installing_boot_to_gecko/index.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Construyendo e instalando Firefox OS -slug: Archive/B2G_OS/Building_and_installing_Boot_to_Gecko -tags: - - B2G - - Documentación de construcción - - Firefox OS -translation_of: Archive/B2G_OS/Building_and_installing_B2G_OS ---- -
-

Debido a que Firefox OS está actualmente en un desarrollo activo, y se encuentra en estado preliminar, la mejor manera de asegurarse de que tienes una copia actualizada e instalada, es compilarla e instalarla tú mismo. Los artículos comprendidos en esta página te guiarán a través de la compilación y la instalación de Firefox OS en un emulador, dispositivo compatible, o en la interfaz de usuario de Gaia en el navegador Firefox.

-
- - - - - - - -
-

Cómo obtener y compilar Firefox OS

-
-
- Firefox OS visión general de la compilación
-
- La compilación e instalación de Firefox OS requiere de una cantidad significativa de tiempo, ancho de banda y una computadora potente. Esta página describe los objetivos del proceso de compilación y de los pasos de este proceso con el fin de ayudar a los usuarios a lo largo del camino.
-
- Firefox OS requisitos previos de compilación
-
- Pasos a seguir antes de compilar Firefox OS por primera vez.
-
- Preparándose para su primera compilación de Firefox OS
-
- Antes de poder compilar Firefox OS, es necesario clonar el repositorio y configurar su construcción. En este artículo se explica cómo hacerlo.
-
- Compilando Firefox OS
-
- Cómo compilar Firefox OS.
-
-
-
- Compilando la llama de Firefox OS en OSX
-
- Cómo realizar la compilación de la llama de Firefox OS en OSX.
-
-
-
- Portando a Firefox OS
-
- Información sobre cómo portar Firefox OS a nuevos dispositivos.
-
-

Ver todo...

-
-

Instalación de Firefox OS y/o Gaia

-
-
- Eligiendo cómo iniciar Gaia o Firefox OS
-
- Puedes usar Gaia dentro de Firefox, o puedes ejecutar Firefox OS en un dispositivo móvil o en un simulador en el escritorio. Esta guía te ayudará a decidir cuál es mejor para tus necesidades.
-
- Usando Gaia en Firefox
-
- Cómo utilizar Gaia dentro de un navegador Firefox de escritorio.
-
- Usando el cliente B2G de escritorio
-
- Una guía para ejecutar y utilizar el cliente de escritorio de Firefox OS; esto simula el entorno Gaia en una aplicación de escritorio. Es más preciso que ejecutar Gaia en Firefox, pero no es tan preciso como los emuladores.
-
- Usando los emuladores de Firefox OS
-
- Una guía para compilar y usar los emuladores de Firefox OS y cuándo usar cada uno.
-
- Instalando Firefox OS en un dispositivo móvil
-
- Cómo instalar Firefox OS en un dispositivo móvil real.
-
- Booteo doble de Firefox OS y Android en SGS2
-
- Cómo configurar un entorno de booteo doble Firefox OS/Android en un Samsung Galaxy S2.
-
-
-

 

diff --git a/files/es/archive/b2g_os/building_b2g_for_qemu_emulator/index.html b/files/es/archive/b2g_os/building_b2g_for_qemu_emulator/index.html deleted file mode 100644 index af77d73b5f..0000000000 --- a/files/es/archive/b2g_os/building_b2g_for_qemu_emulator/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Compilando B2G para el emulador QEMU -slug: Archive/B2G_OS/Building_B2G_for_QEMU_Emulator -translation_of: Archive/B2G_OS/Building_and_installing_B2G_OS ---- -

Obsoleto
Esta funcionalidad es obsoleta. Aunque puede aún funcionar en algunos navegadores, se desalienta su uso ya que puede ser removida en cualquier momento. Evite usarla.

- -

Éste artículo está obsoleto. Ver Compilando e instalando Boot to Gecko, una guía completa para compilar Firefox OS.

- -

Suponemos que ya has configurado tu entorno de compilación y clonado los repositorios.

- -

Los siguientes pasos  te permitirán compilar - y ejecutar - B2G en tu emulador.  NO ejecutar como root.

- -

$ cd B2G
- $ make sync

- -

- -

Compilar con la configuración para QEMU:
- $ make config-qemu

- -

Lo siguiente, construir el backend gonk y luego el propio sistema:
- $ make gonk
- $ make

-
- NOTA:   si ./emu.sh - tu emulador - no se inicia a la primera, tendrás que hacerlo ejecutable:
- $ chmod +x emu.sh
-
- Después, ejecuta el emulador:
- $ ./emu.sh

- -

NOTA:  Después de clonar los repositorios o al crear tu compilación por primera vez, puedes "limpiar" them - e.g. put them into the state so that the latest pull is the same as a fresh clone.

- -

To do this, from your repo root:
- $ make sync; git clean -xfd; git submodule foreach "git clean -xfd"
- Alternately, you can try:
- $ make mrproper

diff --git a/files/es/archive/b2g_os/compilar_boot_to_gecko/index.html b/files/es/archive/b2g_os/compilar_boot_to_gecko/index.html deleted file mode 100644 index 255f1a3db0..0000000000 --- a/files/es/archive/b2g_os/compilar_boot_to_gecko/index.html +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: Compilando Firefox OS -slug: Archive/B2G_OS/Compilar_Boot_to_Gecko -translation_of: Archive/B2G_OS/Building ---- -
-
-

Una vez que hayas preparado tu sistema para compilar y hayas realizado la clonación inicial y configurado el código, podrás compilar Boot to Gecko.

-

Actualizar tu código

-

Si no es la primera vez que compilas B2G, deberías actualizar el código antes de empezar a compilar. Para hacerlo, debes actualizar tanto las herramientas de B2G como las dependencias, usando los siguientes dos comandos:

-
git pull
-./repo sync
-
-

Puedes actualizar partes específicas del repositorio aclarando su nombre:

-
./repo sync gaia
-
-

El comando repo tiene otras opciones disponibles que pueden ser interesantes; repo help te dará mucha información.

-

Compilar

-
-

Nota: Antes de compilar, conviene que prepares un archivo .userconfig para personalizar la compilación. Mira Personalizar el archivo .userconfig para aprender cómo hacerlo.

-
-

Para compilar Boot to Gecko, debes usar simplemente la herramienta build.sh:

-
cd B2G
-./build.sh
-
-

Es hora de otra pausa para un café, o posiblemente una siesta (especialmente si es tu primera compilación). Así como en el paso de configuración de la página anterior, si usas un directorio de archivos de sistema de Android previamente extraídos, deberás establecer ANDROIDFS_DIR antes de ejecutar build.sh.

-

Compilar sólo ciertos módulos

-

Si sólo quieres compilar un módulo en particular, por ejemplo Gecko, puedes hacerlo incluyendo el nombre:

-
./build.sh gecko
-
-

Si sólo quieres actualizar una de las aplicaciones, puedes hacerlo compilando el módulo gaia y usando la variable de entorno BUILD_APP_NAME:

-
BUILD_APP_NAME=calendar ./build.sh gaia
-

Para ver una lista de los módulos que puedes compilar, haz:

-
./build.sh modules
-
-

Especificar cuántos núcleos de procesador usar

-

Por defecto, el compilador de B2G utiliza el número de procesadores que existan en tu ordenador, y establece dos como el número de tareas a ejecutar en paralelo. Puedes cambiar estos números especificando el parámetro -j cuando ejecutes build.sh. Esto es útil si estás usando el ordenador para otras cosas mientras compilas, y necesitas reducir el uso de CPU. También viene bien cuando tienes problemas con la compilación, ya que ejecutar tareas de una en una facilita la lectura de mensajes y registros.

-

Por ejemplo, para compilar ejecutando 2 tareas en paralelo, usa:

-
./build.sh -j2
-
-

El uso más común de esta opción es configurar la compilación para no ejecutar tareas en paralelo, lo cual facilita la lectura de mensajes y la resolución de errores. Para ello, usa:

-
./build.sh -j1
-
-

Construir para múltiples configuraciones regionales

-

Para crear un sistema que incluya varias configuraciones regionales, haz lo siguiente:

-

Gaia

-
    -
  1. Escoge el archivo de idioma que quieres usar. Ahora mismo hay dos en Gaia shared/resources/languages-dev.json y shared/resources/languages-all.json
  2. -
  3. Clona las configuraciones regionales que necesitas desde http://hg.mozilla.org/gaia-l10n a un directorio; nosotros usamos gaia-l10n/ . Tendrás que clonar un repositorio para cada uno de las configuraciones regionales incluidas en el archivo de idiomas.
  4. -
  5. En tu sistema, configura LOCALE_BASEDIR como la ruta absoluta al directorio que creaste en el paso 2. Configura LOCALES_FILE como la ruta absoluta al archivo que escogiste en el paso 1.
  6. -
-

Por ejemplo:

-
export LOCALE_BASEDIR=$PWD/gaia-l10n
-export LOCALES_FILE=$PWD/gecko/gaia/shared/resources/languages-dev.json
-
-

Gecko

-
    -
  1. Escoge el archivo de idioma que quieres usar. En Gecko, ahora mismo utilizamos b2g/locales/all-locales
  2. -
  3. Clona las configuraciones regionales que necesitas a un directorio; por ejemplo gecko-l10n/ . - -
  4. -
  5. Clona compare-locales.
  6. -
  7. -

    En tu sistema, configura L10NBASEDIR como la ruta absoluta al directorio que creaste en el paso 2. Configura MOZ_CHROME_MULTILOCALE como una lista de las configuraciones regionales que clonaste, separadas con espacios.

    -

    Añade el directorio compare-locales/scripts a tu PATH, y compare-locales/lib a tu PYTHONPATH.

    - Por ejemplo, -
    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"
    -
    -

    Una vez hayas completado estos pasos, puedes ejecutar build.sh .

    -

    Al parecer, también es posible usar .userconfig.

    -

    Es posible que estas instrucciones cambien a medida de que avanza el proyecto.

    -

    Errores conocidos

    -
      -
    • -

      KeyedVector.h:193:31: error: indexOfKey was not declared in this scope

      -
    • -
    -

    Este error aparece cuando tu versión de gcc es demasiado reciente. Instala una versión 4.6.x de gcc/g++/g++-multilib.

    -

    Visita Prerrequisitos para compilar Firefox OS para más información.

    -
    -

    Aviso de la comunidad: Es posible utilizar gcc 4.7.x si modificas ligeramente el código de B2G (gcc te proporcionará instrucciones), pero no te podemos ayudar, ni a modificar el código ni con los errores que te puedas encontrar.

    -
    -
      -
    • -

      arm-linux-androideabi-g++: Internal error: Killed (program cc1plus)

      -
    • -
    -

    Si ves este mensaje, lo más probable es que no tengas suficiente memoria libre. Asegúrate de tener suficiente memoria libre antes de ejecutar./build.sh. Normalmente, 4GB de ram son suficientes para compilar sin problemas.

    -
      -
    • -

      Si encuentras errores mientras el compilador está haciendo tests

      -
    • -
    -

    A veces (especialmente después de actualizar el compilador o el sistema operativo) puedes encontrarte con errores extraños mientras el compilador está haciendo test tras acabar de compilar. Algo como esto:

    -
    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
    -

    En estos casos, prueba a eliminar el directorio gaia/xulrunner-sdk y haz "pull" para bajarte el código de nuevo:

    -
    rm -r gaia/xulrunner-sdk
    -
    -

    Este comando elimina la copia precompilada de XULRunner que el compilador se baja automáticamente. Cuando compiles de nuevo, el compilador obtendrá una nueva copia de XULRunner automáticamente.

    -

    Próximos pasos

    -

    Tras compilar, los pasos siguientes dependen de si has compilado Boot to Gecko para el emulador o para un teléfono móvil; lee los artículos siguientes para más información:

    - -
  8. -
diff --git a/files/es/archive/b2g_os/complementos/index.html b/files/es/archive/b2g_os/complementos/index.html deleted file mode 100644 index c6f9d4dca8..0000000000 --- a/files/es/archive/b2g_os/complementos/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Complementos para Firefox OS -slug: Archive/B2G_OS/Complementos -translation_of: Archive/B2G_OS/Add-ons ---- -

Firefox OS 2.5 introduce el soporte para complementos, una característica que los usuarios de equipos de sobremesa han conocido y amado desde el principio de Firefox. Los complementos en Firefox OS son incluso aún más poderosos y pueden personalizar no solo el navegador, dando una experiencia completa con el teléfono, incluyendo modificaciones en la pantalla de inicio y aplicaciones del sistema como por ejemplo la aplicación de Correo o la de Mensajes. Esta página dice todo lo que necesitas saber para empezar con la creación de complementos para Firefox OS e involucrarse con la comunidad de desarrolladores de complementos.

- -
-

Nota: Los complementos de Firefox OS se basan en la WebExtensions API, que tambien es compatible con Firefox para escritorio a partir de la versión 42 y es basado en la API de extensiones usada por Chrome y Opera.

-
- -

Requisitos previos

- -

Usted deberá seguir los pasos que se indican a continuación para empezar con el desarrollo de las extensiones.

- -

1. Actualizar su teléfono a la versión Firefox OS 2.5

- -

Los complementos en Firefox OS solo son compatibles con Firefox OS 2.5 y versiones posteriores. A continuación se muestra una lista con los dispositivos compatibles y cómo actualizarlos (esta lista está incompleta y se modificará en el futuro).

- - - -

2. Habilitar la depuración USB

- -

Ir a la aplicación de Ajustes del dispositivo, seleccione Desarrollador > Depurar vía USB > ADB y DevTools. Ahora debería ser capaz de depurar las apps instaladas mediante WebIDE, ya sea a través de un cable USB y por Wifi (no necesita cable USB.)

- -

3. Configurar WebIDE

- -

El herramienta de WebIDE es parte de Firefox y puede utilizarse para instalar complementos en el teléfono durante el desarrollo.

- -

Véase también

- -

Desarrollo

- - - -

Distribución

- - - -

Participar

- - diff --git a/files/es/archive/b2g_os/consejos_uso_firefox_os/index.html b/files/es/archive/b2g_os/consejos_uso_firefox_os/index.html deleted file mode 100644 index 057a2d39a9..0000000000 --- a/files/es/archive/b2g_os/consejos_uso_firefox_os/index.html +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Consejos de uso de Firefox OS -slug: Archive/B2G_OS/Consejos_uso_Firefox_OS -translation_of: Archive/B2G_OS/Firefox_OS_usage_tips ---- -
-
- Depuración remota
-
- Como poner tu teléfono para la depuración remota.
-
- Desbloqueando tu teléfono
-
- Instrucciones básicas para desbloquear tu teléfono.
-
-  Hacer capturas de pantalla
-
- Como hacer capturas de pantalla en tu teléfono con Firefox OS.
-
-  
-
diff --git a/files/es/archive/b2g_os/debugging/depurar_b2g_usando_gdb/index.html b/files/es/archive/b2g_os/debugging/depurar_b2g_usando_gdb/index.html deleted file mode 100644 index ff30152895..0000000000 --- a/files/es/archive/b2g_os/debugging/depurar_b2g_usando_gdb/index.html +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Depurar B2G usando gdb -slug: Archive/B2G_OS/Debugging/Depurar_B2G_usando_gdb -translation_of: Archive/B2G_OS/Debugging/Debugging_B2G_using_gdb ---- -

-

Borrador
- Esta página no está completa.

- -

-

Depurar Firefox OS usando gdb es fácil. Este artículo lo ayudará a hacerlo aún más fácil.

-

Iniciar el depurador en modo proceso único

-
-

Nota: Antes de ejecutar el depurador, podría configurar un archivo .userconfig para personalizar ciertas cosas. Vea Personalización con el archivo .userconfig para más detalles.

-
-

Para reiniciar Firefox OS y ejecutarlo bajo el control de gdb, simplemente use el script run-gdb.sh:

-
./run-gdb.sh
-
-
-

Nota: Si desea depurar en el emulador, asegúrese de no tener teléfonos conectados; esto puede causar conflctos con la habilidad de gdb de conectarse al emulador.

-
-

Si ya se está ejecutando Firefox OS y desea adjuntarlo sin reiniciarlo, puede hacer algo como:

-
./run-gdb.sh attach
-
-

Depurar tareas fuera del proceso

-

Because of the threaded nature of Firefox OS, you often need to be able to debug tasks other than the main B2G task. To do this, the simplest way is to use the b2g-ps command to find out the PID of the process that you need to debug:

-
$ adb shell b2g-ps
-b2g              root      106   1     189828 56956 ffffffff 40101330 S /system/b2g/b2g
-Browser          app_0     4308  106   52688  16188 ffffffff 400db330 S /system/b2g/plugin-container
-
-

Aquí, Browser es el proceso hijo usado como el "proceso contenido" para la aplicación navegador. Así que si quiere depurar el proceso contenido, en este ejemplo, debería hacer:

-
$ ./run-gdb attach 4308
-

A veces es útil ser notificado inmediatamente de la creación de cualquier proceso hijo. Esto puede lograrse iniiando run-gdb.sh con la variable de entorno MOZ_DEBUG_CHILD_PROCESS:

-
MOZ_DEBUG_CHILD_PROCESS=1 ./run-gdb.sh
-

Habiendo hecho esto, lanzar una aplicación OOP en Firefox OS mostrará el PID de plugin-container para la nueva tarea y esperará 30 segundos, tiempo suficiente para hacer

-
$ ./run-gdb attach <pid>
-

como se mencionaba anteriormente.

-

Si está tratando de depurar algo que ocurre durante el booteo, deberá lanzar la instancia del depurador para la nueva aplicación con bastante rapidez. Una vez que el nuevo depurador fue lanzado, debería presionar inmediatamente "c" para continuar ejecutando la nueva tarea.

-

Soporte

-

Que nivel de funcionalidad se espera

-

Al menos las siguientes caracterísiticas de depuración deberían funcionar definitivamente. Si no lo hacen, lo más probable es que un simple ajuste a la configuración las haga funcionar:

- -

Las siguientes características de depuración not están soportadas. No intente usarlas.

- -

Solución de problemas

-

Hay unas pocas cosas que intentar cuando GDB no está funcionando como se describe anteriormente.

-

Asegúrese que el clon de B2G está actualizado

-

Siempre tenga en mente que para actualizar su clon de B2G debe ejecutar estos dos comandos:

-
git pull
-./repo sync
-

Olvidarse de git pull aquí es una típica razón por la que se terminará con un run-gdb.sh viejo y no se beneficiará de las mejoras recientes.

-

Asegúrese de adjuntarse al proceso correcto

-

Adjuntarse al proceso equivocado (ej. proceso principal de B2G en lugar del proceso Browser) podría explicar por que los breakpoints no se alcanzan.

-

Asegúrese que los símbolos se leyeron correctamente

-

En gdb, use info shared para verificar que los símbolos se leyeron correctamente:

-
(gdb) info shared
-From        To          Syms Read   Shared Object Library
-0xb0001000  0xb0006928  Yes         out/target/product/otoro/symbols/system/bin/linker
-0x40051100  0x4007ed74  Yes         /hack/b2g/B2G/out/target/product/otoro/symbols/system/lib/libc.so
-0x401ab934  0x401aba2c  Yes         /hack/b2g/B2G/out/target/product/otoro/symbols/system/lib/libstdc++.so
-...
-

La columna Syms Read debería decir Yes en todas partes. Quizás en algún teléfono android podría ver Yes (*) para algunas librerías del sistema o drivers; eso debería estar bien. No se debería ver ningún No.

-

Si se ve un No, ese es el primer problema y debe resolverlo antes de buscar otra cosa.

-

Busque cualquer mensaje de error en la salida de terminal justo después de tipear el comando run-gdb.sh.

-

También verifique en esa salida de terminal output que el comando GDB esté correcto. En particular, el último argumento de la línea de comando debería ser la ruta al ejecutable de b2g. Aquí hay un ejemplo correcto:

-
prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-gdb -x /tmp/b2g.gdbinit.bjacob /hack/b2g/B2G/objdir-gecko/dist/bin/b2g
-

Verifique el valor de estas variables de GDB: solib-search-path y solib-absolute-prefix:

-
(gdb) show solib-search-path
-The search path for loading non-absolute shared library symbol files is /hack/b2g/B2G/objdir-gecko/dist/bin:out/target/product/otoro/symbols/system/lib:out/target/product/otoro/symbols/system/lib/hw:out/target/product/otoro/symbols/system/lib/egl:out/target/product/otoro/symbols/system/bin:out/target/product/otoro/system/lib:out/target/product/otoro/system/lib/egl:out/target/product/otoro/system/lib/hw:out/target/product/otoro/system/vendor/lib:out/target/product/otoro/system/vendor/lib/hw:out/target/product/otoro/system/vendor/lib/egl.
-(gdb) show solib-absolute-prefix
-The current system root is "out/target/product/otoro/symbols".
-

Si necesita ayuda, intente el canal de IRC #b2g. Si piensa que encontró un error, infórmelo en B2G issue tracker.

diff --git a/files/es/archive/b2g_os/debugging/developer_settings/index.html b/files/es/archive/b2g_os/debugging/developer_settings/index.html deleted file mode 100644 index 3146b7c96d..0000000000 --- a/files/es/archive/b2g_os/debugging/developer_settings/index.html +++ /dev/null @@ -1,194 +0,0 @@ ---- -title: Developer settings for Firefox OS -slug: Archive/B2G_OS/Debugging/Developer_settings -translation_of: Archive/B2G_OS/Debugging/Developer_settings ---- -
-

Contained in the Firefox OS Settings app is the Developer panel. This panel offers a number of options that can make debugging your open web app on Firefox OS easier. This article covers the options available and how to make use of them.

-
-

The settings panel for developer options is intentionally buried deep to avoid having end users who have no need for these options inadvertently turning on options that make their device run more slowly or add strange visual effects to their displays. The panel looks something like this (the following is from a Geeksphone Keon running an April 2014 build of Firefox OS 2.0; yours may differ if you are running a different version):

-

-

The developer panel is reached as follows:

- -

The following sections cover each of the options in the Developer panel, explaining what they do and why they're useful.

-
-

Importante: Estas herramientas pueden ocasionar fallos durante el uso normal del teléfono. Algunas características vienen desactivadas por defecto debido a los fallos que han sido reportados.

-
-

Ajustes para Desarrolladores

-

Depuración via USB

-

La opción "depuración remota" permite utilizar la depuración remota en tu dispositivo. Esto también activa los comandos ADB. En las versiones anteriores a Firefox 1.4 solo existe una casilla para activar estas funciones; en Firefox 1.4 y superior existen tres opciones diferentes:

- -

HUD Desarrolladores

-

En versiones superiores a Firefox OS 1.4, seleccionando este menú entrarás a las opciones del HUD Desarrolladores.

-

-

Existen varias opciones que son explicadas a continuacion:

- -

Cuadros por Segundo

-

Al activar esta opción se mostrarán tres números en la esquina izquierda de la pantalla, si bien estos numeros son "instantáneos" son sólo suposiciones y pueden no ser acertivos. A continuación se explica qué significa cada número:

- -

A screenshot of Firefox OS, showing three numbers in the top left hand corner that are measurements of app framerate.

-

Time to load

-

Firefox OS also has a tool that can help measure startup time, specifically the "first paint" time. The value shown by the tool — in the top right of the Firefox OS display — is the elapsed time between when the most recent application was launched, and an estimate of the first time that application painted its UI, in milliseconds. This number only approximates the real "first paint" time, and in particular underestimates it. However, lowering this number almost always correlates to improvements in real startup time, so it can be useful to quickly measure optimization ideas.

-

A screenshot of Firefox OS, showing a number in the top right hand corner that is a measurement of the current app startup time, in milliseconds.

-

App memory

-

Displays information on how much memory the app is using, and allows you to enable or disable the different items that use memory to show much each one is using in the current app. For example, the screen shot below only has App memory and JS objects checked, and the indicator on the bottom right is showing that the Settings app is using 414.77KB for JS objects.

-

-

Pseudo-localization

-

When enabled, pseudo-languages like Accented English and Mirrored English are available for selection in Settings > Languages.  With pseudo-localizations, you can test the localizability of your code in regular Gaia builds without having to add real language resources nor having to speak a foreign language.  For instance, you can make sure the layout scales well with longer strings, you can preview the app in a fake RTL language, or spot HTML elements wihout the data-l10n-id attribute (they will be displayed in regular English).

-

Screenshot of pseudolocales

-

You can turn pseudo-localizations on by default when you build Gaia by adding the following line into gaia/build/config/common-settings.json:

-
 "devtools.qps.enabled": true
-

Note: Pseudo-localizations are generated completely dynamically, each time an app is launched.  The performance and memory characteristics may be different than those of regular localizations.  If you specifically want to test performance of non-English languages, build multilocale Gaia with real locales.

-

Graphics settings

-

Flash repainted area

-

In this mode, every time a region of the screen is painted by Gecko, Gecko blits a random translucent color over the painted region. Ideally, only parts of the screen that visually change between frames will "flash" with a new color. But sometimes more area than is needed is repainted, causing large areas to "flash". This symptom may indicate that application code is forcing too much of its scene to update. It may also indicate bugs in Gecko itself.

-

A screenshot of Firefox OS with a number of transparent overlays, showing the parts of the screen repainted with each new animation frame.

-

Enable APZ for all content (Async Pan/Zoom)

-

When enabled, the Async Pan/Zoom module allows panning and zooming to be performed on asynchronously, on another thread, with some noticeable differences to rendering behaviour. To find out more, read the MozillaWiki APZ article.

-

Overscrolling

-

This enables and disables the behaviour in Firefox 2.1+ where the display stretches in an elastic manner when you scroll past the end of a page, then shrinks back again when you stop dragging the display. The behaviour's full name is elastic overscroll.

-

Tiling (was Layers: Enable tiles)

-

Introduced in Firefox OS 1.4, this feature enables the painting of content to the screen in smaller chunks ("tiles") rather than painting the whole screen at once. This is mainly useful for platform QA work involving reducing checkerboarding and finding regression windows.

-

Simple tiling (was Layers: Simple tiles)

-

This flips between the two different content painting implementations described in the section above.

-

Low-precision painting

-

Enabling this option makes Gecko paint a low-precision (blurry) version of the content when scrolling really fast. This is useful because it's quicker to paint, and so helps us avoid displaying blank areas (i.e. checkerboarding) while scrolling quickly. It should only be visible to the user temporarily; once the user stops scrolling we fill in the low-precision areas with high-precision content.

-

Low-precision transparency

-

This is an additional flag for low-precision painting, which makes the low-precision content half transparent. This makes it a little more subtle and less jarring for the user.

-

Hardware composer (was Enable hardware compositing)

-

When enabled, this setting causes the device to use its Hardware Composer to composite visual elements (surfaces) to the screen.

-

Draw tile borders (was Layers: Draw tile borders)

-

This is very similar to the Draw layer borders option, the difference being that it also draws the borders for individual tiles as well as the borders around layers.

-

Draw layer borders

-

When this setting is enabled, a brightly colored border is added around all the different layers painted to the display — great for diagnosing layout issues.

-

A screenshot from Firefox OS showing an opened select form with the draw layers borders option enabled, resulting in colored borders being drawn on all the different rendered layers.

-

Dump layers tree

-

This option enables layers.dump, which causes a copy of the compositor's layer tree to be dumped to logcat on every frame composited to the screen; this is mainly useful for platform graphics performance work, rather than regular web development.

-

Cards View: Screenshots

-

When enabled, this specifies that app screenshots will be taken when the open apps are displayed in card view. If disabled, app icons are shown in the center of blank cards for the card view instead.

-

Window management settings

-

Software home button

-

Enabling this option creates a software home button that can provide the same functionality as the equivalent hardware button if it is not available. This is intended for future use on devices that are likely to not have hardware home buttons, like tablets.

-

Home gesture

-

Enabling this option allows you to swipe upwards towards the center from outside the screen to bring up the homescreen. Again, this can provide the same functionality as the equivalent hardware button if it is not available, and is intended for future use on devices that are likely to not have hardware home buttons, like tablets.

-

Continuous transition

-

This setting allows you to decide whether app keyboards open immediately or continuously (with a  transition). Disabling such transition effects are useful on low end devices, when they cause performance to suffer.

-

App transition

-

Turn this on and then off again and you will disable all app closing/opening transitions: all apps will now just show immediately, without the smooth animation, and keyboards will also open/close without animation. Like "Continuous transition enabled", this is meant for improving performance on low end devices, but it has more of an effect.

-

App suspending

-

If enabled, this specifies that when an app is killed in the background, it will be kept in history and reopened when you open it from homescreen/card view. If disabled, such apps are not kept in history/card view.

-

Debug settings

-

Log slow animations

-

This tool tries to help developers understand why animations are not offloaded to the compositor to be run efficiently as possible. It reports "bugs" like trying to animate elements that are too large, or trying to animate CSS properties that can't be offloaded. The messages you'll get on the device will look like the following:

-
I/Gecko   ( 5644): Performance warning: Async animation disabled because frame size (1280, 410) is bigger than the viewport (360, 518) [div with id 'views']
-
-

Geolocation output in ADB

-

Enables logging of geolocation data to adb logcat. This helps with debugging both the GPS stack (namely we get NMEA callback) and MLS use.

-

Wi-Fi output in adb

-

Enabling this option adds information about Wi-Fi to the adb logs (error logs from the console can be accessed using adb logcat | grep "Error" in the Terminal.)

-

Bluetooth output in adb

-

Enabling this option adds information about Bluetooth to the adb logs (error logs from the console can be accessed using adb logcat | grep "Error" in the Terminal.)

-

Console enabled

-

When enabled, this option lets you use the Web Console in Firefox to remotely access the console output on the device; without this option enabled, the console.log() function does nothing.

-

Gaia debug traces

-

Enabling this directly enables DEBUG traces in Gaia; see error 881672 for more details.

-
-

Note: Unfortunately, not every app supports this mechanism to print their debug log. Instead, they control a "DEBUG" flag in code directly, so enabling this flag does NOT ensure that you'll see all debug logs.

-
-

Show accessibility settings

-

This enables the accessibility settings menu, subsequently found at Settings > Accessibility. The options contained within the accessibility settings are as follows:

-

Screen reader

-

Enabling this option turns on Firefox OS's screen reader. This is technology that allows a blind person to use a Firefox OS device. Currently at a very early stage, it changes the way the standard touch events work. When the screen reader is on, you must interact with the screen as follows:

- -
-

Note: If you have turned the screen reader on and wish to disable it again, you must navigate back to the setting via these new gestures and double-tap the checkbox once it is highlighted to turn it off again. That will restore the touch screen functionality to its default behaviour.

-
-

Note: In Firefox 1.4 and above, there is a quick toggle for the screen reader. Press volume up, then down, three times (up, down, up, down, up, down). The screen reader will instruct you to perform this same action again (volume up, down, up, down, up, down) to turn it on if it is not running, or to turn it off if it is already running. If you do not want to change the current toggle state, simply do something else. That way, you can turn it on and off at will to test your web application for accessibility without having to navigate the accessibility settings menu each time.

-

Speech volume

-

A slider that controls how loud the speech is delivered.

-

Speech rate

-

A slider that controls how fast the speech is delivered.

-

Use Marketplace reviewer certs

-

TBD

-

Shake to save system log

-

TBD

-

Verbose app permissions

-
-

Note: Introduced with Firefox 2.1

-
-

When this is enabled, developers (and privacy enthusiasts) may modify all permissions granted to installed privileged apps, using The "App Permission" pane in the Settings app. The app sub-pages under here are updated upon enabling the setting to provide a list of each API permission is requested for in the app's manifest file, along with choices to set that permission to. For example, "Schedule Alarms" appears with choices of Ask, Deny and Grant. Note that some apps may be unable to deal with changed permissions. If you experience any odd behavior, consider resetting the permission or re-installing the app.

-

Launch first time use

-

The "Launch first time use" button runs the "First-Time Use" (FTU) program; this lets you go through the initial setup and tutorial process, and is useful when trying to debug that process, or if you want to re-configure your device from scratch.

-

Software updates

-

Update channel

-

Enables you to specify different update channels to get software updates from when your device receives OTA updates. Options are nightly, aurora ... (others?)

-

Update URL

-

Enables you to specify different URLs from which to receive your updates.

-

Obsolete settings

-

This section lists settings that are no longer provided, or no longer exist in the same state, but might still be interesting if you are running an older version of Firefox OS.

-

Accessibility

-

In versions of Firefox earlier than newer 1.4 versions, this controls the accessibility settings, as explained in the Show_accessibility_settings section above.

-

Grid

-

The "Grid" option, when enabled, causes the Firefox OS display to be overlaid with a grid pattern to help you gauge positioning and alignment of items. For example, below we see the Browser app running with the Grid option enabled:

-

-

The grid's heavier lines are 32 pixels apart, both horizontally and vertically.

-

Show frames per second

-

In Firefox OS versions older than newer 1.4, enabling this displays frames per second, as explained in the Frames_per_second section above.

-

Show time to load

-

In Firefox OS versions older than newer 1.4, enabling this displays time to load information, as explained in the Time_to_load section above.

-

Rocketbar enabled

-

In Firefox OS versions older than newer 1.4, this option enables the new Firefox Rocketbar on your device, which provides a useful new way to switch between apps, search, and more. When enabled, you'll find a search icon at the top left of the device, and the RocketBar can be brought up by swiping from the top left of the device towards the bottom left.

-
-

Note: In newer versions of Firefox OS, Rocketbar is enabled automatically and cannot be turned off.

-
-

Contacts debugging output in adb

-

Enabling this option adds debugging information about contacts to the adb logs (error logs from the console can be accessed using adb logcat | grep "Error" in the Terminal.)

-

Progressive paint (was Layers: Progressive paint)

-

This was introduced to help with debugging of the Async Panning/Zoom module (APZ) during its implementation. Now APZ implementation is complete, this option is deprecated, and will be removed from future versions (see error 1003228).

-

Displayport Heuristics

- -

These options were introduced to help with debugging of the Async Panning/Zoom module (APZ) during its implementation, specifically to allow QA to experiment with different repainting heuristics to see which resulted in the least amount of checkboarding.. Now APZ implementation is complete, these options are deprecated, and will be removed from future versions (see error 1003228).

-

Edges gesture

-

Enabling this option allows you to swipe left and right from outside the screen towards the center, to navigate to the next and previous sheets (either web pages in the browser, or views inside another app.) This basically works like the browser navigator bar in Firefox, but is enabled by default in Firefox 2.1+.

-

Keyboard layouts

-

In addition to the developer-specific options listed above, Firefox OS < 1.4's developer settings featured keyboard layout options. These let you toggle on and off the then-experimental Chinese input methods:

-

-

As of Firefox 1.4, these options have been removed. This is because the Chinese keyboard layout implementations (zhuyin and pinyin) have now been completed.

-
-

Note: For other keyboard layouts still under development, such as Japanese, we now have a build-time config to opt them in.

-
-

 

diff --git a/files/es/archive/b2g_os/debugging/index.html b/files/es/archive/b2g_os/debugging/index.html deleted file mode 100644 index a06052613e..0000000000 --- a/files/es/archive/b2g_os/debugging/index.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Depuración en Firefox OS -slug: Archive/B2G_OS/Debugging -translation_of: Archive/B2G_OS/Debugging ---- -

Hay tres tipos de depuración que puedes realizar con Firefox OS. Puedes hacer un nivel más elevado de depuración ejecutando Gaia (y por lo tanto muchas aplicaciones web compatibles con B2G) en Firefox 15 o posteriores en el escritorio, lo cual te permitirá utilizar las excelentes herramientas de desarrollador disponibles en Firefox que te ayudarán a depurar la IU de Gaia a la vez que tu aplicación web. Por otro lado puedes usar la aplicación de escritorio dedicada a B2G; o ejecutar Firefox OS en tu dispositivo móvil o en el emulador bajo el control de gdb debugger. Y hay herramientas disponibles para ti mientras ejecutes el cliente de escritorio B2G. Este artículo proporciona enlaces a información útil para todos estos métodos varios de depurar tu código de Firefox OS.

- - - - - - - -
-

documentacion de depuracion Firefox OS

-
-
- Depuración de aplicaciones de Firefox OS en Firefox para escritorio
-
- Puedes utilizar Firefox de escritorio para depurar muchas aplicaciones web. Este artículo  te ofrece una guía de características de Firefox que te pueden venir muy bien mientras lo haces.
-
- Preparándose para depurar código de Firefox OS
-
- Antes de ponerte a usar la mayoría de herramientas integradas en Firefox para depurar código funcionando bajo Firefox OS, necesitarás realizar un poquito de trabajo de configuración previo. Este artículo te explica qué.
-
- Utilizando el depurador
-
- Puedes emplear el Depurador remoto integrado de Firefox para depurar código ejecutado bajo Firefox OS en un dispositivo usando una conexión compartida (tethering) o en el simulador de Firefox OS.
-
- Usando la Consola web remota con Firefox OS
-
- La característica Consola web remota incluida en Firefox te permite ver la salida de la consola en un dispositivo con Firefox OS.
-
- Depurando B2G con gdb
-
- El popular depurador gdb se puede utilizar para depurar Firefox OS y aplicaciones que estén en ejecución tanto en un dispositivo como en un emulador. Esta guía te mostrará cómo hacerlo.
-
- Depurar utilizando el cliente de escritorio B2G
-
- Hay una serie de características disponibles en el cliente de escritorio B2G que puedes utilizar para ayudarte a depurar tus aplicaciones. Aprende sobre ellas en este artículo.
-
- Consejos generales para la depuración con B2G
-
- Consejos de uso general aplicables a cualquier depuración con B2G que realices.
-
- Personalizando el script b2g.sh
-
- Puedes personalizar el script b2g.sh para ajustar las variables del entorno y así cambiar el comportamiento de Gecko.
-
- Obtención de registros NSPR en B2G
-
- Puedes usar los registros NSPR para grabar HTTP y otras redes.
-
- Registro HTTP
-
- Cómo registrar tráfico de red HTTP network para propósitos de depuración.
-
-

Ver todo...

-
-

obten ayuda de la comunidad

-

Si estás trabajando con Firefox OS, o desarrollando aplicaciones que te gustaría ejecutar en dipositivos con Firefox OS, ¡hay una serie de recursos de la comunidad que te pueden ayudar!

- -

Y no te olvides de la netiqueta...

-
-

 

diff --git a/files/es/archive/b2g_os/debugging/personalizando_el_script_b2g.sh/index.html b/files/es/archive/b2g_os/debugging/personalizando_el_script_b2g.sh/index.html deleted file mode 100644 index fb75932f44..0000000000 --- a/files/es/archive/b2g_os/debugging/personalizando_el_script_b2g.sh/index.html +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Personalizando el script b2g.sh -slug: Archive/B2G_OS/Debugging/Personalizando_el_script_b2g.sh -translation_of: Archive/B2G_OS/Developing_Firefox_OS/Customizing_the_b2g.sh_script ---- -

-

Borrador
- Esta página no está completa.

- -

-

En el teléfono, la aplicación b2g (que provee las APIs de Firefox OS entre otras cosas) se inicia a través del script /system/bin/b2g.sh. Se puede personalizar este script para cambiar el comportamiento de Firefox OS.

-

Establecer variables de entorno

-

Si desea establecer una variable de entorno para una ejecución simple de B2G, puede hacer lo siguiente:

-
adb shell stop b2g
-abd shell "export ENV_VAR=value && /system/bin/b2g.sh"
-
-

Si desea usar las mismas variables de entorno todo el tiempo, puede editar b2g.sh, como se describe en la siguiente sección.

-

Editando b2g.sh

-

Para depurar, usted puede desear establecer variables de entorno para conseguir inormación de registro o de otra manera afectar como se ejecuta el programa b2g. Puede hacer esto editando el script b2g.sh. No hay herramientas incluídas en el teléfono para editar este archivo en su lugar, así que necesitará copiarlo primero.

-

Connect the phone to your computer, open a terminal window, and execute the following command to edit the script:

-
adb pull /system/bin/b2g.sh
-

Edite el script para hacer todos los cambios que desee. Por ejemplo, supongamos que desea ver alguna salida de los registros (lo que require una compliación de depuración), debería agregar algo como:

-
export NSPR_LOG_FILE=/data/local/tmp/mylog.txt
-export NSPR_LOG_MODULES=Layers:5
-
-

Y luego hacer lo siguiente para subir el script b2g.sh al teléfono:

-
adb shell stop b2g
-adb remount
-adb push b2g.sh /system/bin
-adb shell chmod 0755 /system/bin/b2g.sh
-adb shell start b2g
-
-
-

Nota: /data/local/tmp es el único lugar del sistema de archivos en el que pueden escribir los procesos de contenido.

-
-

Véase también

- -

 

diff --git a/files/es/archive/b2g_os/debugging/setting_up/index.html b/files/es/archive/b2g_os/debugging/setting_up/index.html deleted file mode 100644 index c223edb982..0000000000 --- a/files/es/archive/b2g_os/debugging/setting_up/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Setting up to debug Firefox OS using Firefox developer tools -slug: Archive/B2G_OS/Debugging/Setting_up -translation_of: Archive/B2G_OS/Debugging/Setting_up ---- -
-

Firefox OS supports the same remote debugging protocol that Firefox mobile supports on Android. This means you can use the Firefox development tools to debug Gaia applications running on a Firefox OS device or emulator. In order to debug Firefox OS running on your device or on the Firefox OS Simulator, you need to use Firefox 18 or later; in addition, there are settings that need to be changed both in your desktop browser's configuration and on your Firefox OS device or simulator.

-
-
-

Note: If you want to debug apps on a Firefox OS device, and you are running Firefox 1.2+, your best option is to use the App Manager instead.

-
-

Firefox desktop

-

You need to be sure you have a build of Firefox 18 or later in order to have remote debugging support. If you don't already have a recent copy of Firefox, download the latest Nightly build to get access to all the latest features.

-

Once you're running an appropriate version of Firefox on your computer, type about:config in the URL bar and change the value of devtools.debugger.remote-enabled to true. Then you'll need to restart Firefox to get remote debugging enabled. After restarting Firefox, the Web Developer menu will have a new option, Tools > Connect...

-

Enabling debugging

-

When using the Firefox OS Simulator (or B2G Desktop), setting up for debugging is pretty easy. You don't need to do any port forwarding like you do when debugging on a physical device. Simply open your device's Developer settings and enable Remote Debugging.

-
-

Note: This no longer works on Firefox OS devices as of January 10, 2013. As of this date device builds of Firefox OS have debugging disabled. There will eventually be a way to build your own build with it re-enabled, but this doesn't exist yet. This document will be updated once that happens. In addition, the preference for turning off out-of-process support has been removed. For now, you'll need to do your debugging in the Firefox OS Simulator.

-
-

If using a real Firefox OS device, open the Developer settings and:

- -
-

Note: If you flash your device, you'll need to redo these configuration changes.

-
-

Now you're ready to use the debugger!

-

Enabling console logging on a Firefox OS device

-

On production builds of Firefox OS, console logging (for example console.log()) is disabled by default. In order to enable it, go to your device's Developer settings and enable Console Enabled.

-

Note: read On-device console logging for more details about how to use console logging on Firefox OS.

-

See also

- diff --git a/files/es/archive/b2g_os/developing_gaia/entendiendo_el_codigo_base_de_gaia/index.html b/files/es/archive/b2g_os/developing_gaia/entendiendo_el_codigo_base_de_gaia/index.html deleted file mode 100644 index 6c1ea3499d..0000000000 --- a/files/es/archive/b2g_os/developing_gaia/entendiendo_el_codigo_base_de_gaia/index.html +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Entendiendo el código base de Gaia -slug: Archive/B2G_OS/Developing_Gaia/Entendiendo_el_codigo_base_de_Gaia -translation_of: Archive/B2G_OS/Developing_Gaia/Understanding_the_Gaia_codebase ---- -
-

Before you start to make your own changes to the Gaia codebase, you should understand the basics of how it is all structured, and what coding conventions are used. This article covers both of these points.

-
-

Gaia branches

-

There are many different branches in the Gaia codebase, and depending on what work you are doing (or what device you have) you might not just want to download, hack and make the master branch. Here is a brief guide to the most common repos you'll likely be interested in:

- -

Gaia codebase structure

-

The following section outlines all the most important parts of the Gaia codebase.

-

apps/

-

This directory contains all of the main Gaia apps, both apps shown in the homescreen — such as calendar and camera — and underlying apps — such as system, homescreen, and keyboard.
-
- The apps work in slightly different ways, but all have a number of common features, including:

- -
-

Note: You can find more information about the apps actually work on our Gaia apps guide.

-
-

build/

-

This directory contains build scripts.

-

dev_apps/

-

This directory contains other apps that are included by customization. For example you could include custom apps that you want to include in custom builds in here.

-
-

Note: For more information about Gaia customization, read our Market customizations guide.

-
-

keyboard/

-

The keyboard directory contains keyboard dictionaries and layouts for different languages.

-

locales/

-

This directory contains a JSON file, languages_all.json, which defines what languages are supported on Gaia. For more insight into how apps are localized, read Getting started with app localization.

-

shared/

-

This directory contains a number of resources that multiple apps make use of; the most notable parts of these are:

- -

tools/

-

The tools directory contains tools for build scripts and tests.

-

Gaia coding style

-

Gaia follows the Google JavaScript coding style.

-

Background information:

- -

Specific rules

-
    -
  1. Make sure HTML files are declared with <!DOCTYPE html> (that is, as HTML5 documents). If you don't, Internet Explorer 9 and later will load them in compatibility mode.
  2. -
  3. Include the "use strict"; statement (just like that, including the quotes) to the top of your JavaScript files to put them into strict mode.
  4. -
  5. Always use two spaces for indentation, rather than tabs.
  6. -
  7. Please use line breaks to separate logical bits of code!
  8. -
  9. Multi-word file names should use the "underscore" character to separate words, like_this.js.
  10. -
  11. Use single quotes instead of double quotes for strings.
  12. -
  13. Use expanded conditional structures: -
    Bad
    -if (expression) doSomething();
    -
    -Correct
    -if (expression) {
    -  doSomething();
    -}
    -
  14. -
  15. If you're working on the System app, check out the guidance listed here.
  16. -
-

Per commit coding style check

-

Gaia uses jshint to automatically check JS coding styles before each commit (via a git pre-commit hook). Once you submit a Pull Request to the Gaia repository, the Travis (Github Continuous Integration) server will run this linter to double check all styles are right.

-

The precommit hook script is in gaia/tools/pre-commit and will be copied to project's .git/hooks folder once a make command is executed.

-
-

Note: We used to use gjslint to check coding styles, but we have since deprecated its use as jshint is stricter and produces better results. We’ve been using JSHint since Firefox OS 1.4, and gjslint is now only recommended for legacy files that have not yet been moved to JSHint.

-
-

Running linting checks manually via Gaia

-

Before submitting a patch we recommend you run JSHint on it manually to check for any style errors.
-
- You should look in the gaia/build/jshint directory for more details about jshint in Gaia; Gaia provides the build script for you. You can run:

-
$ make lint
-

to automatically run both the gjslint and jshint style checks. Or you can run

-
$ make hint
-

to just run the jshint style check.

-
-

Note: If you want to install jshint yourself, without using Gaia, you can use the following:

-
npm install jshint -g
-jshint myfile.js
-
-
-

 

diff --git a/files/es/archive/b2g_os/developing_gaia/index.html b/files/es/archive/b2g_os/developing_gaia/index.html deleted file mode 100644 index 93fce20871..0000000000 --- a/files/es/archive/b2g_os/developing_gaia/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Desarrollando Gaia -slug: Archive/B2G_OS/Developing_Gaia -tags: - - Construir - - Firefox OS - - Gaia - - Mozilla -translation_of: Archive/B2G_OS/Developing_Gaia ---- -
-

Gaia es la interfaz de usuario de Firefox OS y el conjunto de aplicaciones por defecto: Incluye la pantalla de bloqueo, la pantalla de inicio, marcadores, y otras aplicaciones. Esencialmente, Gaia es un conjunto de aplicaciones web complejas que se ejecutan en la capa superior de la plataforma Firefox OS. Este conjunto de articulos cubre todo lo que necesita saber para contribuir con el proyecto Gaia.

-
-

En esta guía te llevaremos a un proceso de trabajo eficaz para contribuir con Gaia — y por eso queremos decir la adición de características al codigo base de  Gaia y trabajando en errores presentes en el proyecto Gaia. El primer grupo de articulos se puden trabajar en orden, o se puede saltar a la sección que necesita para recordar un aspecto específico de el proceso.

-

Después de eso, se proporcionan materiales de referencia e información de temas adicionales.

-

-

Lo básico

-
    -
  1. Ejecutar el codigo base de Gaia
  2. -
  3. Entender el código base de Gaia
  4. -
  5. Hacer cambios en el código de Gaia
  6. -
  7. Probando los cambios en el código de Gaia
  8. -
  9. Enviar los cambios de Gaia
  10. -
-

Referencia contrucción de Gaia

- -

Ver también

- -

 

-

- -
-

Join the Gaia community

-
-
Choose your preferred method for joining the discussion:
- -
-
- -
-
-

diff --git a/files/es/archive/b2g_os/developing_gaia/running_the_gaia_codebase/index.html b/files/es/archive/b2g_os/developing_gaia/running_the_gaia_codebase/index.html deleted file mode 100644 index 334a44b435..0000000000 --- a/files/es/archive/b2g_os/developing_gaia/running_the_gaia_codebase/index.html +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Ejecutar el codigo base de Gaia -slug: Archive/B2G_OS/Developing_Gaia/Running_the_Gaia_codebase -tags: - - Gaia -translation_of: Archive/B2G_OS/Developing_Gaia/Running_the_Gaia_codebase ---- -
-

Este artículo se muestra en detalle cómo ejecutar el código base de Gaia, y qué herramienta están disponibles en esta configuración.

-
-

Para empezar, debemos señalar que NO tiene que compilar Gecko, o B2G, para contribuir con Gaia. Sólo tienes que descargar el código fuente de Gaia y tendrás la capacidad de ejecutarlo y editarlo.
-
- Hay diferentes formas de ejecutar Gaia:

- -

Puedes encontrar información concisa de como ejecutar Gaia de estas diferentes maneras desde esta página, junto con enlaces e información detallada. En general, estos se ordenan de lo más complejo (experiencia más realista), a lo más fácil (experiencia menos realista).

-

En este artículo vamos a concentrarnos en el funcionamiento de Gaia dentro de Firefox Mulet o en el WebIDE — para la mayoría de los cambios que hagas en el código base de Gaia, este mecanismo ofrece la forma más rapida de probar los cambios, pero obviamente hay algunas características (tales como probar las API del dispositivo o la interaccíon con el hardware del teléfono) no estarán disponibles, ya que necesitara un dispositivo real.

-
-

Nota: Para obtener más ayuda con Gaia, los mejores lugares son el canal #gaia (ver Mozilla IRC para más información) y la lista de correo dev-gaia.

-
-

Ejecutar tu construcción de Gaia

-
    -
  1. Primero, hacer una bifurcación (fork) de el Repositorio de Gaia en Github.
  2. -
  3. Después, clona tu bifurcación localmente: -
    git clone https://github.com/your-username/gaia.git
    -
  4. -
  5. Agrega tu producción (upstream) como esto: -
    cd gaia
    -git remote add upstream https://github.com/mozilla-b2g/gaia
    -
  6. -
  7. Now you need to create a Gaia profile. Running make inside your repo folder creates a profile in the profile directory, which is setup for optimal debugging. It creates unpackaged (hosted versions) of the Gaia apps that can be served directly via the local HTTPD server bundled along with Firefox desktop as an extension. When you make a change you just need to refresh your browser window to see the result (as you'll see later), rather than having to rebuild the profile, repush it to the device, etc. This is really good for rapid CSS/JS/HTML hacking.
  8. -
  9. With your debug profile built, run it in Mulet or WebIDE, using the linked instructions.
  10. -
-

Troobleshooting and known issues

-

Error: Python executable "python3" is v3.x, which is not supported by gyp.

-

On some Linux distributions (eg: Archlinux), the default python is python3. This makes npm fail when running some commands (eg. when running tests). To fix it once and for all, you can run the following command:

-
npm config set python python2
-

You can look at this Stack Overflow page for other solutions.

-

Then you should delete your node_modules directory and run the failed command again.

-

Please Install NodeJS -- (use aptitude on linux or homebrew on osx)

-

So, you get this error although you think you installed it. Chances are you're running Debian or another Debian-based distribution like Ubuntu. On these distributions, NodeJS is contained in the nodejs package, and you can install the nodejs-legacy package to set up everything correctly:

-
sudo aptitude install nodejs-legacy
-

If you have issues installing this package, maybe you're using Chris Lea's PPA for Node; please remove it before moving forward.

diff --git a/files/es/archive/b2g_os/elegir_como_ejecutar_gaia_o_b2g/index.html b/files/es/archive/b2g_os/elegir_como_ejecutar_gaia_o_b2g/index.html deleted file mode 100644 index 3a741cb101..0000000000 --- a/files/es/archive/b2g_os/elegir_como_ejecutar_gaia_o_b2g/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Elegir cómo ejecutar Gaia o B2G -slug: Archive/B2G_OS/Elegir_como_ejecutar_Gaia_o_B2G -tags: - - B2G - - Firefox OS -translation_of: Archive/B2G_OS/Choosing_how_to_run_Gaia_or_B2G ---- -

-

Dependiendo de tus necesidades, tienes varias opciones a considerar cuando experimentes con Firefox OS o la interfaz gráfica Gaia. Puedes elegir entre las opciones que te presentamos en esta página; cada opción tiene ventajas y desventajas a tener en cuenta, y algunas opciones son más flexibles que otras.

-

Ejecutar B2G en un equipo

-

Es posible compilar un simulador de Firefox OS y ejecutar Gaia en él. Este programa está basado en Firefox pero se comporta de forma muy parecida a Firefox OS en un móvil. Actualmente, Mozilla proporciona versiones diarias de esta aplicación para desarrolladores. Si estás familiarizado con cómo compilar el código fuente de Firefox u otros proyectos en C++, puedes compilar la aplicación tú mismo siguiendo estas instrucciones.

-

Ventajas

- -

Desventajas

- -

Razones para utilizar el simulador B2G

-

El simulador es una sólida solución intermedia para desarollo y testeo. Es una buena manera de obtener una referencia de cómo tu aplicación o cualquier otro código funciona en un entorno similar a un móvil, sin tener que flashear un teléfono cada vez que quieras probar algo.

-
- Atención: Antes de distribuir una aplicación, debes testearla primero en teléfonos de verdad.
-

Variantes del simulador

-

Hay diferentes variantes del simulador de Firefox OS:

-
-
- Add-on
-
- Esta extensión en la herramienta fundamental para testear apps en Firefox OS, y es la solución recomendada para la mayoría de usuarios. Es compatible con las herramientas para desarrolladores, agregar aplicaciones al entorno de testeo, etcétera.
-
- Versiones "desktop" para desarrolladores
-
- Estas versiones del simulador son aplicaciones independientes creadas para ayudar al equipo de desarrolladores de Firefox OS a verificar características técnicas.
-
- Versiones "desktop" para traductores
-
- Las versiones para traductores son útiles para los equipos de localización, que las usan en su trabajo y para probar las traducciones de Firefox OS y sus aplicaciones.
-
-

Ejecutar B2G en un dispositivo móvil

-

La forma más completa de probar tu código para B2G o Gaia, o tu aplicación web, es compilar e instalar Firefox OS en un dispositivo móvil de verdad. Ésta es también la forma más compleja.

-

Ventajas

- -

Desventajas

- -

Razones para utilizar B2G en un dispositivo móvil

-

Obviamente, ésta es la forma más realista de testear cualquier código o proyecto web en B2G o Gaia. Ejecutando en hardware real, te aseguras de que tu proyecto rinde bien, de que su presentación es correcta, y de que utiliza todos las APIs del dispositivo adecuadamente. Además, siempre debes probar tu código en hardware de verdad antes de distribuirlo; no hacerlo puede tener desafortunadas consecuencias que son difíciles de predecir.

diff --git a/files/es/archive/b2g_os/firefox_os_apps/building_blocks/index.html b/files/es/archive/b2g_os/firefox_os_apps/building_blocks/index.html deleted file mode 100644 index e3d6ceee63..0000000000 --- a/files/es/archive/b2g_os/firefox_os_apps/building_blocks/index.html +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: Firefox OS Building Blocks -slug: Archive/B2G_OS/Firefox_OS_apps/Building_blocks -tags: - - Design - - Design patterns - - Firefox OS - - NeedsTranslation - - TopicStub - - UI - - 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/es/archive/b2g_os/firefox_os_apps/index.html b/files/es/archive/b2g_os/firefox_os_apps/index.html deleted file mode 100644 index 370236dd14..0000000000 --- a/files/es/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/es/archive/b2g_os/firefox_os_build_prerequisites/index.html b/files/es/archive/b2g_os/firefox_os_build_prerequisites/index.html deleted file mode 100644 index f21ca58901..0000000000 --- a/files/es/archive/b2g_os/firefox_os_build_prerequisites/index.html +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Prerrequisitos para compilar Firefox OS -slug: Archive/B2G_OS/Firefox_OS_build_prerequisites -translation_of: Archive/B2G_OS/B2G_OS_build_prerequisites ---- -

Antes de bajarte el código fuente para compilar Firefox OS, necesitas un sistema de compilación configurado correctamente. Ahora mismo, es posible compilar en distribuciones Linux de 64 bits, y en Mac OS X.

-

Necesitas un teléfono móvil compatible o un emulador

-

Esto es importante. Aunque hay varios teléfonos compatibles, algunos de ellos tienen variantes y es posible que sólo algunas de esas variantes sean compatibles. Además, algunos teléfonos son más compatibles que otros. Ahora mismo, puedes utilizar Firefox OS / B2G en los siguientes teléfonos y dispositivos:

-

Categoría 1

-

Dispositivos de Categoría 1 son aquellos que recomendamos para tareas de desarrollo, porque son los que primero reciben nueva funcionalidad y soluciones a problemas y errores. Los dispositivos de Categoría 1 son:

-
-
- Unagi
-
- Unagi es un teléfono que usamos como plataforma de prueba y desarrollo para smartphones simples o de mediana capacidad. Muchos de los desarrolladores del equipo de Firefox OS utilizan Unagi.
-
- Otoro
-
- Otoro es un teléfono que usamos como plataforma de prueba y desarrollo para smartphones simples o de mediana capacidad. Muchos de los desarrolladores del equipo de Firefox OS utilizan Otoro.
-
- Pandaboard
-
- Pandaboard es una mini placa base que se usa en el desarrollo de plataformas móviles. La placa está basada en la arquitectura OMAP 4.
-
- Emulator (ARM and x86)
-
- Hay dos emuladores: uno emula código ARM y el otro ejecuta en código x86.
-
- Ordenador
-
- También puedes construir una versión de Firefox OS para ordenador que ejecuta Gecko en una aplicación XULRunner y utiliza la experiencia de usuario que proporciona Gaia
-
-

La versión para ordenador y los emuladores no requieren teléfono.

-

Categoría 2

-

Los teléfonos de Categoría 2 en general funcionan, y muchos desarrolladores, especialmente desarrolladores de aplicaciones, los utilizan; pero tienden a recibir cambios y novedades más tarde.

-
-
- Samsung Nexus S
-
- Los modelos de Nexus S que sabemos funcionan son el GT-I9020A y el GT-I9023. Es posible que otros modelos también funcionen.
-
- Samsung Nexus S 4G
-
- El modelo SPH-D720 es compatible como Categoría 2.
-
-

Categoría 3

-

Se puede construir Firefox OS para estos teléfonos, pero los desarrolladores del equipo de Firefox OS no trabajan en ellos regularmente, así que su funcionamiento y funcionalidad puede que sean significativamente peores que los de Categorías 1 y 2.

-
-
- Samsung Galaxy S2
-
- El único modelo que funciona es el i9100. Ninguna de las otras variantes es oficialmente compatible. (Es posible que el i9100P también funcione, ya que la única diferencia es la adición del chip NFC).
-
- Samsung Galaxy Nexus
-
- En estos momentos no sabemos de ninguna variante que no sea compatible.
-
-
- Importante: Sólo son compatibles los teléfonos que utilizan como mínimo Android 4 (alias Ice Cream Sandwich). Si tu teléfono se menciona en esta página pero usa una versión de Android más antigua, actualízalo primero.
-

Requisitos para Linux

-

Para compilar en Linux, necesitas:

- -

Estos requisitos son más que el mínimo indispensable, pero los recomendamos porque la construcción puede fallar debido a falta de recursos.

-

Puedes utilizar otras distribuciones, pero recomendamos Ubuntu 12.04 porque es el sistema que más gente utiliza sin dar problemas. Distribuciones que quizá no funcionen: distribuciones de 32 bits y distribuciones recientes (Ubuntu 12.10, Fedora 17/18, Arch Linux debido a gcc 4.7).

-

También necesitas instalar las siguiente utilidades:

- -

Ejemplos de instalación de 64 bits:

-

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
-

Cuando compiles en Ubuntu 64 bits, es posible que necesites crear enlaces simbólicos (symlinks) a las versiones de 32 bits de libX11.so y 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-4.6 g++-4.6 g++-4.6-multilib git ia32-libs lib32ncurses5-dev lib32z1-dev libgl1-mesa-dev libx11-dev make
-

Además del paso ya explicado para solucionar el problema con las versiones 32 bits de libX11.so y libGL.so, también necesitas especificar GCC 4.6 como el compilador del host por defecto antes de empezar a construir. Una vez que te hayas descargado el código, lee nuestras instrucciones al respecto.

-

Fedora 16:

-
$ 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
-

Arch Linux (distribución aún incompatible):

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

Por defecto, Arch Linux utiliza Python3. Necesitas forzar el uso del antiguo python2:

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

Requisitos para Mac OS X

-

Para compilar Firefox OS con Mac OS X, necesitas instalar Xcode, que está disponible en el Mac App Store.

-

Instalar las Utilidades de Línea de Comandos (XCode 4.3.1 y versiones más recientes)

-

Xcode 4.3.1 (OS X 10.7 "Lion") y versiones más recientes como 4.4.1+ (Mac OS X10.8 "Mountain Lion") no incluyen necesariamente las Utilidades de Línea de Comandos. Cuando instales Xcode, abre las Preferencias, luego el Panel de Descargas, e instala las Utilidades de Línea de Comandos. Además, asegúrate de que tienes como mínimo 20 GB de espacio libre en el disco duro.

-

Imagen de la opción de para bajarse la Utilidades de Línea de Comandos en Xcode

-
- Atención: El emulador de Firefox OS necesita un procesador Core 2 Duo o más reciente, es decir, un sistema compatible con Mac OS X 10.7 "Lion". No tienes por qué utilizar Lion, pero tu sistema debe ser compatible con Lion. Esto es sólo para el emulador: puedes construir Firefox OS en Macs más antiguos.
-

Cómo iniciar Firefox OS en Mac

-

Abre una consola y ejecuta el comando siguiente:

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

Este comando obtiene y ejecuta un programa de inicio que se asegura de que tienes todo lo necesario para compilar el emulador. También solicitará permiso para instalar cualquier cosa que falte. El programa buscará e instalará lo siguiente:

- -
-

Xcode

-

Si ya has actualizado Xcode a la versión 4.4+ pero recibes un mensaje diciendo que Xcode necesita actualización, revisa la ruta de Xcode con este comando:

-
xcode-select -print-path
- Si la ruta todavía apunta a /Developer puedes actualizarla haciendo: -
sudo xcode-select -switch /Applications/Xcode.app
- Asegúrate también de que el SDK de Mac OS X 10.6 existe en: -
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
-

Si no existe, tendrás que extraerlo y copiarlo del archivo DMG de Xcode 4.3, que está disponible en el Portal para desarrolladores de Apple. Puedes usar una utilidad que se llama Pacifist para extraer el SDK 10.6. Asegúrate de crear un enlace simbólico (symlink) entre el SDK y el directorio /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

-

Mountain Lion

-
-

Si construyendo en OS X 10.8 "Mountain Lion" (Xcode 4.4.1 o más reciente) te encuentras un error como éste:

-
external/qemu/android/skin/trackball.c:130:25: error: 'M_PI' undeclared (first use in this function)
- Edita el archivo: B2G/external/qemu/makefile.android y añade en la línea 78:
-
MY_CFLAGS += -DM_PI=3.14159265358979323846264338327950288   #/* B2G_fix: not finding M_PI constant */
-
-
- Si usando Mountain Lion, y durante la instalación de las dependencias vía homebrew, te encuentras un error como éste:
-
-
-
-
clang: error: unable to execute command: Segmentation fault: 11
-

... prueba a reinstalar las dependencias manualmente añadiendo la opción --use-gcc como se muestra en el ejemplo:

-
brew install mpfr --use-gcc
-
-

Samsung Galaxy S2

-

Si tu intención es compilar para el Samsung Galaxy S2, también necesitarás instalar heimdall. Para más información, visita {{ anch("Instalación de heimdall") }}. ¡El programa de inicio no ejecuta este paso!

-
- Atención: Si has instalado la utilidad Samsung Kies, que se utiliza para administrar los contenidos de muchos teléfonos Samsung, tienes que eliminarla antes de flashear Firefox OS en el teléfono. En Windows, puedes utilizar el procedimiento estándar para remover aplicaciones; en Mac, la imagen de Kies incluye una utilidad para desinstalar Kies completamente. Flashear Firefox OS fallará si tienes Kies instalado. Si se te olvida eliminar Kies, el sistema de compilación lo detectará y te recordará que debes desinstalarlo. Ten en cuenta que la utilidad de desinstalación no elimina correctamente el directorio ~/Library/Application Support/.FUS, y deja una referencia a cierta utilidad en ese directorio en la lista de programas a ejecutar en inicio. Necesitas eleminar el directorio y la refencia manualmente.
-
- Atención: Mac OS X utiliza un sistema de archivos que ignora las mayúsculas, lo que no te permitirá construir Firefox OS en el futuro (NOTA DEL EDITOR: yo nunca he tenido problemas con esto). Te recomendamos que generes una imagen de disco "sparse" sensible a las mayúsculas y que trabajes desde ese directorio. Para construir una imagen de disco "sparse" sensible a las mayúsculas ejecuta:
-
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/firefoxos.dmg
-

Monta la imagen ejecutando:

-
open ~/firefoxos.dmg
-

Navega al directorio de la imagen montada con:

-
cd /Volumes/untitled/
-

Cómo arreglar la dependencia de libmpc si no funciona

-

gcc 4.6 fue creado con libmpc 0.9; si utilizas homebrew para actualizar paquetes, libmpc se actualiza a la versión 1.0, pero homebrew no recompila gcc 4.6 tras el cambio de versión. Por ello debes crear un enlace simbólico (symlink) para asegurarte de que todo funciona correctamente. Creas el enlace así:

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

Opcional: Instalación de HAX

-

Intel proporciona un "driver" especial que permite al emulador x86 de B2G ejecutar código nativamente en el Mac en lugar de emularlo. Si quieres utilizar esta opción, puedes bajártela e instalarla. No es obligatorio, pero puede mejorar la estabilidad y velocidad de la emulación.

-

Instalación de adb

-

El proceso de compilado necesita obtener bloques binarios de la instalación de Android en el teléfono antes de compilar B2G (a menos, claro, que estés compilando el emulador). Para ello necesitas adb, el "Android Debug Bridge".

-

Para obtenerlo, debes instalar el paquete básico del Android SDK (Android SDK starter package) para tu versión de Android. Luego, ejecuta el gestor de paquetes haciendo $SDK_HOME/tools/android, y usa la interfaz gráfica para instalar las herramientas de sistema del Android SDK (Android SDK Platform-tools).

-

adb será instalado en $SDK_HOME/platform_tools. Asegúrate de añadir este directorio a tu PATH. Para ello, añade esta línea:

-
PATH=$SDK_HOME/platform_tools:$PATH
-

a tu ~/.bashrc o equivalente, sustituyendo $SDK_HOME con el directorio del Android SDK. También es recomendable ejecutar:

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

para hacer una copia de seguridad de la partición de Android en tu teléfono. Así tendrás una copia de todos los bloques binarios para Android en caso de que quieras eliminar los archivos de B2G. Dependiendo del teléfono, también necesitas hacer copia de seguridad de los directorios /data y/o /vendor:

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

Instalación de heimdall

-

Heimdall es una utilidad para flashear el Samsung Galaxy S2. B2G la utiliza para reemplazar los contenidos del teléfono con Firefox OS, y para flashear versiones nuevas de B2G y Gaia. Necesitas Heimdall para instalar Firefox OS sólo en el Galaxy S2; no es necesaria para ningún otro teléfono. Para otros móviles, se construye y utiliza la utilidad fastboot.

-
- Atención: Recuerda que heimdall se necesita sólo para instalar Firefox OS en el Samsung Galaxy S2.
-

Hay dos maneras de instalar heimdall:

- -

Configuración de ccache

-

El tamaño estándar de ccache es 1GB; la compilación de B2G enseguida agota esta capacidad. Puedes cambiar el tamaño de tu cache con este comando:

-
$ ccache --max-size 2GB
-

Configuración de la regla udev en tu móvil

-

Llegado a este punto, puedes obtener el código de identificación del fabricante del USB ejecutando lsusb, pero por lo general es Google (código 18d1) o Samsung (código 04e8). Por tanto, añadir la línea siguiente:

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

al archivo /etc/udev/rules.d/51-android.rules debería funcionar.

-

Guarda los cambios, cierra el archivo, y hazlo legible:

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

Configurar el teléfono

-

Antes de conectar tu teléfono al puerto USB, pon el USB en modo desarrollo, lo que te permitirá acceder al teléfono para depurar y flashear. Para ello, abre la aplicación de Ajustes, accede a la sección de Aplicaciones > Desarrollo, y selecciona la opción "Depuración USB".

-

Siguiente paso

-

Llegado a este punto, ¡ya estás listo para bajarte el código de Firefox OS!

diff --git a/files/es/archive/b2g_os/gaia_hacking_guide/index.html b/files/es/archive/b2g_os/gaia_hacking_guide/index.html deleted file mode 100644 index 8d4ba30890..0000000000 --- a/files/es/archive/b2g_os/gaia_hacking_guide/index.html +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Guía para hackear Gaia -slug: Archive/B2G_OS/Gaia_hacking_guide -translation_of: Archive/B2G_OS/Developing_Gaia ---- -

La guía para hackear Gaia aún no ha sido escrita. Sin embargo,  puedes hacer referencia a este artículo en el wiki de Mozilla, por el momento.

diff --git a/files/es/archive/b2g_os/gonk/index.html b/files/es/archive/b2g_os/gonk/index.html deleted file mode 100644 index e524f46f74..0000000000 --- a/files/es/archive/b2g_os/gonk/index.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Gonk -slug: Archive/B2G_OS/Gonk -translation_of: Archive/B2G_OS/Platform/Gonk ---- -

-

Borrador
- Esta página no está completa.

- -

-
-

Gonk es un sistema operativo de bajo nivel de la plataforma Firefox OS que consiste de un kernel Linux basado sobre el Android Open Source Project (AOSP) y una capa de abstracción de hardware (HAL). Este artículo intenta explicar qué constituye Gonk; para obtener más información sobre la arquitectura general del Firefox OS y cómo Gonk encuadra en ella, lea nuestra guía sobre la Arquitectura de Firefox OS.

-
-

Panorama de Gonk

-

En el código fuente de Gecko hay una carpeta b2g\ que contiene el Gonk Port, el cual habilita las capacidades del hardware móvil para la Web. Consiste de un núcleo, o kernel, Linux, HAL y otras librerías OEM específicas. Varias librerías Gonk son proyectos de código abierto comunes: libusb, bluez, etcétera. Algunas de las otras partes de la HAL están compartidas con el Proyecto Android: GPS, cámara y otros.

-

Gonk es una capa de adaptación (port) de dispositivos: un adaptador entre el hardware y Gecko. Gonk es una distribución de Linux bastante sencilla que puede ser tratada como un adaptador Gecko empardado con capas de adaptación Gecko —entonces Gonk es un objetivo para adaptar Gecko a Firefox OS así como también hay adaptadores de Gecko para OS X, Windows y Android.

-
-

Nota: debido a que diferentes dispositivos móviles pueden tener diferentes chips y otras especificaciones de hardware, los dispositivos pueden tener diferentes distribuciones de Gonk.

-
-

Como el Proyecto Firefox OS goza de control total sobre Gonk, podemos exponer interfaces a Gecko que no podrían ser expuestas en otros sistemas operativos. Por ejemplo, Gecko posee a través de Gonk acceso directo al conjunto completo de telefonía y al buffer de pantalla.

-

Código fuente de Gonk

-

El repositorio B2g en Github contiene soporte oficial para todas las adaptaciones de Gonk para una variedad de dispositivos, así que puede tratarlo como un repositorio de Gonk. La lista de dispositivos soportados está en B2g/config.sh.

-

La mayor parte del trabajo diario realizado en Gonk implica adaptar el sistema a diferentes placas y asegurarse de que Gecko responda bien a los diferentes dispositivos.

diff --git a/files/es/archive/b2g_os/index.html b/files/es/archive/b2g_os/index.html deleted file mode 100644 index 05e4a3fabb..0000000000 --- a/files/es/archive/b2g_os/index.html +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: B2G OS -slug: Archive/B2G_OS -tags: - - B2G - - B2G OS - - Basic - - Empezando con B2G OS - - Gaia - - Gecko - - Gonk - - Mozilla - - Overview - - Principiante - - SO web Gecko - - SO web basado en Mozilla - - b2g smartphone os -translation_of: Archive/B2G_OS ---- -
B2G OS es un sistema operativo completo e independiente para un internet abierto. Es un proyecto de código abierto desarrollado por la comunidad de Mozilla, y conforma la base de los productos para Firefox OS.
- -

B2G OS es un sistema operativo de código abierto mantenido por la comunidad, para teléfonos inteligentes, tabletas, televisiones inteligentes, y otros dispositivos conectados. El proyecto se comenzó en 2011, y está basado en el kernel de Linux y en el motor de renderizado Gecko. Toda la interfaz de usuario está hecha con tecnologías web (HTML, CSS y JavaScript), y se puede utilizar para lanzar y utilizar aplicaciones web. Desde que Mozilla discontinuó su programa comercial de Firefox OS para teléfonos inteligentes, la parte de teléfonos del proyecto es mantenida enteramente por la comunidad de voluntarios de Mozilla, y se ha renombrado a B2G OS.

- -

- -
-

Nota: Se ha realizado una Llamada a contribuir y una Llamada para la adopción de Apps para reunir a más gente, ¡siéntete libre de compartirlo!

-
- -
-
-

Cómo puedes ayudar

- -
    -
  • Reporta y soluciona bugs (el bug principal es el bug 1252143).
  • -
  • Ayúdanos a solucionar pruebas fallidas.
  • -
  • Migra a gaia una app de teléfono: -
      -
    1. Conviértela en una aplicación web (ó)
    2. -
    3. Conviértela en chrome:// (por qué?) y repórtalo
    4. -
    -
  • -
  • Porta B2G OS a tu teléfono, o ayúdanos a mantener una portabilidad.
  • -
  • Ayuda a mejorar y traducir esta documentación y la wiki.
  • -
  • Propón e implementa nuevas funcionalidades para teléfonos inteligentes.
  • -
-
- -
-

Involúcrate

- - - -

Para participar en reuniones y en los Grupos de Trabajo de la comunidad, regístrate en este Calendario. Se anuncia en Discourse, donde puedes encontrar información sobre cómo asistir y notas.

-
- -
-

Dispositivos compatibles

- - - -

Para más información visita esta página.
- Flashea tu dispositivo fácilmente con B2G installer.
- ¿Tu dispositivo no está en la lista? Prueba Mulet para escritorio.

- -

*TEP = Trabajo En Progreso.

-
-
- -

-

-

Nota: Se han movido algunas páginas a los Archivos de MDN — Haznos saber si tienes problemas para encontrar algo o si hay algo en los archivos que crees que debería regresar a esta sección.

-
-

diff --git a/files/es/archive/b2g_os/installing_on_a_mobile_device/index.html b/files/es/archive/b2g_os/installing_on_a_mobile_device/index.html deleted file mode 100644 index 690ea49147..0000000000 --- a/files/es/archive/b2g_os/installing_on_a_mobile_device/index.html +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Instalar Firefox OS en un dispositivo móvil -slug: Archive/B2G_OS/Installing_on_a_mobile_device -tags: - - Firefox OS - - Flashear - - Galaxy S2 - - i9100 -translation_of: Archive/B2G_OS/Installing_on_a_mobile_device ---- -

-

Una vez que se ha construido Boot to Gecko para un dispositivo móvil compatible, puede instalarlo. Este artículo le guiará a través del proceso.

-
- Nota: La primera vez que flashea su teléfono, deberá tener Android 4 (Ice Cream Sandwich) instalado. De lo contrario el proceso no funcionará correctamente. Una vez que usted ha hecho su primera instalación de B2G, sin embargo, sólo tiene que actualizar en la parte superior de la misma.
-

Instalando ADB

-

En OSX:

-

Si tienes homebrew en OSX:

-
brew install android-platform-tools
-
-

De lo contrario descargue las Herramientas para Desarrolladores Android y agrega los binarios a tu PATH.

-

En Ubuntu:

-
sudo apt-get install android-tools-adb
-

Flasheando su telefono

-

Para actualizar todo a su teléfono, sólo tiene que conectar el teléfono y el tipear:

-
./flash.sh
-
-

Eso es todo. El B2G que tienes actualmente en construcción flasheara el dispositivo.

-

Configuración de la regla de udev para su dispositivo

-

En Linux, si obtine,

-
< waiting for device >
-

probablemente significa que usted no ha añadido una regla udev para el dispositivo fastboot, que no es el mismo que el de adb. Usted puede obtener el ID de proveedor USB al ejecutar lsusb ahora, pero por lo general es de Google: 18d1, por lo que añadir esta línea en el archivo / etc/udev/rules.d/51-android.rules funcionaría:

-
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
-
- Nota: Si usted recibe un error libusb muy útil "-3" en Linux, esto significa que usted tiene que ser root para tener el acceso necesario para el dispositivo USB. Ejecute el script de nuevo usando sudo.
-
- Nota 2: Si tienes un un teléfono Keon Geeksphone o Unagi, necesita dos líneas como esta - una para la identificación del proveedor original del teléfono y otra para la de Google.
-

Notas especiales para el Samsung Galaxy S2

-

Si el teléfono es un Galaxy S2 y utiliza Heimdall 1.3.2 (la versión más reciente, use heimdall version para comprobar), es posible que vea un error alarmante "FACTORYFS upload failed!" seguido de "Heimdall flashing failed" y alguna información adicional. Esto es realmente una condición de finalización satisfactoria, y se puede hacer caso omiso de los consejos.

-
-  
-
- Para deshacerse de este extraño comportamiento, tomar una copia de origen de Heimdall, degradar a la versión 1.3.1 ("git checkout fbbed42c1e5719cc7a4dceeba098981f19f37c06"), luego compilarlo según el README, a continuación, instalarlo para que el error desaparezca. Sin embargo, esto no es estrictamente necesario.
-
-  
-
- Todas las versiones de Heimdall son incapaces de flashear una system.img mayor que 100 MB. hacer:
-
ls -l ./out/target/product/galaxys2/system.img
-
-

para ver qué tan grande es el suyo. Si es demasiado grande, pregunte en el IRC para aconsejarlo; hay maneras de hacerlo en dos etapas.

-

Paso añadido para el Samsung Galaxy S2

-

Si está flasheando el Galaxy S2, hay un paso adicional a seguir. Gaia no consigue flashear automáticamente por el script flash.sh, necesitará hacer también:

-
./flash.sh gaia
-
-

Flasheando particiones específicas para teléfonos fastboot

-

Usted puede flashear particiones específicas para teléfonos fastboot (es decir, cualquier teléfono que no sea el Samsung Galaxy S2). Por ejemplo:

-
./flash.sh system
-./flash.sh boot
-./flash.sh user
-
-

Actualización de módulos específicos

-

Puede actualizar los componentes específicos de B2G especificando sus nombres cuando flashea. Por ejemplo:

-
./flash.sh gaia
-./flash.sh gecko
-
-

Para actualizar sólo una aplicación puede utilizar la variable de entorno BUILD_APP_NAME:

-
BUILD_APP_NAME=calendar ./flash.sh gaia
-

Próximos pasos

-

En este punto, el teléfono debe estar ejecutando Boot to Gecko! Es hora de experimentar, escribir algo de código, prueba, o hacer algo de depuración!

-
- Note: Un consejo útil de uso: si su estructura de B2G se inicia con la pantalla de bloqueo solicitar un código de acceso para desbloquear el teléfono, el código por defecto es 0000.
-

Solución de problemas

-

Aquí hay algunos consejos sobre qué hacer si el dispositivo no funciona correctamente después de instalar B2G, o actualizar a una nueva versión

-

Si la interfaz de usuario no se inicia

-

Si actualizas el teléfono y la interfaz de usuario no inicia, puede restablecerla para limpiar configuración fuera de fecha y similares. Esto puede traer de vuelta a la vida. He aquí cómo:

-
cd gaia
-make reset-gaia
-
-

"la imagen es demasiado grande" mensaje de error en la ejecución ./flash.sh

-

Podría significar que el teléfono necesita ser arraigada primero antes de flashear ella. Como b2g tiene que ser escrito en la partición root, el teléfono debe estar enraizado con el fin de instalarlo.

diff --git a/files/es/archive/b2g_os/introduction/index.html b/files/es/archive/b2g_os/introduction/index.html deleted file mode 100644 index 76ac08d8c4..0000000000 --- a/files/es/archive/b2g_os/introduction/index.html +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Introducción a Firefox OS -slug: Archive/B2G_OS/Introduction -translation_of: Archive/B2G_OS/Introduction ---- -

Firefox OS (también llamado por su nombre clave "Boot to Gecko" o "B2G") es el sistema operativo de código abierto de Mozilla basado en Linux y la tecnología Gecko de Mozilla. La idea es esencialmente tener todo el software accesible al usuario ejecutándose en el teléfono siendo una aplicación web que use técnicas avanzadas de HTML5 y APIs de dispositivos para acceder al hardware del teléfono directamente vía JavaScript.

-

Para los desarrolladores web, la parte más importante a entender es que la interfaz de usuario completa es una aplicación web, que es capaz de mostrar e iniciar otras aplicaciones web. Cualquier modificación que haga a la interfaz de usuario y cualquier aplicación que crees para ejecutarse en Firefox OS son páginas web, aunque con acceso mejorado al hardware del dispositivo móvil y sus servicios.

-

Puede aprender cómo construir e instalar Firefox OS siguiendo nuestra guía práctica.

-

Tips de uso

-

Esta sección proporciona algunos consejos que realmente le ayudarán a usar Firefox OS. Esto es algo así como un marcador de posición hasta que tengamos real documentación de uso.

-

Desbloqueando el teléfono

-

Si tu versión de Firefox OS inicia preguntando por una clave para desbloquear el dispositivo, el código por defecto es 0000. Algunas versiones harán eso mientras desarrollamos y probamos la pantalla de bloqueo.

-

Capturando una pantalla

-

Actualmente no hay soporte en el dispositivo para capturar pantalla. Sin embargo, puede hacer desde la terminal en la computadora Linux o Mac OS X que tenga un sistema de construcción de Firefox OS instalado.

-
    -
  1. Asegúrese que tiene ffmpeg instalado. -
      -
    1. En Mac, si usa MacPorts, puede hacerlo con sudo port install ffmpeg. Para homebrew, haga brew install ffmpeg.
    2. -
    3. En Linux (Ubuntu/Debian), utilice sudo apt-get install ffmpeg.
    4. -
    -
  2. -
  3. Conecte su teléfono a la computadora usando un cable USB.
  4. -
  5. Navegue en su teléfono a cualquier situación donde desea obtener la captura de pantalla.
  6. -
  7. cd hacia el directorio B2G/gaia
  8. -
  9. make screenshot
  10. -
  11. Ahora puede tener una captura de pantalla llamada screenshot.png.
  12. -
diff --git a/files/es/archive/b2g_os/phone_guide/fairphone/index.html b/files/es/archive/b2g_os/phone_guide/fairphone/index.html deleted file mode 100644 index 9f09a19917..0000000000 --- a/files/es/archive/b2g_os/phone_guide/fairphone/index.html +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: Fairphone -slug: Archive/B2G_OS/Phone_guide/Fairphone -tags: - - B2G - - Celular - - Comercio justo - - Dispositivo - - Fairphone - - Firefox OS - - Gaia - - Guía -translation_of: Archive/B2G_OS/Phone_guide/Fairphone ---- -
-

Advertencia: Este dispositivo todavía no ejecuta Firefox OS, pero este es el objetivo final. Esta página pretende ser un punto central de información para la comunidad de la coordinación del trabajo de portabilidad.

-
- -

El Fairphone es un smartphone de economía justa; centrado en el abastecimiento, la producción, la distribución, la auto-reparación y el reciclaje de productos electrónicos. No es completamente hardware software libre, pero es compatible con la idea de devolver al menos algún tipo de control de hardware para los usuarios.

- -

Información de publicación del dispositivo

- -

Fairphone ha lanzado dos dispositivos hasta ahora - la FP1 v1 Fairphone (primera edición) fue lanzado el 30 de diciembre del 2013 y el FP1U (segundo lote) fue lanzado el 22 de julio de 2014. Las ventas han llegado a su fin para el dispositivo v1. El v2 Fairphone fue lanzado el 16 de julio 2015 y se puede pedir a Fairphone.

- - - - - - - - - - - - - - -
Fairphone v1Fairphone v2
A picture of the Fairphone v1 device, showing lockscreen and the back. Credit : Fairphone. CC BY-NC-SA.Fairphone 2 Black Matte
- -
-

Nota: Puede seguir el progreso en el blog Fairphone, y revisar la estrategia anunciada y el enfoque.

-
- -

Portabilidad de Firefox OS al dispositivo Fairphone

- -

Esto aún no ha sucedido, pero se está trabajando.

- -

Problemas reales

- -

Fairphone v1 no pudo actualizar su sistema operativo Android personalizado porque el fabricante del chipset no dio a conocer un código abierto de banda actualizada o compilación.

- -

En el Mobile World Congress 2015, Fairphone hizo un llamado a los posibles sistemas operativos alternativos disponibles para el próximo Fairphone v2. Estas conversaciones que se llevaron a cabo dieron por inicio la portabiliad de Firefox OS al dispositivo Fairphone. Una portabilidad de Firefox OS puede ser una manera de salvar al Fairphone v1, así como evitar estas cuestiones para las futuras generaciones de teléfonos. La colaboración de Mozilla con los tres principales proveedores de chipset también ayudaría.

- -

Fairphone v2 es orientado a código abierto con contribuciones de la comunidad a código fuente y a compilación de Fairphone OS.

- -

El progreso y la solución

- -

En este momento el proyecto de portabilidad está empezando (fase de encendido). Esperamos que el trabajo de portabilidad comienze pronto — ver este espacio para más información. 

- -

Contribuyendo

- -

Si usted está interesado en saber más contribuir al esfuerzo para la portabilidad, los siguientes enlaces le llevaran a donde usted necesita ir.

- -

Si usted está interesado en saber más o contribuir al esfuerzo de llevar a cabo, los siguientes enlaces le llevaran a donde usted necesita ir.

- -

Herramientas de Proyecto

- - - -

Firefox OS

- -

Si usted es un desarrollador de portabilidad y quieres saber más acerca del sistema operativo Firefox OS:

- - - -

Comunidad de portabilidad XDA

- -

Si usted es un desarrollador de Firefox OS y desea saber más acerca de portar un sistema operativo:

- - - -

Especificaciones del dispositivo

- -

Fairphone v1

- -

Usted puede encontrar una lista detallada de las especificaciones en la página de las especificaciones de Fairphone.

- -

Red

- - - -

Hardware

- - - -

Software

- - - -

Fairphone v2

- -

Usted puede encontrar una lista detallada de las especificaciones en la página de las especificaciones de Fairphone.

- -

Red

- - - -

Hardware

- - - -

Software

- - - -

Ver también

- - diff --git a/files/es/archive/b2g_os/phone_guide/flame/configuracion_inicial/index.html b/files/es/archive/b2g_os/phone_guide/flame/configuracion_inicial/index.html deleted file mode 100644 index 90bb74f775..0000000000 --- a/files/es/archive/b2g_os/phone_guide/flame/configuracion_inicial/index.html +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Configuración Inicial -slug: Archive/B2G_OS/Phone_guide/Flame/Configuracion_Inicial -tags: - - B2G - - Firefox OS - - Flame - - developer phone - - dispositivo de referencia(2) - - reference device - - teléfono desarrollador -translation_of: Archive/B2G_OS/Phone_guide/Flame/Initial_setup ---- -
-

Después de conseguir un Flame, hay un par de pasos que usted debe asegurarse de que usted sigue para su sistema operativo particular, antes de empezar a tratar de actualizar su dispositivo Flame, por ejemplo para actualizar la versión de Firefox OS de su Flame, o instalar aplicaciones a su teléfono. Ambos están cubiertos en los artículos siguientes, pero se debe trabajar a través de este artículo primero.

-
- -

Todos los sistemas operativos

- -

Necesita instalar ADB y Fastboot en su ordenadorestos son aplicaciones que le permiten interactuar con su teléfono desde la computadora cuando los dos están conectados a través de cable de carga USB del teléfono. Son necesarios para que pueda flashear el teléfono a una nueva versión de Firefox OS, recuperarse de un estado no interactivo, instalando aplicaciones a su teléfono, etc.

- -
-

Nota: Si estás en Ubuntu puede instalar ADB y Fastboot simplemente usando sudo apt-get install android-tools-adb android-tools-fastboot en la línea de comandos.

-
- -
-

Nota: Si usted está en Mac OS puede instalar ADB y Fastboot simplemente usando Homebrew en la línea de comandos. Mire Instalando y usando ADB.

-
- -

ADB y Fastboot se encuentra disponible en Android Developer Toolkit:

- -
    -
  1. Vaya al link anterior.
  2. -
  3. Presione el botón Download Eclipse ADT.
  4. -
  5. Acepte las condiciones de la licencia.
  6. -
  7. Elija entre la versión de 32 bits y 64 bits (elija 32-bit si no estás seguro).
  8. -
  9. Clic en el botón final Download Eclipse ADT with the Android SDK....
  10. -
  11. Una vez finalizada la descarga, descomprima el contenido del archivo zip en el escritorio de su ordenador.
  12. -
  13. El nombre de la carpeta es un poco complicado; cambiarle el nombre a simplemente adt.
  14. -
- -

ADB es una herramienta que se ejecuta desde la línea de comandos. Si usted abre su terminal / simbolo de sistema, vaya a adt/sdk/platform-tools y ejecute el comando adb, debería ver una carga de la información arrojada de vuelta a usted acerca de lo que puede hacer con ADB. Ejecutando adb devices debe devolver la línea List of devices attached, y nada más, porque no tienes ningún dispositivo aún conectado.

- -

En este punto, es necesario establecer la variable PATH para que apunte a la herramienta ADB, para que pueda ejecutarlo desde cualquier lugar, no sólo cuando se está en el directorio exacto en que está el ADB.

- -

Para hacer esto en Windows 8 (Windows 7 será muy similar, pero con pocas diferencias de opciones de menú):

- - - -
-

Nota: Para abrir el símbolo del sistema, haga clic en el botón derecho en el botón de Windows en la parte inferior izquierda y seleccione la línea de comandos.

-
- -

En Mac/Linux:

- - - -

Habilitando depuración remota

- -

Asegúrese de depuración remota segura está activado en tu Flame, usando la opción Depuración Remota/Depuración via USB en Ajustes de desarrollador en el dispositivo (opción es diferente, dependiendo de si usted tiene Firefox 1.3 e inferior, o Firefox 1.4+ instalado).

- -

Pasos extra para Linux

- -

Dependiendo de su distro Linux, es probable que tenga que agregar una regla udev para su teléfono.

- -

Para descubrir el ID de proveedor de su dispositivo, conectar su teléfono a través de USB y utilice el comando lsusb para ver los dispositivos detectados en el subsistema USB. Encuentre su teléfono en la lista, y tome nota de las cuatro primeras cifras inmediatamente seguido de "ID". Un ID común para Flame es 05c6, por lo que una regla udev en este caso sería:

- -
SUBSYSTEM=="usb", ATTRS{idVendor}=="05c6", MODE="0666"
-
- -

Si el dispositivo muestra un número diferente, utilice en su lugar. Por ejemplo:

- -
SUBSYSTEM=="usb", ATTRS{idVendor}=="18d1", MODE="0666"
-
- -

Asegúrese de ejecutar el comando udevadm control --reload-rules (podría ser automática dependiendo de su configuración), a continuación, desconecte y vuelva a conectar el dispositivo antes de continuar.

- -

Pasos extra para Windows

- -

Para acceder al dispositivo Flame con ADB y herramientas Mozilla dev como App Manager/WebIDE, se requiere un controlador USB. Siga los pasos descritos en las secciones siguientes para instalarlo.

- -

Descargando el controlador

- -

Descargue el controlador de Windows desde esta ubicaciónUna vez descargado, extraer el contenido del archivo ZIP en un lugar adecuado en su disco duro.

- -
-

Nota: Android Debug Bridge (ADB) se debe instalar primero: ver instrucciones anteriores si no has hecho esto ya.

-
- -

Instalando el controlador USB

- -

En este punto, conecte el dispositivo Flame al ordenador mediante un cable USB.

- -

Para instalar el controlador abra el directorio Alcatel_USB_Driver_Q_4.0.0_2013_11_11_noinstall  dentro del archivo ZIP extraídos y haga doble clic sobre el ejecutable DriverInstaller.exe. Es posible que reciba una advertencia en este punto que el ejecutable es de un editor desconocido. Si es así, seleccione el botón Si y se pondrá en marcha el ejecutable.

- -

Simple dialog box showing a picture of a phone along with install and uninstall buttons.

- -

Clic en el botón Install para instalar el controlador.

- -

Después de que el controlador se ha instalado, puede comprobar que está trabajando abriendo una ventana de línea de comandos y escribiendo adb devices.

- -

Esto debe listar el dispositivo conectado con una salida algo como:

- -
List of devices attached
-3561d02a          device
- -

Si el dispositivo no aparece aquí, compruebe en el Administrador de dispositivos de Windows. Su Flame puede aparecer como "ACER ADB Interface". Puede confirmar esto desconectando el dispositivo y ver si desaparece del administrador de dispositivos. Desinstale el software del controlador haciendo clic derecho sobre "ACER ADB Interface" y haciendo clic en desinstalar.  Asegúrese de marcar la casilla en el cuadro de diálogo para eliminar el software del controlador. Ahora vuelva a ejecutar el instalador anteriormente. Es recomendable establecer el tiempo de espera de pantalla en su Flame a algo alto (Ajustes > Pantalla > Screen timeout) en Windows aparece a veces para volver a instalar los controladores predeterminados cuando la pantalla se apaga.

diff --git a/files/es/archive/b2g_os/phone_guide/flame/index.html b/files/es/archive/b2g_os/phone_guide/flame/index.html deleted file mode 100644 index caf801ff64..0000000000 --- a/files/es/archive/b2g_os/phone_guide/flame/index.html +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Flame -slug: Archive/B2G_OS/Phone_guide/Flame -tags: - - Firefox OS - - Flame - - developer phone - - dispositivo de referência - - teléfono desarrollador -translation_of: Archive/B2G_OS/Phone_guide/Flame ---- -
-

Actualizaciones en tu Flame: Le animamos a unirse a la siguiente lista de correo para recibir actualizaciones periódicas sobre el software builds y otras noticias relacionadas a su dispositivo Flame: https://mail.mozilla.org/listinfo/flamenews

-
- -

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

- -

Flame es el dispositivo de referencia oficial para el desarrollo, prueba y depuración de Firefox OS y aplicaciones web abiertas. Esta guía proporciona información básica acerca de sus especificaciones de hardware, así como documentación práctica específica experimentando con, desarrollando para, y prueba de software compatible con este teléfono.

- -

El hardware de Flame ofrece un conjunto representativo de especificacionesincluyendo pantalla FWVGA y procesador de doble núcleopara ayudar a los desarrolladores a crear gran contenido y experiencias. Una única plataforma de hardware también es bueno para los probadores, por lo que es más fácil de probar y abordar cuestiones específicas de software sin tener que preocuparse de dispositivos de modelos específicos, errores, etc.

- -

Si usted tiene su teléfono en la mano y quiere empezar a jugar con el, desarrollando y distribuyendo aplicaciones, o contribuir a la plataforma de Firefox, los siguientes enlaces le llevarán a donde necesita ir:

- - - -

Si desea obtener más información sobre actualizar el sistema operativo, recuperación, instalación de aplicaciones, especificaciones del teléfono, usted encontrará la información que necesita en los dos artículos siguientes:

- - - -

Obtener un dispositivo

- -

Las ventas de Flame han llegado a su fin. Todavía hay un montón de oportunidades para los colaboradores de Mozilla para obtener Flame gratuitos, incluyendo una próxima segunda ronda del programa Foxtrot. Si tiene preguntas acerca de cómo obtener un dispositivo gratis para desarrollo o pruebas, por favor, comuniquese con Asa Dotzler o Marcia Knous (marcia) en el canal #fxos en IRC.

- -

Especificaciones del dispositivo

- -

Usted puede encontrar más de las especificaciones del dispositivo que aparecen en nuestra página Phone and device specs.

- -

Red

- - - -

Hardware

- - - -

Mire también

- -

 

- - - -

 

diff --git a/files/es/archive/b2g_os/phone_guide/flame/updating_your_flame/index.html b/files/es/archive/b2g_os/phone_guide/flame/updating_your_flame/index.html deleted file mode 100644 index 62e3ec86a4..0000000000 --- a/files/es/archive/b2g_os/phone_guide/flame/updating_your_flame/index.html +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: Actualiza tu Flame -slug: Archive/B2G_OS/Phone_guide/Flame/Updating_your_Flame -tags: - - Firefox OS - - Flame - - developer phone - - dispositivo de referência - - reerence device - - teléfono desarrollador -translation_of: Archive/B2G_OS/Phone_guide/Flame/Updating_your_Flame ---- -
-

En este artículo se explica cómo actualizar el software en su Flame - incluyendo la actualización de Firefox OS e instalación de nuevas aplicaciones a su teléfono - junto con copias de seguridad de sus datos, y alguna otra solución útil de problemas e información de prueba. Antes de empezar a hacer algo de esto, usted debe asegurarse de que ha iniciado a través de la información de configuración inicial (Initial setup).

-
- -

Actualizando el software del Flame

- -

Tenemos dos principales "canales" de versiones Firefox OS para el Flame:

- - - -

Imagen Base

- -

Usted puede obtener archivos de recuperación y herramientas en los siguientes lugares de almacenamiento:

- -

Up-to-date (utilice éstos a menos que tenga una buena razón para no hacerlo)

- - - -
-

Nota: Puede averiguar qué imagen base está funcionando en su dispositivo con el comando adb shell getprop ro.bootloader. La versión son los últimos cuatro caracteres, con el último entonces removido, el prefijo 'v' (e.j. L1TC000118D0 > v18D).

-
- -
-

Importante: Cuando se ejecuta un flasheo completo o poco profundo (shallow flash), se sobrescribirán los datos del teléfono: por lo tanto, debe hacer una copia de seguridad de sus datos antes de actualizar! Mire la sección Respaldando y restaurando su información del Flame para más detalles.

-
- -

Obsoleto

- -

Estas imágenes base de son solo estables y de producción.

- - - -
-

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

-
- -
-

Nota: Las Imágenes v180 de Firefox OS y anteriores se basan en Android KK (Kitkat, 4,4); Builds JB (Jellybean, 04.01 a 04.03) ahora han sido descontinuados y ya no son compatibles, por lo que no debe usar nada más antiguo a v180.

-
- -

Instalación de imágen base

- -

Para instalar la imagen base en su dispositivo:

- -
    -
  1. Asegúrate de que la depuración remota esté habilitada en el Flame, utilizando la opción Depuración remota/Depuración vía USB en Ajustes de desarrollador (la opción es diferente, dependiendo de si usted tiene Firefox 1.3 e inferior, o Firefox 1.4+ instalado).
  2. -
  3. Conecta tu Flame al ordenador mediante un cable USB. Comprueba que el equipo está conectado al dispositivo mediante el comando adb devices en una terminal.
  4. -
  5. Descarga el archivo .zip mencionado anteriormente. Descomprímelo en tu escritorio.
  6. -
  7. Abre la carpeta en la que has extraído la Imágen y ejecuta: -
      -
    • En Windows, abriendo desde la línea de comandos flash.bat (o haz doble clic en el archivo en el explorador de archivos)
      - Nota: Si falta flash.bat, simplemente cambie el nombre del archivo flash.sh a flash.bat, a continuación, ejecute eso. Asegúrese de tener adb y fastboot instalado y disponible en PATH.
    • -
    • En Linux / OSX, entra en la carpeta mediante la terminal, a continuación, ejecuta el script flash.sh usando ./flash.sh (instrucciones previas le recomiendan utilizar sudo. No. Es muy peligroso utilizar sudo con las cosas que se descargan de Internet. Si el script de flasheo no encuentra su dispositivo, por favor compruebe que sus Reglas udev son correctas). Si usted no ve un archivo flash.sh, simplemente cambie el nombre del archivo flash.bat a flash.sh primero y luego usar el comando anterior.
    • -
    -
  8. -
- -
-

Nota: Si usted recibe un error "permiso denegado" al ejecutar los comandos anteriores, el script de shell, probablemente no tiene los permisos adecuados. Ejecutando chmod +x flash.sh en él debe resolver este problema.

-
- -
-

Nota: Si el script de flasheo queda atascado en "< waiting for device >" mientras la pantalla muestra "ThunderSoft (R)", el script no tiene permiso para acceder al dispositivo mientras está en modo fastboot. Necesita configurar las reglas udev para darle acceso. También puertos USB 3 no funcionan bien con fastboot y pueden ser la causa de este problema.

-
- -
-

Nota: También te invitamos a construir su propio build para instalar en Flame: mire Compilando e instalando Firefox OS.

-
- -

Arreglar la Fuente

- -
-

Importante: Este paso sólo es necesario para la imagen base v180.

-
- -

Después de actualizar Gecko y Gaia a Nightly con la imagen base v180, habrá una falta de correspondencia entre las fuentes que espera Gecko y Gaia y lo que la imagen base proporciona (esto se ha solucionado a partir de V188). Para solucionar esto, usted tiene dos opciones:

- - - -

Actualizando su Flame a una build nightly

- -
-

Nota: Para la versión actual, el desarrollo Nightly Builds de Firefox OS no es compatible con A-GPS, que puede conducir a un rendimiento lento de la funcionalidad GPS. Tenemos la intención de resolver esto de una futura actualización del canal Nightly.

-
- -
-

Importante: Cuando se ejecuta un flasheo completo o poco profundo (shallow flash), se sobrescribirán los datos del teléfono: por lo tanto, debe hacer una copia de seguridad de sus datos antes de actualizar! Mire la sección Respaldando y restaurando su información del Flame para más detalles.

-
- -
    -
  1. Antes de actualizar su teléfono a una build Nightly usted debe flashear la última imágen base para asegurarse de que los sistemas subyacentes están al día. Descargue una imágen base con la misma o una versión superior de Firefox OS de la versión que va a utilizar en el paso 3 y use esto para actualizar el software del dispositivo, como se explicó anteriormente.
  2. -
  3. Debido a que en el paso anterior se instala un sistema operativo nuevo en el dispositivo, tendrás que habilitar de nuevo la depuración remota en tu Flame, usando la opción Depuración remota en Ajustes de desarrollador del dispositivo.
  4. -
  5. A continuación, elija una build para instalar (las puedes encontrar en http://ftp.mozilla.org/pub/mozilla.org/b2g/nightly/). Usted querrá una de las siguientes: - -
  6. -
  7. Escoja una versión y descarge tanto el archivo b2g-XX.XX.en-US.android-arm.tar.gz y gaia.zip files. Guardelos dentro de un directorio en el escritorio llamado algo así como fxos.
  8. -
  9. Descarga el script de flasheo poco produnfo y guárdelo en el mismo directorio que los dos archivos anteriores.
  10. -
  11. Para usuarios de Windows: Descargue también el script windows shallow_flash.bat e instale Cygwin, que proporciona un entorno de comandos de Linux-como en Windows. Usted tendrá que instalar la categoría predeterminada Cygwin base más el paquete descomprimido pero shallow_flash.bat lo hará por usted si usted descarga y copia la configuración Cygwin * .exe en la misma carpeta que el script.
  12. -
  13. -

    Desde la línea de comandos o Terminal, utilice el cd para entrar en la carpeta en la que ha guardado los archivos y luego usa el siguiente comando:

    - -

    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:

    - -

    Doble clic en shallow_flash.bat (con el icono de engranajes) o ejecutarlo desde una consola de comandos (CMD). Se flasheará gaia.zip y un solo b2g-XX.XX.en-US.android-arm.tar.gz file.

    -
  14. -
- -
-

Nota: Si usted recibe un error "permiso denegado" al ejecutar los comandos anteriores, el script de shell, probablemente no tiene los permisos adecuados. Ejecutando chmod +x flash.sh en él debe resolver este problema.

-
- -
-

Nota: Un "shallow flash"actualiza Gecko y Gaia más directorios de datos, en lugar de un flash completo, que actualiza Gecko / Gaia, sino también la capa Gonk subyacente y binarios asociados en particular a este tipo de dispositivo. Es por esto que es una buena idea para actualizar a la primera base image, como se sugirió anteriormente, entonces flasheo poco produnfo sobre la parte superior de esa, una vez que tienes la correcta capa Gonk/binario.

-
- -

Una vez que el proceso de instalación termina el teléfono debe reiniciarse en la build actualizada y mostrar primero el flujo de trabajo del usuario.

- -

Cambiar al canal de actualización "nightly"l

- -

En v2.2 usted puede cambiar el Canal de actualizaciones default por nightly en los Ajustes de desarrollador.

- -

A continuación es el método más antiguo, si no encuentra esa configuración en su dispositivo.

- -
    -
  1. Asegúrate de que la depuración remota esté habilitada en su Flame, usando la opción Depuración Remota en Ajustes de desarrollador del dispositivo.
  2. -
  3. Descarga el script cambiar canal: haz click en el enlace, pulsa el botón Raw, continuación utiliza la función "Guardar como" de su navegador y guarde la página como change_channel.sh.
  4. -
  5. En tu terminal, utiliza cd para acceder a la carpeta que contiene al script y ejecuta el siguiente comando:
    - -
    ./change_channel.sh -v nightly
    -
  6. -
  7. Una vez que se reinicie el teléfono, revisa actualizaciones en Ajustes > Información > Revisar ahora.
  8. -
- -

Ahora puedes obtener actualizaciones OTA (over-the-air) "nightly" en tu Flame.

- -
-

Nota: Puede seleccionar entre varios canales de actualización diferentes. Ejecuta "./change_channel.sh -h" para ver otras opciones de canales.

-
- -

Modo fastboot

- -

Puede que al aplicar un Shallow Flash o una actualización de la imágen base el telefono deje de responder. Cuando esto ocurre debes reiniciar el teléfono en modo de recuperación. El modo de recuperación ofrece algunas opciones (Reiniciar, Actualizar desde adb, Limpiar datos, Limpiar cache, y Actualizar desde sdcard). Desafortunadamente, seleccionando Update from adb entra en un modo (sideload) en el que no puede utilizar los otros comandos de ADB. El comando adb sideload funcionaría pero los diversos script de flasheo dependen de otros comandos adb.

- -

Puede forzar el modo fastboot de la siguiente manera:

- -
    -
  1. Apague el teléfono (que puede implicar el remover la batería en casos extremos...)
  2. -
  3. Conecte el cable USB.
  4. -
  5. Encender el teléfono de nuevo pulsando los botones Bajar volumen y Encender, juntos.
  6. -
- -

El teléfono debe mostrar el texto "FASTBOOT": este es el modo fastboot y está a la espera de una conexión USB.  En este punto conecta tu teléfono y ejecuta el siguiente comando fastboot devices. Tenga en cuenta que regularmente adb no vería el dispositivosólo fastboot puede verlo. En este modo, puedes usar el script flash para instalar la última imágen base como se explicó antes. A medida que el script hace uso de comandos tanto adb y fastboot, es posible que aparezca algún error inicial y advertencias de adb, pero el dispositivo será flasheado y funcionará de nuevo al final del procedimiento.

- -

Modo descarga de Emergencia

- -

Si al instalar una nueva build, el teléfono deja de responder y además no puedes entrar en el modo Fastboot, puedes usar el modo de emergencia para recuperarlo. Usted necesitará el cable USB de emergencia proporcionada con la etiqueta roja “Recovery Cable” en él y la Herramienta de descarrga de emergencia para entrar en este modo. Para obtener instrucciones completas, consulte el tutorial de la herramienta rescate de emergencia incluido en los archivos de la herramienta de descarga. Póngase en contacto con el fabricante del dispositivo (flameservice [at] thundersoft.com) si usted necesita cualquier ayuda técnica.

- -

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

- -
-

Nota: La herramienta proporcionada es sólo para Windows.

-
- -

Modo de Recuperación

- -

Puedes entrar en modo de recuperación para borrar los datos del teléfono o actualizar manualmente el firmware. Hay dos maneras de entrar en este modo:

- -

Si tu teléfono está apagado, presiona los botones Subir Volúmen + Encender, juntos.

- - - -

Cuando ingreses al Modo de Recuperación presiona las teclas de Volumen (Subir y Bajar) para moverte dentro del menú y utiliza el botón de Encendido para seleccionar una opción. Asegurate de tener un respaldo de la información que tengas en el teléfono asi como en la tarjeta de memoria (SD) así como de haber descargado los ultimos paquetes de actualización.

- -

Respaldando y restaurando su información del Flame

- -

Cuando utiliza Flame, no querrá perder los contactos de su teléfono y otros datos, mientras actualiza a una nueva versión (como se ha explicado anteriormente en este artículo). Para respaldar y restaurar información puede utilizar nuestra herramienta Backup and restore profile, que está contenida en B2G-flash-tool Git repo.

- -
    -
  1. Para utilizarlo, primero abra su  terminal / línea de comandos.
  2. -
  3. Clone el repositorio anterior (necesita tener Git instalado) usando -
    git clone https://github.com/Mozilla-TWQA/B2G-flash-tool
    -
  4. -
  5. La herramienta es un archivo Python: backup_restore_profile.py. Asegúrese de que tiene instalado Python (2.7.x es probablemente el mejor.) Sistemas Linux y Mac deben tener esto fuera de la caja.
  6. -
  7. Entre al directorio que acaba de clonar utilizando cd B2G-flash-tool.
  8. -
- -
-

Nota: Al utilizar esta herramienta, usted también tendrá que asegurarse de que su teléfono está conectado a través de USB al ordenador, y que ADB (mire Important steps to follow first antes) y que Depuración via USB (Ajustes de desarrollador en su dispositivo) está habilitado.

-
- -
-

Nota: Si recibe un mensaje sobre la falta de permisos para ejecutar este archivo, use cd para el directorio donde guardó el archivo y ejecuta el siguiente comando:

- -
chmod +x backup_restore_profile.py
-
- -

Respaldando su información

- -

Antes de realizar copias de seguridad usted debe asegurarse de que su dispositivo se ha actualizado con la actualización OTA más reciente. Para ello, en el teléfono vaya a Ajustes > Información > Actualizaciones > clic en Revisar ahora. Si hay una actualización disponible, usted debe obtener en breve una notificación de una actualización disponible. Elija instalar la actualización.

- -

Ahora, en el directorio donde guardó backup_restore_profile.py, ejecute lo siguiente:

- -
python backup_restore_profile.py -b
- -

Esto debe guardar su perfil de dispositivo a un directorio llamado mozilla-profile, en el mismo directorio donde se encuentra el script.

- -

Restaurando su información

- -

Antes de restaurar usted debe asegurarse de que su dispositivo se ha actualizado con la actualización OTA más reciente.. Para ello, en el teléfono vaya a Ajustes > Información > Actualizaciones > clic en Revisar ahora. Si hay una actualización disponible, usted debe obtener en breve una notificación de una actualización disponible. Elija instalar la actualización.

- -

En el directorio dondese encuentra mozilla-profile (mire la sección anterior), ejecute lo siguiente:

- -
python backup_restore_profile.py -r
- -
-

Nota: Usted puede obtener una lista de todas las opciones de la herramienta compatible con Python en ejecución
- backup_restore_profile.py -h.

-
- -

Instalando apps en tu Flame

- -

Las herramientas App Manager y WebIDE hacen que sea fácil instalar aplicaciones a su teléfono, para pruebas, etc.

- -

Ajuste de RAM

- -

Puede ajustar la capacidad de la memoria RAM disponible para ver cómo las aplicaciones funcionan en los teléfonos Firefox OS con capacidad de memoria más bajos.

- -

Esto se logra mediante la introducción al modo fastboot (primero instale fastboot, que está disponible en la misma página SDK como ADB) y ejecute:

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

“0” es la memoria detectada automáticamente y “256-1024” es el número en megabytes (MB). Por ejemplo, si deseas usar 512 MB de memoria RAM debes usar este comando:
- fastboot oem mem 512.

- -

Luego tendrás que reiniciar el dispositivo para que los cambios surtan efecto. Esto se puede hacer usando:

- -
fastboot reboot
- -

El tamaño de la memoria actual puede ser restaurado entrando en el modo fastboot y escribiendo:

- -
fastboot getvar mem
-
diff --git a/files/es/archive/b2g_os/phone_guide/fx0/index.html b/files/es/archive/b2g_os/phone_guide/fx0/index.html deleted file mode 100644 index 5decb58319..0000000000 --- a/files/es/archive/b2g_os/phone_guide/fx0/index.html +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Fx0 -slug: Archive/B2G_OS/Phone_guide/Fx0 -tags: - - Firefox OS - - Fx0 - - KDDI - - Phone - - consumer -translation_of: Archive/B2G_OS/Phone_guide/Fx0 ---- -
-
- -
-

El Fx0 es un teléfono inteligente de consumo de gama alta Firefox OS, y marca el primer lanzamiento de teléfonos Firefox OS en Japón. Fue lanzado por KDDI en diciembre de 2014.

- -

Obtener un dispositivo

- -

El Fx0 está disponible para comprar a través de canales minoristas japoneses estándar. Es un dispositivo SIM-bloqueado, por lo que sólo puede ser utilizado en Japón.

- -

Actualizando el software

- -

La imágen del sistema del dispositivo está bloqueada, por lo que sólo puede actualizarse el software cuando el operador de la red publica una actualización OTA. La imagen del sistema del dispositivo está basada en Firefox OS 2.0.

-
-
- -

Especificaciones

- -

Usted puede encontrar más de las especificaciones del dispositivo que aparecen en nuestra página Phone and device specs.

- -

Hardware

- - - -

Vea también

- - diff --git a/files/es/archive/b2g_os/phone_guide/geeksphone/index.html b/files/es/archive/b2g_os/phone_guide/geeksphone/index.html deleted file mode 100644 index e4cc268f49..0000000000 --- a/files/es/archive/b2g_os/phone_guide/geeksphone/index.html +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Geeksphone -slug: Archive/B2G_OS/Phone_guide/Geeksphone -tags: - - Firefox OS - - Gaia - - Geeksphone - - Tutorial - - Update - - actualizacion -translation_of: Archive/B2G_OS/Phone_guide/Geeksphone ---- -
-
Ediciones Developer Preview de teléfonos Firefox OS se están convirtiendo en una amplia difusión entre la comunidad, principalmente a través de Geeksphone. Dado que estos son para desarrolladores, naturalmente queremos que testees y juegues con ellos lo mas posible! En este articulo se cubriran algunos tips básicos sobre comó mantener el telefono actualizado y como ajustar las aplicaciones del sistema Gaia.
-
-
(Nota: Estas instrucciones son para los viejos modelos Keon y Peak, no necesariamente para el ultimo telefono Geeksphone Revolution)
-

 

-

Actualizando tu Geeksphone a las últimas versiones

-

Las actualizaciones de Firefox Os pueden ser descargadas desde la aplicación Configuración, que se encuentra bajo información del Dispositivo. Puede configurarse el dispositivo para que cheque por actualizaciones diriamente, semanalmente o  mensualmente. Además se proporciona un botón "checar ahora". Cuando hay una actualización disponible se le pedira que descargue e instale la versión actual.

-

The screen for checking updates on the Firefox OS settings app

-

Flasheando su teléfono

-

El equipo de Geeksphone también ofrece la última versión estable y nightly build como descargas autonomas para flasear tu telefono.

-

Configure su teléfono y computadora

-

Antes de intentar flashear su teléfono asegurese de que ha realizado las configuraciones descritas en la sección "Configuración del dispositivo Geeksphone" en  Instalando Apps Firefox OS al Geeksphone. Esto le asegurara que puede transferir datos a su teléfono. En esa misma sección, siga las instrucciones y asegurese que cuenta con los drivers USB correctos.

-
-

Nota: Es particularmente importante en las computadoras Windows esten configuradas con los drivers USB correctos.

-
-

Las imagenes estan localizadas en el sitio de descarga de Geeksphone. En este sitio se le presentaran varias opciones para seleccionar su dispositivo y que tipo de imagen desea utilizar.

-

Two phone images side by side, the Geeksphone Keon and Peak, with different software download options below each one.

-

Descarge la imagen que usara y extraiga el archivo en su sistema de archivos. El archivo contiene imagenes y comandos requeridos para flashear el teléfono usando Windows, Mac OS, o Linux. Antes de empezar a flashear el teléfono asegúrese de que tiene habilitada la depuración remota en el teléfono. Esta opción puede ser habilitada lanzando la aplicación Configuraciones y navegando a Informació del dispositivo -> Mas información -> Desarrollador. Asi mismo, no intente flashear el dispositivo si la batería tiene menos del 50% de carga.

-

Enabling remote debugging on the Firefox OS Settings app

-
-

Nota: Si tu dispositivo no se encuentra con el script de los siguientes pasos, incluso si esta conectado via USB, tendrás que desbloquear tu teléfono y esperar a que aparezca en el sistema.

-
-
-

Nota: "Flashear" el teléfono eliminara todos los datos en el. Si deseas hacer un respaldo de tus datos y restaurarlos despues, sigue las siguientes instrucciones en  Copia de seguridad de la partición del sistema del teléfono.

-
-

Windows

-
-

Nota: Puede que tenga la necesidad de instalar los drivers USB en Windows. Para obtener estas instrucciones vea la sección "Configuración del dispositivo Geeksphone" en  Instalando Apps Firefox OS al Geeksphone.

-
-

Abra una linea de comandos(inicio -> escriba cmd in la busqueda -> enter en Windows 7, tecla de window + X -> seleccionar linea de comandos en Windos 8) y dirigete a la ruta del directorio donde se encuentran los archivos extraidos con  cd "ruta del directorio". Enter:

-
flash.bat
-
-

Esto instalara la nueva imagen en el teléfono. El teléfono necesitara ser configurado nuevamente ya que todos los datos habrán sido borrados.

-

Mac OS

-

Abra una ventana de Terminal (Cmd + espacio -> escriba terminal -> enter) y dirijase a la ruta del directorio que contiene los archivos extraidos. Enter:

-
./flash_mac.sh
-
-

Esto instalara la nueva imagen en el teléfono. El teléfono necesitara ser configurado nuevamente ya que todos los datos habrán sido borrados.

-

Linux

-

Para flashear un Keon desde Ubuntu hay que agregar la siguientes reglas a /etc/udev/rules.d/51-android.rules

-
- SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="8013", MODE="0666"
-
- SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d00d", MODE="0666"
-
-  
-

Abra una ventana de Terminal (control-alt-t en Ubuntu) y dirijase al directorio que contiene los archivos extraidos. Enter:

-
./flash.sh
-
-

Esto instalara la nueva imagen en el teléfono. El teléfono necesitara ser configurado nuevamente ya que todos los datos habrán sido borrados.

-

Esto debe flashear la nueva imagen en el teléfono. El teléfono debera configurarse de nuevo ya que toda la información ha sido borrada. Si quiere tener un respaldo de su información y restaurarla despues, puede seguir las instrucciones en Respaldo del sistema de partición del teléfono.

-
-

Otra forma de "Flashear" el Keon usando Ubuntu es de la siguiente manera:

-
-

Paso 1: Conecta el dispositivo

-

Paso 2: Abre la Terminal

-

Paso 3: Escribe el comando sudo nautilus, escribe tu contraseña de Root para abrir el sistema de ficheros

-
sudo nautilus
-

Paso 4: Pega la carpeta de Firefox O.S Geeks Phone Build en el directorio

-

Paso 5: Haz click en el archivo llamado "flash.sh"

-
./flash.sh
-

Si tiene un 'unagi' o un teléfono developer preview que no sea un Geeksphone

-

Si usted cuenta con un teléfono de desarrollador y no es Geeksphone como un 'unagi' o un dispositivo basado en Android, tal vez necesite realizar los siguientes pasos. Si este no es el caso, por favor siga a la siguiente sección.

-

Usted necesitara instalar el adb y fastboot. Estas utilidades se pueden enconrar en el Kid de herramientas de desarrollo Android (ADT).

-

No es necesario instalar todo el kit de desarrollo. Descargue el kit de desarrollo desde aqui y extraiga el contenido. Adb y fastboot se encuentrar en el directorio /platform-tools/carpeta. Estos pueden ser copiados a /usr/bin en Linux o Mac OS, o copiados en alguna carpeta siempre y cuando se especifique el $PATH de los binarios agregados.

-

Si usted esta tratando de flashear su dispositivo y tiene otro conectado via USB, su teléfono posiblemente no sea detectado por las utilidades correctamente. Solamente tenga conectado su teléfono mientras intente flashearlo.

-

Afinando Gaia

-

Si usted es parte de la industria, usted puede adaptar las aplicaciones por default en Gaia - la UI en Firefox OS. En esta sección se cubrira algunos aspectos básicos para clonar Gaia y hacer cambios en las aplicaciones por default del sistema. Tenga en cuenta que estos consejos son "bajo su propio riesgo" y pueden involucrar la sección "Ok, he brickeado mi teléfono". Antes de proceder, este seguro de tener instalado adb y fastboot en su sistema. Para verificar que los tiene instalado abra una ventana de Terminal y escriba   adb devices   con su dispositivo conectado. Usted deberia ver su teléfono listado bajo los dispositivos conectados.

-

Usted tambien puede correr fastboot desde terminal. Si usted corre fastboot, se debera mostrar un conjunto de opciones. Si usted no tiene instalado adb o fastboot, una busqueda rapida en Google con su sistema operativo volvera varios resultados sobre como instalarlos. Adicionalmente a adb y fastboot usted necesitara tener Git. Si no tiene instalado Git, de un vistazo a esta guia de configuració. Finalmente asegurese de que su teléfono esta configurado para la depuración remota, paso descrito en la sección previa.

-

Una vez que tenga todos los prerequisitos abra una terminal y dirijase al directorio donde le gustaría clonar el código fuente de Gaia. Escriba el siguiente comando:

-
git clone git://github.com/mozilla-b2g/gaia.git gaia
-cd gaia
-
-

Esto clonara la ultima versión del código de Gaia en su sistema.

-
-

Si su plan es subir cambios de regreso al código de Gaia, asegurese de hacer un fork del codigo antes de clonar como se describe en Hacking Gaia.

-
-

Recientemente el Geeksphone Keon ustiliza la rama v1.0.1 del código de Gaia, así que asigne la rama adecuada con el siguiente comando antes de hacer cualquier otra cosa:

-
git checkout -b v1.0.1 origin/v1.0.1
-
-

La mayor parte de las aplicaciones del sistema estan localizadas en el subdirectorio de aplicaciones de Gaia. Usted ahora puede hacer cualquier cambio que desee en las aplicaciones de Firefox OS. Una vez que haya hecho los cambios, asegurese que su dispositivo ha sido montado apropiadamente usando el siguiente comando:

-
adb remount
-

A continuación, ejecute el siguiente comando para hacer push de las aplicaciones modificadas en su teléfono. Esto hará push por defecto a todas las apps del teléfono:

-
B2G_SYSTEM_APPS=1 make install-gaia
-
-

Si sólo hizo cambios en una sola app puedes especificar los cambios de esta usando una sintaxis similar. En este ejemplo sólo la aplicación de calendario sera instalada en el teléfono:

-
APP=calendar B2G_SYSTEM_APPS=1 make install-gaia
-
-

Si tiene problemas mientras hace los cambios, puede reiniciar el teléfono a los valores por defecto usando los siguientes comandos:

-
make production
-make reset-gaia
-
-
-

Nota: Tenga en cuenta que cualquiera de los comandos anteriores limpiaran cualquier dato o aplicación lanzada en el teléfono. Si quiere hacer un respaldo de su información y restaurarla después, debe seguir las instrucciones en el apartado de Copia de seguridad de la partición del sistema del teléfono .

-
-

"Ok, he bloqueado mi teléfono"

-

Si esta en el proceso de modificación de su teléfono y "no responde" debería ser capaz de recuperarlo usando fastboot con un simple procedimiento. A continuación se ilustra como reestablecer el Keon pero con otros teléfonos el proceso debería ser similar. También necesitara verificar si tiene instalado fastboot.

-

Primero retire el cable USB y después remueva la batería del teléfono por 30 segundos. Entonces reinserte la batería y presiones el botón de bajar volumen  mientras mantiene el botón de encendido por unos cuantos segundos. A continuación reconecte el cable USB y ejecute los siguientes comandos desde una ventana de Terminal en el directorio que contiene los ultimos archivos img descritos en la primera sección de este post:

-
fastboot flash recovery recovery.img
-fastboot flash boot boot.img
-fastboot flash userdata userdata.img
-fastboot flash system system.img
-fastboot reboot
-
-

Este proceso debera recuperar su teléfono. Si no funciona, es posible que tenga que  intentar una segunda vez.

-

A jugar!

-

Esperamos que estas instrucciones te sean utiles, y naturalmente queremos que seas feliz con Firefox OS y las posibilidades que somos! Sientete libre de jugar con las actualizaciones de tu dispositivo, de hacer cambios/actualizaciones de las aplicaciones Gaia, y también sientete inspirado de construir tus propias Open Web Apps.

-

Ver también

- diff --git a/files/es/archive/b2g_os/phone_guide/index.html b/files/es/archive/b2g_os/phone_guide/index.html deleted file mode 100644 index 6047637215..0000000000 --- a/files/es/archive/b2g_os/phone_guide/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Guía de Desarrollo en Firefox OS -slug: Archive/B2G_OS/Phone_guide -tags: - - B2G - - Firefox OS - - desarrollo - - telefonos -translation_of: Archive/B2G_OS/Phone_guide ---- -
-

Esta sección contiene información relevante para el desarrolladores sobre las especificaciones de los teléfonos que ejecutan Firefox OS. Tenemos información general disponible en Construir e instalar Firefox OS y Hacking Firefox OS, así que por favor vaya por la información acerca de construir e instalar la plataforma desde cero. Sin embargo, los desarrolladores que posean teléfonos especificos de desarrollo pueden encontrar los siguientes articulos de gran ayuda.

-
-

Información especifica del dispositivo

-
-
- Datos del teléfono Firefox OS
-
- En este artículo enumeramos los distintos teléfonos disponibles Firefox OS, junto con información como sus nombres en clave, la disponibilidad y características de hardware específicos.
-
- Geeksphone
-
- En este artículo vamos a cubrir algunos consejos básicos sobre cómo mantener su Geeksphone hasta a la fecha y la forma de modificar el sistema de aplicaciones de Gaia.
-
- El ZTE OPEN Firefox OS
-
- Este artículo es para compartir la información que tenemos disponible del dispositivo ZTE OPEN Firefox OS.
-
-

Información general de Firefox OS

-
-
- Información general de las caracteristicas
-
- Esta página muestra las características típicas de hardware Firefox OS y los requisitos mínimos de hardware.
-
- Solución de problemas
-
- Este artículo proporciona consejos para la solución de problemas comunes que pueden surgir al utilizar Firefox OS.
-
- Mejores prácticas para dispositivos abiertos de referencia
-
- Un conjunto de mejores prácticas que creemos y recomendamos para cualquier dispositivo de referencia abierto. Todas las recientes referencias de dispositivos Firefox OS siguen estas prácticas.
-
diff --git a/files/es/archive/b2g_os/phone_guide/lista_dispositivos/index.html b/files/es/archive/b2g_os/phone_guide/lista_dispositivos/index.html deleted file mode 100644 index 86ac8aba87..0000000000 --- a/files/es/archive/b2g_os/phone_guide/lista_dispositivos/index.html +++ /dev/null @@ -1,712 +0,0 @@ ---- -title: Lista de Dispositivos -slug: Archive/B2G_OS/Phone_guide/lista_dispositivos -tags: - - B2G - - Dispositivos - - Especificaciones - - Firefox OS - - Guia(2) - - Guía - - Móvil - - Telefono - - movil(2) -translation_of: Archive/B2G_OS/Phone_guide/Phone_specs ---- -
-

Este artículo entrega información acerca de los dispositivos disponibles con Firefox OS. Incluye además las especificaciones del Hardware, nombres clave, la versión de Firefox OS con la que fue lanzado al mercado y mucho más.

-
- -

Dispositivos con Firefox OS disponibles

- -

Durante el desarrollo de Firefox OS hemos tenido diversos dispositivos para realizar pruebas. Hoy en día con la salida al mercado de Firefox OS contamos con diversos modelos de distintos vendedores.

- -
-

Nota: Para información comercial de los dispositivos que se venden actualmente por favor revisa nuestra página para encontrar un dispositivo Firefox OS cerca tuyo.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Nombre / Nombre Clave

-
LanzamientoVersión FxOSDisponibleComentarios
-

Alcatel One Touch Fire

- -

hamachi, buri

-
Julio 12, 20131.0.1Actualmente disponible -

Disponible publicamente en Brasil, Uruguay, Italia, Alemania, Grecia, Serbia, Hungria y Polonia. Disponible por revendedores en eBay.

-
Alcatel One Touch Fire EJulio 18, 20141.3.0Actualmente disponibleDisponible publicamente en Alemania.
otoro, unagi, inari   off the shelf ZTE phone used for development prior to the ZTE Open.
-

ZTE Open

- -

ikura

-
Julio 2, 20131.0.1Actualmente disponibleSimilar al inari; Publicamente disponible en eBay
-

LG Fireweb

- -

leo

-
Octubre 24, 20131.1Actualmente disponiblePublicamente disponible en Brasil.
-

Geeksphone Keon

- -

keon

-
Abril 24, 20131.0.1Actualmente agotadoSolo para desarrolladores
-

Geeksphone Peak

- -

peak

-
Abril 24, 20131.0.1Actualmente agotadoWas codenamed "twist" for a while; developer-only devices
Geeksphone Peak+---cancelado
Geeksphone RevolutionMarzo 4, 20141.3preActualmente disponibleDisponible en linea.
-

LG Google Nexus 4

- -

nexus-4

-
   Experimental. Not supported by either LG or Google. Discontinued hardware.
-

Flame

- -

"the reference device"

-
Fines de Abril, 20141.3 Available to pre-order
-

Spreadtrum

- -

tarako

-
Al final del Q2, 2014 Pronto. 
ZTE Open CMayo 13, 20141.3DisponibleDisponible en linea.
Symphony GoFox F15Septiembre 16, 20141.4DisponibleAvailable through Grameenphone channels in Bangladesh only.
Intex Cloud Fx 1.3 DisponibleDisponible en Snapdeal, solo en India.
Spice Fire One (Mi-FX1) -
 
-
1.3DisponibleDisponible en Snapdeal, solo en India.
Alcatel OneTouch FireC 4020DOctubre 1, 20141.3DisponibleDisponible en Filpkart
Zen Fire 105Octubre 16, 20141.3DisponibleDisponible en Homeshop18
- -

Versiones de Firefox OS

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
VersionFeature Complete (FC) dateRelease To Partner
- (RTP) date
CodenameGecko versionIncluded security fixesRelease notes
1.0Diciembre 22, 2012Febrero 21, 2013TEFGecko 18Gecko 18 
1.0.1Enero 15, 2013Septiembre 6, 2013ShiraGecko 18Gecko 20Developer
- Consumer
1.1Marzo 29, 2013Octubre 9, 2013LeoGecko 18+ (new APIs)Gecko 23Developer
- Consumer
1.1.1 TBDHDSame as 1.1.0 with WVGAGecko 23 
1.2Septiembre 15, 2013Diciembre 9, 2013KoiGecko 26[39]Gecko 26Developer
- Consumer
1.3Diciembre 9, 2013TBD Gecko 28Gecko 28Developer
- Consumer
1.4Marzo 17, 2014TBD Gecko 30Gecko 30Developer
- Consumer (TBD)
2.0TBDTBD Gecko 32Gecko 32Developer
- Consumer (TBD)
- -

Especificaciones de dispositivos

- -

Nota hay algunos casos donde hay un upcoming device que no ha sido anunciado pero podemos compartir el nobre del codigo and (some of) the capabilities of the device.  DO NOT put extra info down for these devices unless Andreas Gal or someone else equally able to bless the public disclosure of the information has disclosed it.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NombreVersionesResoluciónPantalla (pulgadas)CPUCamara(s), MpxRAMROMStorageBattery (mAh)
-

Alcatel One Touch Fire

- -

hamachi, buri

-
v1.0.1/v1.1 -

320 x 480
- PX=1

-
3.5Qualcomm Snapdragon S1 MSM7227A 1 GHzRear: 3.2256MB512MB/data: probably the same as inari; specs say 160MB "end user memory"
- Probably no built-in DeviceStorage, MicroSD card (up to 32GB) required
-  
1400
Alcatel One Touch Fire Ev1.3.0540 x 9604.5 -

Qualcomm Snapdragon 200
- MSM8210
- 1.2 GHz
- dual-core
-  

-
Rear: 5512MB4GB 1700
-

ZTE Open / variants

- -

ikura

-
v1.0.1 (as shipped)320 x 480
- PX=1
3.5Qualcomm Snapdragon S1 MSM7225A 800 MHzRear: 3.2256MB512MB -

/data: 152M
- No built-in DeviceStorage, MicroSD card required

-
1200
-

LG Fireweb

- -

leo

-
v1.1320 x 480
- PX=1
4Qualcomm  Snapdragon S1 MSM7227A 1 GHzRear: 5512MB4GB -

/data: 1007.90M
- built-in DeviceStorage: yes, size unsure. possibly 3.7G, but that might be bad math.  (On an unhapy device /sys/devices/platform/msm_sdcc.3/mmc_host/mmc0/mmc0:0001/block/mmcblk0/block is 7733248, and then assuming a 512 byte block size, we get 3.7G)

-
1540
-

Geeksphone Keon

- -

keon

-
-

v1.0.1 - nightly
- downloads here

-
320 x 480
- PX=1
3.5Qualcomm Snapdragon S1 7225AB 1 GHzRear: 3512MB4GB -

/data: 1.5G
- built-in DeviceStorage: 1023.4M

-
1580
-

Geeksphone Peak

- -

peak

-
v1.0.1 - nightly
- downloads here
540 x 960
- PX=1.5
4.3Qualcomm Snapdragon S4 8225 1.2 GHz dual-core -

Front: 2
- Rear: 8

-
512MB4GB/data: 1.5G
- built-in DeviceStorage: 1023.4M
1800
Geeksphone Revolutionv1.3pre (as shipped)540 x 960 PX=1.54.7Dual-core Intel® Atom™ processor Z2560 with up to 1.6GHz -

Front: 1.3 Rear: 8

-
1GB4GB -

/data: 2G
- built-in DeviceStorage: 2.5GB

-
2000
-

Nexus 4

- -

nexus-4

-
v1.3 - nightly768 x 1280
- 720p
4.7 -

Qualcomm
- Snapdragon S4 Pro
- 1.5 GHz quad-core

-
Rear: 82GB8 or 16GBeverything exists in one big soup, there is no external (MicroSD) storage.  The size of the soup varies based on what model Nexus 4 you got.2100
-

Foxconn InFocus

- -

flatfish

-
 1280 x 80010Allwinner A31, Cortex A7 Quad-Core 1.0 GHz -

Front: 2
- Rear: 5

-
2GB16GB 7000
-

some phone thing

- -

fugu

-
v1.2f (branch) per320 x 480   256MB   
-

Spreadtrum SC6821

- -

tarako

-
v1.3 perHVGA
- 320 x 480
3.5Spreadtrum SC6821, Cortex A5 1GHz0.3 (rear only?)128MB (zram)2GB NAND flash (external) + 1GB LPDDR1 (embedded)32GB micro SD card1100
-

VIA Vixen

- -

community-driven customization of flatfish?

-
 1024 x 6007Cortex-A9 Dual Core 1.2 GHz -

Front: 0.3 Rear: 2
-  

-
1GB8GB  
-

Flame

- -

"the reference device"

-
v1.3 -

FWVGA
- 854 × 480
- PX=1.5
-  

-
4.5 capacitive touch -

Qualcomm Snapdragon 200 MSM8210, 1.2GHZ Dual core processor

-
Front: 2
- Rear: 5 auto focus with flash
256MB–1GB (adjustable by developer)8GB32GB micro SD card (USB 2.0)1800
ZTE Open Cv1.3 -

800 x 480 PX=1.5

-
4Qualcomm Snapdragon 200 MSM8210, 1.2GHZ Dual core processorRear: 3512MB4GB -

/data: 1G

-
1400
Symphony GoFox F15 -

v1.4

-
320 x 480
- PX=?
3.5Spreadtrum 1 GHz Single Core Processor -

Front: 0.3
- Rear: 3.2 with Flash

-
512MB512MB 1450
Intex Cloud FxV 1.3320 x 4803.5Spreadtrum 1 GHz
- Rear: 2.0 without Flash
128 MB256 MB -

Data : 2G

- -

Internal Storage: 46 MB(User Memory)

- -

External -Micro SD Card : Upto 4GB Expanable

-
1250
Spice Fire One (Mi-FX1)V 1.3320 x 4803.5Spreadtrum 1 GHz -

Front :VGA

- -

Rear 1.3

-
128 MB512 MB -

Data : 2G

- -

Internal Storage: 67.9 MB(User Memory)

- -

External -Micro SD Card: Upto 4GB Expanable

-
1400
Alcatel OneTouch FireC 4020DV 1.3320 x 4803.5Spreadtrum 1 GHz 128 MB256 MB -

Data : 2G

- -

Internal Storage : 65 MB(User Memory)

- -

External -Micro SD Card: Upto 32GB Expanable

-
1000
Zen Fire 105V 1.3320 x 4803.5Spreadtrum 1GHz -

Front :VGA

- Rear 2 MP
128 MB256 MB -

Data : 2G

- -

External -Micro SD Card: Upto 16GB Expanable

-
1200
- -

Column explanations:

- - diff --git a/files/es/archive/b2g_os/phone_guide/zte_open/index.html b/files/es/archive/b2g_os/phone_guide/zte_open/index.html deleted file mode 100644 index f5ae618098..0000000000 --- a/files/es/archive/b2g_os/phone_guide/zte_open/index.html +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: The Firefox OS ZTE OPEN -slug: Archive/B2G_OS/Phone_guide/ZTE_OPEN -translation_of: Archive/B2G_OS/Phone_guide/ZTE_OPEN ---- -
-

Mozilla is partnered with ZTE. This partnership helped to create the ZTE OPEN, a powerful Firefox OS-based device aimed at developers and early adopters worldwide. They are unlocked and open for testing and experimentation.

-
- -
-

Note: The instructions are not valid for the ZTE Open C device. If you have a ZTE Open C device you should go to our ZTE Open C page instead.

-
- -

Purchasing a device

- -

These devices are available through ZTE's US and UK eBay stores, and a separate Hong Kong page aimed at Asian and Oceanian customers who don't want to pay high postage costs. They are priced at $79.99/£59.99.

- - - -

Upgrading Firefox OS

- -

This section provides instructions for upgrading Firefox OS on your ZTE OPEN device.

- -

General

- -

In general, Firefox OS builds, updates and testing are done by connecting your phone to a computer using a USB cable, and using ADB (Android Debugging Bridge) and Fastboot to join the devices together and issue commands. You'll therefore need to install ADB and fastboot from the Android Developer Toolkit on your desktop machine. It is not necessary to install the entire toolkit. adb and fastboot are found in the /platform-tools/ folder.

- -

Next, you need to go to your phone and enable remote debugging.

- -

Firefox OS 1.1

- -

On 10th December 2013: ZTE released a Firefox OS 1.1 upgrade for the ZTE OPEN. This now has fastboot enabled, which was caused the problems with the previous published builds.

- -

At this point, it's best to first upgrade your phone to version 1.1, even if you wanted to go to version 1.2. To do this, download the 1.1 package that corresponds to your phone (OPEN (American Standard) or OPEN (European Standard)).  Note that you need to download the version with your OS revision in it (that is, download the "V1.1.0B02(for V1.0)" if you are upgrading from V1.0). The zip file you’ll download will also contain documentation for the upgrade.  Unzip it and copy the firmware ZIP (inside the downloaded zip) as described below.

- -
-

Note: User data will be wiped by the SD package installation. You should backup your data before starting.

-
- -

Now follow these steps:

- -
    -
  1. Power off your phone, remove the battery to access the microSD card and extract the card from its holder.
  2. -
  3. Connect the microSD card to your desktop machine.
  4. -
  5. Move US_DEV_FFOS_V1.1.0B04_UNFUS_SD.zip or EU_DEV_FFOS_V1.1.0B04_UNFUS_SD.zip (depending on the version you downloaded) to the root directory of your microSD card. Do NOT unzip the file.
  6. -
  7. Disconnect the microSD card from your desktop computer and return it to your phone.
  8. -
  9. Hold the volume up button and power key down simultaneously. Volume up is activated by pressing the upper part of the long key on the left side of the phone. If you did it properly, you’ll enter the Firefox OS recovery mode. (Note: the Firefox OS logo may display briefly before you enter the recovery mode; sometimes this can take a little while.)
  10. -
  11. Use the volume up/down key to move from one item to the other in the menu, and choose “apply update from external storage.”
  12. -
  13. Press the power key to confirm the selection. You’ll see a new screen listing the files you have on the microSD card.
  14. -
  15. Again use volume up/down key to select the firmware: either US_DEV_FFOS_V1.1.0B04_UNFUS_SD.zip or EU_DEV_FFOS_V1.1.0B04_UNFUS_SD.zip (depending on the version you downloaded), and press the power key to confirm.
  16. -
- -

If everything went well, you’ll see a sequence of status messages, culminating with one that says, Install from sdcard complete.”. You’ll need to select “reboot system now” after the installation has completed. Your phone will then reboot, and you’ll see the configuration screen you saw the first time you powered on the phone.

- -

Firefox OS 1.2

- -

In January 2014, ZTE released a beta version of Firefox OS 1.2 (fastboot enabled, with root access). It is basically version 1.1 baseline + version 1.2 Gecko and Gaia, and doesn't require the build to be put on the phone's SD Card.

- -

With 1.1 installed as described above, open a terminal and check that the connection is made with the following command:

- -
adb devices -l
-
- -

You should see your device as something like, "roamer2    device usb:2-1.2", in response.

- -

Download the appropriate version of the build from the Dropbox account ZTE has set up: US version or UK version. For Windows users, you can also download special instructions, and an upgrade tool to help you to install the new version easily. The steps below however will work on all operating systems – Linux, OS X, and Windows – without relying on the special tool.

- -

Once you have the file, extract the contents, and open a console. Note that those steps will erase your personal data, so be sure to make a (backup) first. Then navigate to the folder where the files are. Still in the console, type this command:

- -
adb reboot bootloader
- -

While the phone is rebooting, execute the following command. (Fastboot only works inside a reboot):

- -
sudo fastboot devices
-
- -

If you see, "< waiting for device >", hit Ctrl-C and retry the command until you see something like, "ROAMER2    fastboot", in response.

- -

Then, quickly execute the following commands while it is still rebooting:

- -
fastboot flash boot boot.img
-fastboot flash userdata userdata.img
-fastboot flash system system.img
-fastboot flash recovery recovery.img
-fastboot erase cache
-fastboot reboot
- -
-

Note: If you keep encountering "waiting device" message. Try add sudo before the commands, like "sudo fastboot flash boot boot.img".

-
- -

(The reboot completed before I was done entering all the commands as I was distracted. I simply restarted from the, "adb reboot bootloader".)

- -

If everything went well, your phone should reboot at this point. You’ll find that this version of 1.2 from ZTE includes many test applications, which you can remove if you like.

- -
-

Note: Upgrading your ZTE Open to Firefox 1.1 or 1.2 (fastboot enabled) by Frédéric Harper also provides a useful breakdown of the install process.

-
- -
-

Note: There is a bug in ZTE's 1.2 build for the Open, whereby the notification tray won't pull down/open. This can be fixed by flashing the latest engineering version Firefox OS 1.2 to your phone. Make sure you have ADB installed and remote debugging turned on, then run the following commands in your terminal:
-
- git clone -b v1.2 https://github.com/mozilla-b2g/gaia.git gaia_v1.2
- cd gaia_v1.2
- make reset-gaia

-
- -

Firefox OS 1.3 and beyond

- -

ZTE currently haven't released builds for Firefox OS 1.3 and beyond. To get these on your ZTE open you'll have to manually build and install a new Firefox OS/B2G build on it (start at the build prerequisite instructions, and treat the ZTE like it is an Inari device, for the purposes of configuration). You can recover your phone if necessary, using the procedure cited in the I bricked my phone section.

- -

Phone features

- - - -
-

Note: the Hong Kong phones also support tri-band 3G Networks — HSDPA 850/1900/2100 (850/1900 for US, CA, 850/1900/2100 for Asia, AU, and 900/2100 for EU.)

-
- -

Wireless carriers

- -
-

Pricing information is for reference only and may not be accurate. Visit the associated link for official information.

-
- -

US carriers

- -

AT&T

- - - -
Sampling of prepaid AT&T plans
- -

Prepaid GoPhone®, Smartphone Plans

- - - -

Aio

- - - -
Sampling of prepaid Aio plans
- - - -

Good2GO

- - - -
Sampling of prepaid Good2GO plans
- - - -

Other AT&T MVNOs

- -

These carriers do not offer additional 3G data.

- - - -

T-Mobile

- - - -

Canadian carriers

- -

The US version of the ZTE Open also work in Canada on carriers that use the Bell/Telus network, or the Rogers network. Some regional carriers like Sasktel or MTS that have UMTS should work too.

- -

It will not work on carriers that do not use UMTS or GSM, like Public Mobile, nor on the carriers that use the AWS band like WIND Mobile, Mobilicity, Videotron or Eastlink.

- -

Memory card

- -

File system

- -

In order to be recognized by the phone, the MicroSD card must be formatted as a FAT32 file system. If a card is new or has never been reformatted, it should work as is.

- -

Device revisions

- -

Revision 01

- -

Phones produced before 09/27/2013 do not have fastboot enabled and must be updated. Normally, this would be handled by Software Updates, but since some users have reported trouble with this method, ZTE have made SD card packages available to enable fastboot on earlier devices. Flash images for:

- - - -

The zip file is linked under Downloads.  Note that you need to download the version with your OS revision in it (that is, download the "V1.1.0B02(for V1.0)" if you are upgrading from V1.0).  Once the file is downloaded and unzipped, follow the instructions in the bundled PDF to flash the package to your phone.

- -

Related Support Forum Questions:

- - - -

Revision 02

- -

Phones produced on or after 09/27/2013 are fastboot enabled by default. This includes the Hong Kong phones.

- -
-

Note: If you are unsure of your phone's revision, check it in Settings > Device Information > Software. If it is older than the following version numbers, you will need to update your phone using the above SD packages to enable fastboot.

- - -
- -

Device support

- -

Once your phone has fastboot enabled, you will then be able to build and install new Firefox OS/B2G builds on it (start at the build prerequisite instructions, and treat the ZTE like it is an Inari device, for the purposes of configuration), and recover your phone if necessary, using the procedure cited in the I bricked my phone section.

- -

If you encounter errors about setting the system time while flashing a custom build, you may need to download a modified boot image.

- -

I bricked my phone

- -

If you are in the process of modifying your phone and it becomes “unresponsive” you should be able to recover it using fastboot with the following simple procedure.

- -

First remove the USB cable and then remove the battery from the phone for 30 seconds. Then reinsert the battery and press the volume up button while holding the power button for a few seconds. Next reconnect the USB cable and run the following commands from a terminal window in the directory that contains the SD package files described above (it is worth checking for an update to the SD package before you do this):

- -
fastboot flash recovery recovery.img
-fastboot flash boot boot.img
-fastboot flash userdata userdata.img
-fastboot flash system system.img
-fastboot reboot
-
- -

This process should recover your phone. If it doesn't seem to work, you may have to try it a second time.

- -

Headphones not working?

- -

We found that the headset jack is designed by a Chinese manufacturer that has compatibility problems with other brands of headsets that include microphones. You may have voice mute problems when you try to use headsets made by Apple, Samsung, HTC, and others. You can buy a 3.5 mm headset adapter that reverses the microphone and ground pins to avoid this problem. For more information, see error 812607.

- -

Other support notes

- -

Some customers have come across an Issue of FOTA updates failing to enable fastboot; this is still under investigation, and we are assisting ZTE to analyze every scenario. We will post more information as it is available.

- -

If your phone was unfortunately damaged during the FOTA update because of ZTE providing false or wrong update files, you can attempt to restore it to factory settings using the appropriate SD image and instructions referenced in Revision 01. Otherwise, send your phone back to the eBay store you purchased it from in exchange for a new one. You may contact the store owner directly via an eBay message.

- -

See also

- -

Official Dev Phone page on Firefox Marketplace

- -

Draft User Manual [en-US] - PDF

diff --git a/files/es/archive/b2g_os/phone_guide/zte_open_c/index.html b/files/es/archive/b2g_os/phone_guide/zte_open_c/index.html deleted file mode 100644 index 985a7e413e..0000000000 --- a/files/es/archive/b2g_os/phone_guide/zte_open_c/index.html +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: ZTE OPEN C -slug: Archive/B2G_OS/Phone_guide/ZTE_OPEN_C -tags: - - Dispositivos - - Gaia - - Guia(2) - - Móvil - - Open C - - Smarthpone - - Teléfono(2) - - Teléfonos(2) - - zte -translation_of: Archive/B2G_OS/Phone_guide/ZTE_OPEN_C ---- -
-

El ZTE Open C con Firefox OS es un móvil con Firefox OS mejorado por ZTE que ofrece un hardware más potente, incluyendo una cámara de 3MP y pantalla de 4 pulgadas con una calida WVGA, y viene instalado con Firefox OS 1.3. Este artículo proporciona información acerca del dispositivo, incluyendo como actualizarlo y detalles de como solucionar problemas.

-
- -
-

Nota: Las instrucciones no son válidas para el ZTE Open. Si tienes un ZTE Open debes ir al link del ZTE Open

-
- -
-

Nota: La herramienta de actualización que es necesaria para desbloquear el dispositivo (mirar abajo) solo está disponible para Windows en este momento. Sin embargo, hay una manera más complicada de desbloquear el dispositivo en OS X o Linux que es descrita más abajo.

-
- -

El ZTE Open C es el primer dispositivo con las últimas actualizaciones de Firefox os de mediados de 2014 ofreciendo nuevas características incluyendo un acceso al reproductor de música desde la pantalla de bloqueo o la barra de notificaciones y compartir archivos por Bluetooth, permitiendo transferir varios archivos simultaneamente. Los usuarios pueden desplazarse por el dispositivo más rápido con las carpetas inteligentes que agrupan apicaciones o búsquedas de aplicaciones automaticamente en categorías, un sistema de scroll mejorado y aplicaciones del sistema que se inician más rápido.(ej: calendario, contactos, cámara...)

- -

Obtén tu dispositivo

- -

El dispositivo está disponible para comprar en ebay a un precio de 70$

- - - -
-

Nota: Clientes de Francia deben echar un vistazo a la página francesa de MDN para obtener sus respectivos proveedores.

-
- -
-

Nota: Los dispositivos no vienen con ninguna aplicación específica de cada operador o sus servicios y están liberados para todas las variantes de los primeros clientes.

-
- -

Especificaciones del dispositivo

- -

Puedes encontrar más información de sus especificaciones en el listado de especifiaciones del telefono y dispositivo.

- -

Actualizando el software

- -
-

Nota: La comunidad francesa de Mozilla proporciona builds actualizadas del ZTE Open C.

-
- -

Para actualizar el software de tu ZTE Open C, la forma más facil usar las builds disponibles en la página de ZTE. Para encontrar esto, ve al centro de soporte de ZTE, selecciona tu región en la columna derecha, en la columa del centro selecciona Smartphones, y Open C (estándar europeo) o Open C (estándar americano), dependiendo de donde viniera el dispositivo que compraste. Sólo pudimos encontrar el ZTE Open C en España a partir de Agosto del 2014. Luego clickea en Seleccionar para ir a la página de descarga.

- -

Cuandp vayas a descargar una build, deberás encontrar un PDF en un ZIP explicando como instalar la build.

- -

Actualización manual.

- -

Si quieres actualizar Gecko o Gaia tú mismo, el proceso es un poco complicado, porque el teléfono está bloqueado por defecto (no hay permisos root). Para desbloquear tu teléfono, puedes usar la herramienta de actualización del Open C.

- -
-

Nota: Esta herramienta de actualización solo está disponible para Windows por ahora.

-
- -

Si quieres desbloquear tu móvil desde OS X o Linux, esto es lo que tienes que hacer:

- -
    -
  1. Descarga la build desde el link de Comebuy.com
  2. -
  3. Extrae la build del paso 1 y deberás encontrar un archivo boot.img dentro del zip.
  4. -
  5. -

    Añade las siguientes líneas en  in /etc/udev/android.rules :

    - -
    SUBSYSTEM=="usb", ATTR{idVendor}=="19d2", ATTR{idProduct}=="1350", MODE="0666", GROUP="plugdev"
    -SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d00d", MODE="0666", GROUP="plugdev"
    -
  6. -
  7. Para entrar en el modo fastboot usa los siguientes comandos en tu terminal: -
     adb reboot-bootloader
    -
  8. -
  9. Para flashear el archivo boot.img del paso 2 al dispositivo, usa este comando: -
     fastboot flash boot boot.img
    - si lo prefieres, para verificar que fumciona antes de flashear, deberás usar: - -
     fastboot boot boot.img 
    -
  10. -
  11. Para reiniciar el dispositivo usa: -
     fastboot reboot 
    -
  12. -
  13. Ahora deberás tener el móvil desbloqueado y funcionando: -
    adb shell getprop ro.secure
    - deberás volver al paso 0.
  14. -
- -

Actualizando Gecko y Gaia

- -

Una vez que tu móvil esté en modo fastboot, podrás construir e instalar una nueva versión de Firefox OS/B2G y los componenetes Gecko y Gaia.

- -
    -
  1. Comienza en instrucciones, y trata al Open C como al Flame en términos de configuración: esto es debido a que el Flame y el Open c están basados en Android Jellybean. - -
    -

    Cuidado: Esto no significa que puedas flashear una imagen del Flame. Hacer esto provocará un brick permanente en tu móvil que no podrá ser solucionado.

    -
    -
  2. -
  3. Durante el paso de configuración, necesitarás un archivo manifest para el Open C. Descargalo desde aquí y guardalo en cualquier lugar de tu disco local como openc.xml.
  4. -
  5. Limpia el  directorio B2G, borrando los directorios innecesarios: -
    rm -rf objdir-gecko/ out/ backup-flame/
    -
  6. -
  7. Opcional: Antes de continuar, puedes escoger la versión de Gecko y Gaia que quieres construir. Para hacer eso, abre el archivo openc.xml, localiza las etiquetas gecko git, gaia y gonk-misc, y modifica el valor de su revisión para coincidir con la versión que quieres. Ejemplo: puedes construir la versión 2.2 de Gecko y Gaia, con lo siguiente: -
    <project name="gecko.git" path="gecko" remote="mozillaorg" revision="v2.2"/>
    -(...)
    -<project name="gaia" path="gaia" remote="mozillaorg" revision="v2.2"/>
    -<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="v2.2"/>
    -
  8. -
  9. Ahora configura Firefox OS con los siguientes comandos: (Nota: el directorio no puede contener espacios, de otra manera no funcionará) -
    ./config.sh flame /PATH/TO/openc.xml
    -
  10. -
  11. Puedes construir el componente Gecko y flashearlo en tu teléfono usando lo siguiente: -
    ./build.sh gecko
    -./flash.sh gecko
    - -
    -

    Nota: El último paso del comando flash.sh es para reiniciar el dispositivo, pero la secuencia de inicio no se completará (se congelará cuando salga el zorro animado). No te preocupes, esto es normal.

    -
    -
  12. -
  13. Ahora puedes actualizar Gaia, para que la nueva versión de Gecko funcione con la nueva versión de Gaia en tu dispositivo : -
    cd gaia
    -make reset-gaia
    -
  14. -
  15. Finalmente, puede que necesites actualizar las fuentes.
  16. -
- -
-

Cuidado: Intentar flashear una imagen del Flame dejará tu móvil brickeado.

-
- -

 

- -

Actualizando Gaia

- -

 

- -

Para actualizar solo Gaia, dejando Gecko solo, necesitas clonar el repositorio de Gaia desde Github, luego flashealo en tu dispositivo.

- -
    -
  1. Asegurate de que tienes ADB instalado.
  2. -
  3. Ve a https://github.com/mozilla-b2g/gaia, luego haz click en el botón "fork", situado en la esquina derecha arriba para forkearlo en tu repositorio.
  4. -
  5. Clona el código desde tu repositorio forkeado en tu escritorio ejecutando lo siguiente en tu terminal: -
    git clone https://github.com/your-github-username/gaia.git
    -
  6. -
  7. Usa el comando cd en el directorio resultante.
  8. -
  9. En tu teléfono, activa la depuración remota (elige ADB y la opción Devtools)
  10. -
  11. Ahora conecta tu móvil al ordenador vía USB; asegurate de que es reconocido metiendo dispositivos adb en tu terminal.
  12. -
  13. Ejecuta los siguientes comandos para reiniciar tu móvil y actualiza con el nuevo código fuente de Gaia. -
    make reset-gaia
    -
  14. -
- -

Arreglar fuentes

- -

Después de actualizar Gecko/Gaia, puede que encuentres diferencias entre las fuentes de Gecko y Gaia. Para arreglar esto, descarga nuestra actualización de fuentes, extraelo, accede al directorio creado tras la extracción, y ejecuta el script flash.sh.                                                                                                      
-
- Otra opción es usar el script para actualizar las fuentes del sistema, que descarga y flashea las fuentes del sistema automaticamente.

- -

Imágenes del sistema

- -

Si no quieres compilar Gecko y Gaia por ti mismo, puedes usar una imágen compabitle del Flame ofrecida por Mozilla. Siempre que tu teléfono haya sido desbloqueado con la herramienta de ZTE, puedes flashear una imágen del sistema desde el directorio de imágenes de prueba (nightly builds). Este proceso borrará todos tus datos; para hacer una copia de seguridad de tu perfil de usuario usa este script antes de flashear el nuevo sistema.

- -

Elige tu sabor favorito entre mozilla-centra, aurora, o vanilla y elige el entorno Gecko. Todas los directorios de imagen son llamados como "2014-10-06-xx-yy-zz-mozilla-your_flavor-device_codename" así que necesitarás buscar "2014-10-06-xx-yy-zz-mozilla-your_flavor-flame". La imágen de B2G que está dentro del directorio específico de Gecko tiene una versión y lenguaje básico, "b2g-34.0a2.en-US.android-arm.tar.gz" es la versión Gecko 34 y el lenguaje es inglés americano por defecto, descarga "Gaia.zip" si quieres actualizar Gaia también.

- -

Para flashear estos archivos en el dispositivo necesitarás un script llamado shallow_flash; puedes encontrarlo aquí, descarga el script y ejecútalo vía terminal.

- -

En Mac y Cygwin

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

En Linux

- -
./shallow_flash.sh -ggaia.zip -Gb2g-XX.XX.en-US.android-arm.tar.gz
- -

 

- -

He bloqueado (brick) mi teléfono

- -

Si tu equipo no responde, deberías desbloquearlo (unbrick) utilizando las builds oficiales y las intrucciones para flashearlo vía tarjeta SD, en la página oficial de ZTE.

- - - -

Sin embargo, si la partición de tu sistema es defectuosa, tendrás que repararlo usando directamente el acceso fastboot. Asumiendo que estás utilizando Ubuntu GNU/Linux:

- -
    -
  1. Descarga la imágen del sistema de recuperación desde la página de soporte de ZTE y extrae el archivo update.zip en tu escritorio.
  2. -
  3. Extrae el archivo recovery.img desde update.zip.
  4. -
  5. Crea un directorio small-system/ en el escritorio y copia dentro el archivo build.prop, y los directorios lib/ y bin/ que encontrarás en el archivo update.zip.
  6. -
  7. Instala el paquete android-tools-fsutils ( o instala ext4_utils desde la fuente en XDAdevelopers.
  8. -
  9. Crea tu  small-system.img: -
    ./make_ext4fs -l 40M small-system.img ~/Desktop/small-system/
    -
  10. -
  11. Mueve el archivo small-system.img a tu escritorio y enciende el dispositivo en modo fastboot presionando el botón power y el botón de bajar volumen a la vez.
  12. -
  13. Conecta el dispositivo a tu ordenador (los dispositivos fastboot se deberían mostrar) y flasea small-system.img -
    fastboot flash system small-system.img
    -
  14. -
  15. Entonces enciende el móvil en modo recovery usando recovery.img: -
    fastboot boot recovery.img
    -
  16. -
  17. En el menú de booteo, selecciona la entrada apply udate from ADB (usando volúmen arriba y volumen abajo para navegar y power para seleccionar) y entonces: -
    adb sideload update.zip
    -
  18. -
  19. -

    Al finalizar el proceso, sólo tienes que reiniciar tu dispositivo.

    -
  20. -
- -
-

Nota: Puedes hacer referencia a esta entrada de soporte para más información.

-
diff --git a/files/es/archive/b2g_os/platform/gaia/hacking/index.html b/files/es/archive/b2g_os/platform/gaia/hacking/index.html deleted file mode 100644 index 22599068e9..0000000000 --- a/files/es/archive/b2g_os/platform/gaia/hacking/index.html +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: Hackeando Gaia -slug: Archive/B2G_OS/Platform/Gaia/Hacking -translation_of: Firefox_OS/Developing_Gaia ---- -
-

Esta página está dirigida a desarrolladores de Gaia. Si usted está buscando información acerca de cómo construir y ejecutar Firefox OS, debería consultar la página de Construyendo e Instalando Firefox OS en su lugar.

-
- -

Gaia es la colección de aplicaciones web que forman la interfaz de Firefox OS. Cualquier cosa que usted vea en la pantalla del Firefox OS es creada usando tecnologías web abiertas. Esto incluye la pantalla de inicio y todas las aplicaciones predeterminadas.

- -

Obteniendo el código fuente

- -

Para obtener el código fuente de Gaia, fork us on GitHub and then clone your fork using git.

- -
$ git clone https://github.com/mozilla-b2g/gaia.git
- -

Ejecutando Gaia

- -

Usted puede ejecutar Gaia en el escritorio, en Firefox, o en un un dispositivo móvil compatible.

- -

B2G desktop

- -

B2G desktop es una versión de escritorio de la aplicación de ejecución utilizada en los dispositivos Firefox OS, la cual puedes utilizar para correr Gaia en tu computadora de escritorio.

- -

Puedes descargar una versión nightly de B2G desktop desde aquí.Dependiendo de qué versión estés utilizando, puede que quieres una versión específica de latest-mozilla-b2g18. Hay versiones para Linux (32 bits y 64 bits), Mac OS X y Windows.

- -

Las versiones Nightly tienen empaquetadas con ellas una versión reciente de Gaia. Una vez que hayas descargado el archivo, todo lo que necesitas es extraerlo en una carpeta y correr el binario de b2g desde la carpeta extraída.

- -
-

Nota: Las versiones de 64-bits de Linux no funcionan correctamente con algunas distribuciones, se trata del error 812484. Si tienes problemas trata con una versión de 32-bits en lugar de una de 64-bits

-
- -
$ cd b2g
-$ ./b2g
- -

Para correr B2G con tu propia versión de Gaia para propósitos de desarrollo primero necesitas una construir una versión de tu copia:

- -
$ cd /path/to/gaia
-$ DEBUG=1 make
- -

Esto generara un directorio en tu carpeta gaia llamada profile. La parte DEBUG correo Gaia como aplicaciones locales en servidor-web interno, en lugar las aplicaciones empaquetadas por defecto, estas tienen que ser re-empaquetadas después de cada cambio. Puedes encontrar la ruta del perfil de directorio tomando un vistazo a la última línea de salida después de ejecutar el comando de abajo, que debería verse así:

- -
Profile Ready: please run [b2g|firefox] -profile /path/to/gaia/profile
- -

Puedes entonces correr B2G Desktop con tu perfil generado como se indica abajo:

- -
$ ./b2g /path/to/gaia/profile
- -

Si quieres puedes compilar tu propio B2G desktop desde el código.

- -

Usando Gaia en Firefox

- -

It's also possible to run Gaia inside of Firefox. This gives you the advantages of having a rapid development cycle, as well as standard web development tools and debuggers. See Using Gaia in Firefox for details on how to do this.

- -

Usando Gaia en un dispositivo

- -

If you have a compatible mobile device you can also run Gaia by flashing it with Firefox OS. See Building and installing Firefox OS for details on how to do this. We also have documentation for how to test Firefox OS.

- -

Unidad de pruebas

- -

See Gaia unit tests for documentation about how to create and run unit tests for Gaia.

- -

Presentando errores

- -

Bugs are filed on Bugzilla under Firefox OS > Gaia. File a new bug under the Gaia component (or one of the sub-components).

- -

Contribuyendo a Gaia

- -

Mozilla depends on contributions from the open source community to help develop Gaia apps and we'd love you to get involved.

- -

Some great places to find some bugs to start hacking on:

- - - -

Estilos de codificación básicos

- - - -

Reglas Adicionales

- -

Mal:

- -
if (expression) doSomething();
-
- -

Correcto:

- -
if (expression) {
-  doSomething();
-}
-
- -

If you're working on the system app, check out the guidance listed here.

- -

Before submitting a patch we recommend you run gjslint on it to check for any style errors:

- -
gjslint --nojsdoc my_file.js
- -

Enviando un parche

- -

First file or assign a bug to yourself on Bugzilla, you'll need a Bugzilla account.

- -

Then create a branch on your fork of Gaia:

- -
$ git branch branchname
-$ git checkout branchname
- -

Commit your changes:

- -
$ git add /file/to/add
-$ git commit -m "Bug XXXXX - Fix the broken Gaia and save the world"
- -

Push your branch:

- -
$ git push origin branchname
- -

Send a pull request by navigating to the branch in your fork on GitHub and finding the pull request button.

- -

To request a review of your patch, add an attachment to the bug in Bugzilla referencing the URL of the pull request and set the review ("r") flag to "?" and enter the bugzilla ID of one of the module owners and peers. The Github tweaks for bugzilla extension on AMO can help automate this process by automatically creating the attachment and adding it to the bug; you will still need to set the review flag on Bugzilla.

- -

The reviewer may ask you to make some changes. Once they're is happy with your patch, they will merge it into the master branch for you. Before they do this they would prefer it if you could squash all your changes into a single commit, so your contribution can be tracked easily.

- -

The person who merge the commit (usually the reviewer) would add a r= flag in the comment of the merge commit.

- -

Opciones de Make

- -

There are many undocumented nor unsupported environment variable presists in the Makefile. Do not depend on them as they may be removed in the future.

- -

Default

- -
make
- -

Make a profile with packaged apps, lunachable by B2G Desktop and can be pushed to device.

- -

Debug make

- -
DEBUG=1 make
- -

The DEBUG part runs Gaia as hosted apps on a built-in web server, rather than the default packaged apps which have to be re-packaged after every change. Launch the profile with the latest Firefox Nightly will also give you nice B2G specific panels on the Firefox Developer Tools.

- -

Push to device

- -
make install-gaia
-
-make reset-gaia
- -

With adb (Android Debug Bridge) setup, these make targets will push Gaia to the device. reset-gaia will purge the profile and all other webapps before pushing the new Gaia copy.

- -

Selective build

- -
APP=system make
-
-APP=system make install-gaia
- -

With a profile already exists, APP allow you to specify which app to re-package, instead of re-pack and re-push all the Gaia apps.

- -

High resolution image assets

- -
GAIA_DEV_PIXELS_PER_PX=1.5 make
- -

When packaging the app, replace images with their *@1.5x.(gif|jpg|png) ones if such image exists.

- -

Gaia is currently targetting HBGA (320x240), qHD (540×960) and WVGA (480×800) only; use GAIA_DEV_PIXELS_PER_PX to make sure the images looks sharp on qHD and WVGA devices. see A pixel is not a pixel for more information about device pixels per css pixels.

- -

Script compression and optimization

- -
GAIA_OPTIMIZE=1 make
- -

(TBA)

- -

App selection

- -
GAIA_APP_SRCDIRS=apps test_apps showcase_apps
- -

(TBA)

- -

App selection shortcuts

- -
PRODUCTION=1
-DOGFOOD=1
- -

(TBA)

- -

Preference shortcuts

- -
NOFTU=1
-REMOTE_DEBUGGER=1
- -

(TBA)

- -

Device webapp installation partation selection

- -
B2G_SYSTEM_APPS=1
- -

(TBA)

- -

Distribution and market customization build

- -
GAIA_DISTRIBUTION_DIR=./dir
- -

Read Customization Overview for detail.

- -

Contacting the Team

- - diff --git a/files/es/archive/b2g_os/platform/gaia/index.html b/files/es/archive/b2g_os/platform/gaia/index.html deleted file mode 100644 index f8664fd4ee..0000000000 --- a/files/es/archive/b2g_os/platform/gaia/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Gaia -slug: Archive/B2G_OS/Platform/Gaia -tags: - - '#B2G #gaia' -translation_of: Archive/B2G_OS/Platform/Gaia ---- -

Gaia es la capa de interfaz de usuario de Firefox OS. Todo lo que aparece en la pantalla luego que Firefox OS inicia es presentado por Gaia, incluyendo la pantalla de bloqueo, el marcador y otras aplicaciones. Gaia está completamente escrito en HTML, CSS, y JavaScript. Su única interfaz al sistema operativo y hardware subyacentes es a través de interfaces web estándar (Web API), implementadas por Gecko.

-

Por su diseño, Gaia puede ser ejecutado no solo en dispositivos Firefox OS, sino en otros sistemas operativos y otros navegadores (aunque posiblemente con funcionalidad reducida dependiendo de las capacidades del navegador).

-

Aplicaciones de terceros instaladas junto a Gaia pueden ser cargados por Gaia.

- - - - - - - -
-

Documentación sobre Gaia

-
-
- Introducción a Gaia
-
- Gaia es la intefaz de usuario para dispositivos Firefox OS; Es simplemente una aplicación web corriendo en la parte superior de Firefox OS. Esta guia te introducirá a Gaia.
-
- Guía para hackear Gaia
-
- La guía para hackear y modificar la interfaz de Gaia.
-
-

Ver todas...

-
-

Obteniendo ayuda de la comunidad

-

Si estas trabajando en Gaia, o desarrollando aplicaciones para Gaia, estos son los recursos de la comunidad para ayudarte

- -
    -
  • Haz tus preguntas en el canal Gaia del irc de Mozilla: #gaia
  • -
-

No olvides como hacer adecuadamente tus preguntas...

-
- - -

Recursos

- -
-


-  

diff --git a/files/es/archive/b2g_os/platform/gaia/introduction_to_gaia/index.html b/files/es/archive/b2g_os/platform/gaia/introduction_to_gaia/index.html deleted file mode 100644 index 14c7fb3e16..0000000000 --- a/files/es/archive/b2g_os/platform/gaia/introduction_to_gaia/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Introducción a Gaia -slug: Archive/B2G_OS/Platform/Gaia/Introduction_to_Gaia -translation_of: Archive/B2G_OS/Platform/Gaia/Introduction_to_Gaia ---- -

Gaia es la interfaz de usuario de Boot to Gecko (B2G); es un conjunto de aplicaciones Web que se ejecutan en un dispositivo B2G, emulador, repertorio de escritorio, o versión de Firefox. Todo lo que necesitas conocer para añadir aplicaciones o realizar cambios a Gaia son tecnologías Web como JavaScript, HTML, and CSS.

-

Pantalla de bloqueo de Gaia

-

Predeterminadamente, la pantalla de bloqueo está habilitada, y el PIN por defecto para desbloquear el equipo es "0000". Es muy probable que esta característica cambie con el tiempo mientras es optimizada.

-

La interfaz por defecto de Gaia

-

La interfaz por defecto en Gaia es similar a lo que se observa en la mayoría de los teléfonos inteligentes, como se muestra aquí.

-

Gaia HomeEsta imagen es evidentemente de una versión preliminar del sistema operativo, con iconos de relleno (y algunas aplicaciones de prueba). La barra de estado en la parte superior indica la red en la que el teléfono está operando (o "No hay tarjeta SIM" para un dispositivo sin ninguna red telefónica), la intensidad de la red, la intensidad de la señal WiFi, nivel de batería, y la hora actual.

-

La sección media de la pantalla muestra los iconos de las aplicaciones; al deslizar hacia la izquierda y derecha se desplaza a través de pantallas de iconos.

-

En la parte inferior de la pantalla se localiza una barra con espacio para hasta siete de las aplicaciones más usadas. Puedes arrastrar y soltar aplicaciones a esta barra desde la sección media.

diff --git a/files/es/archive/b2g_os/platform/index.html b/files/es/archive/b2g_os/platform/index.html deleted file mode 100644 index 1e6dda531b..0000000000 --- a/files/es/archive/b2g_os/platform/index.html +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: La Plataforma Firefox OS -slug: Archive/B2G_OS/Platform -translation_of: Archive/B2G_OS/Platform ---- -

La Plataforma Firefox OS esta formada por varios componenetes. No obstante no es necesario comprender su arquitectura para desarrollar aplicaciones que funcionen en Firefox OS, si estás trabajando en el desarrollo o adaptación de esta plataforma, o simplemente estás curioseando, esta documentación puede resultar de tu interés.

- - - - - - - -
-

DocumentaCion sobre la plataforma Firefox OS

-
-
- Introducción al Firefox OS
-
- Información introductoria sobre qué y cómo trabaja Firefox OS.
-
- Instalación y Montaje de Firefox OS
-
- Una guía para Instalar y Montar Firefox OS en terminales compatibles. Esta guía además incluye un emulador para poder arrancar Firefox OS en un PC.
-
- Gaia
-
- Documentacion sobre Gaia, la interfaz de usuario para los dispositivos Firefox OS; se trata de una Aplicación Web que se ejecuta en el propio dispositivo plataformado con Firefox OS.
-
- Gonk
-
- Documentación sobre Gonk, la capa del sistema operativo sobre el que corre Gaia. Está formado por un nucleo de Linux (Linux kernel) y una capa de drivers que permiten la comunicación entre Gecko y el propio dispositivo.
-
- Gecko
-
- Gecko es la capa de Firefox OS que proporciona a la plataforma los mismos estándares web abiertos, utilizados por Firefox y Thunderbird, así como muchas otras aplicaciones.
-
- Feature support chart
-
- A chart of which features are available in which types of Firefox OS builds.
-
- Firefox OS architecture overview
-
- An overview of how Firefox OS is structured internally; this is primarily of interest to platform developers and people doing porting work.
-
- Firefox OS apps architecture
-
- An overview of the application model on Firefox OS.
-
- Testing Firefox OS
-
- A guide to testing Firefox OS, including information about creating automated tests.
-
- Porting Firefox OS
-
- Information about how to port Firefox OS to new devices.
-
- Customization with the .userconfig file
-
- How to customize the build and execution of Firefox OS by changing the .userconfig file.
-
-

View All...

-
-

Getting help from the community

-

If you're working with Firefox OS, or developing applications you'd like to run on Firefox OS devices, there are community resources to help you!

- -
    -
  • Ask your question on Mozilla's Boot to Gecko IRC channel: #b2g
  • -
-

Don't forget about the netiquette...

-
- - -

Resources

- -
-

 

diff --git a/files/es/archive/b2g_os/platform/settings_list/index.html b/files/es/archive/b2g_os/platform/settings_list/index.html deleted file mode 100644 index d5397affd8..0000000000 --- a/files/es/archive/b2g_os/platform/settings_list/index.html +++ /dev/null @@ -1,709 +0,0 @@ ---- -title: Firefox OS settings list -slug: Archive/B2G_OS/Platform/Settings_list -translation_of: Archive/B2G_OS/Platform/Settings_list ---- -
-

Firefox OS offers a number of settings that configure the device and its built-in features. These settings can be accessed by certified apps using the Settings API.

-
-
-

Note: Because of differences in features provided by different devices and different releases of Firefox OS, this list may or may not be an exact match for what's available on every device.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Setting nameTypeDefault value
accessibility.invertBooleanfalse
accessibility.screenreaderBooleanfalse
alarm.enabledBooleanfalse
app.reportCrashesStringask
app.update.intervalNumber86400
audio.volume.alarmNumber15
audio.volume.bt_scoNumber15
audio.volume.dtmfNumber15
audio.volume.contentNumber15
audio.volume.notificationNumber15
audio.volume.ttsNumber15
audio.volume.telephonyNumber5
bluetooth.enabledBooleanfalse
bluetooth.debugging.enabledBooleanfalse
camera.shutter.enabledBooleantrue
clear.remote-windows.dataBooleanfalse
debug.grid.enabledBooleanfalse
debug.oop.disabledBooleanfalse
debug.fps.enabledBooleanfalse
debug.ttl.enabledBooleanfalse
debug.log-animations.enabledBooleanfalse
debug.paint-flashing.enabledBooleanfalse
debug.peformancedata.sharedBooleanfalse
deviceinfo.firmware_revisionString 
deviceinfo.hardwareString 
deviceinfo.osString 
deviceinfo.platform_build_idString 
deviceinfo.platform_versionString 
deviceinfo.softwareString 
deviceinfo.update_channelString 
gaia.system.checkForUpdatesBooleanfalse
general.useragent.updates.enabledBooleantrue
geolocation.enabledBooleantrue
keyboard.layouts.englishBooleantrue
keyboard.layouts.dvorakBooleanfalse
keyboard.layouts.otherlatinsBooleanfalse
keyboard.layouts.cyrillicBooleanfalse
keyboard.layouts.arabicBooleanfalse
keyboard.layouts.hebrewBooleanfalse
keyboard.layouts.zhuyinBooleanfalse
keyboard.layouts.pinyinBooleanfalse
keyboard.layouts.greekBooleanfalse
keyboard.layouts.japaneseBooleanfalse
keyboard.layouts.polishBooleanfalse
keyboard.layouts.portugueseBooleanfalse
keyboard.layouts.spanishBooleanfalse
keyboard.vibrationBooleanfalse
keyboard.clicksoundBooleanfalse
keyboard.autocorrectBooleantrue
keyboard.wordsuggestionBooleantrue
keyboard.currentStringen
language.currentStringen-US
lockscreen.passcode-lock.codeString0000
lockscreen.passcode-lock.timeoutNumber0
lockscreen.passcode-lock.enabledBooleanfalse
lockscreen.notifications-preview.enabledBooleantrue
lockscreen.enabledBooleantrue
lockscreen.lockedBooleantrue
lockscreen.unlock-sound.enabledBooleanfalse
mail.sent-sound.enabledBooleantrue
message.sent-sound.enabledBooleantrue
operatorvariant.mccString0
operatorvariant.mncString0
ril.iccInfo.mbdnString 
ril.sms.strict7BitEncoding.enabledBooleanfalse
ril.cellbroadcast.searchlistString 
debug.console.enabledBooleanfalse
phone.ring.keypadBooleantrue
powersave.enabledBooleanfalse
powersave.thresholdNumber0
privacy.donottrackheader.enabledBooleanfalse
ril.callwaiting.enabled  
ril.cf.enabledBooleanfalse
ril.data.enabledBooleanfalse
ril.data.apnString 
ril.data.carrierString 
ril.data.defaultServiceIdNumber0
ril.data.passwdString 
ril.data.httpProxyHostString 
ril.data.httpProxyPortNumber0
ril.data.mmscString 
ril.data.mmsproxyString 
ril.data.mmsportNumber0
ril.data.roaming_enabledBooleanfalse
ril.data.userString 
ril.mms.apnString 
ril.mms.carrierString 
ril.mms.httpProxyHostString 
ril.mms.httpProxyPortString 
ril.mms.mmscString 
ril.mms.mmsportString 
ril.mms.mmsproxyString 
ril.mms.passwdString 
ril.mms.userString 
ril.radio.preferredNetworkTypeString 
ril.radio.disabledBooleanfalse
ril.supl.apnString 
ril.supl.carrierString 
ril.supl.httpProxyHostString 
ril.supl.httpProxyPortString 
ril.supl.passwdString 
ril.supl.userString 
ril.sms.strict7BitEncoding.enabledBooleanfalse
ril.sms.defaultServiceIdNumber0
ril.telephony.defaultServiceIdNumber0
ring.enabledBooleantrue
screen.automatic-brightnessBooleantrue
screen.brightnessNumber1
screen.timeoutNumber60
tethering.usb.enabledBooleanfalse
tethering.usb.ipString192.168.0.1
tethering.usb.prefixString24
tethering.usb.dhcpserver.startipString192.168.0.10
tethering.usb.dhcpserver.endipString192.168.0.30
tethering.wifi.enabledBooleanfalse
tethering.wifi.ipString192.168.1.1
tethering.wifi.prefixString24
tethering.wifi.dhcpserver.startipString192.168.1.10
tethering.wifi.dhcpserver.endipString192.168.1.30
tethering.wifi.ssidStringFirefoxHotspot
tethering.wifi.security.typeStringopen
tethering.wifi.security.passwordString1234567890
tethering.wifi.connectedClientsNumber0
tethering.usb.connectedClientsNumber0
time.nitz.automatic-update.enabledBooleantrue
time.timezone  
ums.enabledBooleanfalse
ums.modeNumber0
vibration.enabledBooleantrue
wifi.enabledBooleantrue
wifi.screen_off_timeoutNumber600000
wifi.disabled_by_wakelockBooleanfalse
wifi.notificationBooleanfalse
wifi.connect_via_settingsBooleanfalse
icc.displayTextTimeoutNumber40000
icc.inputTextTimeoutNumber40000
-

See also

- diff --git a/files/es/archive/b2g_os/portando/index.html b/files/es/archive/b2g_os/portando/index.html deleted file mode 100644 index 6dada46208..0000000000 --- a/files/es/archive/b2g_os/portando/index.html +++ /dev/null @@ -1,369 +0,0 @@ ---- -title: Portando a Boot to Gecko -slug: Archive/B2G_OS/Portando -tags: - - B2G - - portar - - porting -translation_of: Archive/B2G_OS/Porting_B2G_OS/basics ---- -

Boot to Gecko (FirefoxOS) utiliza un kernel derivado de Android, con una interfaz de usuario basada en Gecko sobre él. Este artículo provee la guía básica de cómo portar el sistema operativo en nuevos dispositivos.

-

Esta guía asume que tu estas portando en un dispositivo nuevo que está funcionando con Andriod; Si estás portando a otro dispositivo, el trabajo va a ser más enredado.

-

Prequisitos

-

Configurando la compilación de tu sistema

-

El primer paso es configurar la compilación del sistema; puedes seguir la guía en prerequisitos para compilar B2G.

-

Crear una copia de seguridad local del sistema original de Android

-

A continuación, deberás hacer una copia de seguridad de tu dispositivo Android antes de empezar a bombardearlo con tu compilación de pruebas de B2G. Además, algunos de estos comandos serán necesarios para el proceso de compilación e instalación.

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

Nota: Esto es opcional pero es recomendado, ya que algunas veces es posible tener perdidas mayores ocasionadas por problemas de compilaciones, en donde si no posees una copia de los archivos propietarios de tu telefono, lo mas probable es que el problema sea irreparable.

-
-

B2G

-

Crea un fork del repositorio de B2G

-

Para esto necesitas una cuenta en Github.com, si no la tienes, creala y luego realiza un fork del siguiente repositiorio:

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

Si no sabes como crear un fork de un repositorio en visita este sitio para obtener ayuda.

-

Clona tu repositorio de B2G

-

Una vez hecho el fork anterior, para empezar a portar B2G a tu nuevo dispositivo, es necesario que clones el repositiorio en tu equipo, clonamos el reposiorio de la siguiente manera:

-
git clone https://github.com/Your-User-Name/B2G.git
-
-

Remplaza Your-User-Name con el usuario de tu cuenta de Github.

-
-

Agrega un nuevo dispositivo al config.sh

-

El siguiente paso, es agregar un nuevo dispositivo a config.sh; puedes usar uno de los existentes como plantilla. Esto básicamente consiste en proporcionar las instruciones para obtener los archivos correctos para hacer la compilación.

-

Busca la linea siguiente en tu archivo config.sh:

-
case "$1" in
-

Seguidamente agrega:

-
"device-name")
-
-echo DEVICE=device-name >> .tmp-config &&
-
-repo_sync $1
-
-;;
-
-

Nota: Debes remplazar la parte en que dice device-name, con el nombre de tu dispositivo, como por ejemplo si tu dispositivo fuera el Samsung Galaxy S3, quedaria asi:

-
"i9300")
-
-echo DEVICE=i9300 >> .tmp-config &&
-
-repo_sync $1
-
-;;
-
-

Como ultimo paso (opcional, no influye en nada si realizas o no este paso), buscas esta parte en tu archivo config.sh:

-
echo Usage: $0 \(device name\)
-
-echo
-
-echo Valid devices to configure are:
-
-echo - galaxy-s2
-
-echo - galaxy-nexus
-
-echo - nexus-s
-
-echo - nexus-s-4g
-
-echo - otoro
-
-echo - unagi
-
-echo - pandaboard
-
-echo - emulator
-
-echo - emulator-x86
-
-exit -1
-
-;;
-

Y agregas tu dispositivo:

-
echo - device-name
-
-
-

Nota: Debes remplazar la parte en que dice device-name, con el nombre de tu dispositivo, como por ejemplo si tu dispositivo fuera el Samsung Galaxy S3, quedaria asi:

-
echo - i9300
-
-

Crear un árbol de configuración para el nuevo dispositivo

-

Este arbol de configuracion debe incluir, al menos:

- -

El contenido aquí puede variar en gran medida entre un dispositivo y otro. En particular, BoardConfig.mk y extract-files.sh podrían variar significativamente. Esta parte requiere un conjunto de hacking, pruebas, y depuración para averiguar que pedazos binarios deberán ser extraidos. Este arbol de configuracion debe estar hosteado en un repo en tu cuenta de Github, mira este repositorio de ejemplo para que te hagas una idea de como tiene que quedar. (Solo es un ejemplo y no tiene que quedar igual a este, todos los telefonos tienen distinto Hardware)

-
-

Nota: No es necesario que crees estos archivos por tu propia cuenta, por lo general la mayoria de los telefonos y dispositivos que corren CyanogenMod o AOKP tienen un repositorio en Github con todos estos archivos del arbol de configuracion, puedes distinguirlos, porque la mayoria de estos repositorios llevan el nombre de: ej "android_device_samsung_i9300" (como es en este caso ejemplo, el nombre varia dependiendo de tu dispositivo). Asi que es recomendable que antes de que empieces a crear estos archivos por tu cuenta, revises algunos de los repositorios de CyanogenMod o AOKP, para ver si el arbol de configuracion de tu dispositivo ya esta creado por alguien mas.

-

Caso contrario ocurre con los dispositivos ZTE o algunos otros dispositivos a los cuales CyanogenMod o AOKP aun no han llegado, que requieren que crees estos archivos por tu propia cuenta desde 0. El Foro XDA  es otro buen lugar para debatir y ver recursos.

-
-

Una vez que tengas estos archivos, si te ha tocado crearlos desde 0 o tienes los archivos del arbol de configuracion en tu equipo, es totalmente necesario que los subas a un repositorio en tu cuenta de Github como se habia mencionado anteriormente. Si no sabes como crear el repositorio en donde alojar tus archivos de configuracion, por favor revisa esta guia. Al final del proceso deberas tener un repositorio como este:

-
https://github.com/Your-User-Name/android-device-your-new-device
-
-

En donde dice Your-User-Name deberia aparecer tu nombre de usuario de tu cuenta en Github, y en donde dice android-device-new-device, deberia aparecer el nombre que le has puesto a tu repositiorio cuando estabas creandolo. (ej: android-device-samsung-i9300)

-
-

Si por el contrario has tenido suerte de encontrar que CyanogenMod o AOKP, o algun otro usuario ya ha creado estos archivos, tienes que hacer un fork del repo en tu cuenta. En pocas palabras, es necesario que tengas todos los repos de tu dispositivo ha realizar el port de FirefoxOS, alojados en tu cuenta de Github.

-

El Archivo Manifest

-

Crea un fork del repositorio b2g-manifest

-

De nuevo realizamos un fork al repositorio de b2g-manifest.

-
https://github.com/mozilla-b2g/b2g-manifest
-

Si no sabes como crear un fork de un repositorio en visita este sitio para obtener ayuda.

-
-

Este fork tiene que quedar igualmente en tu cuenta de Github.

-
-

Crea tu propio repositorio de b2g-manifest

-

Una vez mas, es necesario que el repositorio que acabas de clonar en el paso anterior, sea hosteado por una cuenta de Github tuya en donde puedas hacer las modificaciones especiales para tu dispositivo. Quedando de la siguiente manera:

-
git clone https://github.com/Your-User-Name/b2g-manifest.git
-

Crear el archivo de manifiesto para el nuevo dispositivo

-

Ahora necesitas agregar los repositorios requeridos para el archivo de manifiesto para el nuevo dispositivo; este archivo de manifiesto es llamado device-name.xml (el nombre de este archivo debe ser cambiado por el nombre de tu dispositivo, conservando la extension que lo caracteriza, el .xml). Este archivo debe tener la siguiente estructura:

-
-
<?xml version="1.0" encoding="UTF-8"?>
-
-<manifest>
-
-
-  <remote name="aosp"
-
-           fetch="https://android.googlesource.com/" />
-
-  <remote name="b2g"
-
-          fetch="git://github.com/mozilla-b2g/" />
-
-  <remote name="linaro"
-
-           fetch="git://android.git.linaro.org/" />
-
-  <remote name="mozilla"
-
-fetch="git://github.com/mozilla/" />
-
-  <remote name="mozillaorg"
-
-      fetch="https://git.mozilla.org/releases" />
-
-  <default revision="refs/tags/android-4.0.4_r1.2"
-
-           remote="linaro"
-
-           sync-j="4" />
-
-
-  <!-- Gonk specific things and forks -->
-
-  <project path="build" name="platform_build" remote="b2g" revision="master">
-
-    <copyfile src="core/root.mk" dest="Makefile" />
-
-  </project>
-
-  <project path="dalvik" name="fake-dalvik" remote="b2g" revision="master" />
-
-  <project path="gaia" name="gaia.git" remote="mozillaorg" revision="master" />
-
-  <project path="gecko" name="gecko.git" remote="mozillaorg" revision="master" />
-
-  <project path="gonk-misc" name="gonk-misc" remote="b2g" revision="master" />
-
-  <project path="rilproxy" name="rilproxy" remote="b2g" revision="master" />
-
-  <project path="external/moztt" name="moztt" remote="b2g" revision="master" />
-
-
-  <!-- Stock Android things -->
-
-  <project path="abi/cpp" name="platform/abi/cpp" />
-
-  <project path="bionic" name="platform/bionic" />
-
-  <project path="bootable/recovery" name="platform/bootable/recovery" />
-
-  <project path="device/common" name="device/common" />
-
-  <project path="device/sample" name="device/sample" />
-
-  <project path="external/apriori" name="platform_external_apriori" remote="b2g" revision="master" />
-
-  <project path="external/bluetooth/bluez" name="platform/external/bluetooth/bluez" />
-
-  <project path="external/bluetooth/glib" name="platform/external/bluetooth/glib" />
-
-  <project path="external/bluetooth/hcidump" name="platform/external/bluetooth/hcidump" />
-
-  <project path="external/bsdiff" name="platform/external/bsdiff" />
-
-  <project path="external/bzip2" name="platform/external/bzip2" />
-
-  <project path="external/dbus" name="platform/external/dbus" />
-
-  <project path="external/dhcpcd" name="platform/external/dhcpcd" />
-
-  <project path="external/dnsmasq" name="platform/external/dnsmasq" />
-
-  <project path="external/elfcopy" name="platform_external_elfcopy" remote="b2g" revision="master" />
-
-  <project path="external/elfutils" name="platform_external_elfutils" remote="b2g" revision="master" />
-
-  <project path="external/expat" name="platform/external/expat" />
-
-  <project path="external/fdlibm" name="platform/external/fdlibm" />
-
-  <project path="external/flac" name="platform/external/flac" />
-
-  <project path="external/freetype" name="platform/external/freetype" />
-
-  <project path="external/giflib" name="platform/external/giflib" />
-
-  <project path="external/gtest" name="platform/external/gtest" remote="linaro" revision="master" />
-
-  <project path="external/harfbuzz" name="platform/external/harfbuzz" />
-
-  <project path="external/icu4c" name="platform/external/icu4c" />
-
-  <project path="external/iptables" name="platform/external/iptables" />
-
-  <project path="external/jpeg" name="platform/external/jpeg" />
-
-  <project path="external/libgsm" name="platform/external/libgsm" />
-
-  <project path="external/liblzf" name="platform/external/liblzf" />
-
-  <project path="external/libnfc-nxp" name="platform/external/libnfc-nxp" />
-
-  <project path="external/libnl-headers" name="platform/external/libnl-headers" />
-
-  <project path="external/libpng" name="platform/external/libpng" />
-
-  <project path="external/libvpx" name="platform/external/libvpx" />
-
-  <project path="external/mksh" name="platform/external/mksh" />
-
-  <project path="external/opensans" name="platform_external_opensans" remote="b2g" revision="master" />
-
-  <project path="external/openssl" name="platform/external/openssl" />
-
-  <project path="external/protobuf" name="platform/external/protobuf" />
-
-  <project path="external/safe-iop" name="platform/external/safe-iop" />
-
-  <project path="external/screencap-gonk" name="screencap-gonk" remote="b2g" revision="master" />
-
-  <project path="external/sonivox" name="platform/external/sonivox" />
-
-  <project path="external/speex" name="platform/external/speex" />
-
-  <project path="external/sqlite" name="platform/external/sqlite" />
-
-  <project path="external/stlport" name="platform/external/stlport" />
-
-  <project path="external/strace" name="platform/external/strace" />
-
-  <project path="external/tagsoup" name="platform/external/tagsoup" />
-
-  <project path="external/tinyalsa" name="platform/external/tinyalsa" />
-
-  <project path="external/tremolo" name="platform/external/tremolo" />
-
-  <project path="external/webp" name="platform/external/webp" />
-
-  <project path="external/webrtc" name="platform/external/webrtc" />
-
-  <project path="external/wpa_supplicant" name="platform/external/wpa_supplicant" />
-
-  <project path="external/wpa_supplicant_8" name="platform/external/wpa_supplicant_8" />
-
-  <project path="external/zlib" name="platform/external/zlib" />
-
-  <project path="external/yaffs2" name="platform/external/yaffs2" />
-
-  <project path="frameworks/base" name="platform/frameworks/base" />
-
-  <project path="frameworks/opt/emoji" name="platform/frameworks/opt/emoji" />
-
-  <project path="frameworks/support" name="platform/frameworks/support" />
-
-  <project path="hardware/libhardware" name="platform/hardware/libhardware" />
-
-  <project path="hardware/libhardware_legacy" name="platform/hardware/libhardware_legacy" />
-
-  <project path="hardware/ril" name="platform/hardware/ril" />
-
-  <project path="libcore" name="platform/libcore" />
-
-  <project path="ndk" name="platform/ndk" />
-
-  <project path="prebuilt" name="platform/prebuilt" />
-
-  <project path="system/bluetooth" name="platform/system/bluetooth" />
-
-  <project path="system/core" name="platform/system/core" />
-
-  <project path="system/extras" name="platform/system/extras" />
-
-  <project path="system/media" name="platform/system/media" />
-
-  <project path="system/netd" name="platform/system/netd" />
-
-  <project path="system/vold" name="platform/system/vold" />
-
-
-  <!-- Cosas de tu dispositivo  -->
-
-
-
-</manifest>
-

El archivo manifesto es muy facil de crear, simplemente necesitaras el codigo anterior y entenderlo un poco. Copia el codigo anterior

-

Booteo de B2G

-
-

Recompilar boot.img

-

Una vez lo tengas todo hecho, necesitas recompilar la imágen de arranque. Esto no suele ser necesario para el propio Kernel, pero recoge los cambios en  init.rc.

-

Cambios a init.rc

-

El init.rc que utilizas no es el proporcionado por B2G; en su lugar, tienes que tirarlo desde el dispositivo

-

Las principales cosas que necesitarás modificar son:

-
Importar init.b2g.rc
-

Añade las siguientes líneas para importar init.b2g.rc:

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

Corrige los permisos en los archivos /system/b2g/b2g, /system/b2g/updater, /system/b2g/plugin-container; esto se deberá hacer después de las líneas que montan los archivos del sistema de lectura/escritura:

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

Es posible que quieras iniciar modificando init.rc del nuevo dispositivo en vez de usar el init.rc proveido por la compilación del sistema; si es así, necesitas recordar configurar TARGET_PROVIDES_INIT_RC en BoardConfig.mk.

-

Kernel precompilado vs. compilando el kernel desde una fuente

-

Puedes usar un Kernel precompilado, o podrías compilar el Kernel desde una fuente. Para compilar el Kernel desde una fuente, añade AndroidKernel.mk  y la configuración del kernel al árbol de configuración del dispositivo.

-

El maguro en la vieja compilación del sistema es un ejemplo de compilación del kernel desde una fuente.

-

Flasheo del dispositivo

-

Añade el nuevo dispositivo a flash.sh

-

Añade el nuevo dispositivo a  flash.sh; las especificaciones de como hacer esto dependerán de que herramientas necesitas usar para flashear el nuevo dispositivo.

-

Primer arranque

-

Configura, compila y  flashea el nuevo dispositivo

-

Ahora puedes probar compilando y flasheando tu nuevo dispositivo:

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

Probar y depurar

-

Necesitamos añadir algunos detalles aqui; de hecho, este artículo podría usar algo de ayuda.

-

FAQ

-

¿A que dispiositivos se le puede hacer Port?

-

Si tu dispositivo corre Android 4.0.4 lo mas probable es que pueda correr FirefoxOS, no obstante no quiere decir que a la primera correra sin ningun problema. El Porting es todo un proceso de prueba y error, es posible que tardes mas tiempo solucionando problemas en los archivos que compiles, que recopilandolos todos.

-

Mi dispositivo es de arquitectura ARMv6, ¿correra alli?

-

Puede que si o puede que no, todo depende de tus conocimientos y de hasta donde puedas llegar con el Port, por ahora solo se conoce un caso en los foros de Geeksphone en donde un usuario a logrado completar un Port estable a uno de los telefonos que ofrece Geeksphone de arquitectura ARMv6.

-

¿Alguien mas esta trabajando en realizar Port a los diferentes dispositivos?

-

Quienes realizan los Port son desarrolladores, geeks o mozillians. No se puede definir un equipo especial de Mozilla que este trabajando en ello. Por otro lado la comunidad Mozilla Hispano tiene un proyecto conformado por un grupo de personas con el fin de lograr el Port a varios dispositivos. Para mas informacion puedes visitar este link.

-

¿Necesito algunos conocimientos previos para empezar a realizar el Port?

-

Si, de hecho hay dos tipos de casos que pueden suceder mientras realices el Port. El primero de ellos es que tengas la suerte de que todos los sources y archivos que encuentre en Github para tu Port esten bien y compilen sin ningun problema (Poco probable que suceda). El segundo caso es que te toque re escribir algunos, si no son todos los archivos y sources de tu dispositivo para lograr que compilen y que arranquen FirefoxOS (Es lo que probablemente te pueda suceder con seguridad). Por lo que por recomendacion, seria bueno que tuvieras previos conocimientos acerca del funcionamiento de Android, algo de C y C++.

-

Mira también

- diff --git a/files/es/archive/b2g_os/porting_firefox_os/index.html b/files/es/archive/b2g_os/porting_firefox_os/index.html deleted file mode 100644 index 9da87c1802..0000000000 --- a/files/es/archive/b2g_os/porting_firefox_os/index.html +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Porting Firefox OS -slug: Archive/B2G_OS/Porting_Firefox_OS -tags: - - Firefox OS - - NeedsTranslation - - TopicStub - - porting -translation_of: Archive/B2G_OS/Porting_B2G_OS ---- -

This page lists the available resources for porting Firefox OS.

- -
-
Porting basics
-
Basic information about how to port Firefox OS to new devices.
-
Porting on CyanogenMod
-
This article explains how to port Firefox using CyanogenMod.
-
diff --git a/files/es/archive/b2g_os/porting_firefox_os/portando_de_cyanogenmod/index.html b/files/es/archive/b2g_os/porting_firefox_os/portando_de_cyanogenmod/index.html deleted file mode 100644 index cc9e9b19a1..0000000000 --- a/files/es/archive/b2g_os/porting_firefox_os/portando_de_cyanogenmod/index.html +++ /dev/null @@ -1,239 +0,0 @@ ---- -title: Portando en CyanogenMod -slug: Archive/B2G_OS/Porting_Firefox_OS/Portando_de_CyanogenMod -translation_of: Archive/B2G_OS/Porting_B2G_OS/Porting_on_CyanogenMod ---- -

- -

Firefox OS es tradicionalmente compilado encima de AOSP. Esto no significa que nosotros solamente usemos AOSP. Varias ramas (forks) de AOSP existen que tienen como objetivo apoyar una amplia gama de hardware. CyanogenMod, el fork mas popular de AOSP, incluye cientos de añadiduras, modificaciones, y hacks para dar soporte a cientos de disposivitos Android al por menor. Este articulo explica como portar Firefox OS usando CyanogenMod.

- -

Cuando compilamos Firefox OS encima de CyanogenMod podemos dar soporte al mismo numero de despositivos que CyanogenMod soporta. Debido a la gran cantidad de dispositivos soportados por CyanogenMod, es muy probable que ya tengas un dispositivo para el cual puedas compilar.

- -
Importante: Esta guía es solamente para usuarios avanzados; debes de saber al menos cómo compilar CyanogenMod o AOSP.
- -

Si nunca has compilado CyanogenMod para tu dispositivo entonces te sugerimos insistentemente que aprendas como hacerlo antes de portar Firefox OS. Esto tiene dos propositos: aprenderás como usar las herramientas necesarias para portar Firefox OS, y verificarás la calidad del 'port' de CyanogenMod.

- -

Más explícitamente, ésta guía asume que tu dispositivo esta desbloqueado y tiene CyanogenMod instalado. Esta guia no te enseñara como rootear y/o desbloquear tu dispositivo, o como preparar tu maquina para compilar o como usar git para solucionar los fallos de combinación.

- -

Un resumen de los pasos a seguir es el siguiente:

- -
    -
  1. Descargar el codigo fuente
  2. -
  3. Modificar los 'repos' del dispositivo
  4. -
  5. Modicar el núcleo
  6. -
  7. Compilar e Instalar
  8. -
- -

Descargar el código de fuente

- -
Para hacer: Convinar el manifiesto de mozilla-b2g: Bugzilla: 1211870.
- -

Tenemos varias herramientas útiles para construir Firefox OS, todas ellas contenidas en un simple repositorio. Descárga estas herramientas por git para crear tu directorio de trabajo.

- -
git clone https://github.com/cm-b2g/B2G.git && cd B2G
-
- -

Hecho esto, necesitamos descargar el código fuente:

- -
./config.sh cm-porting
-
- -

El archivo config.sh  inicializa la herramienta repo usando el manifiesto  base-l-cm.xml  que se encuentra en el repositorio b2g-manifest.  Éste archivo XML es en realidad una lista de repositorios específicos del SO necesarios para construir B2G OS.  Luego, utiliza la herramienta repo para descargar todo el código de fuente.

- -

La descarga de estos repositorios, muchos de los cuales tienen varias gigas,  tomará bastante tiempo, así que te recomendamos hacer esto en la noche si tienes una conección lenta, o justo después del almuerzo si tienes una conección rápida.

- -

Este paso también crea un archivo .config que podrás editar después.

- -

Manifiesto local para tu dispositivo

- -

El manifiesto anterior no contiene ningún repositorio específico de dispositivo, asunto diferente al típico manifiesto. Necesitaremos entonces crear un local_manifest.xml con todos los repositorios de tu dispositivo. La manera más rápida de hacerlo es usando breakfast, un herramienta automática escrita por CyanogenMod para crear un manifiesto local y descargar los repositorios adicionales directamente de la cuenta de CyanogenMod en GitHub.

- -
. build/envsetup.sh && breakfast 123
-
- -

Reemplace 123 por el nombre clave de su dispositivo.

- -

Si tu dispositivo no está oficialmente soportado por CyanogenMod, pero hay un 'port' no oficial, tu puedes crear el archivo local_manifest.xml manualmente en la carpeta  .repo/local_manifests.

- -
<?xml version="1.0" encoding="UTF-8"?>
-<manifest>
-     <remote name="xyz" fetch="git://github.com/xyz/" revision="cm-12.1" />
-     <project name="device_oem_123" path="device/oem/123" remote="xyz" />
-     <project name="device_oem_1xx-common" path="device/oem/1xx-common" remote="xyz" />
-     <project name="kernel_oem_1xx" path="kernel/oem/1xx" remote="xyz" />
-     <project name="vendor_oem" path="vendor/oem" remote="xyz" />
-</manifest>
-
- -

Recuerda correr repo sync cuando hayas creado tu manifiesto.

- -

Modificar los 'repos' del dispositivo

- -

Parte de la configuración de un dispositivo se encuentra en los archivos XML de superposición, usados por el sistema de construcción AOSP para establecer las opciones por defecto en las apps de Android. Firefox OS no los usa así que podemos reimplementar algunas de estas opciones, tales como el botón de inicio de la pantalla, el almacenamiento emulado, etc.

- -

Podemos establecer opciones predeterminadas más sanas mediante la inclusión de dos archivos desde vendor/cm. La primera línea podría ser agregada en la parte superior de device.mk y la segunda en la parte inferior de BoardConfig.mk:

- -
# Extra mk import at the top of device.mk
-$(call inherit-product, vendor/cm/config/common_full.mk)
-
-# Extra mk import at the bottom of BoardConfig.mk
-include vendor/cm/BoardConfig.mk
-
- -

Todavía se necesitan más opciones, ya que muchas son propiamente específicas del dispositivo . A continuación encontrarás una lista de adiciones y eliminaciones específicas de dispositivos comunes. Esta lista no es exhaustiva, pero agregando las dos líneas mencionadas arriba y configurando todas las de abajo,  tendrás un sistema funcional.

- -
# for Gecko to use the correct resolution assets
-# Valid options are: 1.5 | 2 | 2.25
-GAIA_DEV_PIXELS_PER_PX := 2.25
-
- -
# for Gecko to use the correct boot animation
-# Valid options are: hvga | fwvga | qHD | 720p | 1080p
-BOOTANIMATION_ASSET_SIZE := 1080p
-
- -
# for Gecko to support separate internal storage partition
-# This is for legacy devices only. You must prvide your own volume.cfg file
-GECKO_BOARD_SEPARATE_STORAGE_PARTITON := true
-
- -
# for Gecko to support virtual home button
-PRODUCT_PROPERTY_OVERRIDES += \
-    ro.moz.has_home_button=0
-
- -
# for Gecko to support usb mass storage
-# You may need to add mass_storage to init.oem.usb.rc
-PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
--    persist.sys.usb.config=mtp
-+    persist.sys.usb.config=mass_storage
-
- -
# for Gecko to support NFC
-PRODUCT_PROPERTY_OVERRIDES += \
-    ro.moz.nfc.enabled=true
-
-PRODUCT_PACKAGES += \
-    nfcd
-
- -
# Changes in init.device.rc
--on property:init.svc.bootanim=running
--on property:init.svc.bootanim=stopped
--on property:service.bootanim.exit=1
-+on property:sys.boot_completed=1
-
- -

Modificar el núcleo

- -

Necesitamos habilitar en el núcleo algunas características de seguridad adicionales para Firefox OS. Estas características no estaban presentes en núcleos Android hasta Marshmallow así que muchos dispositivos necesitarán algunos parches 'backported' adicionales para el núcleo. Más información al respecto en Bugzilla: 790923.

- -

Es suficiente tomar la mejor selección de parches para tu núcleo; el sistema de compilación habilitará automáticamente las nuevas características. Para un trabajo de ejemplo ver el LGE MSM8994 kernel.

- -
Importante: Este paso es obligatorio. Firefox OS no arrancará sin estas características de seguridad.
- -

Compilar e instalar

- -

¿Recuerdas el archivo .config creado anteriormente? Ahora necesitamos reemplazar cm-porting con el nombre clave de tu dispositivo.

- -
$ grep -r PRODUCT_NAME device/oem/123
-
- -

Nota: No uses el valor en cm.mk, usa el que está en device.mk, este debería ser algo como full_123. Puedes hacer el reemplazo manualmente o con sed:

- -
$ sed -i "s/cm-porting/full_123/g" .config
-
- -

Ahora es momento de comenzar la compilación:

- -
$ ./bldcm.sh
-
- -

Esto tomará, en todo caso, de 30 minutos a un par de horas dependiendo de tu PC, así que podría ser un buen momento para ir a la tienda y preparar algo de comer, o ayudar en las tareas de la casa.

- -

Instalar Firefox OS a través de fastboot

- -

Si tu dispositivo soporta fastboot, puedes simplemente mandar las imágenes de partición directamente al dispositivo:

- -
cd out/target/product/123/
-fastboot flash boot boot.img
-fastboot flash recovery recovery.img
-fastboot flash system system.img
-fastboot flash userdata userdata.img
-
- -

Instalar Firefox OS através del recovery

- -

Si tu dispositivo no soporta fastboot entonces puedes usar update.zip en su lugar. Este puede ser inicializado por el dispositivo a través de adb sideload. Una vez allí, deberás mandar el archivo .zip:

- -
adb sideload out/target/product/123/fota/fullimg/update.zip
-
- -

Solución de problemas

- -

¿Algo no funciona? ¡Es momento de remangarse la camisa!

- -

Lo primero que debes hacer es determinar si la característica está funcionando en CyanogenMod. Puede que simplemente falte  alguna configuración para Firefox OS.

- -

Si la característica no funciona en CyanogenMod entonces significa que debes implementarla para tu 'port'. Sería bueno si también presionas tu revisión yendo atrás en el código.

- -

Cámara

- -

Algunas partes de Android fueron removidas del proceso de compilación por ser innecesarias. Si tu cámara  arrojaburbujas de queja sobre la pérdida de funciones, verifica los marcos o la base para ver si las funciones fueron removidas. Podría ser posible traerlas de vuelta.

- -

WiFi

- -

El dispositivo podría no ver ciertos Puntos de Acceso si no están en un canal oficial. Este parecería ser un problema de CyanogenMod o incluso de AOSP, ya que este afecta distintos tipos de hardware y diferentes OEMs.

diff --git a/files/es/archive/b2g_os/preparing_for_your_first_b2g_build/index.html b/files/es/archive/b2g_os/preparing_for_your_first_b2g_build/index.html deleted file mode 100644 index c0a20668ca..0000000000 --- a/files/es/archive/b2g_os/preparing_for_your_first_b2g_build/index.html +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: Preparándote para tu primer binario de B2G -slug: Archive/B2G_OS/Preparing_for_your_first_B2G_build -translation_of: Archive/B2G_OS/Preparing_for_your_first_B2G_build ---- -

- -

Antes de construir B2G, necesitas clonar el repositorio y configurar tu binario. Este artículo te explica cómo.

- -

Cómo clonar el repositorio de B2G

- -

El primer paso antes de empezar a construir tu primer binario es clonar el repositorio de B2G. Esto no lo bajará todo: bajará solamente el "build system" de B2G y las utilidades de configuración. La mayoría del código de B2G está en el repositorio general Mercurial de Mozilla.

- -

Para clonar el repositorio, usa git:

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

Tras clonarlo (lo que debería tardar sólo un momento), cd al directorio de B2G:

- -
cd B2G
-
- -

Cómo copiar la estructura de B2G a otro ordenador

- -

Si tienes un ordenador nuevo (¡vaya suerte!), tu vida será mucho más fácil si simplemente migras la estructura completa de B2G de un ordenador al otro.

- -

Para ello, monta el disco duro de tu ordenador viejo en el nuevo, y haz:

- -
rsync -a source/ dest/
-
- -

Donde source es la ruta completa (incluida la barra oblicua del final) a la estructura del código, y dest es el destino al que la quieres mover (la barra oblicua del final también es importante en este caso).

- -
-

Atención: Si copias los archivos de un ordenador con un sistema operativo diferente asegúrate de ejecutar './build.sh clean' antes de empezar el proceso de construcción. Si no, puedes causar problemas de compilación.

-
- -

Si sigues estas instrucciones, puedes saltarte el resto de este artículo e ir directamente a la página de construcción.

- -

Cómo configurar B2G en tu móvil

- -
Importante: Recuerda que sólo son compatibles los móviles con Android 4 (alias Ice Cream Sandwich o ICS). Asegúrate de que tu teléfono tiene instalado ICS, si no este paso probablemente fallará ya que algunos "drivers" se obtienen de móviles que no son Nexus. Si tienes que flashear tu móvil con ICS, ten en cuenta que algunas extensiones USB no funcionan bien con utilidades para flashear, y que tendrás que conectar tu teléfono a uno de los puertos del ordenador.
- -

Una vez tengas el "build system" de B2G, necesitas configurarlo para el móvil en el que lo vas a instalar. Para ver una lista de aparatos compatibles, puedes utilizar la herramienta config.sh:

- -
./config.sh
-
- -

Este comando te muestra una lista de aparatos compatibles. Por ejemplo:

- -
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)
- -

-Si tu aparato no está en la lista, no continúes: ayúdanos a hacer B2G compatible con tu aparato o espera a que alguien lo haga. ¡Pero siempre es mejor que seas tú el que nos ayudes!
- -
 
- -
Atención: Si por cualquier razón quieres construir una versión específica de B2G, lee el artículo Cómo construir una versión específica de Gecko antes de hacerlo.
- -

Cómo configurar un teléfono móvil

- -

Primero conecta tu móvil: el proceso de configuración necesita acceder al teléfono.

- -

Si tu teléfono aparece en la lista de aparatos compatibles, puedes empezar el proceso de configuración ejecutando config.sh otra vez, pero ahora incluyendo el nombre del aparato. Por ejemplo, para construir para el Samsung Google Nexus S, escribirías:

- -
./config.sh nexus-s
-
- -

Al principio de la configuración es posible que tengas que configurar la opción de uso del color, tras lo cual el proceso continúa. Éste es un buen momento para tomarse un descanso, ya que es ahora cuando te estás descargando por primera vez todo el código necesario para construir B2G.

- -

Si tu teléfono ya no tiene Android y tu estructura de B2G no tiene los bloques binarios, pero has hecho una copia de seguridad de la partición /system tal y como te recomendó el artículo Prerrequisitos para construir Firefox OS, puedes utilizar dicha copia de seguridad haciendo:

- -
ANDROIDFS_DIR=<absolute path to parent dir of system dir> ./config.sh <target>
-
- -

Configuración para construir un emulador

- -

Si quieres construir uno de los emuladores, especifica "emulator" para construir la versión ARM, o "emulator-x86" para construir la versión x86. La versión x86 es más rápida, pero su simulación de dispositivos móviles es menos fiel a la realidad.

- -

Por ejemplo, para construir el emulador ARM, escribirías lo siguiente:

- -
./config.sh emulator
-
- -

Al principio de la configuración es posible que tengas que configurar la opción de uso del color, tras lo cual el proceso continúa. Éste es un buen momento para tomarse un descanso, ya que es ahora cuando te estás descargando por primera vez todo el código necesario para construir B2G.

- -
-

Atención: ./config.sh puede llevar más tiempo y consumir más recursos de red de lo que esperabas. Puedes parar el proceso haciendo Ctrl-C y reiniciarlo más tarde. Si sospechas que parte del proceso fue interrumpido antes de terminar, ejecuta './repo sync' para reparar cualquier posible error.

-
- -

Cómo construir una versión específica de Gecko

- -

Algunas veces querrás o necesitarás construir B2G basado en una versión de Gecko distinta de la que se usa por defecto (la que se especifica en el manifiesto). Puedes hacerlo editando el archivo.userconfig antes de hacer "pull" en el repositorio (es decir, antes de ejecutar config.sh). Por ejemplo, si quieres construir basándote en mozilla-central:

- -
GECKO_PATH=/path/to/mozilla-central
-GECKO_OBJDIR=/path/to/mozilla-central/objdir-gonk
-
- -
-

Atención: si construyes para otra versión de Gecko en Mac OS X, el directorio mozilla-central tiene que estar en un sistema de archivos sensible a las mayúsculas.

-
- -

Lee Personalización del archivo .userconfig para más información sobre adaptaciones que puedes hacer.

- -

Próximo paso: empieza a construir.

diff --git a/files/es/archive/b2g_os/probando_firefox_os/index.html b/files/es/archive/b2g_os/probando_firefox_os/index.html deleted file mode 100644 index 282a2fc9cc..0000000000 --- a/files/es/archive/b2g_os/probando_firefox_os/index.html +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Probar Firefox OS -slug: Archive/B2G_OS/Probando_Firefox_OS -translation_of: Archive/B2G_OS/Automated_testing ---- -

-

Considerando que Boot to Gecko esta todavía en desarrollo y la compatibilidad para hardware nuevo está pensada para un futuro inmediato, es importante saber cómo probarlo. Esta página ofrece enlaces a artículos que proveen información sobre varios aspectos las pruebas de Boot to Gecko.

- - - - - - - -
-

Pruebas de unidades

- -
-
-

Temas de prueba diversos

-
-
- Depurar OpenGL
-
- Como depurar código OpenGL en Boot to Gecko.
-
- Gráfico de soporte de características
-
- Un gráfico de que características están soportadas por las diferentes compilaciones de Boot to Gecko.
-
-

Marionette para Boot to Gecko

- -

Prueba de Gaia

- -

Tutoriales de Marionette

- -

Escribiendo pruebas para Marionette

- -

Ver todo...

-
-

Obtener ayuda de la comunidad

-

Si está trabajando con Boot to Gecko o desarrollando aplicaciones que funcionarán en dispositivos basados en Boot to Gecko, hay recursos de la comunidad que lo ayudarán.

- -
    -
  • Pregunte en el canal de IRC de Mozilla: #b2g
  • -
-

No se olvide de la netiquette...

-
- - -
-

 

diff --git a/files/es/archive/b2g_os/quickstart/app_tools/index.html b/files/es/archive/b2g_os/quickstart/app_tools/index.html deleted file mode 100644 index a179d64a23..0000000000 --- a/files/es/archive/b2g_os/quickstart/app_tools/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: App tools -slug: Archive/B2G_OS/Quickstart/App_tools -translation_of: Archive/B2G_OS/Quickstart/App_tools ---- -
-

What do you use to build Open Web Apps? The answer is "anything you would normally use to build for the web." The following is a list of tools and resources to help you get started making Open Web Apps. They can be easily integrated into your existing web development workflow, if you have one, or you can build a new workflow around them.

-
-

App Validator

-

Is your app ready for the Firefox Marketplace? The App validator will check your manifest and show you any errors it may have, or warnings you should consider.

-

Firefox OS Simulator

-

Installing and using the Firefox OS Simulator is the easiest way to get up and running with your app. After installed the simulator is accessible via the Tools -> Web Developer -> Firefox OS Simulator menu. The simulator launches with a JavaScript console so that you may debug your application from within the simulator!

-

App Manager

-

The new kid on the block with regards to testing tools is called the App Manager. 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.

-

Firefox Developer Tools

-

Firefox now ships with a default set of developer tools built from the ground up to ensure a great development experience that is both snappy and efficient. To find out more about how these tools work, and see a detailed list of what else Mozilla has to offer, head on over to our Tools zone.

diff --git a/files/es/archive/b2g_os/quickstart/index.html b/files/es/archive/b2g_os/quickstart/index.html deleted file mode 100644 index ebe1f7c220..0000000000 --- a/files/es/archive/b2g_os/quickstart/index.html +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Build -slug: Archive/B2G_OS/Quickstart -tags: - - NeedsTranslation - - 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/es/archive/b2g_os/quickstart/intro_to_manifests/index.html b/files/es/archive/b2g_os/quickstart/intro_to_manifests/index.html deleted file mode 100644 index 84ab7f30d9..0000000000 --- a/files/es/archive/b2g_os/quickstart/intro_to_manifests/index.html +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Introducción al manifest -slug: Archive/B2G_OS/Quickstart/Intro_to_manifests -translation_of: Archive/B2G_OS/Quickstart/Intro_to_manifests ---- -
-

Este articulo proporciona toda la información básica que usted necesita saber a cerca de trabajar con archivos de manifiesto open web app.

-
-
-
- ¿Por qué mi aplicación necesita un app manifest?
-
- La aplicación manifest proporciona útil información a cerca de una aplicación (tal como nombre, autor, icono y descripción)  es un simple documento usado por los usuarios y las tiendas de aplicacion. Lo mas importante, está contendra una lista de Web APIs (Tal como geolocation) que su aplicación necesita. Esto permite a usuarios tomar decisiones informadas a cerca de aplicaciones antes de instalarla.
-
- Es la Open Web app manifest la misma cosa como el  manifest usado por la extensión de Google Chrome y las web app instalables? o el W3C Widgets manifest? o el  HTML5 cache manifest?
-
- No a todos ellos. . La open web app manifest es probablemente la mas similar a google manifest, pero no son identicos. Es esperado que el Open web apps manifest llegará a ser un estandar.
-
- ¿Qué es un origen?
-
- El origen de una aplicación es el protocolo, dominio y puerto de la url junto. Cada una de las siguientes urls son diferentes a la original: -
    -
  • http://example.com
  • -
  • http://example.com:8080 (diferente puerto)
  • -
  • https://example.com (diferente protocolo)
  • -
  • http://www.example.com
  • -
  • http://myapp.example.com (subdominio)
  • -
-
-
- Las siguientes urls son la misma original: -
    -
  • http://Example.com:80
  • -
  • http://example.com
  • -
-
-
-
-
- Las siguientes urls son la misma original: -
    -
  • http://example.com/drawingApp
  • -
  • http://example.com/notesApp
  • -
-
-
-
-
- ¿Por qué tengo que hospedar el app manifest en el mismo origen que mi aplicación?
-
- Asumimos que solo usted puede alojar una aplicación manifest en el mismo origen que su aplicación. Esto significa que los usuarios pueden instalar su aplicación con confianza, sabiendo que la instalación es basada en su aplicación manifiesto y no en alguien más.  Los usuarios deberían tener esta confianza si están instalando su aplicación para Firefox OS Marketplace, para alguna otra tienda de aplicaciones o para su propio sitio web si es auto-publicada su aplicación.
-
- Si la aplicación manifest no fué hospedada en el mismo origen que la aplicación misma, allí no habría nada para prevenir que terceros hagan directamente aplicaciones fuera de el contenido alojado en su origen.Incluso empeora, terceros podrían crear una aplicación manifiest usando su marca eso sería engañar a los usuarios para que instalen una aplicación que es una fachada para un robo de contraseñas u otros comportamientos imprevistos .
-
- ¿hacer esto significa que no puedo incrusptar imagenes o javascript de otros origenes?
-
- No.  La restricción de origen es sobre solo contenido (paginas HTML) . imagenes y otros recursos embebidos pueden ser localizados en otras partes (por ejemplo, en una red de entrega de contenido), excepto por el icono de la aplicación.
-
- Puedo tener mas de una aplicación en mi origen?
-
- No, allí solo puede estar una aplicación por origen. Si se permitiera multiples aplicaciones de un solo origen, ellos podrian vivir en una simple web sandbox — examinarían cada localStorage del otro , hace solicitud ajax a cada APIS del otro, o incluso roba acceso a las APIS privilegiadas que deberían de haber tenido concebida solo una de las aplicaciones. Esto sería especialmente peligroso para dominios públicos que públican contenido generado por usuario para muchos usuarios.
-
- Nosotros recomendamos que use una separación de subdominios para cada una de sus aplicaciones. Por ejemplo, spreadsheet.mycoolapps.com por una aplicación y texteditor.mycoolapps.com por otro. Para mas información, ver Añadiendo un subdominio por una aplicación.
-
- Muchos recursos y permisos en la web ya están en el ambito de un solo origen. por definición una aplicación y un origen como la misma cosa  que usamos la misma restrinción que son usados en otra parte de la web y en HTML5.
-
- ¿Porqué no subir el manifiesto directamente al Firefox Os Marketplace?
-
- Hay varios beneficios de alojas el manifiesto en su dominio y proporcionando la url de la aplicación manifest a el Marketplace: -
    -
  • Nosotros pretendiamos que el Marketplace (y otras tiendas de aplicaciones) revisarían periodicamente todo el manifiesto  en la URL proporcionada y verifique actualizaciones en ellos. Esto evita la necesidad de que vuelva a subir su aplicación manifiesto por cada actualización .
  • -
  • El marketplace pasará tanto el original contenido de la aplicación manifiesto como la URL para el dispositivo del usuario. esto permite al dispositivo verificar por bajos costos en la aplicación manifiesto que podría indicar la manipulación. Este será especialmente importante para aplicaciones que usen APIS web(por ejemplo geolocalización).
  • -
- Nota: A partir de este escrito, nosotros estamos todavía diseñando un proceso por el cual el Marketplace pasará una actualizada aplicación  manifiesto a el dispositivo del usuario.
-
-
- ¿Por qué mi servidor Web tiene que utilizar la cabecera Content-Type de HTTP adecuada al servir mi aplicación manifiesta?
-
- Esta restricción previene a usuarios de un sitio web que permite contenido de usuarios generados (por ejemplo, un sitio pastebin) para inadvertidamente o inapropiadamente reclamando que todo sitio web como su aplicación.
-
- Debería usar HTTPS para servir mi aplicación ?
-
- Si, es una buena idea. Nosotros anticipamos que el firefox Os Marketplace requerirá cualquier aplicación usando APIS web (Tal como geolocación) para servir a su aplicación manifesto a través de HTTPS como una defensa adicional contra ataques hombre-en-el-medio. Si usas HTTPS para su manifiesto, usted necesita también usarla para todas las páginas en su sitio.
-
- Qué pasa si alguien más entrega mi aplicación a el Markeplace de Firefox OS?
-
- En el afortunado evento que alguien adivine la url de su aplicación manifiesto y lo entrega a el Marketplace de Firefox Os antes que usted, por favor presentar una queja con el equipo de apoyo del mercado.
-
-

Vease también

-

App manifest

diff --git a/files/es/archive/b2g_os/quickstart/introduccion_a_las_open_web_apps/index.html b/files/es/archive/b2g_os/quickstart/introduccion_a_las_open_web_apps/index.html deleted file mode 100644 index 37caf3ab16..0000000000 --- a/files/es/archive/b2g_os/quickstart/introduccion_a_las_open_web_apps/index.html +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Introducción a las Open Web Apps -slug: Archive/B2G_OS/Quickstart/Introduccion_a_las_open_web_apps -tags: - - Apps - - Web Open App -translation_of: Archive/B2G_OS/Quickstart/Intro_to_open_web_apps ---- -

Multi devices

- -
-

Este artículo está diseñado para actuar como un buen punto de partida para cualquiera que desee aprender más sobre Open Web Apps, si usted es un desarrollador o administrador del proyecto, o tiene otro rol relevante en el desarrollo de aplicaciones o en la distribución. Aquí te ofrecemos un panorama claro de las Open Web Apps y la filosofía detrás de ellas.

-
- -

Las Open Web Apps son esencialmente diferentes de sitios web estándar o páginas Web. Se construyen utilizando tecnologías web abiertas estándar - HTML, CSS, JavaScript, etc - y se pueden acceder mediante un navegador Web. Las principales diferencias radican en su capacidad para ser instaladas en un dispositivo, trabajar sin conexión y tener acceso a API's avanzadas que permiten la interacción con las características del dispositivo, como la cámara, agenda, y otras cosas. Además, se basan en tecnologías abiertas tanto como sea posible. Cuando las diferencias radican en la implementación de tecnología entre las plataformas, se deben hacer esfuerzos para asegurar que ambos son compatibles, a través de una combinación de detección de características y código apropiado para diferentes plataformas, y la degradación agraciada.

- -

Ventajas de las Open Web Apps

- -

Echemos un vistazo a las ventajas de Open Web Apps con más de detalle:

- - - -

El siguiente video también se ve en las ventajas generales de las Open Web Apps, y el desarrollo para la plataforma Firefox OS:

- -

- -

La Web es la plataforma

- -

Una Open Web App, como tal existe instalada en una plataforma como Firefox OS no es un bookmark - es una parte propia del sistema. Las Open Web Apps son una gran promesa. Se trata de una oportunidad que no hay que perderse, de lo contrario la web puede llegar a ser una vez más dividida. Con esto en mente, debe quedar claro que las Open Web Apps (OWA) están destinadas a ser estandarizadas y de formar parte de "la Web". Si tiene éxito, OWA debería eventualmente trabajar en todos los navegadores, sistemas operativos y dispositivos.

- -

En Mozilla estamos trabajando duro para crear esta plataforma de aplicaciones que está respaldada en su totalidad por la open Web. No es la intención de ser la "plataforma Mozilla" o la "plataforma Firefox". La Web es la plataforma. Estamos creando un conjunto de APIs abiertas y las implementaciones para demostrar cómo pueden existir aplicaciones portátiles en la web sin dependencia de un proveedor. Otros grupos, como Facebook y Google Chrome también están trabajando en las plataformas de aplicaciones soportadas por la Web. Facebook apps estan hechas para encajar en Facebook y Chrome apps estan diseñadas para dispositivos Chrome OS y servidores de Google. Las Chrome apps son las más similares a las Open Web Apps. Seguimos colaborando con el equipo de Google Chrome como las normas de las apps evolucionan y que sin duda compartimos nuestra visión en gran parte. Existe un enorme potencial para todas las plataformas de apps basadas en la Web para converger e invitamos a todos los proveedores a ayudarnos a construir las correctas Open Web App APIs.

- -

A pesar de que actualmente se debe tener un motor basado en Firefox Mozilla ("Web runtime") para usar las Open Web Apps, no se pretende que este será siempre el caso. Muchas partes del proyecto de aplicaciones Web abiertas aún se están elaborando y no es posible implementar todo en todos los navegadores a la vez. Aunque muchas partes de las Open Web Apps ya están estandarizadas, muchas otras partes todavía están en proceso de cambio. Se pretende y se espera que las Open Web Apps serán una estándar que estará disponible en los principales navegadores.

- -

Por lo tanto, cuando usted lee las páginas  de MDN que tienen que ver con las Open Web Apps, por favor, tenga en cuenta que a pesar de que mucha de la información es específica para Firefox en este momento, es de esperar que  se permitirá desarrollar Open Web Apps para todos los navegadores en el futuro.

- -

Estándares Web

- -

La tecnología de OWA no es una sola pieza, es un paraguas que agrupa a muchas tecnologías diferentes y algunas de ellas son muy nuevas. Por el momento, partes de OWA están estandarizadas (HTML5, CSS, JavaScript, IndexedDB, etc.). Otras partes aún no están estandarizadas y la implementación Mozilla es solo específica para Firefox o a alguna otra tecnología de Mozilla. Como la misión de Mozilla es de compartir y potenciar a todos, esta situación es sólo temporal. Es por eso que en la documentación OWA vamos a tratar de identificar claramente las partes de OWA que no están todavía estandarizadas.

- -

Tenga en cuenta también que puede haber algunas propuestas relacionadas con OWA y normas potenciales que no son utilizadas por Mozilla.

- -

Normas eventualmente previstas.

- -

Así que aquí están las piezas no estandarizadas aún a través de las distintas plataformas web y que aún son Firefox, sólo por el momento:

- - - -

Marketplace

- -

Compra una vez, Ejecuta donde sea

- -

Desde el principio Mozilla ha construido un sistema de aplicaciones que permite a los usuarios comprar una aplicación una vez y ejecutarla en todos sus dispositivos HTML5. Muy pronto Mozilla lanzara el smartphone FirefoxOS pero eso será sólo un dispositivo en el que se ejecuten sus aplicaciones. Cuando usted compra una aplicación a través de la Firefox Marketplace, el sistema instala un recibo en su dispositivo. El recibo es un JSON Web Token con metadata que enlaza con la clave pública del mercado y su dirección URL del servicio de verificación. Cuando una aplicación se inicia, puede verificar el recibo pero el recibo en el dispositivo no está atado al Firefox MarketPlace. El recibo es sólo una prueba criptográficamente verificable de compra. Cualquiera puede vender Open Web Apps si siguen las especificaciones del recibo. Cuando usted compra una aplicación, se pretende que sea portable a través de cualquier dispositivo compatible con el sistema de Open Web Apps.

- -
-
Mozilla está construyendo la infraestructura necesaria para ejecutar Open Web Apps en cualquier dispositivo HTML5. Firefox para Android le permitirá instalar y ejecutar aplicaciones (se puede probar hoy). Los iconos de las apps instaladas estarán en tu pantalla principal justo como en las aplicaciones normales de Android. También se puede instalar y ejecutar Open Web Apps en el escritorio de Windows, Mac o Linux usando Firefox (esto funciona actualmente). Actualmente se requiere alguna versión de Firefox, pero está previsto que el sistema de Open Web finalmente reciba el apoyo de todos los navegadores principales con un conjunto de normas. Desde el primer día Mozilla ha incluido todos los navegadores compatibles con HTML5 en su prueba de conceptos, se puede echar un vistazo a esta shim alojada en JavaScript para obtener ideas sobre cómo apoyar a la plataforma de aplicaciones en un navegador que no sea Firefox.
- -
 
-
- -

En el futuro, el sistema de Open Web Apps apoyará sinconizando tus apps instaladas entre dispositivos. Dado que los recibos son portátiles sólo podrías sincronizarlos tú mismo si quieres. En caso de que no, es obvio  que siempre se puede ejecutar una Open Web App gratis en cualquier navegador, ya que no es diferente de un sitio web

- -
-
Se podría, sin embargo, utilizar las nuevas APIs especificas para mobiles que no se aplican en todas las plataformas.
- -
 
-
- -

El video a continuación ofrece un panorama útil de las ventajas de los MarketPlace abiertos y un enfoque para el descubrimiento de las Open Apps:

- -

- -

WebPayment API

- -

Comercio para Apps

- -
-
Parte del éxito de las plataformas de aplicaciones móviles como iOS y Android es que hacen que sea muy fácil de probar nuevos modelos de negocio a través de los pagos móviles. Estos modelos todavía están evolucionando pero el comercio es sin duda algo que, en el momento, es incómodo en la Web de escritorio y más natural en el móvil. En concreto, es muy conveniente para cargar algo a su factura de teléfono cuando usted ya está accediendo a ella desde el teléfono de todos modos. Con el lanzamiento de Firefox OS, el entorno de aplicaciones apoyará compras de aplicaciones y los pagos dentro de la aplicación a través de la WebPayment API. Apoyar el comercio es crucial para el crecimiento de una plataforma de aplicaciones. El uso de la API de pago propuesto es completamente opcional. Mozilla no impedirá que cualquier aplicación utilice su propio sistema de pago independiente.
- -
 
-
- -

Véase también

- - diff --git a/files/es/archive/b2g_os/quickstart/tu_primera_aplicacion/index.html b/files/es/archive/b2g_os/quickstart/tu_primera_aplicacion/index.html deleted file mode 100644 index a1f58175e8..0000000000 --- a/files/es/archive/b2g_os/quickstart/tu_primera_aplicacion/index.html +++ /dev/null @@ -1,257 +0,0 @@ ---- -title: Tu primera Aplicación -slug: Archive/B2G_OS/Quickstart/tu_primera_aplicacion -translation_of: Archive/B2G_OS/Quickstart/Your_first_app ---- -
-
-

Las aplicaciones de la web abierta le dan a los desarrolladores lo que justamente han querido por años: un entorno multiplataforma dedicado a la construccion de aplicaciones con HTML, CSS y Javascript, con Firefox OS siendo la primera plataforma dedicada a las aplicaciones web. Esta guía tiene como objetivo iniciarte y orientarte rápidamente en una estructura básica e instrucciones de construcción, ¡de tal manera que tú puedas crear la siguiente generación de aplicaciones!

-
- -

Si deseas continuar con esta guía, puedes descargar nuestro quick start app template. Encuentra más provechoso el contenido leyendo la guía  Apps template.

- -

Estructura de la Aplicación

- -

Aplicaciones Empaquetadas vs. Aplicaciones Alojadas

- -

Hay dos tipos de aplicaciones web abiertas: empaquetadas y  alojadas. Las aplicaciones empaquetadas son esencialmente archivos  zip  conteniendo todos los archivos necesarios: HTML, CSS, JavaScript, imágenes, manifest, etc. Las aplicaciones alojadas están corriendo desde un servidor en un dominio dado, como un sitio web estandard. Ambos tipos de aplicaciones  requieren un manifest válido. Cuando llega el momento de listar tu aplicación  en el Firefox Marketplace, ya sea que tu subas tu aplicación como un archivo zip o la URL del servidor donde está tu aplicación.

- -
-
-

Hecho en colaboración con Treehouse: Check them out!

-
-
- -

A los efectos de esta guía, crearás una aplicación alojada que vivirá en tu dirección localhost. Una vez que tu aplicación esté lista para ser publicada en el Firefox Marketplace, podras tomar la decisión de agruparla como una aplicación empaquetada o lanzarla como una aplicación alojada.

- -

Manifest de la Aplicación

- -

Cada aplicación de Firefox  requiere un archivo manifest.webapp en la raíz de la aplicación. El archivo manifest.webapp  proporciona información importante sobre la aplicación, como la versión, nombre, descripción, localización de íconos, strings locales, dominios donde la aplicación puede ser instalada, y mucho más. Sólo el nombre y la descripción son obligatorios. Una plantilla simple dentro de la aplicación es similar a lo que sigue:

- -
{
-  "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": "Il vostro nuovo fantastico Open Web App",
-      "developer": {
-        "url": "http://yourawesomeapp.com"
-      }
-    }
-  },
-  "default_locale": "en"
-}
- -
-
-

Hecho en colaboración con Treehouse: Check them out!

-
-
- -

 

- -

Un manifiesto básico es todo lo que necesitas para empezar. Para más detalles sobre los manifiestos, lee App Manifest.

- -

App Layout & Design

- -

El responsive design (diseño adaptativo) se ha convertido cada vez más importante a medida que más resoluciones de pantalla en diferentes dispositivos se convierten en la norma. Aunque el principal objetivo de tu aplicación sean las plataformas móviles como Firefox OS, otros dispositivos probablemente también tengan acceso a ella. Las CSS media queries permiten adaptar el diseño al dispositivo, como se muestra en este ejemplo de esqueleto en 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 */
-}
- -

Hay muchos frameworks JavaScript y CSS disponibles para ayudar en el diseño adaptativo y el desarrollo de aplicaciones móviles (Bootstrap, etc.). Elige el frameworks(s) que mejor se adapte a tu aplicación y estilo de desarrollo.

- -

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:

- - - -

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.

- -

Firefox OS Simulator

- -

Installing and using the Firefox OS Simulator is the easiest way to get up and running with your app. After you install the simulator, it is accessible from the Tools -> Web Developer -> Firefox OS Simulator menu. The simulator launches with a JavaScript console so you can debug your application from within the simulator.

- -

App Manager

- -

The new kid on the block with regards to testing tools is called the App Manager. 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/es/archive/b2g_os/releases/2.0/index.html b/files/es/archive/b2g_os/releases/2.0/index.html deleted file mode 100644 index df409eb076..0000000000 --- a/files/es/archive/b2g_os/releases/2.0/index.html +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: Firefox OS 2.0 para desarrolladores -slug: Archive/B2G_OS/Releases/2.0 -tags: - - '2.0' - - B2G - - Firefox OS - - Notas de la versión -translation_of: Archive/B2G_OS/Releases/2.0 ---- -
-

En esta página se detallan las características para desarrolladores recientemente implementadas en Gecko específicos para Firefox OS 2.0.

-
-
-

El componente Gecko de Firefox OS 2.0 esta basado en Firefox 31/32.

-
-

Nuevas características

-

Esta sección provee un resumen de las nuevas características disponibles en Firefox OS 2.0. Para mas detalles de cambios en una plataforma especifica (Adiciones API, etc.), revisa la sección Adiciones de la plataforma en detalle.

-
-
- NFC
-
- Esta versión incluye soporte para contenido de dispositivo a dispositivo compartido con la tecnología NFC (Near Field Communication). Tu puedes emparejar tu dispositivo con cualquier otro y luego deslizar para compartir tus contactos, multimedia o URL's favoritas con otros.
-
- Telefonía
-
- Firefox OS ahora soporta direcciones IPv4 e IPv6 en el administrador de red.
-
- Encontrar Mi Dispositivo
-
- Si has perdido tu teléfono Firefox OS, Encontrar Mi Dispositivo puede ayudarte a encontrarlo (ve al sitio web http://find.firefox.com). Puedes verlo en un mapa, hacer que reproduzca un sonido y que muestre un mensaje en pantalla. También puedes bloquearlo remotamente o borrar tu información personal. Para empezar, crea una cuenta Firefox (Ajustes > Firefox Accounts en tu dispositivo) y activa Encontrar Mi Dispositivo (Ajustes > Encontrar mi dispositivo).
-
- Multimedia
-
- Ahora puedes crear tus propios ringtones usando tu propia colección de música, o canciones que has descargado de la web.
-
- Cámara
-
- La aplicación de la cámara ahora soporta varios modos de enfoque: Touch, auto continuo, y seguimiento de rostro.
-
- Productividad
-
- Hemos realizado una actualización visual a las aplicaciones de Correo, Calendario y Reloj.
-
- Pantalla de inicio
-
- Firefox OS 2.0 introduce una pantalla de inicio con desplazamiento vertical sencillo e iconos mas grandes.
-
- Cambio de aplicación con gestos en los bordes
-
- Gestos en los bordes están ahora disponibles para intercambiar entre las diferentes aplicaciones (desliza tu pulgar desde el borde izquierdo de la pantalla hacia el derecho y viceversa, para cambiar entre las múltiples aplicaciones abiertas).
-
-

Nuevas características para socios

-
-
- Integración E.ME 
-
- La integración E.ME proporciona acceso directo a aplicaciones web mientras proveedores de búsqueda configurables pueden buscar en la web al mismo tiempo.
-
-

Nuevas características en las DevTools

-

Las Herramientas para desarrolladores de Firefox han tenido un gran numero de características añadidas en las versiones 31 y 32 de Firefox; estas no son especificas de Firefox OS, pero puede tomar ventaja de ellas depurando tus aplicaciones para Firefox OS mediante el WebIDE. Para saber mas, lea:

- -

Adiciones de la plataforma en detalle

-
-

Nota: Esta lista incluye las características mas importantes de Firefox OS. Para una lista ampliada de característica añadidas a Gecko (que generalmente están presentes también en Firefox OS 2.0), consulta las notas de la versión para desarrolladores de Firefox 31 y las notas para desarrolladores de Firefox 32.

-
-

Web API

- -

CSS

- -

Mejoras en las tecnologías soportadas

- -

Versiones Antiguas

-

- -

diff --git a/files/es/archive/b2g_os/releases/2.1/index.html b/files/es/archive/b2g_os/releases/2.1/index.html deleted file mode 100644 index d43116ad1e..0000000000 --- a/files/es/archive/b2g_os/releases/2.1/index.html +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Firefox OS 2.1 para desarrolladores -slug: Archive/B2G_OS/Releases/2.1 -tags: - - '2.1' - - B2G - - Firefox OS - - Notas de la versión -translation_of: Archive/B2G_OS/Releases/2.1 ---- -
-

Firefox OS 2.1 está en una etapa de pre-lanzamiento en este momento. Su componente Gecko está basado en Firefox 33/34. En esta página se detallan las características para desarrolladores recientemente implementadas en Gecko específicamente para Firefox OS 2.1.

-
-
-

Nota: Para las características generales de Gecko que están también presentes en Firefox OS Gecko, consulta las notas de Firefox 33 para desarrolladores y notas de Firefox 34 para desarrolladores.

-
-

Cambios en la plataforma

-

Firefox OS tenia una política de seguridad de "Aplicación individual (single app) por origen", pero esto ha cambiado desde Firefox 34/Firefox OS 2.1 (leer FAQ para mas información). Si usted necesita compatibilidad con las versiones anteriores, considere alojar tus aplicaciones en orígenes separados; una estrategia posible es crear diferentes subdominios para tus aplicaciones.

-

Cambios en la API Web  

- -

Mira también

- -

Versiones Antiguas

-

- -

diff --git a/files/es/archive/b2g_os/releases/index.html b/files/es/archive/b2g_os/releases/index.html deleted file mode 100644 index f4d3874b14..0000000000 --- a/files/es/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.

-
-
  1. Firefox OS 2.0 para desarrolladores
  2. Firefox OS 2.1 para desarrolladores
-

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/es/archive/b2g_os/screencast_series_colon__app_basics_for_firefox_os/index.html b/files/es/archive/b2g_os/screencast_series_colon__app_basics_for_firefox_os/index.html deleted file mode 100644 index 77c5748c58..0000000000 --- a/files/es/archive/b2g_os/screencast_series_colon__app_basics_for_firefox_os/index.html +++ /dev/null @@ -1,228 +0,0 @@ ---- -title: 'Series de Screencast: Lo Básico sobre Aplicaciones para Firefox OS' -slug: 'Archive/B2G_OS/Screencast_series:_App_Basics_for_Firefox_OS' -tags: - - API - - Apps - - B2G - - Firefox OS -translation_of: 'Archive/B2G_OS/Firefox_OS_apps/Screencast_series:_App_Basics_for_Firefox_OS' ---- -
-

Firefox OS es un sistema operativo que trae la Web a los dispositivos móviles; en lugar de ser un nuevo Sistema Operativo con nuevas tecnologías y entornos de desarrollo,  Firefox OS se basa en tecnologías web estándar que han estado en uso desde hace años. Si tu eres un desarrollador web y quieres construir una aplicación móvil, Firefox OS te da las herramientas para  hacerlo sin tener que cambiar tu flujo de trabajo o aprender un entorno de desarrollo totalmente nuevo. En esta colección de vídeos cortos, desarrolladores de Mozilla y Telenor se reunieron en Oslo, Noruega para explicar en pocos pasos como puedes empezar a construir aplicaciones para Firefox OS.

-
- -

En esta serie aprenderás:

- - - -
-

Nota: Cada uno de los screencast son lo suficientemente cortos para verlos durante un descanso. Toda la serie no debe tomar mas de una hora para observarla.

-
- -

Código y entorno de desarrollo

- -

Además de los screencasts, tu puedes descargar los códigos de ejemplo desde GitHub que los acompañan. Si deseas probar los códigos de ejemplo por ti mismo, necesitarás configurar un entorno de desarrollo muy sencillo. Todo lo que necesitas es:

- - - -

Presentación de la serie

- -

La serie nos muestra a Jan Jongboom (@janjongboom) y Sergi Mansilla (@sergimansilla) de Telenor Digital, y Chris Heilmann (@codepo8) de Mozilla; Fue grabada durante tres días en Oslo, Noruega en la sede central de Telenor en Febrero del 2014.

- -

Aquí estamos nosotros tres hablándote acerca de la serie y qué puedes esperar de ella:

- -

- -

Sección 1: Construyendo tu primera aplicación para Firefox Os y como publicarla

- -

En los primeros cinco screencast de la sección 1 mostraremos como construir una aplicación para Firefox Os, como depurarla y probarla en tu computadora y en un dispositivo real,  y como tenerla listada en el Firefox Marketplace. Esto puede sonar como mucho trabajo, pero pronto descubrirás que si ya sabes como construir un sitio web, tienes 90% del camino listo.

- -

Más que un sitio web

- -

Las aplicaciones de Firefox OS son HTML5, En esencia, estas usan las mismas tecnologías que los sitios web. Puedes empezar escribiendo un sitio web y convertirlo en una aplicación simplemente dándole un archivo de manifiesto (ver The app manifest para más detalles). Esto le dice a Firefox OS que estas escribiendo una aplicación y te permite:

- - - -

En esencia, las aplicaciones HTML5 son sitios web sobre alimentados y deben seguir las mismas reglas, como por ejemplo:

- - - -

La diferencia principal es que para que una página web se convierta en una gran aplicación, debes tener muy en cuenta a los usuarios móviles. Esto significa, ante todo, que tu aplicación debe:

- - - -

En muchos casos, esto significa que necesitas hacer más ligera tu página web y simplificar la interface. La buena noticia es que todos tus usuarios serán beneficiados por eso.

- -

- -
-

Nota: Para encontrar más información acerca de cómo diseñar una buena aplicación HTML5, entra al App Center en MDN.

-
- -

El archivo manifest de tu app

- -

El App Manifest en Firefox OS en un archivo simple de JSON que le dice al sistema operativo acerca de tu aplicación. En esencia, esto es lo que convierte una página web en una Open Web App. Dentro del manifest, tu defines el nombre en diferentes localidades y solicitas al sistema operativo tener acceso a varios servicios y al hardware. Incluso puedes editar la orientación predeterminada de tu aplicación, y de ser necesario, bloquear la orientación.

- -

- -

Para más información acerca del manifest y herramientas que pueden ayudarte:

- - - -

El gestor de aplicaciones

- -

La forma más sencilla de empezar a trabajar con Firefox OS es probando el gestor de aplicaciones App Manager.  Esta herramienta se encuentra junto al Firefox developer tools for desktop y te permite conectarte a un simulador de Firefox OS en su computadora, o a un dispositivo real con Firefefox OS si tienes uno disponible. Desde allí, puedes jugar con Firefox OS, instalar aplicaciones directamente dentro del simulador o en un dispositivo real, y depurarlas como si se ejecutaran en un Firefox OS , viendo los cambios inmediatamente en tiempo real sin necesidad de desinstalar o actualizar las aplicaciones.

- -

El siguiente video presenta los primeros pasos para el uso del App Manager junto con el simulador:

- -

- -
-

Nota: El App Manager te permite depurar tus propias aplicaciones sin ningun problema incluso cuando no estes conectado.

-
- -

Para más información sobre el App Manager:

- - - -

Probar en un Dispositivo Real

- -

Probar tus aplicaciones en un simulador esta bien, pero solo te lleva tan lejos como un ambiente simulado puede hacerlo. Si quieres probar el rendimiento de la interacción de la aplicación o la reacción a algunas cosas como la orientación del dispositivo, necesitas un dispositivo real. Con las herramientas de desarrollo y el App Manager juntos, puedes usar el dispositivo y adentrarte en los detalles de lo que pasa dentro de tu aplicación mientras la usas.

- -

- -

Publicar en el Marketplace

- -

El Marketplace de Firefox OS es el sitio mas conveniente para listas tus aplicaciones y ponerlas a disposicion de las personas en sus dispositivos y en la web. El Marketplace también te permite listar tu aplicación para otras plataformas como Firefox Desktop y Firefox para Android. Tambien puedes permitir que las personas valoren tu aplicación, den su opinión, y compren  tu aplicación usando un proceso simple de verificación. Listar tu aplicación es simple:

- - - -

- -

Las aplicaciones enviadas al Marketplace son revisadas por el equipo revisor de aplicaciones de Mozilla y se te notificara sobre el estado de tu envío en pocos días. Si existen problemas con tu aplicación recibirás un mensaje de validación durante el proceso, pero es posible que también recibas una explicación legible por humanos sobre lo que está mal y como solucionarlo.

- -
-

Nota: Lee Submitting an application to the Firefox Marketplace para más nformación sobre el procesos de envío.

-
- -

Sección 2: Tópicos Avanzados sobre Firefox OS

- -

En los primeros videos te presentamos Firefox OS y como desarrollar tu primera aplicación. También abarcamos como depurar tu aplicación en el escritorio (y en un dispositivo real), y como listar tu aplicación en el Marketplace de Firefox. En los cinco videos restantes nos adentraremos en las tecnologías que permiten a Firefox OS ir un paso más adelante y darte acceso a las funcionalidades que hacen del desarrollo para smartphones y tablets interesante para los desarrolladores. Pese a que muchas de estas tecnologías actualmente solo funcionan en Firefox OS, son todas de código abierto y han sido enviadas como propuestas estándar. Trabajar hoy con estas APIs significa que estás preparado para otros dispositivos y plataformas que emergerán en el futuro cercado.

- -

Web APIs

- -

Los Smartphones están llenos de tecnología grandiosa (cámaras, acelerómetros, y GPS para nombras algunos).  El problemas era que ellas no eran accesibles para tecnologias web, si querías acceder a ellas necesitabas escribir aplicaciones nativas. Para solucionar esto, Mozilla y sus socios diseñaron un conjunto de APIs para permitir a los desarrolladores alcanzar las profundidades del hadrware de los dispositivos móviles usando JavaScript de una forma segura. Estas son llamadas Web APIs y estan definidas abiertamente y disponibles para que otros las implementen. Firefox OS es la primera plataforma que las usa.

- -

 Más infromación en el siguiente screencast:

- -

- -

Para más información sobre las Web APIs:

- - - -

Web Activities

- -

Web Activities son métodos alternativos para acceder al hardware de un dispositivo. En vez de hacer que una API se comunique con el dispositivo directamente, Web Arctivities te permitirá crear un ecosistema de aplicaciones en el dispositivo que se comunican entre sí y comparten sus habilidades. Por ejemplo, en vez de acceder a la cámara directamente, tu aplicación puede usar un Web Activity para solicitar una imagen y el usuario del dispositivo puede usar su aplicación favorita para tomar una foto la cual es devuelta a la aplicación que realizo la petición originalmente.

- -

En vez de solicitar a los usuarios acceso a los dispositivos (lo cual es importante en términos de seguridad), les permitirás usar aplicaciones en la que ellos ya confían para realizar dichas funciones. Además,  puedes registrar tus aplicaciones como las opciones preferidas para ciertas tareas en el sistema operativo. Puedes pensar sobre los Web Activities como el equivalente de hacer clic con el botón derecho sobre un documento en el escritorio del computador y seleccionar con cual aplicación abrir dicho documento. Aparecerán diferentes opciones más una opción para hacer que el sistema operativo utilice de manera predeterminada esta aplicación para abrir los archivos de ahora en adelante.

- -

Web Activities permite a las aplicaciones comunicarse entre sí en el dispositivo sin ninguna necesidad de utilizar un servidor. Lo único que transmiten de una aplicación a la otra es la información final.

- -

- -

Para más información sobre Web Activities:

- - - -

Notificaciones Push

- -

Notificaciones Push (invocada usando el SimplePush Web API) son métodos para que una aplicación reaccione cuando el dispositivo recibe un mensaje específico. Esto te permitirá desarrollar aplicaciones que pueden estar cerradas (y ahorrando energía) hasta que sean necesarias. Las notificaciones creadas de esta manera tendrán el beneficio de no portar información y de esta manera Mozilla nunca obtendrá información sobre la aplicación y los atacantes no podrán acceder a la misma.

- -

- -

Para más información sobre cómo usar Notificaciones Push con SimplePush:

- - - -

Funcionalidad sin conexión

- -

Las aplicaciones no son muy útiles si no funcionan sin conexión web. Este es un motivo por el cual los usuarios prefieren aplicaciones ya instaladas en vez abrir el navegador del dispositivo y buscar el contenido en él. El término “aplicación web” pareciera indicar que se necesita de una conexión web para que la aplicación  se pueda usar.

- -

Nuestros usuarios estarán sin conexión web en algunas ocasiones (ya sea en un avión, en el subterráneo o sin plan de datos en la tarjeta SIM) y necesitamos asegurarnos de que nuestras aplicaciones sean útiles cuando eso suceda. HTML5 ofrece algunas tecnologías que permiten funcionalidad sin conexión web, principalmente AppCache y DOMStorage.

- -

- -

Para más información sobre funcionalidad sin conexión:

- - - -

Donde encontrar más

- -

Esperamos que esta serie de videos te haya dado una clara introducción para el desarrollo de tus propias aplicaciones web abiertas. Si te interesa aprender más, existen algunos recursos y canales que puedes usar:

- -

- - - -

Esperamos verte allí.

- -

Chris, Sergi y Jan

diff --git a/files/es/archive/b2g_os/security/application_security/index.html b/files/es/archive/b2g_os/security/application_security/index.html deleted file mode 100644 index 0573a493e0..0000000000 --- a/files/es/archive/b2g_os/security/application_security/index.html +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: Seguridad en aplicaciones -slug: Archive/B2G_OS/Security/Application_security -translation_of: Archive/B2G_OS/Security/Application_security ---- -
-
-

Borrador
- Esta página no está completa.

- -
-

Los controles clave en la seguridad de las aplicaciones web introducidas por FirefoxOS son:

- -

Tipos de aplicaciones

-

FirefoxOS soporta tres tipos de aplicaciones web: "web", "privilegiadas" y "certificadas". Un tipo de aplicacion es declarado en su manifest, y determina la lista de permisos que puede solicitar.

- -

Para más detalles de los tres tipos, véase la documentación del App Manifest.

-

Entrega de aplicaciones

-

Las aplicaciones pueden ser  pueden ser entregadas por dos mecanismos diferentes en Firefox OS:  alojadas o enpaquetadas. Las aplicaciones web regulares pueden ser entregadas por cualquier mecanismo, mientras que las aplicaciones privilegiadas deben ser empaquetadas.

-

Aplicaciones alojadas

-

Una aplicación alojada consiste simplemente en un archivo manifest en el servidor del desarrollador. A menudo el manifest apunta también a un manifest de appcache que permite a la aplicación ser cacheada para un arranque más rápido y para habilitar el uso offline, pero de otra manera no afecta a la aplicación para nada. Desde el punto de vista de la seguridad, las aplicaciones alojadas funcionan como un sitio web normal. Cuando una aplicación alojada es cargada, la URL de las paginas cargadas son las URL que aquellas paginas tendrian normalmente en su servidor web. Así para enlazar a una página web específica o recurso en la aplicación, la misma URL es usada como cuando una URL es usada para enlazar a esa página o URL en un sitio web específico.

-

Aplicaciones empaquetadas

-

Una aplicación empaquetada es una Open Web App que tiene todos sus recursos (HTML, CSS, JavaScript, app manifest, etc.) contenidos en un archivo zip, en vez de tener sus recursos en un servidor web. Para más detalles en este formato, vease aplicaciones empaquetadas

-

Instalación de aplicaciones

-

Las aplicaciones son instaladas mediante la API Javascript de aplicaciones:

- -

Para asegurarse que una aplicación realmente quiere ser instalada como una aplicación web tenemos que asegurar que no es posible engañar a un sitio web para que aloje un manifest de aplicación. Esto es hecho exigiendo que el manifest sea servido con un mime-type específico, "application/x-web-app-manifest+json". Esta restricción se relaja cuando la aplicación manifest, y por lo tanto el manifest de aplicación, es del mismo origen que la página que hizo el pedido para instalar la aplicación.

-

Actualizaciones

-

El proceso de actualizaciones para las aplicaciones está descrito aquí:  Actualizando apliaciones [en-US]

-

Permisos

-

Se le pueden otorgar privilegios adicionales a las aplicaciones por sobre los privilegios de un sitio normal. Por defecto las aplicaciones tienen los mismos permisos que las páginas web normales. Para poder ganar permisos adicionales, el primer paso es enumerar los permisos adicionales que esta necesita en el manifest de la aplicación.

-

Declaración del manifest

-

Para cada permiso adicional que la aplicación quiera, el manifest debe enumerar el permiso junto con una descripción sencilla de por qué la aplicación necesita ese permiso. Por ejemplo si una aplicación quiere usar la API navigator.geolocation, debe incluir en su archivo manifest:

-
"permissions": {
-  "geolocation":{
-    "description": "Requerido para el autocompletado en la pantalla compartida",
-  }
-},
-
-

Esto permite a la aplicación indicar el permiso para la geolocalización, de la misma manera que una página web normal lo haría. Para más detalles acerca de los manifest, véase App manifest.

-

Nota: Actualemente la intensión de uso de los permisos no se muestran al usuario - véase bug 823385.

-

Otorgando permisos

-

Cuando los permisos son solicitados en el manifest, el permiso es definido como "allow" (permitir) o "prompt" (preguntar). Los permisos permitidos son otorgados al ser declarados en el manifest sin necesidad de más aprobaciones. Para permisos preguntados, se le pide el permiso al usuario la primera vez que la aplicación accede a la API relacionada, y tiene que tomar la decisión antes de que el acceso a la API sea otorgado. En general, Firefox OS solo pide a los usarios acerca de los permisos cuando estos pueden tener un impacto en la privacidad, y es razonable para el usuario entender que esta siendo pedido. Por ejemplo el acceso a los contactos es pedido,  sin embargo el acceso para hacer una conección TCP es simplemente garantizada porque no razonable para un usuario entender  las implicaciones de seguridad implicadas en permitir estos permisos. El uso de permisos "allow" es revisado como parte de la revisión de seguridad del Marketplace para asegurar que los usuarios se encuentran protegidos.

-

Revocando permisos

-

Los usuarios pueden cambiar su opinión en cualquier momento acerca de permisos "prompt" en cualquier momento, y puede revocar los permisos a través de la aplicación de configuracion de Firefox OS. Los permisos "allow" no son configurables por el usuario.

-

Sandbox de las aplicaciones Web

-

Información almacenada por aplicación

-

Cada aplicación corre su propio sandbox, eso significa que toda la información guardada por una aplicación es separada de toda la información guardada por cualquier otra aplicación. Esto incluye cosas como información de cookies, información almacenada localmente, bases de datos indexadas localmente, y permisos de sitios.

-

Esto significa que si un usuario instaló dos aplicaciones, la Aplicación A y la Aplicación B, estas tendrán cookies completamente diferentes, diferente información local, y diferentes permisos. Esto se aplica inclusive si ambas aplicaciónes abren un <iframe> que apunta hacia el mismo origen. Por ejemplo, si ambas aplicaciones A y B abren un <iframe> que apunta a "http://www.mozilla.org", ambas mostrarán la misma página web, sin embargo el sitio será cargado y mostrado con diferentes cookies en las dos aplicaciones.

-

Un resultado de esto es que si un usuario se registra en, por ejemplo Facebook, cuando está usando la aplicación A, esto afecta la capacidad de B para interactuar con la cuenta del usuario en Facebook. La cookie que que usa facebook para registrarse cuando el usuario está usando la aplicación A está solo disponible para la aplicación A. Si la aplicación B abre un <iframe> a Facebook, la cookie no estará allí y entonces cuando la aplicación B abre Facebook, recibe la pantalla de registro en vez de la cuenta del usuario.

-

Las aplicaciones no se pueden abrir entre ellas

-

Esto significa que las aplicaciones no pueden abrir otras aplicaciones a través del uso de iframes. Si la aplicación A crea un iframe con el src de la aplicación B, esto no abrirá la aplicación B en el iframe. Esto simplemente abrirá el sitio web qe se encuentra en esa URL. No usará ninguna de las cookies de B y por lo tanto no se comportará diferente si la aplicación B no estuviera instalada en el dispositivo.

-

Esto se aplica inclusive para las aplicaciones empaquetadas (más información acerca de estas abajo). inclusive si la aplicación A intenta abrir la aplicación enpaquetada B usando un iframe que apunte a app:// Dirección de la aplicación B, esto simplemente no podrá cargar. Si esto resulta en un error 404 o algún tipo de error determinado todavía falta deteminarse, pero definitivamente fallará al cargar. Y fallará de la misma manera no importa si la aplicación está instalada en el dispositivo o no, de modo que es imposible determinar para la aplicación A si la aplicación B se encuentra instalada.

-

Lo mismo sucede si el marco superior de la aplicación A es navegado por una URL a la aplicación B. Nosotros sabremos para un determinado marco que aplicación lo abrio, y por lo tanto cuando intente cargar la URL de la aplicación B en el marco de la aplicación A, esto sucederá exactamente como las dos situaciones descriptas arriba, por ejemplo, no hay forma de que use los recursos de B, como ser cookies u otra información local.

-

Motivación

-

Hay tanto beneficios como desventajas con este enfoque. La desventaja es que si un usuario interactúa con el mismo sitio web a través de diferentes aplicaciones, deberá registrarse en cada aplicación. Así tambien si un sitio web necesita almacenar información localmente, y el usuario interactúa con ese sitio en varias aplicaciones, la información terminará dplicada en cada aplicación, lo cual puede ser un problema si hay grandes cantidades de información.

-

El principal beneficio de de este enfoque es un modelo mucho más estable. No hay forma de que varias aplicaciones puedan hacerlo a través de sitios web de terceros en formas inesperadas que harían que instalar una aplicación haga que otra aplicación deje de funcionar. Cuando una aplicación es desinstalada, no hay forma que la información necesaria para otra aplicación se pierda, o que una aplicación deje de funcionar debido a una dependencia funcional con la aplicación desinstalada.

-

Un usuario puede instalar de forma segura la "Fabulosa Aplicación Social" para registrarse en Facebook sin tener que preocuparse que la aplicación "El Juego de DIbujos" pueda montar algún tipo de ataque para obtener la información del usuario de Facebook usando algún tipo de error o atajo que pueda existir en el sitio web de facebook.

-

También existen buenos beneficios para la privacidad. El usuario puede instalar de forma segura la "Aplicación de mi partido político" sin tener que preocuparse de que la "Apliación de empleados de la Megacorporación" sea capaz de detectar que aplicación se encuentra instalada o que información fue creada.

-

Permisos aislados

-

Así como la información de un sitio web es aislada por medio de una sandbox, también son aislados los permisos otorgados. Si la aplicación A carga una página de http://maps.google.com y la página pide utilizar la geolocalización y el usuario dice "permitir y recordar la decisión", esto solo significa que http://maps.google.com tiene acceo a la geolocalización dentro de la aplicación A. Si la aplicación B abre http://maps.google.com, esa página no tendrá acceso a la geolocalización a menos que el usuario le garantice ese permiso de vuelta.

-

Y como en un navegador normal, los permisos se encuentran separados por origen. Si la aplicación A tiene el acceso garantizado para utilizar geolocalización, esto no significa que todos los origenes corriendo en la aplicación A tendrán ese permiso. Si la aplicación A abre un <iframe> a http://maps.google.com, entonces http://maps.google.com tiene que pedir permiso antes que el acceso a la geolocalización sea garantizado.

-

Sandbox de la API para Navegadores

-

Para una seguridad adicional para aquellas aplicaciones que necesitan abrir una gran cantidad de URLs, como por ejemplo navegadores, añadimos el "browserContent flag" (indicador de contenido de navegador). El browserContent flag permite que cada aplicación tenga no una, sino dos sandbox, una para la aplicación en sí, y otra para cualquier contenido web que abra. Por ejemplo:

-

Digamos que la aplicación "Mi Navegador" carga desde el sitio  https://minavegador.com. Este es el dominio de donde los scripts y otros recursos son cargados. Los scripts y recursos pertenecen a este dominio.

-

Ahora bien, si esta aplicación crea un <iframe mozbrowser>, un sandbox diferente es creado para este <iframe>, el cual será un sandbox diferente del usado por la aplicación - por ejemplo, si este oframe navega a https://minavegador.com, esto resultará en diferentes cookies usados dentro del <iframe mozbrowser>. Así también el contenido dentro del <iframe mozbrowser> verá diferentes IndexedDB y bases de datos localStorage de las que abrió la aplicación.

-

Esto también se aplica si "Mi Navegador" quiere crear integración con, por ejemplo, Google Maps para implementar navegación basada en  to implementar navegación basada en la ubicación. Si la aplicación abre un <iframe> a http://maps.google.com, esto abrirá un iframe que recibirá las cookies para el sitio http://maps.google.com. Si el usuario navega dentro del área de contenido web, por ejemplo del <iframe mozbrowser>, a http://maps.google.com, este usará cookies diferentes y permisos diferentes de los que existen a nivel de la aplicación.

-

Otro ejemplo donde esto sería util sería en una aplicación tipo Yelp. Yelp tiene la capacidad de visitar el website de un restaurante direntamente desde la aplicación. Al usar un <iframe mozbrowser> para abrir el sitio web de un restorante, la aplicación Yelp se asegura que el el sitio web no puede tener un <iframe> apuntando a la aplicación de Yelp (lo cual apuntaría a http://yelp.com). Si lo hiciera, el sitio web recibiría el sitio web de Yelp, en vez de la aplicación. Así no existe manera de que el sitio web pueda montar un ataque a la aplicación ya que el sitio web de Yelp no compartirá ninguno de los permisos o la información de la aplicación Yelp.

-

Resumen de la Seguridad en Aplicaciones

-

La tabla de abajo resume los diferente tipos de aplicaciones de Firefox OS, y describe el formato, instalación, y el proceso de actualización de las Open Web Apps corriendo en Firefox OS.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Tipos de aplicaciones web
TipoEntregaModelo de PermisosInstalaciónActualizaciones
WebAlojada o empaquetadaMenos sensible a los permisos que no son peligrosos para exponer a contenido web sin validadInstaladas desde cualquier lugarPueden ser actualizadas de forma transparente por el usuario o desde el marketplace, dependiendo de donde la aplicación fue instalada, y el mecanismo de entrega.
PrivilegiadaEmpaquetada y firmadaAPIs privilegiadas que requieren de validación y autenticación de la aplicaciónInstaladas desde un marketplace confiableActualizadas desde un marketplace confiable, al usuario se le pide aprovación para descargar e instalar las actualizaciones.
CertificadaEmpaquetadaAPIs poderosas y peligrosas que no se encuentran disponibles para aplicaciones de terceros.Preinstaladas en el dispositivoActualizadas solo como parte de las actualizaciones a nivel del sistema.
-

Nota: Para la  version 1.0 de Firefox OS, si bien las aplicaciones  web pueden ser instaladas desde cualquier sitio web o marketplace, las aplicaciones privilegiadas solo pueden ser instaladas desde el Mozilla Marketplace, como el soporte a multiples marketplaces confiable no está todavía completo.

diff --git a/files/es/archive/b2g_os/security/index.html b/files/es/archive/b2g_os/security/index.html deleted file mode 100644 index e88430f481..0000000000 --- a/files/es/archive/b2g_os/security/index.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Firefox OS security -slug: Archive/B2G_OS/Security -tags: - - B2G - - Firefox OS - - Mobile - - Móvil - - Seguridad - - TopicStub - - movil(2) -translation_of: Archive/B2G_OS/Security ---- -

Los siguienes artículos cubren información sobre la seguridad de Firefox OS. Esto incluye caracerísticas generales de seguridad así como seguridad en las aplicaciones y mantener el proceso de instalación seguro.

- - - - - - - - -
-

Documentación de seguridad de Firefox OS

- -
-
Modelo de seguridad de Firefox os
-
Un vistazo al manual de seguridad de Firefox  OS
-
Seguridad del sistema
-
Detalles de los controles de seguridad integrados en el runtime de Firefox OS
-
Seguridad de aplicaciones en Firefox OS
-
Un vistazo de cómo las aplicaciones son seguras en Firefox OS
-
Instalación y actualización segura de aplicaciones
-
Cómo Firefox OS instala y acualiza las aplicaciones de forma segura.
-
Permisos de Software en Firefox OS
-
Una guía de qué tipos de software tienen permisos para realizar varias tareas en Firefox OS.
-
 Depuración y pruebas de seguridad con Firefox OS
-
Esta guía muestra los pasos básicos de las pruebas de seguridad, desde la apertura de abrir un depurador remoto de JavaScript hasta la creación de un proxy HTTP/S de intercepción contra una versión de escritorio de Firefox OS.
-
- -

Ver Todo...

-
-

Obtener ayuda de la Comunidad

- -

Si estás trabajando con Firefox OS, o desarrollando aplicaciones que te gustaría ejecutar en dispositivos Firefox OS, ¡Hay recursos de la comunidad para ayudarte!

- - - -

No te olvides de la  netiquette...

- - - - - -
- -

 

- -

-Firefox OS
diff --git a/files/es/archive/b2g_os/security/modelo_seguridad/index.html b/files/es/archive/b2g_os/security/modelo_seguridad/index.html deleted file mode 100644 index 8c03acd89e..0000000000 --- a/files/es/archive/b2g_os/security/modelo_seguridad/index.html +++ /dev/null @@ -1,255 +0,0 @@ ---- -title: Introducción a la seguridad de Firefox OS -slug: Archive/B2G_OS/Security/modelo_seguridad -translation_of: Archive/B2G_OS/Security/Security_model ---- -

Este documento proporciona una visión general del marco de trabajo de seguridad del sistema operativo de Mozilla Firefox OS, que está diseñado para proteger los dispositivos móviles de las amenazas a la plataforma, aplicaciones y datos. En Firefox OS, Mozilla ha implementado un modelo exhaustivo, integrado y de múltiples capas de seguridad que ofrece una protección mejor frente a los riesgos de seguridad en los teléfonos móviles.

-

Seguridad de la plataforma

-

Firefox OS en su plataforma utiliza un modelo de seguridad de varias capas que esta diseñado para reducir los riesgos de seguridad en todos los niveles. Contramedidas de primera línea se combinan con una estrategia de defensa en profundidad que proporciona protección completa contra amenazas.

-

Arquitectura de la seguridad

-

Firefox OS conecta las aplicaciones basadas en la web con el hardware subyacente. Se trata de una pila de tecnologías integradas que consiste en los siguientes niveles:

-

-

Mobile device es el teléfono móvil ejecutando Firefox OS. Gonk consiste en el kernel de Linux, las librerías del sistema, el firmware y los controladores del dispositivo. Gecko es la capa de tiempo de ejecución de aplicaciones que proporciona el marco de trabajo para la ejecución de aplicaciones, e implementa las API Web que se usan para acceder a las funciones del dispositivo móvil. Gaia es la colección de aplicaciones web que conforman la experiencia de usuario (aplicaciones que contienen desde HTML5, CSS, JavaScript, imágenes, medios, y así sucesivamente).

-

Gecko es el portero que hace cumplir las políticas de seguridad diseñadas para proteger el dispositivo móvil de un mal uso. La Capa Gecko actúa como intermediario entre las aplicaciones web (en la capa Gaia) y el teléfono. Gonk le ofrece las características del hardware del teléfono móvil directamente a la capa Gecko . Las aplicaciones web acceden a las funcionalidades del teléfono móvil sólo a través de las API Web, y sólo si Gecko permite la petición de acceso, no hay accesos directos ni "puertas traseras" en el teléfono. Gecko aplica los permisos e impide el acceso a las solicitudes no autorizadas.

-

Implementación del sistema de seguridad

-

Firefox OS viene instalado en el teléfono inteligente. la imagen original del sistema es creada por un conocido, una fuente de confianza que por lo general es el OEM del dispositivo, el cuál es responsable de ensamblar, construir, probar y firmar digitalmente el paquete que se distribuye.

-

Las medidas de seguridad se utilizan en toda la pila de tecnologías. Los privilegios del sistema de archivos son impuestas por las listas del control de acceso de Linux`s (ACLs). Las aplicaciones del sistema se instalan en un volumen que es de solo lectura (excepto durante las actualizaciones, donde es temporalmente tienen lectura y escritura ). Sólo las áreas que contienen los datos de usuario son de lectura y escritura. Varios componentes del hardware del dispositivo tiene una función de protección que se aplican de forma predeterminada como la práctica estándar de la industria. Los fabricantes de Chipset, por ejemplo, emplean técnicas de endurecimiento para reducir las vulnerabilidades. El núcleo de la plataforma (Gecko and Gonk) se endurece para reforzar su defensa contra las amenazas potenciales, utilizándose en su caso las características de endurecimiento del compilador. Para más detalles ver Seguridad en tiempo de ejecución.

-

Actualizaciones seguras del sistema

-

Las actualizaciones y parches a la plataforma Firefox OS se implementan usando un proceso seguro de Mozilla que asegura la integridad de la imagen del sistema en el teléfono móvil. La actualización es creada por un conocido, una fuente de confianza que por lo general es el OEM del dispositivo, el cuál es responsable de ensamblar, construir, probar y firmar digitalmente el paquete que se distribuye.

-

Las actualizaciones del sistema pueden incluir la totalidad o una parte de la pila de Firefox OS. Si cambios en Gonk son incluidos en la actualización, entonces FOTA (Firmware sobre el aire ) es el proceso de instalación utilizado. La actualización por FOTA puede incluir cualquier otra parte de la pila de Firefox OS, incluyendo la gestión del dispositivo(FOTA, firmware / drivers), gestión de la configuración(configuraciones de Firefox OS), actualizaciones de seguridad, Gaia, Gecko y otros parches.

-

Actualizaciones que no involucren a Gonk pueden hacerse usando la utilidad de actualización de sistemas de Mozilla. Firefox OS utiliza el mismo marco de trabajo de actualizaciones, los procesos y el formato de archivos de Mozilla (MAR)  (usado para actualizar los paquetes) como el producto Firefox para Escritorio. Para más información, consulte https://wiki.mozilla.org/Software_Update.

-

Al integrar el servicio de actualización que puede ser proporcionado por el fabricante, en el teléfono móvil comprueba periódicamente si hay actualizaciones del sistema. Una vez que un paquete del sistema esta disponible y es detectado por el servicio de actualizaciones, se solicita al usuario que confirme la actualización. Antes de instalar las actualizaciones en dispositivo móvil, se comprueba que haya suficiente espacio para aplicar la actualización y la distribución se verifica para:

- -

Las siguientes medidas de seguridad son utilizadas durante el proceso de actualización:

- -

Rigurosas comprobaciones se llevan a cabo para asegurar que la actualización es aplicada correctamente en teléfono móvil.

-

Seguridad en aplicaciones

-

Firefox OS utiliza una estrategia de seguridad de tipo defensa en profundidad apara proteger el teléfono móvil de las aplicaciones intrusivas o maliciosos. Esta estrategia cuenta con una variedad de mecanismos, incluyendo los niveles de permisos implícitos basados en un modelo de aplicaciones de confianza, la ejecución de recinto de seguridad en tiempo de ejecución, únicamente acceso al hardware subyacente teléfono móvil a través del API, un modelo de permisos robusto y seguridad en la instalación y los procesos de actualización. Para obtener información técnica, consulte: Seguridad de las aplicaciones.

-

En Firefox OS, todas las aplicaciones son aplicaciones web - programas escritos utilizando HTML5, JavaScript, CSS, media y otras tecnologías web abiertas (las páginas que se ejecutan en el navegador no se conocen como aplicaciones Web en este contexto). Porque no hay binario ("nativo") las aplicaciones instaladas por el usuario, todo acceso al sistema está mediada estrictamente a través de las API Web. Incluso el acceso al sistema de archivos es sólo a través de las API de Web y una base de datos SQLite de fondo - no hay acceso directo desde las aplicaciones a los archivos almacenados en la tarjeta SD.

-

Firefox OS limita y hace cumplir el ámbito de los recursos que pueden ser accedidos o utilizados por una aplicación, mientras que también apoya una amplia gama de aplicaciones con diferentes niveles de permisos. Mozilla implementa controles estrictos sobre qué tipo de aplicaciones pueden acceder a qué APIs. Por ejemplo, sólo las aplicaciones certificadas (se suministran con el teléfono) pueden tener acceso a la API de telefonía. La aplicación Marcador tiene privilegios para acceder a la API de telefonía para hacer llamadas telefónicas, pero no todas las aplicaciones certificadas se puede acceder a esta API. Esto evita que un escenario, por ejemplo, en el que se instala una aplicación de terceros arbitraria, marca un número de teléfono de pago por uso (900 y 910), y por debajo te consume gran cantidad del saldo del teléfono celular. Sin embargo, otras aplicaciones OEM pueden darse de forma selectiva el acceso a la API de telefonía. Por ejemplo, un operador podría proporcionar una aplicación de gestión de sistemas que permite a los clientes administrar su cuenta, incluyendo la posibilidad de llamar a la facturación del operador o de la oficina de apoyo directamente.

-

Aplicaciones confiables y no confiables

-

Firefox OS clasifica las aplicaciones de acuerdo a los siguientes tipos:

- - - - - - - - - - - - - - - - - - - - - - - - - -
-

Tipo

-
-

Nivel de confianza

-
-

Descripción

-
-

Certificadas

-
-

Altamente confiable

-
-

Aplicaciones del sistema que han sido aprobadas por el operador o el OEM (debido al riesgo de corrupción para el dispositivo o riesgo para las funcionalidades críticas). Aplicaciones y servicios del sistema solamente, no destinadas a aplicaciones de terceros.
- Esta designación se reserva para sólo un pequeño número de aplicaciones críticas. Ejemplos: SMS, Bluetooth, cámara, reloj del sistema, la telefonía y el marcador por defecto (para garantizar que los servicios de emergencia siempre están accesibles).

-
-

Privilegiadas

-
-

Confiables

-
-

Aplicaciones de terceros que han sido revisados, aprobados y firmados digitalmente por un mercado autorizado.

-
-

Web (todo lo demás)

-
-

No confiables

-
-

Contenido web regular. Incluye tanto las aplicaciones instaladas (almacenadas en el teléfono móvil) y las aplicaciones de servidor (almacenados remotamente, con sólo un archivo de manifiesto de aplicación almacenada en el teléfono móvil). El manifiesto para aplicaciones de servidor se puede obtener a través de un mercado de aplicaciones.

-
-

El nivel de confianza de una aplicación determina, en parte, su capacidad para acceder a la funcionalidades en el teléfono móvil.

- -

Algunas operaciones, como el acceso a la red, se supone de un permiso implícito para todas las aplicaciones. En general, cuanto más sensible es la operación (por ejemplo, marcar un número de teléfono o el acceso a la lista de contactos), mayor es el nivel de confianza requerido en la aplicación para ejecutarla.

-

Principle of Least Permissions

-

For web apps, the Firefox OS security framework follows the principle of least permissions: start with the absolute minimum permissions, then selectively grant additional privileges only when required and reasonable. By default, an app starts with very low permissions, which is comparable to untrusted web content. If the app makes Web API calls that require additional permissions, it must enumerate these additional permissions in its manifest (described later in this document). Gecko will consider granting Web API access to an application only if the applicable privileges are explicitly requested in its manifest. Gecko will grant the requested permission only if the type of the Web App (certified, trusted, or web) is sufficiently qualified for access.

-

Review Process for Privileged Apps in the Marketplace

-

In order for an app to become privileged, the app provider must submit it for consideration to an authorized Marketplace. The Marketplace subjects the app to a rigorous code review process: verifying its authenticity and integrity, ensuring that requested permissions are used for the purposes stated (in the permission rationale), verifying that the use of implicit permissions is appropriate, and validating that any interfaces between privileged app content and unprivileged external content have the appropriate mitigations to prevent elevation of privilege attacks. The Marketplace has the responsibility to ensure that the web app will not behave maliciously with the permissions that it is granted.

-

After an app passes this review, it is approved for use, its app manifest is digitally signed by the Marketplace, and it is made available for mobile users to download. The signature ensures that, if the web store were somehow hacked, the hacker could not get away with installing arbitrary content or malicious code on users’ phones. Due to this vetting process, Firefox OS gives privileged apps obtained from a Marketplace a higher degree of trust than everyday (untrusted) web content.

-

Packaged and Hosted Apps

-

Apps for Firefox OS can be either packaged (stored on the mobile phone) or hosted (stored on a remote web server, with just a manifest stored on the mobile phone). There are some differences in the way in which security is managed for each. Nonetheless, packaged and hosted apps are both subject to application sandboxing, which is described later in this document.

-

Packaged Apps

-

A packaged app consists of a ZIP file containing application resources (HTML5, CSS, JavaScript, images, media), as well as a manifest that provides an explicit list of assets and their corresponding hashes. Certified and privileged apps must be packaged apps because the app manifest needs to be digitally signed. When a user obtains a packaged app, the ZIP file is downloaded onto the mobile phone, and the manifest is read from a known location inside the ZIP file. During the install process, app assets are verified and remain stored locally in the package. All explicit permissions are requested at runtime, showing the user the app's data usage intentions, and persisted by default.

-

To refer to app resources in a packaged app, the URL begins with app: using the following format:

-

app://identifier/path_within_zipfile/file.html

-

where app:// represents the mount point for the ZIP file, and identifier is a UUID that is generated when the app is installed on the mobile phone. This mechanism ensures that resources referred to with an app: URL are contained in the ZIP file. The path within an app: is relative, so relative links to resources in the ZIP file are allowed.

-

While packaged apps are primarily intended to be used for Certified or Privileged apps, regular web apps can also be packaged. However, they do not gain any increase in trust or permissions access simply because they are packaged.

-

Hosted Apps

-

Hosted apps are located on a web server and loaded via HTTP. Only the app manifest is stored on the mobile phone. Everything else is stored remotely. Certain APIs are available only to privileged and certified apps, which requires the app to be packaged due to signing requirements. Therefore, a hosted app will not have access to any of the Web APIs operations that require privileged or certified app status.

-

From a security point of view, hosted apps work very much like normal websites. A hosted app is loaded by invoking a hard-coded, fully-qualified URL that points to the startup page in the root directory of the app on that web server. Once a hosted app is loaded, the mobile phone links to pages using the same URLs that are used when browsing the web site.

-

App Manifest

-

An Open Web App manifest contains information that a Web browser needs in order to interact with an app. A manifest is a JSON file with (at a minimum) a name and description for the app. For further details, refer to FAQs about app manifests.

-

Example Manifest

-

The following code listing shows an example manifest with just basic settings:

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

Security Settings in the App Manifest

-

The manifest can also contain other settings, including the following security settings:

- - - - - - - - - - - - - - - - - - - - - - - - - -
-

Field

-
-

Description

-
-

permissions

-
-

Permissions required by the app. An app must list every Web API it intends to use that requires user permission. Most permissions make sense for privileged apps or certified apps, but not for hosted apps. Properties per API:

-
    -
  • description - A string specifying the intent behind requesting use of this API. Required.
  • -
  • access - A string specifying the type of access required for the permission. Implicit permissions are granted at install time. Required for only a few APIs. Accepted values: read, readwrite, readcreate, and createonly.
  • -
-
-

installs_allowed_from

-
-

Origin of the app. Array of origins (scheme+unique hostname) that are allowed to trigger installation of this app. Allows app providers to restrict installs from only an authorized Marketplace (such as https://marketplace.firefox.com/).

-
-

csp

-
-

Content Security Policy (CSP). Applied to all pages loaded in the app. Used to harden the app against bugs that would allow an attacker to inject code into the app. If unspecified, privileged and certified apps have system-defined defaults. Syntax:
- https://developer.mozilla.org/en-US/docs/Apps/Manifest#csp

-

Note that this directive can only increase the CSP applied. You cannot use it, for example, to reduce the CSP applied to a privileged App.

-
-

type

-
-

Type of application (web, privileged, or certified).

-
-

Firefox OS requires that the manifest be served with a specific mime-type ("application/x-web-app-manifest+json") and from the same fully-qualified host name (origin) from which the app is served. This restriction is relaxed when the manifest app (and thus the app manifest) is same-origin with the page that requested the app to be installed. This mechanism is used to ensure that it's not possible to trick a website into hosting an application manifest.

-

Sandboxed Execution

-

This section describes application and execution sandboxes.

-

Application Sandbox

-

The Firefox OS security framework uses sandboxing as a defense-in-depth strategy to mitigate risks and protect the mobile phone, platform, and data. Sandboxing is a way of putting boundaries and restrictions around an app during run-time execution. Each app runs in its own worker space and it has access only to the Web APIs and the data it is permitted to access, as well as the resources associated with that worker space (IndexedDB databases, cookies, offline storage, and so on). For details, see https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS/Security/Security_model.

-

The following figure provides an overview of this security model.

-

-

By isolating each app, its impact is contained within its own worker space. It cannot interfere with anything (such as other apps or their data) outside of that worker space.

-

Execution Sandbox

-

B2G (Gecko) runs in a highly-privileged system process that has access to hardware features in the mobile phone. At run-time, each app runs inside an execution environment that is a child process of the B2G system process. Each child process has a restricted set of OS privileges – for example, a child process cannot directly read or write arbitrary files on the file system. Privileged access is provided through Web APIs, which are mediated by the parent B2G process. The parent ensures that, when a child process requests a privileged API, it has the necessary permission to perform this action.

-

Apps communicate only with the B2G core process, not with other processes or apps. Apps do not run independently of B2G, nor can apps open each other. The only “communication” between apps is indirect (for example, when a listener process detects an event generated by some other process), and is mediated through the B2G process.

-

Hardware Access Only via the Web API

-

Web apps have only one entry point to access mobile phone functionality: the Firefox OS Web APIs, which are implemented in Gecko. Gecko provides the sole gateway to the mobile device and underlying services. The only way to access device hardware functionality is to make a Web API call. There is no “native” API and there are no other routes (no “back doors”) to bypass this mechanism and interact directly with the hardware or penetrate into low-level software layer.

-

Security Infrastructure

-

The following figure shows the components of this security framework:

-

- -

Permissions Management and Enforcement

-

Firefox OS security is designed to verify and enforce the permissions granted to web apps.
- The system grants a particular permission to an app only if the content requests it, and only if it has the appropriate permissions requested in the app’s manifest. Some permissions require further authorization from the user, who is prompted to grant permission (as in the case of an app requesting access to the user’s current location). This app-centric framework provides more granular control over permissions than traditional role-centric approaches (in which individual roles are each assigned a set of permissions).

-

A given Web API has a set of actions and listeners. Each Web API has a required level of permission. Every time a Web API is called, Gecko checks permission requirements (role lookup) based on:

- -

If the request does not meet the permission criteria, then Gecko rejects the request. For example, untrusted apps cannot execute any Web APIs that are reserved for trusted apps.

-

Prompting Users for Permission

-

In addition to permissions that are implicitly associated with the web apps, certain operations require explicit permission from the user before they can be executed. For these operations, web apps are required to specify, in their manifest, their justification for requiring this permission. This data usage intention informs users about what the web app intends to do with this data if permission is granted, as well as any risk involved. This allows users to make informed decisions and maintain control over their data.

-

Secure App Update Process

-

-

For app upgrades and patches to a privileged app, app providers submit the updated package to an authorized Marketplace, where it is reviewed and, if approved, signed and made available to users. On Firefox OS devices, an App Update Utility periodically checks for app updates. If an update is available, then the user is asked whether they want to install it. Before a update is installed on the mobile device, the package is verified for:

- -

Rigorous checks are in place to ensure that the update is applied properly to the mobile phone.
- The complete update package must be downloaded in a specific and secure location before the update process begins. Installation does not overwrite any user data.

-

Device Security (Hardware)

-

Security mechanisms for the mobile device hardware are typically handled by the OEM. For example, an OEM might offer SIM (Subscriber Identity Module) card locks, along with PUK (PIN Unlock Key) codes to unlock SIM cards that have become locked following incorrect PIN entries. Contact the OEM for details. Firefox OS does allow users to configure passcodes and timeout screens, which are described in the next section.

-

Data Security

-

Users can store personal data on their phone that they want to keep private, including contacts, financial information (bank & credit card details), passwords, calendars, and so on. Firefox OS is designed to protect against malicious apps that could steal, exploit, or destroy sensitive data.

-

Passcode and Timeout Screens

-

Firefox OS allows users to set a passcode to their mobile phone so only those who supply the passcode can use the phone. Firefox OS also provides a timeout screen that is displayed after a configurable period of phone inactivity, requiring passcode authentication before resuming use of the phone.

-

Sandboxed Data

-

As described earlier, apps are sandboxed at run time. This prevents apps from accessing data that belongs to other apps unless that data is explicitly shared, and the app has sufficient permissions to access it.

-

Serialized Data

-

Web apps do not have direct read and write access to the file system. Instead, all access to storage occurs only through Web APIs. Web APIs read from, and write to, storage via a an intermediary SQLite database. There is no direct I/O access. Each app has its own data store, which is serialized to disk by the database.

-

Data Destruction

-

When a user uninstalls an app, all of the data (cookies, localStorage, Indexeddb, and so on) associated with that application is deleted.

-

Privacy

-

Mozilla is committed to protecting user privacy and user data according to its privacy principles (https://www.mozilla.org/privacy/), which stem from the Mozilla Manifesto (https://www.mozilla.org/about/manifesto.html). The Mozilla Firefox Privacy Policy describes how Mozilla collects and uses information about users of the Mozilla Firefox web browser, including what Firefox sends to websites, what Mozilla does to secure data, Mozilla data practices, and so on. For more information, see:

- -

Firefox OS implements these principles by putting the control of the user data in the hands of the user, who gets to decide where this personal information goes. Firefox OS provides the following features:

- -

 

diff --git a/files/es/archive/b2g_os/simulator/index.html b/files/es/archive/b2g_os/simulator/index.html deleted file mode 100644 index e05c481b85..0000000000 --- a/files/es/archive/b2g_os/simulator/index.html +++ /dev/null @@ -1,258 +0,0 @@ ---- -title: Simulador de Firefox OS -slug: Archive/B2G_OS/Simulator -translation_of: Archive/B2G_OS/Simulator ---- -
-

El Simulador de Firefox OS está todavía en una etapa temprana de desarrollo, y aún no llega al nivel de confiabilidad que queremos.

- -

Si encuentra un error de cualquier tipo, cree un informe en GitHub, y si quiere hacernos una pregunta, utilice la lista de correo dev-developer-tools o en el canal #devtools de irc.mozilla.org (en inglés).

-
- -

El complemento Simulador de Firefox OS es una herramienta que le permite probar y depurar aplicaciones para Firefox OS en el escritorio. El ciclo de «programar–probar–depurar» es mucho más rápido con el Simulador que con un dispositivo de hardware real y, obviamente, no necesitará uno para utilizarlo.

- -

En esencia, el complemento del Simulador consiste de:

- - - -

La siguiente captura de pantalla muestra una sesión de depuración utilizando el Simulador.

- -

El tablero se encuentra en la esquina superior derecha de la imagen, ubicado en una pestaña de Firefox. Hemos añadido una aplicación empaquetada, llamada «Where am I?». En la esquina superior izquierda, hay una aplicación ejecutándose en el Simulador. Asimismo, hemos conectado las herramientas de depuración, que están en la ventana inferior. Puede ver que se ha alcanzado un punto de interrupción en la aplicación.

- -

- -

Esta guía abarca los temas siguientes:

- - - -

Para un tutorial práctivo que le muestra cómo utilizar el Simulador para depurar una aplicación web real, véase la página Paso a paso con el Simulador.

- -

Instalar el complemento del Simulador

- -

El Simulador está empaquetado y distribuido como un complemento de Firefox. Para instalarlo:

- -
    -
  1. Mediante Firefox, vaya a la página del Simulador en addons.mozilla.org.
  2. -
  3. Pulse en «Añadir a Firefox».
  4. -
  5. Una vez que se haya descargado completamente el complemento, se le solicitará instalarlo: pulse en «Instalar ahora».
  6. -
- -

Debido al tamaño del complemento, Firefox puede colgarse durante unos segundos mientras se instala, y es posible que aparezca el cuadro de diálogo «Aviso: script sin respuesta». Si esto ocurre, pulse en «Continuar» y espere a que la instalación finalice. Este problema se sigue en el error n.º 814505.
-
- Una vez instalado el complemento, Firefox comprobará si hay actualizaciones regularmente y lo mantendrá actualizado automáticamente.

- -

Cuando instala el Simulador, el tablero se abre automáticamente; y puede volverlo a abrir en cualquier momento yendo al menú «Firefox» (o el menú «Herramientas» en OS X y Linux) ▸ «Desarrollador web» ▸ «Firefox OS Simulator»:

- -


- El tablero es la herramienta que usará para añadir su aplicación al Simulador y ejecutarla. Así es como luce:
-

- -

Añadir, actualizar y desinstalar aplicaciones

- -

Añadir aplicaciones

- -

Para añadir una aplicación empaquetada al Simulador, abra el tablero, pulse en «Añadir un directorio» y seleccione el archivo manifest para su aplicación.
-
- Para añadir una aplicación alojada en la Web, escriba un URL en el cuadro de texto «URL de página o manifest.webapp», y luego pulse en «Añadir URL». Si el URL apunta a un manifest, ese manifest se utilizará. Si no, el tablero generará un manifest para el URL. De este modo puede añadir cualquier sitio como aplicación con tan solo introducir su URL.
-
- Cuando añade una aplicación, el tablero ejecutará una sserie de pruebas en el archivo manifest para comprbar problemas comunes. Consulte la sección Validación de manifest para obtener detalles sobre las pruebas que se ejecutan.

- -

A menos de que la validación del manifest muestre que su aplicación tiene errores, el tablero ejecutará la aplicación en el Simulador automáticamente.

- -

Gestión de aplicaciones

- -

Una vez que ha añadido una aplicación, ésta aparecerá en la lista de aplicaciones instaladas del gestor:
-
- Cada entrada proporciona información sobre la aplicación:

- - - -

También proporciona tres órdenes:

- - - -

Si ha conectado un dispositivo con Firefox OS a su equipo, verá una cuarta orden llamada «Instalar en dispositivo».

- -

Validación de manifest

- -

Cuando proporciona un manifest, el gestor ejecutará algunas pruebas de validación en él. El gestor informa tres clases de problemas:

- - - -

Se muestran resúmenes de los problemas encontrados en la entrada de la aplicación, al pulsar en los resúmenes se muestran más detalles.

- -

Errores del manifest

- -

El tablero informará las condiciones siguientes como errores, lo cual significa que no podrá ejecutar su aplicación si no los corrige:

- - - -

A continuación se muestra el resultado de intentar añadir un archivo manifest que carece del campo «name»:
-
-

- -

Avisos del manifest

- -

El tablero informará de los siguientes problemas de manifest como avisos:

- - - -

Avisos específicos del Simulador

- -

Finalmente, el gestor emitirá avisos para las aplicaciones que utilicen funciones de Firefox OS que todavía no son totalmente compatibles con el Simulador:

- - - -

Ejecutar el Simulador

- -

El Simulador se puede abrir de dos maneras:

- - - -

Una vez que inició el Simulador mediante cualquiera de estas formas, el botón «Detenido» se vuelve verde y su etiqueta cambia a «Ejecutándose». Para detener el Simulador, pulse en este botón de nuevo.
-
- El Simulador aparece en una ventana separada cuyo tamaño simula las dimensiones de una pantalla de 320 × 480 píxeles, y posee una barra de herramientas en la parte inferior que contiene algunas funciones adicionales.

- -

Para simular toques, puede pulsar con el ratón y arrastrar mientras mantiene oprimido el botón izquieerdo. Asi que, para ver las aplicaciones incorporadas en el sistema —y las que haya instalado—, pulse y arrastre con el ratón sobre la pantalla de inicio:

- -

- -

Barra de herramientas del Simulador

- -

La barra de herramientas ubicada en la parte inferior de la ventana contiene tres botones:
-
- De izquierda a derecha, son el botón «Inicio», «Simulación de giro» y «Simulación de geolocalización».

- - - -

Activar el registro de consola

- -

Si activa la casilla «Consola» que se ubica bajo el botón «Detenido/Ejecutándose», la Consola de errores se abrirá junto al Simulador. Su aplicación podrá crear registros en esta consola mediante el bojeto global «console».

- -

Adjuntar herramientas para desarolladores

- -

Puedes adjuntar herramientas para desarrolladores en el Simulador, para ayudar a depurar tu aplicación. Por el momento, puedes adjuntar únicamente el Depurador de JavaScript y la Consola Web, pero estamos trabajando para añadir soporte para mas herramientas para desarrolladores.

- -

Mientras que el Simulador esté en funcionamiento otro botón aparecerá debajo de la casilla "Consola". Está etiquetado "Conectar...":

- -

- -

Haz clic, y te llevará a una página parecida a esta:

- -

Haz clic en "Conectar" aquí y verás otra página, esta vez como esta:
-
-

- -

Para usar el Depurador de JavaScript, selecciona aquí "chrome://prosthesis/content/shell.xul". Una vez ejecutado, necesitarás buscar los scripts de tu aplicación en el seleccionador de script, pero si abres tu aplicación y luego te conectas al depurador, el script principal de tu aplicación será seleccionado como predeterminado:

- -

Para usar la Consola Web con tu aplicación, selecciona "Proceso Principal" en la ventana "Conectar a dispositivo remoto".

- -

Lamentablemente, no hay depuración de objetivo único que funcione con ambos la Consola Web y el Depurador JS - pero puedes ejecutar dos dos casos simultáneamente de las herramientas de depuración, una dirigida a "shell.xul" y otra a "Proceso Principal".

- -

Subir al dispositivo

- -

Si tienes un dispositivo Firefox OS puedes conectarlo al Simulador, y por ello puedes subirlo desde el panel de control a el dispositivo.

- -

Conectar un dispositivo

- -

Para conectar un dispositivo, sigue las instrucciones en la guía de connecting a Firefox OS device to the desktop. Recuerda que no tienes que instalar adb, ya que el complemento del Simulador ya lo incluye.

- -

 

- -

Subir aplicaciones al dispositivo

- -

Una vez que hayas configurado el dispositivo y escritorio, y conectado el dispositivo a tu escritorio mediante USB, verás aparecer el comentario "Dispositivo conectado." a la izquierda del panel de control, y un nuevo comando en la entrada por cada aplicación etiquetada "Subir":

- -

- -

Click "Push", and the app will be installed on the Firefox OS device.

- -

Solucionar problemas en Linux

- -

Si no puedes conectar tu dispositivo después de crear reglas udev, por favor vea este bug.

- -

 

- -

Limitaciones del Simulador

- -

Recuerda que el Simulador de Firefox OS no es una simulación perfecta.

- -

Limitaciones de hardware

- -

Aparte del tamaño de la pantalla, el Simulador no simula las limitaciones de hardware del dispositivo Firefox OS tales como memoria disponible o velocidad de la CPU.

- -

Códecs de Audio/Video

- -

Los siguientes códecs dependen en decodificación acelerada por hardware y por lo cual no hay asistencia todavía:

- - - -

Esto significa que no es posible usar el Simulador para probar la reproducción de video en aplicaciones y en páginas web como Youtube que dependen de esos códecs.

- -

APIs no admitidas

- -

Ciertas APIs que funcionan en el dispositivo no funcionarán en el Simulador, generalmente porque el soporte hardware no está disponible para el escritorio. Hemos implementado simulaciones para algunas APIs como geolocalización, y esperamos añadir más en futuras versiones. Sin embargo, por el momento las siguientes APIs no son compatibles. Usárlas podría traer errores o dar resultados incorrectos:

- - - -

Obtener ayuda

- -

Si encuentras algún bug, por favor archívalos en GitHub. Si tienes alguna cuestión, preguntanos en dev-developer-tools mailing list o en #devtools en irc.mozilla.org.

diff --git a/files/es/archive/b2g_os/usando_el_b2g_escritorio_cliente/index.html b/files/es/archive/b2g_os/usando_el_b2g_escritorio_cliente/index.html deleted file mode 100644 index 0fbbe96e02..0000000000 --- a/files/es/archive/b2g_os/usando_el_b2g_escritorio_cliente/index.html +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: Usando el cliente de escritorio B2G -slug: Archive/B2G_OS/usando_el_B2G_escritorio_cliente -translation_of: Archive/B2G_OS/Building_the_B2G_OS_simulator ---- -

El cliente de escritorio Firefox OS, también llamado "Cliente de escritorio B2G", te permite correr Gaia y Apps Web en un entorno Gecko-based muy parecido a un dispositivo actual. No emula el hardware del dispositivo, por lo tanto no es apto para probar APIs de dispositivo, tampoco es un reemplazo para probar hardware actual. Sin embargo, tiene múltiples APIs habilitadas que no están disponibles en Firefox como las de Contactos y Opciones. Por lo tanto puede ser muy util durante el desarrollo de nuestra aplicación, o durante el trabajo con la intefaz de usuario de Gaia.

-

Este articulo trata sobre la descarga o compilación del cliente de escritorio Firefox OS i como utilizarlo.

-
-

Nota: La forma más sencilla para utilizar el cliente de escritorio de Firefox OS es utilizar el simulador de Firefox OS. No necesita de instalación de cliente por su parte.

-
-

Descarga una compilación "nightly"

-
-

Note: Firefox OS version 1.0 is based on a branch of Gecko 18. There are also nightly builds based on mozilla-central here:
- http://ftp.mozilla.org/pub/mozilla.org/b2g/nightly/latest-mozilla-central/

-
-

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. This lets you bypass having to build it yourself. In addition, you don't have to download Gaia on your own either.

-

Be sure to install the application in a writeable location; the application needs to be able to update included the Gaia profile.

-

You can now skip ahead to Running the desktop client, unless you actually want to build it for yourself.

-

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).

-

Downloading Gaia

-

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.

-

To download Gaia for the first time, let's clone the source code repository on GitHub:

-
git clone https://github.com/mozilla-b2g/gaia
-cd 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 (run in the gaia directory) will take care of that:

-
make
-
-

This should create a profile directory below the gaia directory. The new profile contains a customized extension and other configuration needed to make B2G run properly.

-

Running the desktop client

-

Once you've built the client and downloaded Gaia (or downloaded and installed the nightly desktop application), you're ready to fire up the Firefox OS desktop client.

-

Running on Linux

-

To run the desktop client on Linux using the embedded Gaia profile, just run the b2g executable. If you want to specify a different Gaia profile, you need to bypass the b2g wrapper program and run the b2g-bin binary. The binary is in the archive you downloaded earlier or in the ../build/dist/bin directory if you built the client yourself.

-
.../b2g-bin -profile gaia/profile
-
-

You may experience annoying rendering problems. To avoid them, add the following line to your gaia/profile/user.js file:

-
user_pref("layers.acceleration.disabled", true);
-
-

Running on Mac

-

If you downloaded the nightly build, you can simply launch it from the Finder as usual. Any console output is visible by running the standard Console utility program included with your Mac.

-

If you want to specify a different Gaia profile, you need to bypass the b2g wrapper program and run the b2g-bin binary. The command line is slightly more complicated due to the location of the b2g-bin binary and the need for absolute paths when specifying the profile directory:

-
.../B2G.app/Contents/MacOS/b2g-bin -profile /full/path/to/gaia/profile
-
-

Running on Windows

-

Running the nightly build on Windows is as simple as launching b2g.exe. If you want to customize the execution, you can do so by running the b2g-bin.exe executable instead; this bypasses the wrapper program that automatically uses the bundled Gaia.

-

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-bin -jsconsole -profile /path/to/your/profile
-
-

Note: On production builds of Firefox OS, console logging (such as by console.log()) is disabled by default. In order to enable it, open the Settings app and navigate down through Device Information->More Information->Developer, then toggle on the "Console Enabled" preference.

-
-

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-bin -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 in Settings application. 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/es/archive/b2g_os/using_firefox_os_simulator/index.html b/files/es/archive/b2g_os/using_firefox_os_simulator/index.html deleted file mode 100644 index 158cdca809..0000000000 --- a/files/es/archive/b2g_os/using_firefox_os_simulator/index.html +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Using Firefox OS Simulator -slug: Archive/B2G_OS/Using_Firefox_OS_Simulator -translation_of: Archive/B2G_OS/Simulator ---- -

The Firefox OS Simulator is a desktop platform tool that shows you what apps will look like on a phone that is running the Firefox OS. It is the easiest way to try out apps on Firefox OS before submitting them to the Firefox Marketplace. The Firefox OS Simulator was formerly called "r2d2b2g", but that name is too difficult.

-

The Simulator is packaged as a desktop Firefox add-on. You can use any recent version of Firefox from Firefox 17 onward.

-

Although there are other ways to run the Firefox OS desktop, the best and most convenient way for app developers is this one. If you're a core Firefox OS platform developer, or are working on localization, there are other tools that are better suited for your needs. The Simulator add-on includes support for adding apps to the test environment, and is configured to support remote debugging, remote Web console, and other features. It also provides a visible Home button you can click, and sets the user-agent string to the one used by Firefox OS on devices. The result is, in nearly every way, a better environment for app developers.

-

Installing Firefox OS Simulator

-
    -
  1. Using Firefox, go to this link: https://addons.mozilla.org/addon/firefox-os-simulator/
  2. -
  3. Click Add to Firefox. It's a large download. Follow the prompts that appear.
  4. -
-
-

Because of the size of the add-on, Firefox may freeze for several seconds while installing it, and its unresponsive script dialog may appear, due to bug 814505. If it does, just click the Continue button, and Firefox will continue installing the add-on.

-
-

Starting the Simulator

-
    -
  1. On the Firefox menu (Windows) or the Tools menu (Mac, Linux), go to Web Developer and click Firefox OS Simulator. The dashboard appears. -

    Dashboard

    -
  2. -
  3. Click the Stopped button. It changes into the Running button and Firefox OS boots up in its own window. The default size for this window is 320x480. -

    Simulator

    -

    To stop the Simulator, click the Running button in the dashboard, or just close the Simulator window.

    -
  4. -
-
-

Note: You can also start and stop the Simulator in the Developer Toolbar command line using firefoxos start and firefoxos stop.

-
- -

Imitate swipe motions in the Simulator by clicking and dragging with the mouse. The mouse scroll wheel will move a list up and down, such as in the Settings app. Click and hold down the mouse button to simulate a long press.

-

To get back to the home screen, click the home button at the bottom of the Simulator, or press the Home key on your keyboard. On Mac keyboards without a Home key, use Fn + Left Arrow.

-

Console checkbox

-

Click the Console check box before you start the Simulator to open an error console so you can spot errors that might occur while you're working on your app.

-

Web APIs in the Simulator

-

Mozilla is working on many Web APIs to make native platform capabilities available to Open Web Apps. The Web APIs currently supported in the Simulator are:

- -

Installing an app in the Simulator

-

To install a hosted app in the Simulator, type the URL to the app's manifest in the URL box, and click Add Manifest. This will install the app in the Simulator. Here is a simple weather app that you can use as a test:

-
http://jlongster.github.com/weatherme/manifest.webapp
-

The app's icon will be added to one of the home screens in the Simulator.

-

You can also install a plain website in the same way. Just type the website's URL in the box and click Add URL, and an icon for the site will be added to a home screen. Autocompletion works if you have the website open in another tab.

-

To install a packaged app in the Simulator, click the Add Directory button, then select the mini-manifest of the app on your local filesystem.

-

To remove an app from the Simulator, click the Remove link for the app in the dashboard. You may have to restart the Simulator to see it gone.

-

Updating an app

-

If you are working on an app and need to update it in the Simulator, click the app's Update button in the dashboard. You will have to restart the Simulator. Hosted apps follow the usual rules for Website caching and working with appcache.

-

Reporting bugs

-

Remember that the Simulator is a brand-new tool and is still heavily under development. Please let us know if you find any bugs.

-

More information

-

The Simulator itself is the Firefox OS desktop client (also called the B2G desktop client), which is a build of Firefox OS that runs on Windows, Mac, and Linux. Firefox OS Simulator makes it easier to test apps on Firefox OS desktop because it includes functionality for adding apps to the environment and is configured/extended in a variety of ways to better meet the needs of app developers.

-

However, because the Simulator uses the Firefox OS desktop client, the documentation for B2G Desktop, Gaia, and B2G generally will also apply to the Simulator to some extent. Here are a couple of those docs:

-

Using the Firefox OS desktop client

-

Hacking Gaia

diff --git a/files/es/archive/b2g_os/using_the_app_manager/index.html b/files/es/archive/b2g_os/using_the_app_manager/index.html deleted file mode 100644 index bd8b6e6427..0000000000 --- a/files/es/archive/b2g_os/using_the_app_manager/index.html +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Usando el App Manager -slug: Archive/B2G_OS/Using_the_App_Manager -translation_of: Archive/B2G_OS/Using_the_App_Manager ---- -
-

El App Manager es una nueva herramienta disponible en Firefox para escritorio, que provee una cantidad de útiles herramientas para ayudarte a probar, desarrollar y depurar aplicaciones HTML5 en teléfonos Firefox OS y el Simulador de Firefox OS, directamente en tu navegador.

-
-

El App Manager se compone de:

- -

Instalación rápida:

-

Esta seccion esta diseñada para conseguir la puesta en funcionamiento lo antes posible; si necesitas mas detalles por favor siga adelante con la sección Configuración del dispositivo y sistema y continue leyendo desde allí. Vea también la sección Solución de problemas para obtener ayuda si tiene algún problema.

-
    -
  1. Asegúrate de tener Firefox para escritorio 26+ instalado
  2. -
  3. Abre el App Manager (en la barra de direcciones, tipea about:app-manager)
  4. -
  5. Si no tienes un dispositivo real: -
      -
    1. Install the Firefox OS Simulator
    2. -
    3. En la barra inferior del App Manager, haz clic en Start Simulator, después haz clic en el nombre del simulador instalado, que debe aparecer ahí.
    4. -
    -
  6. -
  7. Si tienes un dispositivo real: -
      -
    1. Asegúrate que tu dispositivo está corriendo Firefox OS 1.2+
    2. -
    3. En Opciones de tu dispositivo, desactiva el Bloqueo de pantalla (Opciones > Bloqueo de pantalla) y activa Depuración remota (Opciones > Información del dispositivo > Más información > Desarrollador)
    4. -
    5. Instala el ADB Helper como complemento en tu Firefox de escritorio
    6. -
    7. Conecta tu dispositivo a tu máquina vía cable USB
    8. -
    9. El nombre de tu dispositivo debería aparecer en la barra inferior del App Manager. Haz clic en él.
    10. -
    -
  8. -
  9. En la barra inferior debe aparecer "Conectar con: xxx"
  10. -
  11. Haz  clic en el panel de Apps y añade una app (empaquetada y hospedada)
  12. -
  13. El botón Iniciar valida tu app y la instala en el simulador / dispositivo
  14. -
  15. El botón Depurar conecta las herramientas para desarrolladores con la app arrancada
  16. -
-

Configuración del dispositivo y el sistema

-

Lo primero que tendrá que hacer cuando se utiliza el App Manager es asegurarse de que su sistema y el teléfono están configurados correctamente. En esta sección se ejecutarán todos los pasos necesarios.

-

Se requiere Firefox OS 1.2+

-

Asegúrese de que su dispositivo se está ejecutando Firefox OS 1.2/Boot2Gecko 1.2 o superior. Para comprobar qué versión de Firefox OS del dispositivo está funcionando, vaya a Ajustes > Información > Software.

-

Si usted no tiene una versión lo suficientemente alta instalada, dependiendo del teléfono que tiene, necesitará ya sea instalar una construcción nocturna disponible de Firefox OS 1.2 superior, o configurar y construir por sí mismo desde la fuente.

-

Construcciones disponibles:

- -

Para construir tu propia distribución de Firefox OS 1.2+, siga las instrucciones que se encuentran en Building and installing Firefox OS, iniciando con Firefox OS build prerequisites.

-

Depuración remota

-

A continuación, debe habilitar la depuración remota en Firefox OS. Para ello, vaya a Ajustes> Información> Más información> Desarrollador y active la casilla de depuración remota.

-

ADB o ADB helper

-

El proceso utiliza el puente de depuración Android (ADB) para manejar la conexión y comunicación entre el dispositivo y la computadora. Hay dos opciones para ejecutar ADB:

- -
-

Nota: no es necesario ejecutar este comando si tienes instalado el complemento ADB Helper.

-
-

Conectando tu disporitivo al App Manager

-

Con toda la configuración hecha, ahora es el momento de conectar el dispositivo a tu ordenador e iniciar el App Manager:

-
    -
  1. Conecta el dispositivo a tu computadora via USB
  2. -
  3. Desactiva el bloqueo de pantalla en tu dispositivo, vaya a Ajustes> Pantalla y desmarque la casilla Bloquear la pantalla. Esta es una buena idea, porque cuando la pantalla se bloquea, la conexión del teléfono se pierde, lo que significa que ya no está disponible para la depuración.
  4. -
  5. Inicia el App Manager, en el Navegador Firefox de escritorio seleccione la opción de menú Herramientas > Desarrollo web > App Manager, o escriba about:app-manager in la barra de direcciones.
  6. -
  7. En la parte inferior del App Manager, verás una barra de estado de conexión (vea la imagen de abajo). Usted debe ser capaz de conectar el dispositivo, haga clic en el botón "Connect to localhost: 6000".
  8. -
  9. Si esto funciona correctamente, un mensaje deberá aparecer en el dispositivo: "An incoming request to permit remote debugging connection was detected. Allow connection?". Pulsa el botón OK (También puede que tengas que pulsar el botón de encendido del teléfono para que pueda ver el mensaje.) La barra de estado de la conexión debe decir "Connected to B2G", con un botón Desconectar disponible para presionar si quieres cancelar la conexión.
  10. -
-

-
-

Tenga en cuenta que los otros controles en la barra de estado de la conexión permiten conectar un simulador para el Administrador de la aplicación, lo que vamos a cubrir en la siguiente sección, a continuación, y cambiar el puerto que la conexión pasa sucesivamente. Si cambia el puerto, también será necesario que habilite el reenvío de puertos para este puerto, así, como se indica en la sección ADB o ADB Helper.

-
-

Usar el complemento Firefox OS Simulator

-

Si no tienes un dispositivo real disponible para usar con el App Manager, puedes probarlo utilizando un el complemento Firefox OS Simulator. Para empezar, instala el simulador apropiado para su sistema operativo:

-

Install Simulator

-

Una vez que hayas instalado el simulador, tienes que ir a la barra de estado de la conexión en la parte inferior del App Manager, y haga clic en el botón "Start simulator". Aparecerán tres botones:

- -

Panel de aplicaciones

-

 

-

Ahora que todo funciona, vamos a revisar la funcionalidad disponible dentro de la App Manager, empezando por el Panel de aplicaciones. A partir de aquí, puede importar una aplicación existente para instalar en su dispositivo y depurarlo:

- -

La información sobre su aplicación debe aparecer en la parte derecha de la ventana, como se ve a continuación:

-

-

Editor del Manifiesto

-

Desde Firefox 28 en adelante, el panel de aplicaciones incluye un editor para el manifiesto de la aplicación:

-

-

Depuración

-

Al hacer clic en "Update" actualizará (o instalará) la aplicación en el dispositivo. Al hacer clic en "debug" se conectará una caja de herramientas de la aplicación, lo que le permite depurar su código directamente:

-

-
-

Nota: podrás disfrutar jugando con la caja de herramientas - intenta alterar el DOM, CSS, etc y verás los cambios reflejados en el dispositivo en tiempo real. Tales cambios se guardarán en el código de la aplicación instalada, las verás la próxima vez que abras la aplicación en el dispositivo.

-
-

Antes de Firefox 28, las herramientas se ponen en marcha en una ventana separada. Desde Firefox 28 en adelante, las herramientas se inician en una ficha independiente en la propia App Manager, junto con las aplicaciones y las fichas de dispositivos. La ficha tendrá el icono de la aplicación, así que es fácil de encontrar:

-

-

Errores

-

Si una aplicación no se ha añadido con éxito - por ejemplo, si la URL es incorrecta, o se ha seleccionado una carpeta aplicación empaquetada - una entrada se agrega a la página de esta aplicación, pero esto va a incluir información de errores.

-

-

También puedes eliminar una aplicación desde esta vista, el ratón encima del nombre/Descripción de la App en la izquierda de la ventana, y pulsando el botón "X" que aparece en cada caso. Sin embargo, esto no elimina la aplicación del dispositivo. Para ello es necesario eliminar manualmente la aplicación utilizando el propio dispositivo.

-

Panel del Dispositivo

-

La ficha de dispositivos muestra información sobre el dispositivo conectado. Desde la ventana "Aplicaciones instaladas", las aplicaciones en el dispositivo se pueden iniciar y depurar.

-

-
-

Nota: las aplicaciones certificadas no están listadas por defecto. Vea como depurar aplicaciones certificadas.

-
-

La ventana "Permissions" muestra los privilegios requeridos por las diferentes Web APIs en el dispositivo actual:

-

-

Finalmente, puedes tomar una captura de pantalla del dispositivo haciendo click en el botón "Screenshot". la imagen aparecerá en una nueva pestaña en Firefox, y desde allí podrás guardarla o descartarla si es tu elección.

-

Depurar aplicaciones certificadas

-

Actualmente, sólo los dispositivos que ejecutan una versión de desarrollo de Firefox OS 1.2 son capaces de depurar aplicaciones certificadas. Si tienes una versión en desarrollo, puede habilitar la depuración de aplicaciones certificadas por el cambio de las prefe-certificada devtools.debugger.forbid-apps en false en tu perfil. Para ello, siga los pasos a continuación:

-
    -
  1. -

    En tu computadora, ingresa el siguiente comando en el terminal para entrar al sistema de archivos de tu dispositivo via consola:

    -
    adb shell
    -

    tu consola debe cambiar a root@android.

    -
  2. -
  3. -

    A continuación, detener B2G corriendo el siguiente comando:

    -
    stop b2g
    -
  4. -
  5. -

    Navega al siguiente directorio:

    -
    cd /data/b2g/mozilla/*.default/
    -
  6. -
  7. -

    Aquí, actualiza el archivo pref.js con la siguiente linea:

    -
    echo 'user_pref("devtools.debugger.forbid-certified-apps", false);' >> prefs.js
    -
  8. -
  9. -

    Después de que termines de editar y salvar el archivo, inicia B2G usando el siguiente comando:

    -
    start b2g
    -
  10. -
  11. -

    Sal del sistema de archivos del dispositivo cuando el comando exit; con esto regresarás a tu terminal normal.

    -
  12. -
  13. -

    Ahora reconecta el App Manager y deberías poder ver las aplicaciones certificadas para su depuración.

    -
  14. -
-
-

Nota: Si deseas agregar esta preferencia a tu construcción de Gaia puedes correr el comando make DEVICE_DEBUG=1 reset-gaia.

-
-

Solución de problemas

-

Si el dispositivo no es renonocido:

- -

¿No puedes conectar tu dispositivo al App Manager o iniciar el simulador?  Háganos saber o abra un bug.

diff --git a/files/es/archive/b2g_os/ux/building_blocks/action_menu/coding/index.html b/files/es/archive/b2g_os/ux/building_blocks/action_menu/coding/index.html deleted file mode 100644 index a914e72083..0000000000 --- a/files/es/archive/b2g_os/ux/building_blocks/action_menu/coding/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: 'Coding guide: Action menus' -slug: Archive/B2G_OS/UX/Building_blocks/Action_menu/Coding -translation_of: Archive/B2G_OS/Firefox_OS_apps/Building_blocks/1.x/Action_menu/Coding ---- -

Here you can find examples of how to create action menus on Firefox OS, as well as downloads for the CSS and image resources used by the built-in apps on Firefox OS. You can copy these resources into your app and make use of them to build apps that match these apps' appearances.

- -
-

Note: Object menus are implemented using the same code; the only difference is that you never use a title in an object menu.

-
- -

Implementing action menus

- -

To implement an action menu using the style shown here, place the CSS and media files into your app and then import the CSS using the {{cssxref("@import")}} at-rule:

- -
@import url(resources/action_menu.css);
- -

Make sure the media files are in the location expected by the CSS (either by placing them in a corresponding location or by revising the CSS).

- -

Examples

- -

With title

- -

HTML to create the menu

- -

The HTML below creates the dialog with four buttons, one of which is disabled.

- -
<form role="dialog" data-type="action" onsubmit="return false;" id="sample-menu">
-  <header id="sample-title"> Title </header> <!-- this header is optional -->
-  <menu>
-    <button id="button1"> Action 1 </button>
-    <button id="button2" disabled> Action 2 (disabled) </button>
-    <button id="button3"> Action 3 </button>
-    <button id="cancel"> Cancel </button>
-  </menu>
-</form>
-
- -

JavaScript content

- -

The JavaScript below simply adds code to some of the buttons to change the title of the dialog when clicked.

- -
var btn = document.querySelector("#button1");
-btn.addEventListener("click", function() {
-  var title = document.getElementById("sample-title");
-  title.innerHTML="Button 1";
-});
-
-var btn = document.querySelector("#button3");
-btn.addEventListener("click", function() {
-  var title = document.getElementById("sample-title");
-  title.innerHTML="Button 3";
-});
-
- -

Working demo

- -

You can try out the action menu in this live demonstration.

- -

Without title

- -

HTML to create the menu

- -

The HTML below creates the dialog with four buttons, one of which is disabled.

- -
<form role="dialog" data-type="action" onsubmit="return false;" id="sample-menu">
-  <menu>
-    <button id="button1"> Action 1 </button>
-    <button id="button2" disabled> Action 2 (disabled) </button>
-    <button id="button3"> Action 3 </button>
-    <button id="cancel"> Cancel </button>
-  </menu>
-</form>
-
- -

Working demo

- -

You can try out the action menu in this live demonstration.

- -

 

diff --git a/files/es/archive/b2g_os/ux/building_blocks/action_menu/index.html b/files/es/archive/b2g_os/ux/building_blocks/action_menu/index.html deleted file mode 100644 index e4263d2d1a..0000000000 --- a/files/es/archive/b2g_os/ux/building_blocks/action_menu/index.html +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Menú de acciones -slug: Archive/B2G_OS/UX/Building_blocks/Action_menu -translation_of: Archive/B2G_OS/Firefox_OS_apps/Building_blocks/1.x/Action_menu ---- -

Un menú de acciones, como indica su nombre, muestra un listado de acciones, relativas al contenido de la aplicación, a traves del cual el usuario puede elegir qué hacer. Visita la Guía de código para saber cómo implementar un menú de acciones en tu aplicación.

-

Caracteristicas

- -

Visuales

- - - - - - - -
-

Estado de reposo

-

-

El boton de acciones abierto, esperando a que el usuario presione una seleccion.

-
-

Estado pulsado

-

-

Aspecto del menu mientras el dedo del usuario presiona la "Opcion 03".

-
-

Variaciones

-

Existen dos variaciones basicas en el menu de acciones: que el menu tenga o no una cadena de titulo en la parte superior.

-

-

Interaccion

-

El diagrama muestra como trabaja el flujo de interaccion del ususario con el menu de acciones.

-

-

Ver tambien

- diff --git a/files/es/archive/b2g_os/ux/building_blocks/button/index.html b/files/es/archive/b2g_os/ux/building_blocks/button/index.html deleted file mode 100644 index a2e0612620..0000000000 --- a/files/es/archive/b2g_os/ux/building_blocks/button/index.html +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: Botón -slug: Archive/B2G_OS/UX/Building_blocks/Button -translation_of: Archive/B2G_OS/Firefox_OS_apps/Building_blocks/1.x/Button ---- -

Realiza una acción cuando es pulsado por el usuario. Son objetos de interfaz de usuario que tienen una amplia variedad de estilos. Consulta la Guía de codificación para informarte sobre cómo implementar botones con un aspecto como los que aquí se describen.

-

Características

- -

Hay multiples tipo de botones:

-
-
- Botones de acción
-
- Se utilizan cuando solo hay unas pocas acciones y no es necesaria una lista. La acción principal del botón utiliza un color especial resatado para indicar que es la opción principal.
-
- Botones de lista
-
- Se utilizan para mostrar una lista de acciones,  o para activar la presentación de un valor de selección.
-
- Botones de campo de entrada
-
- Se utilizan para llevar a cabo acciones con campos de entrada.
-
- Botones especiales/pesonalizados
-
- Se utilizan para proporcionar acciones específicas incluyendo grabar, llamar y similares.
-
-

Visualización

-

Aquí hay varios ejemplos visuales de cómo deberían verse los botones. No olvides que puedes usar la hoja de estilos y los recursos de imágenes proporcionados en la Guía de codificación para implementarlos.

-

Botones de acción

-

Se utilizan cuando solo hay unas pocas acciones y no es necesaria una lista. La acción principal del botón utiliza un color especial resatado para indicar que es la opción principal.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Acción principalAcción secundariaBorrar
Normal
Presionado
Deshabilitado
-

Sobre fondo oscuro, los botones deshabilitados tienen un aspecto especial, como se ve abajo.

- - - - - - - - - - - - - - - -
 Acción principalAcción secundaria
Disabled
-

Botones de lista

-

Se utilizan para mostrar una lista de acciones,  o para activar la presentación de un valor de selección.

-

Desencadenar acciones

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Desecadenar una acción en la vista actualDesencadenar una acción en una nueva vistaMostrar un selector de valores
Normal
Presionado
Deshabilitado
-

Selección de valores

-

Una vez que se abre un selector de valores, necesitarás al menos un botón en el panel de selección de valores para descartar el valor seleccionado. Estos botones deberían tener el siguiente aspecto:

- - - - - - - - - - - - - - - -
NormalPresionadoDeshabilitado
-

Botones de campos de entrada

-

Los botones de campos de entrada son botones asociados a un campo de entrada, que cuando se presionan, llevan a cabo una acción relacionada con ese campo de entrada.

- - - - - - - - - - - - - - - -
NormalPresionadoDeshabilitado
-

Botones especiales

-

Los botones especiales son botones visuales al estilo icono que se utilizan para propósitos especiales, tales como operar con la cámara del dispositivo, contestar o colgar el teléfono y activar el teclado de llamada. Por supuesto puedes encontrar otras utilidades a estos botones especiales.

-

Botones de cámara

-

Estos botones no tienen estado deshabilitado; simplemente no los muestras si la ocpión de tomar fotos no está disponible.

- - - - - - - - - - - - - - - - - - - - - - - -
 Grabar videoDetener grabación videoTomar foto
Normal
Presionado
-

Botones de teléfono

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
 DescolgarColgarOcultar teclado
Normal
Presionado
Deshabilitado
-

Botones personalizados

-

Estos son ejemplos de botones personalizados; en este caso, para añadir un contacto.

- - - - - - - - - - - - - - - -
Normal
Presionado
Deshabilitado
-

Ver también

- diff --git a/files/es/archive/b2g_os/ux/building_blocks/index.html b/files/es/archive/b2g_os/ux/building_blocks/index.html deleted file mode 100644 index 33fc3c8a70..0000000000 --- a/files/es/archive/b2g_os/ux/building_blocks/index.html +++ /dev/null @@ -1,268 +0,0 @@ ---- -title: Componentes básicos de UX de Firefox OS -slug: Archive/B2G_OS/UX/Building_blocks -translation_of: Archive/B2G_OS/Firefox_OS_apps/Building_blocks/1.x ---- -

Aquí encontrarás una descripción de los elementos de la interfaz de usuario comunes en las aplicaciones de Firefox  OS, además de ejemplos de cómo debe verse y funcionar.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

Menú de acciones

-
-


-  Detalles
- Guía del programador

-
-

 

-
-

Botón

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Confirmación

-
-

- -

Detalles
- Guía del programador
-  

-
-

 

-
-

Filtro

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Cabecera

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Área de entrada

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Lista

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Menú de objetos

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Indicador de progreso y actividad

-
-

- -

Detalles
- Guía del prgramador

-
-

 

-
-

Desplazamiento por letras

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Barra de búsqueda

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Estado

-
-


- Detalles
- Guía del programador

-
-

 

-
-

Interruptor

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Pestañas

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Barra de herramientas

-
-

- -

Detalles
- Guía del programador

-
-

 

-
-

Selector de valor

-
-

- -

Detalles
- Guía del programador

-
-

 

-
- -

 

diff --git a/files/es/archive/b2g_os/ux/guia_estilo/index.html b/files/es/archive/b2g_os/ux/guia_estilo/index.html deleted file mode 100644 index 5a205c7bdf..0000000000 --- a/files/es/archive/b2g_os/ux/guia_estilo/index.html +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Guía de estilo de Firefox OS -slug: Archive/B2G_OS/UX/Guia_estilo -translation_of: Archive/B2G_OS/Firefox_OS_apps/Copy_styleguide ---- -

Hemos puesto a su disposición elementos de diseño visual, incluyendo componentes básicos, plantillas, fondos de pantalla y más, que puede descargarlos desde nuestra colección de elementos.

-

Iconos para aplicaciones

-

¿Necesita ayuda para crear un icono para su aplicación? Échele un vistazo a nuestras pautas y plantillas.

-

Tono de voz del texto

-

Títulos

- -

Botones

- -

Listas de selector de valores

- -

Mejores prácticas generales

- -

Formularios

- -

Términos específicos

- -

Cómo mostrar unidades de tamaños de archivo

- -

Véase también

- diff --git a/files/es/archive/b2g_os/web_telephony_api/index.html b/files/es/archive/b2g_os/web_telephony_api/index.html deleted file mode 100644 index 149350095e..0000000000 --- a/files/es/archive/b2g_os/web_telephony_api/index.html +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Web Telephony API -slug: Archive/B2G_OS/Web_Telephony_API -tags: - - NeedsTranslation - - Phone - - Telephony - - TopicStub - - Voice - - WebAPI -translation_of: Archive/B2G_OS/Web_Telephony_API ---- -

WebTelephony is an API that makes it possible for web content to handle voice phone calls from JavaScript code.

-

The API is available using window.navigator.mozTelephony. See below for a full list of interfaces:

-

DOM interfaces

- -

Sample code and introduction

-
-
-

See also

- diff --git a/files/es/archive/b2g_os/web_telephony_api/introduccion_a_la_webtelephony/index.html b/files/es/archive/b2g_os/web_telephony_api/introduccion_a_la_webtelephony/index.html deleted file mode 100644 index 1b7eb653f8..0000000000 --- a/files/es/archive/b2g_os/web_telephony_api/introduccion_a_la_webtelephony/index.html +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Introducción a la WebTelephony -slug: Archive/B2G_OS/Web_Telephony_API/Introduccion_a_la_WebTelephony -translation_of: Archive/B2G_OS/Web_Telephony_API/Using_the_Web_Telephony_API ---- -

La base de acceder a la funcionalidad del teléfono es simplemente a través de navigator.mozTelephony, que es parte de la WebTelephony API. Una vez que tenga una referencia a ese objeto se puede empezar a hacer y de recibir llamadas. Aquí hay algunos ejemplos:

-
// Objeto telephony
-var tel = navigator.mozTelephony;
-
-// Comprueba si el teléfono está silenciado (propiedad de lectura/escritura)
-console.log(tel.muted);
-
-// Comprueba si el altavoz está activado (propiedad de lectura/escritura)
-console.log(tel.speakerEnabled);
-
-// Realizar una llamada
-var call = tel.dial("123456789");
-
-// Eventos para esa llamada
-call.onstatechange = function (event) {
-    /*
-        Valores posibles del estado:
-        "dialing", "ringing", "busy", "connecting", "connected",
-        "disconnecting", "disconnected", "incoming"
-    */
-    console.log(event.state);
-};
-
-// Opciones anteriores como eventos directos
-
-      // Conectar llamada
-       call.onconnected = function ();
-
-      // Desconectar llamada
-      call.ondisconnected = function ();
-
-      // Resivir una llamada
-      tel.onincoming = function (event) {
-      var incomingCall = event.call;
-
-    // Obtener el número de la llamada entrante
-    console.log(incomingCall.number);
-
-    // Responder a la llamada
-    incomingCall.answer();
-};
-
-// Desconectar llamada
-call.hangUp();
-
-
-// Iteración sobre las llamadas, y la adopción de medidas en función de su estado de cambiado
-tel.oncallschanged = function (event) {
-    tel.calls.forEach(function (call) {
-        // Registrar el estado de cada llamada
-        console.log(call.state);
-    });
-};
-
-

Ver también

- diff --git a/files/es/archive/css3/index.html b/files/es/archive/css3/index.html deleted file mode 100644 index 492e22e423..0000000000 --- a/files/es/archive/css3/index.html +++ /dev/null @@ -1,822 +0,0 @@ ---- -title: CSS3 -slug: Archive/CSS3 -translation_of: Archive/CSS3 ---- -

CSS3 es la última evolución del lenguaje de las Hojas de Estilo en Cascada (Cascading Style Sheets), y pretende ampliar la versión CSS2.1. Trae consigo muchas novedades altamente esperadas , como las esquinas redondeadas, sombras, gradientes , transiciones o animaciones, y nuevos layouts como multi-columnas, cajas flexibles o maquetas de diseño en cuadrícula (grid layouts).

- -

Las partes experimentales son particulares para cada navegador y deberían ser evitadas en entornos de producción, o usadas con extrema precaución, ya que tanto la sintaxis como la semántica pueden cambiar en el futuro.

- -

Los módulos y el proceso de estandarización

- -

El Nivel 2 de CSS necesitó 9 años, desde Agosto de 2002 hasta Junio de 2011, para alcanzar el estado de Recomendación. Esto fué debido al hecho de que algunas características secundarias fueron retiradas de las especificaciones globales, con el fin de acelerar la normalización de las características no problemáticas, el Grupo de Trabajo CSS de la W3C, en una decisión referida como la doctrina Beijing  dividió CSS en componentes más pequeños llamados módulos cada uno de estos módulos es ahora una parte independiente del lenguaje y se dirije a la estandarización a su propio ritmo mientras algunos módulos son ya recomendados de la W3C, otros todavía son borradores iniciales tambíen se añaden nuevos módulos cuando se identifican nuevas necesidades.

- -

CSS Modules and Snapshots as defined since CSS3

- -

Formalmente, no existe un estandar de CSS3 por sí solo cada módulo es estandarizado independientemente, por lo que el estandar CSS consiste en CSS2.1 modificado y extendido por módulos terminados, no necesariamente todos con el mismo nivel numérico por tanto, puede ser definido un panorama del CSS estandar listando (enumerando) CSS2.1 y los módulos maduros.

- -

El consorcio W3 publica periodicamente ciertos snapshots(imágenes), como en 2007 o 2010.

- -

Aunque hoy en día ningún módulo con nivel mayor al 3 es estandarizado, esto cambiará en el futuro. Algunos módulos, como Selectors 4 o CSS Borders y Backgrounds nivel 4 tienen ya un borrador de edición pese a que aún  no tienen un estatus de primer borrador de trabajo.

- -

Estado de los módulos CSS

- -

Módulos estables

- -

Unos pocos módulos CSS son lo suficientemente estables y han alcanzado uno de los tres niveles de recomendación de CSSWG: Candidato (Candidate), Recomendación (Recommendation), Recomendación propuesta o Recomendación  (Proposed Recommendation or Recommendation). Estos puden ser usados sin un prefijo y son muy estables aunque algunas características aun pueden ser eliminadas de la etapa de Candidate Recommendation.

- -

Estos módulos extienden y mejoran la especificación CSS2.1 la cual construye el núcleo de la especificación. Juntos, son el snapshot actual de la especificación CSS.

- - - - - - - - - - - -
{{ SpecName("CSS3 Colors", "", "") }}{{ Spec2("CSS3 Colors") }} desde el 7 de Junio de 2011
-

Agrega la propiedad {{ cssxref("opacity") }} y las funciones hsl(), hsla(), rgba() and rgb() para crear los valores {{cssxref("<color>")}}. También define la palabra clave currentColor como un color válido.

- -

Ahora el color transparente es un color real (gracias al soporte para el canal alpha) y es un alias para rgba(0,0,0,0.0) .

- -

Deja obsoleto las keyworks del sistema de colores (system-color) las cuales ya no deberían ser usadas en ambientes de producción.

-
- - - - - - - - - - - -
{{ SpecName("CSS3 Selectors", "", "") }}{{ Spec2("CSS3 Selectors") }} desde el 29 de Septiembre de 2011
-

Agrega:

- -
    -
  • Atributo substring selector de igualdad, E[attribute^="value"] , E[attribute$="value"] , E[attribute*="value"] .
  • -
  • Nuevas pseudo-clases: {{ cssxref(":target") }}, {{ cssxref(":enabled") }} y {{ cssxref(":disabled") }}, {{ cssxref(":checked") }}, {{ cssxref(":indeterminate") }}, {{ cssxref(":root") }}, {{ cssxref(":nth-child") }} y {{ cssxref(":nth-last-child") }}, {{ cssxref(":nth-of-type") }} y {{ cssxref(":nth-last-of-type") }}, {{ cssxref(":last-child") }}, {{ cssxref(":first-of-type") }} y {{ cssxref(":last-of-type") }}, {{ cssxref(":only-child") }} y {{ cssxref(":only-of-type") }},{{ cssxref(":empty") }}, y {{ cssxref(":not") }}.
  • -
  • Los Pseudo-elementos ahora son caracterizados por un par de dos puntos en vez de sólo uno: :after ahora es {{ cssxref("::after") }}, :before ahora es {{ cssxref("::before") }}, :first-letter ahora es {{ cssxref("::first-letter") }}, y :first-line ahora es {{ cssxref("::first-line") }}.
  • -
  • El nuevo combinador general de hermanos (general sibling combinator) ( h1~pre ).
  • -
-
- -

La siguiente iteración de la especificación de Selectores ya está en progreso, aunque aún no ha alcanzado el estado de primer borrador público de trabajo.

- - - - - - - - - - - -
{{ SpecName("CSS3 Namespaces", "", "") }}{{ Spec2("CSS3 Namespaces") }} desde el 29 de Septiembre de 2011
-

Añade soporte para los nombres de espacio XML (namespaces) definiendo la noción de nombre CSS cualificado (CSS qualified name), usando la sintaxis ' | ' y agregando la regla CSS {{ cssxref("@namespace") }}.

-
- - - - - - - - - - - -
{{ SpecName("CSS3 Media Queries", "", "") }}{{ Spec2("CSS3 Media Queries") }} desde el 19 de Junio de 2012
-

Extiende los tipos anteriores de media ( print, screen, ) a un lenguaje completo permitiendo queries sobre las capacidades de  media del dispositivo como only screen y color.

- -

Los Media queries no sólo son usado en documentos CSS sino también en algunos atributos de elementos HTML, como el atributo {{ htmlattrxref("media","link") }} del elemento {{ HTMLElement("link") }}.

-
- -

La siguiente generación de esta especificación está en progreso, permitiendo adaptar un sitio Web con respecto a los métodos de entrada disponibles en el agente del usuario con las nuevas características media como hoverpointer. También está propuesta la detección de soporte EcmaScript usando media script.

- - - - - - - - - - - -
{{ SpecName("CSS3 Style", "", "") }}{{ Spec2("CSS3 Style") }} desde el 7 de Noviembre de 2013
-

Define formalmente la sintaxis del contenido del atributo global style de HTML.

-
- - - - - - - - - - - -
{{ SpecName("CSS3 Backgrounds", "", "") }}{{ Spec2("CSS3 Backgrounds") }}
-

Agrega:

- -
    -
  • Soporte en fondos para cualquier tipo de {{cssxref("<image>")}} y no solo las uri() definidas.
  • -
  • Soporte para multiples imágenes de fondo.
  • -
  • Los valores {{ cssxref("background-repeat") }} space y round, y para la sintaxis de dos-valores de esta propiedad CSS.
  • -
  • El valor local de {{ cssxref("background-attachment") }}.
  • -
  • Las propiedades CSS de {{ cssxref("background-origin") }}, {{ cssxref("background-size") }} y {{ cssxref("background-clip") }}.
  • -
  • Soporte para border curvos con las propiedades CSS {{ cssxref("border-radius") }}, {{ cssxref("border-top-left-radius") }}, {{ cssxref("border-top-right-radius") }}, {{ cssxref("border-bottom-left-radius") }}, y {{ cssxref("border-bottom-right-radius") }}.
  • -
  • Soporte para el uso de una {{cssxref("<image>")}} como borde con las propiedades CSS {{ cssxref("border-image") }}, {{ cssxref("border-image-source") }}, {{ cssxref("border-image-slice") }}, {{ cssxref("border-image-width") }}, {{ cssxref("border-image-outset") }}, y {{ cssxref("border-image-repeat") }}.
  • -
  • Soporte para sombras de elemento con la propiedad CSS {{ cssxref("box-shadow") }}.
  • -
- -

 

-
- -

El CSS4 Iteración de fondos y Especificación de bordes ya está en progreso; aunque aún no ha alcanzado el estado del Primer Borrador de Trabajo Público, este planea agregar la característica de acortar los bordes (en el  CSS {{ cssxref("border-clip") }}, {{ cssxref("border-clip-top") }}, {{ cssxref("border-clip-right") }}, {{ cssxref("border-clip-bottom") }}, y {{ cssxref("border-clip-left") }} propiedades) o controlar la forma del borde en una esquina (usandopropiedad CSS {{ cssxref("border-corner-shape") }}).

- - - - - - - - - - - -
{{ SpecName("CSS3 Multicol", "", "") }}{{ Spec2("CSS3 Multicol") }}
Se agrega soporte para el diseño fácil de multi-columnas usando 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") }}
-

Se define el tipo de dato {{cssxref("<image>")}}.

- -

Se extiende la sintaxis  de url() para dar soporte a cortes de imágenes usando media fragments.

- -

Agregados:

- -
    -
  • La unidad dppx al tipo de dato {{cssxref("<resolution>")}}.
  • -
  • La función image() como una alternativa más flexible a  url() para definir una imagen desde una URL.
    - Un riesgo : Dado el insuficiente soporte por los navegadores, la estandarización de la función image() debe ser postergada a la siguiente iteración de este módulo .
  • -
  • Soporte para linear-gradient(), repeating-linear-gradient(), radial-gradient() and repeating-radial-gradient().
  • -
  • La capacidad de definir cómo reemplazar el elemento que encaja en sus elementos, usando al propiedad CSS {{ cssxref("object-fit") }}.
    - Un riesgo : Dado el insuficiente soporte por los navegadores, la estandarización de  {{ cssxref("object-fit") }} y propiedad debe ser posterga a la siguiente iteración de este módulo.
  • -
  • La capacidad de sobreescribir la resolución y la orientacion de una imagen externa usando el CSS {{ cssxref("image-resolution") }} y {{ cssxref("image-orientation") }} .
    - RIESGO : debido al bajo soporte de los navegadores, la estandarización de {{ cssxref("image-resolution") }} y {{ cssxref("image-orientation") }} podría posponerse para la próxima iteración
  • -
-
- -

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 Syntax", "", "") }}{{ Spec2("CSS3 Syntax") }}
Precises how charsets are determined; minor changes in parsing and tokenization algorithms.
- -

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("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 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.
- -

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 syntax are tested and often implemented.

- - - - - - - - - - - -
{{ 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.
- -

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 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 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("CSS3 Exclusions and Shapes", "", "") }}{{ Spec2("CSS3 Exclusions and Shapes") }}
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/es/archive/est\303\241ndares_web/analizar_microformatos_en_javascript/index.html" "b/files/es/archive/est\303\241ndares_web/analizar_microformatos_en_javascript/index.html" deleted file mode 100644 index a187eb78c5..0000000000 --- "a/files/es/archive/est\303\241ndares_web/analizar_microformatos_en_javascript/index.html" +++ /dev/null @@ -1,201 +0,0 @@ ---- -title: Analizar microformatos en JavaScript -slug: Archive/Estándares_Web/Analizar_microformatos_en_JavaScript -tags: - - Firefox 3 - - Microformats -translation_of: Archive/Web_Standards/Parsing_microformats_in_JavaScript ---- -

Firefox 3 introduces a new API for managing and parsing microformats. This article examines the generic microformat parsing API, which handles the heavy lifting of pulling data out of a microformat. This API is primarily intended to be used when implementing new microformats.

- -

Methods

- -

dateTimeGetter()

- -

Specifically retrieves a date from a microformat node. After getting the text, it is normalized into an ISO 8601 date.

- -
normalizedDate = Microformats.parser.dateTimeGetter(propnode, parentnode);
-
- -
Parameters
- -
-
propnode
-
The DOM node to check.
-
parentnode
-
The property's parent node. If it is a subproperty, this is the parent property node. Otherwise this is the microformat node.
-
- -
Return value
- -

A string containing the normalized date.

- -

defaultGetter()

- -

Uses the microformat patterns to decide what the correct text for a given microformat property is. This includes looking at thing such as abbr, img and alt, area and alt, and value excerpting.

- -
propertyValue = Microformats.parser.defaultGetter(propnode, parentnode, datatype);
-
- -
Parameters
- -
-
propnode
-
The DOM node to check.
-
parentnode
-
The property's parent node. If it is a subproperty, this is the parent property node. Otherwise this is the microformat node.
-
datatype
-
"HTML" if the search should be done using innerHTML(), or "text" to use innerText(). The default is "text".
-
- -
Return value
- -

A string containing the property's value.

- -

emailGetter()

- -

Specifically retrieves an email address from a microformat node. This removes the subject if one is specified, as well as the mailto: prefix.

- -
email = Microformats.parser.emailGetter(propnode, parentnode);
-
- -
Parameters
- -
-
propnode
-
The DOM node to check.
-
parentnode
-
The property's parent node. If it is a subproperty, this is the parent property node. Otherwise this is the microformat node.
-
- -
Return value
- -

A string containing the email address.

- -

HTMLGetter()

- -

Retrieves all the HTML from a particular DOM node.

- -
html = Microformats.parser.HTMLGetter(propnode, parentnode);
-
- -
Parameters
- -
-
propnode
-
The DOM node to check.
-
parentnode
-
The property's parent node. If it is a subproperty, this is the parent property node. Otherwise this is the microformat node.
-
- -
Return value
- -

An object containing a function you can call to get the string and the HTML.

- -

Nota: This doesn't return the HTML as a string, but an object with a few functions you can call to retrieve the HTML and do other tasks.

- -

The functions you can call on the returned object are:

- -
string = html.toString();
-
- -

Returns a string using innerText().

- -
string = html.toHTML();
-
- -

Returns the node's HTML using innerHTML().

- -
string = html.replace(a, b);
-
- -

Returns a string in which all occurrences of a in the HTML are replaced with b.

- -
string = html.match(a);
-
- -

Performs the specified matching operation on the HTML and returns the result.

- -

iso8601FromDate

- -

Converts a JavaScript date object into an ISO 8601 formatted date.

- -
isoDate = Microformats.parser.iso8601FromDate(date, punctuation)
-
- -
Parameters
- -
-
date
-
The JavaScript Date object to convert.
-
punctuation
-
true if the date should have "-" and "/" in it.
-
- -
Return value
- -

A string containing the ISO 8601 formatted date.

- -

textGetter()

- -

Retrieves all the text from a particular DOM node, including all tags. This calls defaultGetter() internally.

- -
text = Microformats.parser.textGetter(propnode, parentnode);
-
- -
Parameters
- -
-
propnode
-
The DOM node to check.
-
parentnode
-
The property's parent node. If it is a subproperty, this is the parent property node. Otherwise this is the microformat node.
-
- -
Return value
- -

A string containing all the text from the specified microformat node, including the tags.

- -

telGetter()

- -

Specifically retrieves a telephone number from a microformat node. This handles the fact that telephone numbers use "value" as the name of one of their subproperties, but "value" is also used for value excerpting.

- -
tel = Microformats.parser.telGetter(propnode, parentnode);
-
- -
Parameters
- -
-
propnode
-
The DOM node to check.
-
parentnode
-
The property's parent node. If it is a subproperty, this is the parent property node. Otherwise this is the microformat node.
-
- -
Return value
- -

A string containing the telephone number.

- -

uriGetter()

- -

Specifically retrieves a URI from a microformat node. This is done by looking at an href, img, object, or area to get the fully-qualified URI.

- -
uri = Microformats.parser.uriGetter(propnode, parentnode);
-
- -
Parameters
- -
-
propnode
-
The DOM node to check.
-
parentnode
-
The property's parent node. If it is a subproperty, this is the parent property node. Otherwise this is the microformat node.
-
- -
Return value
- -

A string containing the fully-qualified URI.

- -

See also

- -

Using microformats, Describing microformats in JavaScript

diff --git "a/files/es/archive/est\303\241ndares_web/crear_microformatos_en_javascript/index.html" "b/files/es/archive/est\303\241ndares_web/crear_microformatos_en_javascript/index.html" deleted file mode 100644 index 3fb594f13b..0000000000 --- "a/files/es/archive/est\303\241ndares_web/crear_microformatos_en_javascript/index.html" +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Crear microformatos en JavaScript -slug: Archive/Estándares_Web/Crear_microformatos_en_JavaScript -tags: - - Firefox 3 - - Microformats - - páginas_a_traducir -translation_of: Archive/Web_Standards/Describing_microformats_in_JavaScript ---- -

Los microformatos son descritos en JavaScript usando un formato de estructura estandarizada que tiene varios miembros estándar que describen el objeto.

- -

Formato de definición de microformatos

- -

La definición de microformatos debe contener las siguientes entradas:

- -
-
mfVersion
-
Especifica el numero de versión del microformato API a la definición de la cual fue escrita. Para Firefox 3, este debe ser fijado a 0.8.
-
mfObject
-
El objeto JavaScript que implementa el microformato.
-
className
-
Una cadena especificando el nombre de las clase de microformato como es referenciada en HTML (class="className").
-
required
-
Un areglo indicando los nombres de todas las propiedades que deben ser especificadas. Este debe ser omitido si todas las propiedades son opcionales.
-
properties
-
Una estructura describiendo las propiedades del microformato.
-
- -

Especificaciones de las propiedades

- -

Cada propiedad en la estructura properties es especificada por su nombre, y debe incluir atributos adicionales si la propiedad lo requiere. Los atributos estándar son:

- -
-
plural
-
Un valor booleano que, si  es true indica que la propiedad puede tener multiples valores. Si una propiedad es plural, este es retornado como un arreglo.
-
virtual
-
Un valor booleano que indica si la propiedad es virtual o no. Si esta es virtual, el metodo virtualGetter() sera llamado para intentar crear la propiedad si esta no existe.
-
virtualGetter
-
Una funcion que es creada para conseguir el valor de una propiedad virtual. Esta función es usada solo si virtual es true.
-
value
-
El valor por defecto de la propiedad.
-
subproperties
-
Es posible para una propiedad incluir en si misma mas propiedades; para hacer esto, se deben incluir en una estructura subproperties dentro de la propiedad.
-
dataType
-
El tipo de dato contenido por la propiedad. Los posibles valores son:
-
dateTime
-
Una fecha ISO
-
anyURI
-
Un URI
-
email
-
Una dirección de correo electrónico.
-
tel
-
Un numero de teléfono.
-
HTML
-
HTML incluyendo etiquetas.
-
float
-
Un numero de punto flotante.
-
microformat
-
Un microformato.
-
microformat_property
-
Una propiedad especifica dentro del microformato especificada por microformat.
-
custom
-
datos de aduana.
-
- -

Un ejemplo simple

- -

El microformato hCard para definir información de contactos hace uso del microformato adr para definir una dirección. el microformato adr es definido a continuación:

- -
var adr_definition = {
-  mfVersion: 0.8,
-  mfObject: adr,
-  className: "adr",
-  properties: {
-    "type" : {
-      plural: true,
-      types: ["work", "home", "pref", "postal", "dom", "intl", "parcel"]
-    },
-    "post-office-box" : {
-    },
-    "street-address" : {
-      plural: true
-    },
-    "extended-address" : {
-    },
-    "locality" : {
-    },
-    "region" : {
-    },
-    "postal-code" : {
-    },
-    "country-name" : {
-    }
-  }
-};
-
- -

Las propiedades aqui son absolutamente simples. La propiedad type indica el tipo de dirección representada por el objeto (trabajo, hogar, y asi sucesivamente). Desde que la propiedad plural sea true, multiples tipos pueden ser especificados. Esto permite a una dirección ser marcada como sea, por ejemplo, una dirección de trabajo para recibir paquetes.

- -

La propiedad street-address es tambien plural. Esto permite que multiples líneas de información sean contenidas en el arreglo street-address.

- -

El microformato esta registrado con el microformato API llamando Microformats.add(), como este:

- -
Microformats.add("adr", adr_definition);
-
- -

Nota:  Para ser claro: desde que el  microformato adr esta incluido por defecto en Firefox 3 y posteriores, usted no necesita agregarlo por si mismo si necesita usarlo.

- -

Ver tambien

- -

Using microformats, Parsing microformats in JavaScript

diff --git "a/files/es/archive/est\303\241ndares_web/index.html" "b/files/es/archive/est\303\241ndares_web/index.html" deleted file mode 100644 index 2f6362a8af..0000000000 --- "a/files/es/archive/est\303\241ndares_web/index.html" +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Estándares Web -slug: Archive/Estándares_Web -tags: - - Estándares_Web -translation_of: Archive/Web_Standards ---- -

-

-
Estándares Web del W3C
-Una magnífica introducción al tema

Los estándares web se diseñan cuidadosamente para aportar las máximas ventajas al mayor número de usuarios, y aseguran la viabilidad a largo plazo de cualquier documento publicado en la Web. Diseñar y publicar con arreglo a estos estándares simplifica y reduce los costes de producción, Además, los sitios son accesibles a más gente, y a más tipos de dispositivos con acceso a Internet.[1]

La entidad encargada de crear, mantener y divulgar los estándares web es el W3C.

-
-

Documentación

-
Ventajas para los negocios del uso de estándares web -
Ser fiel a los estándares web, y dejar de lado las tecnologías propietarias puede contribuir a los objetivos comerciales de una compañía. -
-
El W3C de la A a la Z -
Documento cuyo objetivo principal es ofrecer una descripción breve y sencilla sobre las diferentes tecnologías del W3C, proporcionando así a los usuarios una mejor comprensión de las mismas. -
-
10 razones para usar los estándares -
Traducción del artículo sobre porqué aprender y usar estándares web -
-
¿Qué es el Consorcio World Wide Web? -
El W3C, en mil ocasiones habrás leido estas siglas, pero... ¿Qué hay detrás? -
-
Using Web Standards in your Web Pages (en) -
This article provides an overview of the process for upgrading the content of your web pages to conform to the W3C web standards. -
-

Ver Todos -

-
-

Comunidad

-
  • En la comunidad Mozilla... -
-

-

- -

Ver Todos -

-

Herramientas

- - -

Ver Todos -

-

Temas relacionados

-
CSS, HTML, XML, Desarrollo Web -
-
-
-

Nota: 1
- The Web Standards Project -

Categorías -

Interwiki Language Links -


-

diff --git "a/files/es/archive/est\303\241ndares_web/preguntas_frecuentes_sobre_rdf_en_mozilla/index.html" "b/files/es/archive/est\303\241ndares_web/preguntas_frecuentes_sobre_rdf_en_mozilla/index.html" deleted file mode 100644 index cd499f080a..0000000000 --- "a/files/es/archive/est\303\241ndares_web/preguntas_frecuentes_sobre_rdf_en_mozilla/index.html" +++ /dev/null @@ -1,446 +0,0 @@ ---- -title: Preguntas frecuentes sobre RDF en Mozilla -slug: Archive/Estándares_Web/Preguntas_frecuentes_sobre_RDF_en_Mozilla -tags: - - RDF - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Archive/Web_Standards/RDF_in_Mozilla_FAQ ---- -

General

- -

¿Por dónde empiezo?

- -

RDF cumple dos objetivos primarios en Mozilla.

- - - - - -

RDF en cincuenta palabras o menos es una rápida y muy buena descripción de qué hace RDF en Mozilla.

- -

El documento RDF Arquitectura final describe con muchos más detalles como trabaja la conexión Mozilla y RDF, y da una explicación de los interfaces implicados.

- -

Donde puedo encontrar información sobre Open Directory ("dmoz")?

- -

Aquí no, desafortunadamente. Bien, aquí hay un poco... Debes empezar en http://www.dmoz.org/ para mas información acerca de Open Directory. El set de datos Open Directory está disponible como un, enorme, depósito RDF/XML. Describe miles de sitios Web que usan un mix de vocabulario de Dublin Core y de la "taxonomía" DMoz. Para más información mira sus páginas RDF, o los anuncios odp-rdf para actualizaciones relacionados con su formato de datos exacto. El sitio ChefMoz también esta disponible en RDF.

- -

Si tienes problemas con los datos DMoz y ChefMoz, será mejor que contactes directamente esos proyectos. Pero si haces algo interesante con los contenidos (ej. cargando pedazos de los datos desde un sitio remoto hacia una interface de usuario XUL), no olvides hacerlo saber a las listas de mozilla-rdf y RDF Interest Group. Estas listas también estarán interesadas en herramientas para limpieza / re-procesamiento y almacenaje de datos DMoz. Para algunos directorios basados en ODP RDF puedes mirar las páginas de los sitios que usan ODP Data.

- -

Qué es un datasource?

- -

Generalmente, RDF puede ser visto desde dos puntos de vista: Como un gráfico con nodos y arcos, o como una sopa de declaraciones lógicas. Un datasource es un subgráfico (o coleccíon de declaraciones, dependiendo de tu punto de vista) que por alguna razón están recolectadas todas juntas. Los ejemplos de datasources que existen hoy en día son "marcadores de browser", "historial de navegación", "cuentas de correo IMAP", "servidores de noticia NNTP", y "archivos RDF/XML".

- -

En Mozilla, las datasources pueden unirse usando composite data source. Es como superponer gráficos, o unir una colección de declaraciones ("microteorías"). Las declaraciones acerca de del mismo recurso RDF pueden ser mezcladas. Por ejemplo, "la última fecha de visita" de un sitio en particular proviene del historial de navegación, y el "atajo de teclado" que puedes usar para ese sitio proviene de los marcadores. Ambos datasources refieren al website a través del URL, esta es la "clave" que permite que el datasource sea mezclado con efectividad.

- -

Para mas información acerca de como escribir un datasource por favor remitete a RDF Datasource How-To.

- -

Cómo administra los datasource Mozilla?

- -

El RDF service administra una tabla con todos los datasources cargados. A la tabla se le asigna una URI, que es algo asi como la URL del archivo RDF/XML, o una URI "especial" que empieza con rdf que hace referencia a un datasource Built-in.

- -

Los datasources se pueden cargar a traves del servicio RDF, utilizando el método GetDataSource(). Si el argumento URI hace referencia a la URL de un archivo RDF/XML, entonces el servicio creará un datasource RDF. El datasource permanecerá "capturado" hasta que la última referencia al datasource sea liberada. Si el argumento URI hace referencia a un datasource Built-in, el servicio RDF utilizará el administrador de componentes XPCOM para cargar el componente cuya ContractID ha sido hecha utilizando la URI "especial" y el bien conocido prefijo@mozilla.org/rdf/datasource;1?name=.

- -

Por ejemplo:

- -

 

- -
rdf:foo
-
- -

que cargará:

- -
@mozilla.org/rdf/datasource;1?name=foo
-
- -

Igual que los datasources RDF/XML, un datasource que es respondida de esta manera, será "capturada" por el servicio RDF hasta que la última referencia es soltada.

- -

Cómo creo datasources desde un archivo RDF/XML?

- -

Puedes crear un datasource RDF/XML usando el método GetDataSource() del servicio RDF:

- -
// Obten el servicio RDF
-var RDF =
-  Components
-  .classes["@mozilla.org/rdf/rdf-service;1"]
-  .getService(Components.interfaces.nsIRDFService);
-// ...y desde allí, Obten el datasource. Aségurat de que el servidor web lo entregue como
-// text/xml (recomendado) o como text/rdf!
-var ds = RDF.GetDataSource("http://www.mozilla.org/some-rdf-file.rdf");
-// NOTA que  ds será cargado desincronizadamente, asi que los aciertos no serán
-// inmediatos
-
- -

O puedes crear uno utilizando el administrador de componentes XPCOM directamente, Aquí hay un ejemplo.

- -
// Crear un archivo RDF/XML usando el administrador de componentes XPCOM
-var ds =
-  Components
-  .classes["@mozilla.org/rdf/datasource;1?name=xml-datasource"]
-  .createInstance(Components.interfaces.nsIRDFDataSource);
-// La interface nsIRDFRemoteDataSource tiene las interfaces
-// que necesitamos para configurar el datasource.
-var remote =
-   ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
-// Asegúrate de que el servidor entregue esto como text/xml (recomendado) o como text/rdf!
-remote.Init("http://www.mozilla.org/some-rdf-file.rdf");
-// Cárgalo! fijate que esto ocurrira desicronizadamente. Configura
-// aBlocking a true, podemos forzarlo pra que sea sincronizado pero
-// generalmente es una mala idea, porque se bloqueará tu interface de usuario!
-remote.Refresh(false);
-// NOTA queds será cargado desincronizadamente, los aciertos no
-// serán inmediatos
-
- -

Si deseas que se cargue de forma sincronizada, deberías crearlo manualmente.

- -

Cómo actualizo un datasource RDF/XML?

- -

Puedes forzar un datasource RDF/XML (o cualquier datasource que soporte nsIRDFRemoteDataSource) utilizando el método Refresh()de nsIRDFRemoteDataSource. Refresh() tiene un solo parámetro que indica si te gustaría realizar la operacíon sincronizadamente ("blocking") o desincronizadamente ("non-blocking"). Nunca lo hagas sincronizadamente, a menos que sepas lo que estás haciendo, esta opción bloqueará la interfaz de usuario hasta que la carga sea completada.

- -

Cómo sé si un datasource RDF/XML se cargó?

- -

Es posible consultar la propiedad loaded utilizando la interfaz nsIRDFRemoteDataSource para determinar si el datasource está cargado o no.

- -

 

- -
// Obtén el servicio RDF
-var RDF =
-  Components
-  .classes["@mozilla.org/rdf/rdf-service;1"]
-  .getService(Components.interfaces.nsIRDFService);
-// Obtén el datasource.
-var ds = RDF.GetDataSource("http://www.mozilla.org/some-rdf-file.rdf");
-// Ahora mira si se cargó o no...
-var remote =
-  ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
-
-if (remote.loaded) {
-  alert("El datasource ya está cargado!");
-}
-else {
-  alert("El datasource no se cargó, pero se está cargando ahora!");
-}
-
- -

Digamos que el datasource no está cargado, y se está cargando desincronizadamente. Podríamos usar esta API y el setTimeout() de JavaScript para realizar un loop que chequee la propiedad loaded de forma continua. Sería malo no detectar una carga fallida, por ejemplo, que no hubiera ningun dato en le URL.

- -

Por esta razón, hay una interfaz observadora que te permite espiar el progreso del datasource. El siguiente código ilustra como usarlo.

- -

 

- -
// Este es el objeto que observará el progreso de RDF/XML
-var Observer = {
-  onBeginLoad: function(aSink)
-    {},
-
-  onInterrupt: function(aSink)
-    {},
-
-  onResume: function(aSink)
-    {},
-
-  onEndLoad: function(aSink)
-    { alert("done!"); },
-
-  onError: function(aSink, aStatus, aErrorMsg)
-    { alert("error! " + aErrorMsg); }
-};
-// obtén el servicio RDF
-var RDF =
-  Components
-  .classes["@mozilla.org/rdf/rdf-service;1"]
-  .getService(Components.interfaces.nsIRDFService);
-// Obtén el datasource.
-var ds = RDF.GetDataSource("http://www.mozilla.org/some-rdf-file.rdf");
-// ahora mira si se cargó o no...
-var remote =
-  ds.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
-
-if (remote.loaded) {
-  alert("El datasource ya está cargado!");
-}
-else {
-  alert("El datasource no se cargó, pero se está cargando  ahora!");
-  // los datasources RDF/XML son nsIRDFXMLSinks
-  var sink =
-    ds.QueryInterface(Components.interfaces.nsIRDFXMLSink);
-  // Adjunta el observador al  datasource
-  sink.addXMLSinkObserver(Observer);
-  // ahora serán llamados del métodos del  Observador como
-  // los progresos de carga.
-}
-
- -


- Nota que el observador permanecerá unido al datasource RDF/XML a menos que llamemos a XMLSinkObserver

- -

Cómo accedo a la información de un datasource?

- -

La interfaz nsIRDFDataSource es lo que te permitirá acceder y manipular las declaraciones en un datasource.

- - - -

También puedes usar la interfaz RDF container para acceder a la información contenida en contenedores RDF.

- -

Cómo cambio información en un datasource?

- -

Usa "Assert" para agregar una declaración y "Unassert" para quitar una. Mira Mozilla RDF Back end Architecture

- -
ds.Assert(homepage, FV_quality, value, true);
-ds.Unassert(homepage, FV_quality, value, true);
-
- -

Cómo guardo los cambios en un datasource?

- -

Se puede hacer QueryInterface a nsIRDFRemoteDataSource con un datasource. Esta interfaz tiene un método Flush() que re-escribe los contenidos de un datasource nuevamente hacia la URL desde donde fueron cargados. Usando un mecanismo de protocolo específico (ej. un file: URL simplemente escribe el archivo, un http: URL probablemente hará un HTTP-POST). Flush() sólo escribe el datasource si el contenido ha cambiado.

- -

Cómo úno varios datasource para verlos cómo uno solo?

- -

Utiliza nsIRDFCompositeDataSource. Esta interfaz proviene de nsIRDFDataSource. Implementar esta interfaz combinará las declaraciones de distintos datasources dentro de uno colectivo. Como la interfaz nsIRDFCompositeDataSource proviene de nsIRDFDataSource, puede ser llamada y modificada igual que un data source.

- -

Cómo accedo a datasources "built-in"?

- -

Un datasource buitl-in es un componente localmente-instalado que implementa nsIRDFDataSource. Por ejemplo, el servicio de marcadores. Primero, asegúrate de que eres capaz de acceder a un datasource haciendo click aquí. Hay grandes restricciones de seguridad para acceder a un datasource desde un XUL o JS "desconocido".

- -

Como el datasource built-in es nada mas que un componente XPCOM, puedes acceder utilizando el componente administrador XPConnect.

- -
// Usa el administrador de componentes para obtener los // marcadores
-var bookmarks =
-  Components.
-  classes["@mozilla.org/rdf/datasource;1?name=bookmarks"].
-  getService(Components.interfaces.nsIRDFDataSource);
-
-// Ahora haz algo con eso...
-if (bookmarks.HasAssertion(
-     RDF.GetResource("http://home.netscape.com/NC-rdf#BookmarksRoot"),
-     RDF.GetResource("http://home.netscape.com/NC-rdf#child"),
-     RDF.GetResource("http://home.netscape.com/NC-rdf#PersonalToolbarFolder"),
-     true) {
-  // ...
-}
-
- -

Algunos datasources tienen ContractID "especiales" que hacen más fácil el acceso utilizando el método GetDataSource() de nsIRDFSerivce o el atributo datasource de una plantilla XUL. Estos ContractID son de:

- -
@mozilla.org/rdf/datasource;1?name=name
-
- -

Y son accesibles via GetDataSource y el atributo datasources usando rdf:name. Por ejemplo, el siguiente fragmento XUL muestra como colocar el servicio de marcadores dentro de una plantilla XUL.

- -
<tree datasources="rdf:bookmarks">
-  ...
-</tree>
-
- -

Cómo manipulo "contenedores" RDF?

- -

Para manipular un "contenedor" RDF (un <rdf:SEq>, por ejemplo) puedes utilizar nsIRDFContainerUtils la cual puede ser llamada como un servicio a tráves del siguiente ContratID:

- -
@mozilla.org/rdf/container-utils;1
-
- -

Puedes usarlo para detectar si algo es un contenedor RDF utilizando IsSeq(), IsBag(), IsAlt(). Puedes "crear un recurso dentro de un contenedor", sino hubiera uno, utilizando MakeSeq(), MakeBag(), MakeAlt(). Estos métodos devuelven nsIRDFContainer que te permitirá hacer operaciones tipo-contenedor sin ensuciarte las manos.

- -

Si tu datasource ya posee un objeto que es un contenedor RDF, puedes usar el objeto nsIRDFContainer con:

- -
@mozilla.org/rdf/container;1
-
- -

Utiliza COntractID y Init() con el datasource y el recurso como parámetros. Nota que esto fallará si el recurso todavia no es un contenedor.

- -

Plantillas XUL

- -

Las plantillas XUL se crean especificando un atributo datsource sobre un elemento en un documento XUL.

- -

Hay dos "formas" de escribir plantillas XUL. La "simple", que es la mas comun en Mozilla, y la "extendida", que pertime mayor concordancia contra gráficos RDF. Mira también XUL:Template Guide (está ordenado de forma bizarra porque se intenta introducir primero la forma extendida, y luego la forma simple como una especie de simplificación de la forma extendida).

- -

¿Qué puedo construir con una plantilla XUL?

- -

Puedes construir cualquier clase de contenido usando una plantilla XUL. Puedes utilizar cualquier clase de etiqueta (incluso HTML o XML arbitrario) en la parte <action> de un <rule>.

- -

Cuándo debo utilizar una plantilla XUL?

- -

Una alternativa al uso de plantillas RDF y XUL es el uso de W3C DOM APIs, para crear y manipular modelos de contenido XUL (o HTML). Sin embargo, algunas veces suelen presentarse algunos incovenientes:

- -
    -
  1. hay distintas </em>"vistas" de los datos</em>. Por ejemplo, Mozilla mail/news muestra la jerarquía de carpeta en la barra de herramientas, varios menues, y en algunas ventana de diálogo. Mejor que escribir tres pedazos de código JS (o C++) para construir los árboles DOM, uno para cada modelo de contenido, <menubutton>, <menu> y <tree>, seria que escribas tres sets compactos de reglas.
  2. -
  3. Los datos pueden cambiar. Por ejemplo un usuario de mail/news tal vez agregue o quite carpetas IMAP (nota como estos requerimientos complican la construcción de modelos de contenido) La plantila de construcción XUL utiliza reglas para mantener sincronizados, de forma automática, todos los modelos de contenidos acorde a tus cambios.
  4. -
- -

Para poder tener la ventaja de estas funciones, debes ser capaz de expresar tu información en términos de RDF datasource API ya sea usando el built-in memory datasource, usando RDF/XUL para almacenar tu información, o escribiendo tu propia implementación de nsIRDFDataSource

- -

Qué es lo que se carga cuando especifico "datasource=" ?

- -

En el "root" de una plantilla, el atributo datasources especifica que se debe cargar una lista de URIs datasource que están separadas por un espacio en blanco. Pero, qué es una "URI datasource"? Puede ser:

- - - -

En ambos casos, los datasources se cargan usando el método GetDataSource() de nsIRDFService asi que será manejado de igual manera para todos los datasources que asi se carguen.

- -

Cuál es el modelo de seguridad para RDF/XML en XUL?

- -

El documento XUL que es cargado de una URL "confiable" (cualquier chrome: URL) puede especificar cualquier URI datasource en el atributo datasources de la plantilla XUL.

- -

El documento que es cargado desde una URL "no confiable", puede especificar solo un documento RDF/XML desde el mismo codebase (en el significado de Java) donde se origino el documento XUL. Los datasources que no son "especiales" (ej. rdf:) se cargarán desde un XUL "no confiable".

- -

Cómo agrego un datasource a una plantila XUL?

- -

Si bien es posible crear una plantilla XUL con un conjunto de datasources "implicitos" especificando el atributo datasource, abrá veces que no sabrás que datasource cargar hasta que la XUL esté cargada. Por ejemplo, tu XUL tal vez necesite computar el datasource que se desea mostrar en un manejador onload. O, tal vez necesites agregar datasources basado en la acción de un usuario.

- -
<window xmlns="http://www.mozilla.org/keymaster/gat...re.is.only.xul">
-  ...
-  <tree id="my-tree" datasources="rdf:null">
-    ...
-  </tree>
-  ...
-</window>
-
- -

Asumiendo que hemos adquirido el datasource de alguna manera (ej. así), el sig. ejemplo muestra cómo agregar un datasource a una plantila, y luego, forzar a la plantilla a reconstruirse basada en los nuevos contenidos agregados.

- -
var ds = /* asumimos que tienes esto! */;
-// Obten el elemento DOM para 'my-tree'
-var tree = document.getElementById('my-tree');
-// agregamos nuestro datasource
-tree.database.AddDataSource(ds);
-// Forza al arbol a reconstruirse *ahora*. debes hacerlo "manual"!
-tree.builder.rebuild();
-
- -

Cualquier elemento XUL con un atributo datasources "tendrá" una propiedad database y una builder. La primera refiere a un objeto nsIRDFCompositeDataSource que contiene los datasources desde donde son contruidas las plantillas.

- -

La segunda propiedad refiere a un objeto nsIXULTemplateBuilder que es el "generador" que mantiene el estado de los contenidos de la plantilla.

- -

Nota que el datasource rdf:null es un datasource especial que nos dice "hey, no tenemos un datasource todavía, pero vamos a agregar uno mas tarde, chequéalo!". Esto hace que database y builder se instalen, pero deja a database vacía de datasources, debes agregarlos tú mismo!

- -

Puedo manipular plantillas XUL usando las APIs DOM?

- -

Sí! puedes agragar, quitar reglas, cambiar las condiciones de una regla y cambiar el contenido que es generado por una regla. De hecho, puedes cambiar cualquier cosa de una plantilla usando W3C DOM APIs.

- -

Eso si, debes llamar a rebuild() para que los cambios hagan efecto (del mismo modo que lo haces si agregas un datasource a una plantilla XUL).

- -

Cómo agrego texto plano desde una plantilla?

- -

Para agregar texto plano desde una plantilla usa el elemento <text>.

- -
<template>
-  <rule>
-    <conditions>...</condition>
-    <bindings>...</bindings>
-    <action>
-      <text value="?alguna-variable" />
-    </action>
-  </rule>
-</template>
-
- -

La plantilla arriba creará un modelo de contenido que ejecutará series de nodos de texto.

- -

Solución de problemas

- -

Trucos y secretos sobre el tema.

- -

Mi archivo RDF/XML no carga.

- -

La causa mas usual de este problema es un tipo de MIME incorrecto. Asegúrate que tu servidor esté enviando el archivo como text/xml (recomendado) o como text/rdf.

- -

Nota que W3C RDF Core WG está registrando application/rdf+xml, aunque esto no funciona con ningún código Mozilla. (tenemos algún bug registrado para rastrear esto? -- danbri)

- -

Otro problema posible: para XUL y RDF cargado de forma remota tal vez necesites ajustar las restricciones de seguridad de Mozilla (mira más abajo para ejemplos). Si XUL no está cargando tu RDF, y el tipo MIME está OK, tal vez este sea el problema.

- -

Puedes usar los utilitarios rdfcat y rdfpoll para verificar que RDF/XML son válidos. Estos programas son generados en Windows por defecto, y en Linux cuando especificas configure --enable-tests.

- - - -

Ambos programas son lentos para cargar y ejecutarse (pero se ejecutarán). Inician XPCOM y hacen que Necko pueda cargar y procesar URLs igual que lo hace Mozilla.

- -

No sucede nada cuando llamo AddDataSource.

- -

Nota que el generador de la plantilla no regenera automaticamente el contenido de una plantilla después de AddDataSource o RemoveDataSource, debe ser llamado desde database del generador. Debes llamar elt.builder.rebuild() manualmente para actualizar los contenidos de la plantilla

- -

Por qué? Esto se diseño para que no se produzcan múltiple re-generaciones cuando más de un datasource es agregado a la database.

- -

Ejemplos

- -

Donde puedo encontrar algunos ejemplos?

- -

Aquí hay algunos, son ejecutables directamente desde HTTP.

- -

Mira también duplicates.rdf (directo desde Mozilla) también duplicates.xul. Nota que debes alivianar el modelo de seguridad de Mozilla para que funcionen. Para hacerlo, agrega la siguiente línea al archivo de preferencias. (primero debes reiniciar Mozilla para que escriba el archivo)

- -
user_pref("signed.applets.codebase_principal_support", true);
-
- -

Te preguntará si permites a los scripts en duplicates.xul accerder XPConnect, responde que SÍ.

- -

Actualmente Mozilla no permite acceso a las interfaces y servicios RDF sin previlegios, mira el bug 122846 para detalles.

- -

Por favor comunicate via mail con danbri si crees que deberíamos colocar algún otro link

- -

Notas

- -
    -
  1. Mira también W3C RDF y Semantic Web para más información acerca de RDF y tecnologías relacionadas.
  2. -
- -

Contribuyentes

- - - - - -

Autor: Chris Waterson

- -
-

Información sobre documento original

- -
- -
- -

Categorías

- -

Interwiki Language Links

- -

 

- -
 
-
diff --git "a/files/es/archive/est\303\241ndares_web/usando_el_marcado_correcto_para_llamar_a_los_plugins/index.html" "b/files/es/archive/est\303\241ndares_web/usando_el_marcado_correcto_para_llamar_a_los_plugins/index.html" deleted file mode 100644 index 11aa4d9829..0000000000 --- "a/files/es/archive/est\303\241ndares_web/usando_el_marcado_correcto_para_llamar_a_los_plugins/index.html" +++ /dev/null @@ -1,268 +0,0 @@ ---- -title: Usando el marcado correcto para llamar a los plugins -slug: Archive/Estándares_Web/Usando_el_marcado_correcto_para_llamar_a_los_plugins -tags: - - HTML - - Plugins - - Todas_las_Categorías -translation_of: Archive/Web_Standards/Using_the_Right_Markup_to_Invoke_Plugins ---- -

Este artículo habla de cómo llamar correctamente a un plugin usando HTML. Habla de los elementos object y embed y muestra detalles sobre cómo llamar a aplicaciones Java con HTML en aplicaciones web.

- -

El elemento <object>: Estándares W3C y los navegadores

- -

El elemento object es parte de la especificación HTML 4.01, y es el mecanismo recomendado para llamar a los plugins. Su uso esta condicionado a unas pocas advertencias de las que esta sección habla.

- -

Tradicionalmente, el elemento object ha sido usando de forma diferente por Microsoft Internet Explorer y los navegadores basados en Mozilla como Netscape 7. En IE, el elemento object es usado para llamar a un plugin creado con la arquitectura ActiveX. Aquí vemos un ejemplo de este tipo de uso por parte de IE:

- -
<!-- IE ONLY CODE -->
-<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
-codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
-width="366" height="142" id="myFlash">
-    <param name="movie" value="javascript-to-flash.swf" />
-    <param name="quality" value="high" />
-    <param name="swliveconnect" value="true" />
-</object>
-
- -

En el ejemplo de arriba, el atributo classid que va junto al elemento object apunta a un URN "clsid:" seguido de un único identificador de un control ActiveX (en el ejemplo de arriba, la cadena que comienza por "D27..."). Esto es, de hecho, el identificador único del plugin de Macromedia's Flash, y los desarrolladores se supone que conocen esos identificadores únicos para llamar al componente de su elección. El atributo codebase usado arriba apunta a la localización donde está el archivo CAB que contiene el control del ActiveX. En este contexto, el atributo codebase se usa como mecanismo de obtención (es decir, una forma de obtener el controlador si no esta presente). Si el control de ActiveX de Flash no está instalado, IE irá entonces a la URL indicada en el atributo codebase y obtendrá el control de ActiveX. Los elementos param adicionales (que son "hijos" del elemento object) especifican los parámetros de configuración para el plugin de Flash. Por ejemplo, param name="movie" indica al plugin de Flash la localización del archivo SWF para empezar a reproducirlo.

- -

Con la salida de Netscape 7.1, este tipo de uso de elementos object de ActiveX está soportado con el uso del Microsoft® Windows Media Player. Sólo el Windows Media Player está soportado como control de ActiveX en Netscape 7.1. Los detalles se indican en otro artículo.

- -

Navegadores como Netscape 7 no renderizarán el plugin Flash si se usa el marcado de arriba, porque Netscape 7 no soporta llamadas a componentes ActiveX o basados en ActiveX, con la excepción del Windows Media Player en Netscape 7.1. Los navegadores basados en Mozilla soportan la arquitectura de plugin de Netscape, los cuales no estan basados en COM como el ActiveX (y por ello, no son llamados vía identificador único) sino basados en el tipo MIME. Los navegadores basados en Mozilla suportan el uso del elemento object junto con el tipo MIME. A continuación se muestra un ejemplo de este uso, una vez más para el plugin de Macromedia Flash:

- -
<object type="application/x-shockwave-flash" data="javascript-to-flash.swf"
-width="366" height="142" id="myFlash">
-    <param name="movie" value="javascript-to-flash.swf" />
-    <param name="quality" value="high" />
-    <param name="swliveconnect" value="true" />
-    <p>You need Flash -- get the latest version from
-    <a href= "http://www.macromedia.com/downloads/">here.</a></p>
-</object>
-
- -

En el ejemplo anterior, application/x-shockwave-flash es el tipo MIME de Flash e invocará la arquitectura Flash específica de Netscape en navegadores basados en Mozilla. Los punteros de atributos que apuntan al fichero SWF a ejecutar, y los parámetros de configuración (los elementos param) son ambos usados de una forma consistente por IE y por los navegadores basados en Mozilla como Netscape 7. De hecho, lo visto anteriormente también funcionará para IE, que interpreta las invocaciones de tipo MIME para ciertos tipos MIME como Flashademás de las invocaciones del estilo ActiveX classid.

- -

Debido a que el uso de los tipos MIME para Flash funcionará tanto para IE como para Netscape 7, se puede usar el código anterior el plugin de Flash tanto en IE como en Netscape 7. Sin embargo, hay algunas advertencias que los desarrolladores deben tener en cuenta cuando usen el elemento object en navegadores basados en Mozilla como es Netscape 7 y en IE:

- -

Advertencias

- - - - - -
<!-- Usage Will Not Work As Intended -->
-<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
-codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
-width="366" height="142" id="myFlash">
-    <param name="movie" value="javascript-to-flash.swf" />
-    <param name="quality" value="high" />
-    <param name="swliveconnect" value="true" />
-
-	<object type="application/x-shockwave-flash" data="javascript-to-flash.swf"
-	 width="366" height="142" id="myFlashNSCP">
-		<param name="movie" value="javascript-to-flash.swf" />
-    		<param name="quality" value="high" />
-    		<param name="swliveconnect" value="true" />
-		<p>You need Flash -- get the latest version from
-		 <a href="http://www.macromedia.com/downloads/">
-		here.</a></p>
-	</object>
-
-</object>
-
- - - - - -

Recomendaciones

- -

Para superar el inconveniente de no poder anidar elementos object en IE y de no existir el modo de usar simplemente un elemento object de modo multiplataforma (con mecanismos de obtención específicos de la arquitectura), la mejor solución es escribir elementos object dinámicamente basándose en la arquitectura. Por ejemplo, en los navegadores que soportan ActiveX como IE, creando un elemento con un atributo classid y en navegadores que soportan la arquitectura de plugins de Netscape, usando un tipo MIME. A continuación se muestra un ejemplo en JavaScript que ilustra esto:

- -
if (window.ActiveXObject)
-{
-
-// browser supports ActiveX
-// Create object element with
-// download URL for IE OCX
-
-document.write('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"');
-document.write(' codebase="http://download.macromedia.com');
-document.write('/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"');
-document.write(' width="366" height="142" id="myFlash">');
-document.write(' <param name="movie" value="javascript-to-flash.swf" />');
-document.write(' <param name="quality" value="high" />');
-document.write(' <param name="swliveconnect" value="true" />');
-document.write('<\/object>');
-
-}
-
-else
-{
-
-// browser supports Netscape Plugin API
-
-document.write('<object id="myFlash" data="javascript-to-flash.swf"');
-document.write(' type="application/x-shockwave-flash"');
-document.write(' width="366" height="142">');
-document.write('<param name="movie" value="javascript-to-flash.swf" />');
-document.write('<param name="quality" value="high" />');
-document.write('<param name="swliveconnect" value="true" />');
-document.write('<p>You need Flash for this.');
-document.write(' Get the latest version from');
-document.write(' <a href="http://www.macromedia.com/downloads">here<\/a>.');
-document.write('<\/p>');
-document.write('<\/object>');
-
-}
-
- -

Véase también: Flash Satay

- -

El elemento object y Java

- -

Los navegadores basados en Mozilla como Netscape 6.x, Netscape 7 y CompuServe 7 vienen con el plugin para Java que Sun proporciona. Los usuarios que instalen Netscape 6.x o Netscape 7 tienen la opción de instalar o no Java. A diferencia de Netscape Communicator 4.x, Netscape 6.x y 7 que no tienen por defecto una máquina virtual Java -- ellos dependen del plugin de Sun. Durante la época de Netscape Communicator 4.x, Netscape Communications solía desarrollar una máquina virtual Java que soportaba Java 1.5.0 y anterior. Ahora, con Netscape 6 y 7, la máquina virtual Java es un plugin de Sun. Netscape ya no desarrolla o incluye una máquina virtual Java por defecto con el nevegador.

- -

El plugin para Java de Sun puede ser invocado por el elemento object, como cualquier otro plugin. Una vez más, Internet Explorer típicamente invoca el plugin de forma que el elemento object es usado conjuntamente con el atributo classid que apunta a un identificador único ActiveX. Cada versión superior del plugin tiene un identificador único. Este es un ejemplo del tipo de etiqueta que JRE 1.4.1 invocará en IE, usando el identificador único para JRE 1.4.1:

- -
<!-- IE ONLY CODE -->
-<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
-     width="460" height="160"
-codebase="http://java.sun.com/products/plugin/autodl/jinstall-1_4_1-windows-i586.cab#version=1,4,1">
-     <param...>
-     <param...>
-</object>
-
- -

La invocación anterior no funcionará en navegadores basados en Mozilla como Netscape 7 a causa de la razón vista anteriormente: classid usado conjuntamente con el identificador único hace referencia a una arquitectura (ActiveX) que el código de Mozilla (y, por lo tanto, Netscape 7) no soporta. Puedes invocar el plugin de Java para Netscape 7 y otros navegadores basados en Mozilla usando el tipo MIME para Java apropiado. Aquí se muestra un ejemplo:

- -
<object type="application/x-java-applet;jpi-version=1.4.1_01"
-width="460" height="160">
-	<param name="code" value="Animator.class" />
-	<param name="imagesource" value="images/Beans" />
-	<param name="backgroundcolor" value="0xc0c0c0" />
-	<param name="endimage" value="10" />
-	<param name="soundsource" value="audio">
-	<param name="soundtrack" value="spacemusic.au" />
-	<param name="sounds" value="1.au|2.au|3.au|4.au|5.au|6.au|7.au|8.au|9.au|0.au" />
-	<param name="pause" value="200" />
-	<p>You need the Java Plugin.
-         Get it from <a href="http://java.sun.com/products/plugin/index.html">here.</a></p>
-</object>
-
- -

El código anterior menciona una versión específica de un tipo MIME, y si el navegador basado en Mozilla como Netscape 7 no tiene instalado JRE 1.4.1_01, el texto alterno es mostrado. No es necesario siempre dar una versión específica de un tipo MIME. Si no te estás aprovechando de las características específicas de alguna versión concreta, un tipo MIME más genérico como application/x-java-vm funcionará igual de bien. Los parámetros de configuración para el applet, incluyendo la clase que contiene el punto de entrada inicial (Animator.class, referenciado por el elemento param), son específicos en muchos elementos param.

- -

Los navegadores basados en Mozilla como Netscape 7 también permiten el uso de un atributo especial classid. Este es el especial classid "java:". Aquí vemos un ejemplo usando este método de invocación:

- -
<object classid="java:NervousText.class" width="534" height="50">
-	<param name="text" value="Java 2 SDK, Standard Edition v1.4" />
-	<p>You need the Java Plugin.
-	   Get it from
-	   <a href="http://java.sun.com/products/plugin/index.html">here.
-	   </a>
-	</p>
-</object>
-
- -

el classid "java:" te permite referenciar la clase que proporciona el punto de entrada inicial. El resto de los parámetros de configuración funcionan gracias a los elementos param.

- -

Applet, la elección típica

- -

El elemento applet continúa siendo el más soportado, y sigue siendo la forma más popular de invocar applets en Java. En Netscape 7 y CompuServe 7, el elemento applet invoca directamente el plugin de Java. Aquí vemos un ejemplo:

- -
<applet code="NervousText.class" width="534" height="50">
-	<param name="text" value="Java(TM) 2 SDK, Standard Edition v1.4" />
-</applet>
-
- -

El elemento applet ha sido despreciado en la especificación HTML 4.01, pero una ventaja de usarlo es que en navegadores basados en Mozilla como Netscape 7, si has perdido Java, un mecanismo automático de obtención lo reemplaza. El navegador usará el Netscape's Plugin Finder Service para descargar el plugin de Java. La sección References reúne recursos de como usar el elemento applet.

- -

El elemento embed

- -

El elemento embed ha sido usado para invocar plugins desde los primeros tiempos de los navegadores Netscape. Típicamente, el elemento embed es anidado con un elemento object, tal que el otro elemento object invoca un control ActiveX para IE, mientras que el elemento interno embed invoca un plugin de Netscape. Aquí vemos un ejemplo de este uso:

- -
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
-codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0"
-width=366 height=142 id="myFlash">
-	<param name="movie" value="javascript_to_flash.swf" />
-	<param name="quality" value="high" />
-	<param name="swliveconnect" value="true" />
-		<embed src="javascript_to_flash.swf" quality="high" width="366" height="142"
-    		type="application/x-shockwave-flash"
-    		pluginspage="http://www.macromedia.com/downloads/"
-    		name="myFlash" swliveconnect="true">
-    		</embed>
-</object>
-
- -

Enlaces a las normas que marcan el uso del elemento embed pueden ser vistas en la sección References. El elemento embed es habitualmente el elemento más ampliamente usado para invocar plugins en navegadores Netscape. Es importante indicar, sin embargo, que el elemento embed no es parte de la especificación HTML 4.01, por lo que no es un estándar W3C. Algunas advertencias que marcan el uso del elemento embed son:

- - - -

Nótese que el mecanismo de obtención para el elemento embed -- esto es, la forma en como un plugin se obtiene si se ha perdido -- viene a través del atributo pluginspage. Este atributo apunta a una página para coger el plugin si éste no se detecta por el navegador. El atributo pluginurl es otro atributo que puede ser usado, y puede ser usado para apuntar directamente a un archivo XPInstall para una descarga más racionalizada. Para el elemento embed en concreto, estos atributos en Netscape 7 y Mozilla son mandados por la opción Plugin Finder Service. Debajo de Editar | Preferencias | Navegador | Aplicaciones de ayuda es una opción para usar el Plugin Finder Service de Netscape. Si el usuario ha seleccionadoSiempre usar Netscape Plugin Finder Service para obtener Plugins entonces si estos atributos son o no especificados no produce ninguna diferencia -- el navegadorsiempre consultará con el Plugin Finder Service para determinar si tiene un plugin para manejar el tipo MIME perdido. Si esta opción no está marcada, el Plugin Finder Service será usado sólo si el autor de la página webNO especifica cualquiera de estos atributos.

- -

Información del documento original

- - - -

Referencias

- -
General -- Especificaciones
- - - -
El elemento <object>
- - - -
El elemento <embed>
- - - -
Java
- - - -
Bugs y futuras direcciones en Netscape y Mozilla
- - - -

Categorías

- -

Interwiki, vínculos a otros idiomas

diff --git "a/files/es/archive/est\303\241ndares_web/ventajas_para_los_negocios_del_uso_de_est\303\241ndares_web/index.html" "b/files/es/archive/est\303\241ndares_web/ventajas_para_los_negocios_del_uso_de_est\303\241ndares_web/index.html" deleted file mode 100644 index acc168d514..0000000000 --- "a/files/es/archive/est\303\241ndares_web/ventajas_para_los_negocios_del_uso_de_est\303\241ndares_web/index.html" +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Ventajas para los negocios del uso de estándares web -slug: Archive/Estándares_Web/Ventajas_para_los_negocios_del_uso_de_estándares_web -tags: - - Desarrollo_Web - - Estándares_Web - - Todas_las_Categorías -translation_of: Archive/Web_Standards/The_Business_Benefits_of_Web_Standards ---- -

Introducción

-

Más con menos, esta parece ser la misión imposible de los diseñadores web: Dirigirse a más clientes, a una audiencia creciente, con mayor diversidad de navegadores, mejorando la accesibilidad, con usuarios que piden más velocidad, y todo esto reduciendo los costes de mantenimiento o rediseño del sitio. Atrapados entre la espada y la pared, los webmasters afrontan un desafío formidable. Pero cuentan con un aliado insospechado en la batalla, los estándares web.

-

Este artículo explica cómo, ser fiel a los estándares web, y dejar de lado el código y las tecnologías propietarias, puede contribuir a los objetivos comerciales de una compañía.

-

Dar al sitio un diseño uniforme

-

Separando el contenido de la presentación los diseñadores web tienen mucho ganado. El estilo es definido con CSS, un lenguaje orientado a la presentación. Guardar el código CSS en un documento separado (hoja de estilo) y aplicarlo a un grupo de documentos HTML permite cambiar por completo el diseño para todos esos documentos fácilmente. El HTML estricto (a diferencia del marcado transicional), no permite el uso de etiquetas de estilo en los documentos HTML, forzando con naturalidad la separación de contenido y presentación.

-

Mejorar la experiencia de Usuario:

-

Cargar más rápido, consumiendo menos ancho de banda

-

El código HTML suele ser mucho más compacto cuando es usado conjuntamente con CSS, y por lo tanto es más fácil de leer y mantener. Según varios estudios sobre el caso, y Andy King, el autor de Speed Up Your Web Site: Web Site Optimization, CSS posibilita la transformación de maquetaciones a base de tablas en diseños basados en CSS. Hacerlo, suele reducir el tamaño de las páginas entre un 25 y un 50 %. Esto se traduce en una mejor experiencia de usuario, según el Gurú de la usabilidad Jakob Nielsen, que apunta que los usuarios tienden a cerrar una página Web cuando tarda más de 10 segundos en cargar.

-

Aumentar el tráfico del sitio

-

Mejorar el posicionamiento en los buscadores

-

Conseguir un buen posicionamiento es uno de los mayores desafíos que un webmasters debe afrontar. En este asunto toda ayuda es buena.

-

Los robots de los buscadores rastrean la web para indexarla. Comparados con una persona, los robots ven la web de un modo muy distinto. Los efectos dinámicos creados con JavaScript son ignorados (de flash ni hablamos), y el texto dentro de los gráficos tampoco será leído. La separación de contenidos y presentación aumenta el ratio información/código, haciendo los documentos basados en CSS más apropiados para su consulta por parte de usuarios no humanos, lo cual mejora su posición en los resultados de los buscadores.

-

Crear los títulos con texto y CSS en vez de gráficos también ayuda.

-

Adaptación a múltiples plataformas

-

Estándares y multiplataforma van de la mano. Mientras algunos navegadores caprichosos tienen comportamientos diferentes según la plataforma, los navegadores basados en Mozilla están diseñados para comportarse igual en todas las plataformas soportadas (Mac, Linux, Unix, Windows ...)

-

Pensando en el mañana

-

Una parte muy significativa de la información almacenada electrónicamente es producida para la web y escrita en formato HTML. La mayor parte de esta información usa HTML no válido, que puede ser mostrado correctamente en navegadores viejos más permisivos. Pero la web evoluciona; los navegadores web pueden ser menos permisivos, o comportarse de modo diferente cuando detectan código no válido (p.ej parsea los datos inválidos y los renderiza de otro modo). La utilización de código válido, conforme a los estándares asegura que los datos serán reutilizables durante mucho tiempo, porque las especificaciones de cómo analizar los formatos estándar están bien documentadas y son estables.

-

En contra de la creencia popular, escribir código estándar no significa producir contenidos menos atractivos. De hecho, siguiendo los estándares puede hacerse casi todo lo que se hace con las extensiones propietarias, con la ventaja añadida de ser multiplataforma y una apuesta de futuro.

-

Extensibilidad

-

Usar HTML estricto y separar la estructura del contenido prepara el terreno para XHTML, que es una versión de HTML compatible con XML. La Utilización de XHTML permitirá a los desarrolladores web usar herramientas del mundo XML, tales como XSLT, que permite manipular datos XML fácilmente.

-

El uso de XHTML es una introducción a la familia de estándares que conforman las tecnologías XML, como XML, XSLT (transformando documentos), SVG (gráficos animados), MathML (expresiones matemáticas)... Estas tecnologías han sido diseñadas para ser interoperables, y son la base de los Servicios Web. Este va mucho más allá del simple diseño web.

-

Reducir los costes de mantenimiento

-

El mantenimiento de un sitio Web es a menudo costoso y usar estándares web puede ayudar mucho en este aspecto.

-

Ventajas de CSS sobre JavaScript

-

Es frecuente usar gráficos o javaScript para añadir algún efecto especial al texto. Las hojas de estilo dan a los diseñadores un control total sobre la tipografía y permite efectos como los rollovers. Esto reduce la necesidad de crear gráficos y programar scripts, y lo que es más importante, reduce el ancho de banda que consumen las imágenes.

-

Código HTML bien formado

-

Uno de los principales dolores de cabeza de los desarrolladores es la diferencia en como los distintos navegadores muestran las páginas web. Tales diferencias de renderizado son propias de navegadores antiguos, la mayoría son conocidas y están documentadas. En muchos casos, las divergencias son causadas por un código ambiguo.

-

El código gramaticalmente correcto reduce considerablemente las diferencias de renderizado entre los navegadores. La utilización de instrumentos de validación como el validador del W3C ayudan a detectar los errores y a comprobar que el código HTML es gramaticalmente correcto, esto elimina la ambigüedad en el parseo que hacen los navegadores.

-

Compatibilidad con múltiples navegadores

-

Cada vez son más los navegadores, además del IE, usados para surfear por la web:

- -

A grosso modo, para surfear en la web se usan 5 motores de renderizado diferentes, en docenas de navegadores, para las 3 plataformas principales.

-

Según todas las fuentes, los navegadores basados en Gecko son cada día más populares. Firefox ha sido descargado más de 200 millones de veces.

-

En un entorno cada vez más heterogéneo, probar las páginas Web en todas las configuraciones es imposible. el código estándar se convierte en la única solución viable. == The Netscape 4 and IE4 exceptions == The only drawback in using CSS is that older browsers (specifically IE4 and NS4) will not be able to render as intended. In some cases, where a significant portion of the audience is running Netscape 4.x, use of simple tables for layout and CSS for font control may be a solution. Another option is to serve HTML content to Netscape 4.x users, without CSS style. The content will be usable but not as attractively presented as in a modern browser. Furthermore, 4.x browsers are known to have security issues, so their users should be encouraged to upgrade.

-

Accesibilidad

-

Ser accesible es un requisito para las agencias gubernamentales de muchos países: EE.UU, España o Brasil y en algunos países como Australia, para cualquier organización el código estándar (en concreto,HTML estricto y CSS para la maquetación) hace de la accesibilidad un objetivo más fácil, porque los estándares han sido creados pensando en la accesibilidad.

-

Cuidando la accesibilidad seremos capaces de servir contenidos web a una mayor audiencia, y aumentamos la usabilidad del sitio, incluso para la gente sin minusvalía.

-

Reducir la dependencia del desarrollador

-

Cuando los webmasters asumen la dirección de un sitio creado por otros, el código escrito por los anteriores desarrolladores puede ser todo un reto. En muchos casos, tienen que enfrentarse con un código HTML de mala calidad, que además contiene características indocumentadas, hacks, o prácticas de marcado peculiares. La carencia de documentación es a menudo un problema.

-

El siguiente documento: standards-compliance in requirements, aporta un modo muy eficaz de medir la calidad del producto final, el W3C que es un juez imparcial.

-

Como los estándares están muy bien documentados, cualquier persona que asuma código estándar puede trabajar con él de inmediato; sin tener que familiarizarse con las prácticas de codificación del desarrollador anterior. Esto además, reduce considerablemente la dependencia de un desarrollador concreto.

-

Ventajas para los visitantes del sitio

-

Gracias a la accesibilidad, a la rapidez en la carga de las páginas y a la mayor compatibilidad con múltiples navegadores (sin limitarse a uno o dos navegadores usados en las pruebas), es más probable que sus visitantes aprecien sus servicios y vuelvan mañana.

-

Conclusión

-

Utilizar los estándares web y separar el diseño de los contenidos aporta un montón de ventajas, hoy y mañana.

-

Hoy esto significa ampliar la audiencia, reducir los coste de producción de nuevos contenidos, y mejorar la accesibilidad.

-

Mañana esto significará reducir la dependencia de proveedores, reducir costes en mantenimiento, y un diseño más flexible para el sitio. Por último pero no menos importante, el uso de estándares abre las puertas a las tecnologías XML.

-

Todos estos factores también contribuyen a facilitar la administración del sitio, aumentar el número de visitas y amortizar la inversión. Técnicos, vendedores, y contables, todos pueden beneficiarse de un sitio Web basado en estándares. Es más de lo que uno podría esperar.

-

Categorías

-

interwikis

- -

diff --git a/files/es/archive/index.html b/files/es/archive/index.html deleted file mode 100644 index 4f4a70c023..0000000000 --- a/files/es/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/es/archive/jxon/index.html b/files/es/archive/jxon/index.html deleted file mode 100644 index 9fb34dede3..0000000000 --- a/files/es/archive/jxon/index.html +++ /dev/null @@ -1,1509 +0,0 @@ ---- -title: JXON -slug: Archive/JXON -tags: - - Documentos -translation_of: Archive/JXON ---- -

JXON (lossless JavaScript XML Object Notation) is a generic name by which is defined the representation of JavaScript Objects using XML. There are no real standards for this conversion, but some conventions begin to appear on the web. There are some cases in which the whole content of an XML document must be read from the JavaScript interpreter (like for web-apps languages or settings XML documents, for example). In these cases JXON could represent the most practical way.

- -

In this article we will show how to convert a parsed XML document (i.e. an instance of Document) to a JavaScript Object tree (i.e. a tree of nested instances of Object) and viceversa, with some different algorithms. It could be useful to read the XML introduction article first.

- -

If you want a complete bidirectional JXON library (modelled on the JSON global object), skip to the dedicated paragraph (but please read the note about the const statement compatibility).

- -
Note: If you are interested to address only some parts of an XML document (and are not starting in JavaScript/JSON for templating purposes), use XPath instead of converting the whole document into JSON.
- -

Conversion snippets

- -

Now imagine you have this sample XML document:

- -
example.xml
- -
<?xml version="1.0"?>
-<!DOCTYPE catalog SYSTEM "catalog.dtd">
-<catalog>
-  <product description="Cardigan Sweater">
-   <catalog_item gender="Men's">
-     <item_number>QWZ5671</item_number>
-     <price>39.95</price>
-     <size description="Medium">
-       <color_swatch image="red_cardigan.jpg">Red</color_swatch>
-       <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
-     </size>
-     <size description="Large">
-       <color_swatch image="red_cardigan.jpg">Red</color_swatch>
-       <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
-     </size>
-   </catalog_item>
-   <catalog_item gender="Women's">
-     <item_number>RRX9856</item_number>
-     <discount_until>Dec 25, 1995</discount_until>
-     <price>42.50</price>
-     <size description="Medium">
-       <color_swatch image="black_cardigan.jpg">Black</color_swatch>
-     </size>
-   </catalog_item>
-  </product>
-  <script type="text/javascript"><![CDATA[function matchwo(a,b) {
-    if (a < b && a < 0) { return 1; }
-    else { return 0; }
-}]]></script>
-</catalog>
-
- -

First, create a DOM tree like the previous example as described in the How to Create a DOM tree article. If you have already have a DOM tree from using XMLHttpRequest, skip to the next paragraph.

- -
Note: If you are using an instance of XMLHttpRequest in order to retrieve your XML file, please use the yourRequest.responseXML property to get a parsed XML document. Don't use yourRequest.responseText!
- -

The algorithms proposed here (see: #1, #2, #3, #4) will consider only the following types of nodes and their attributes:

- -
    -
  1. Document (only as function argument),
  2. -
  3. DocumentFragment (only as function argument),
  4. -
  5. Element,
  6. -
  7. Text (never as function argument),
  8. -
  9. CDATASection (never as function argument),
  10. -
  11. Attr (never as function argument).
  12. -
- -

This is a good and standardized compromise for a JavaScript usage, since all of the information of an XML Document is contained in these node types. All other information (like processing instructions, schemas, comments, etc.) will be lost. This type of algorithm is still considered lossless, since what is lost is meta-information and not information.

- -

In order to avoid conflicts, the representation of nodes and attributes names is case insensitive (always rendered in lower case), so objects' local property names set using JavaScript must always have some kind of capitalization (that is, at least one capital letter somewhere in their names), as you can see below.

- -

The following algorithms are somewhat based on the Parker convention, version 0.4, which prescribes the transformation of tags names into object properties names and the recognition of the typeof of all the collected text content of each tag (plain text parsing); but with some differences (so, one can say that we follow a our convention). Moreover, all algorithms are equally lossless for the contemplated nodes.

- -

We consider the third algorithm as the most representative and practical JXON parsing algorithm.

- -

Now let's serialize doc — the DOM tree — to a JavaScript Object Tree (you can read more about working with Objects and how Javascript is Object-Oriented). We can use several algorithms to convert its content to a Javascript Object Tree.

- -

Algorithm #1: a verbose way

- -

This simple recursive constructor will convert an XML DOM tree to a JavaScript Object tree. The text content of each element is stored into the keyValue property, while nodeAttributes, if they exist, are listed under the child object keyAttributes. The constructor's argument can be the entire XML Document, a DocumentFragment or simply an Element node.

- -
/*\
-|*|
-|*|  JXON Snippet #1 - Mozilla Developer Network
-|*|
-|*|  https://developer.mozilla.org/en-US/docs/JXON
-|*|  https://developer.mozilla.org/User:fusionchess
-|*|
-|*|  This framework is released under the GNU Public License, version 3 or later.
-|*|  http://www.gnu.org/licenses/gpl-3.0-standalone.html
-|*|
-\*/
-
-function parseText (sValue) {
-  if (/^\s*$/.test(sValue)) { return null; }
-  if (/^(?:true|false)$/i.test(sValue)) { return sValue.toLowerCase() === "true"; }
-  if (isFinite(sValue)) { return parseFloat(sValue); }
-  if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
-  return sValue;
-}
-
-function JXONTree (oXMLParent) {
-  var nAttrLen = 0, nLength = 0, sCollectedTxt = "";
-  if (oXMLParent.hasChildNodes()) {
-    for (var oNode, sProp, vContent, nItem = 0; nItem < oXMLParent.childNodes.length; nItem++) {
-      oNode = oXMLParent.childNodes.item(nItem);
-      if ((oNode.nodeType - 1 | 1) === 3) { sCollectedTxt += oNode.nodeType === 3 ? oNode.nodeValue.trim() : oNode.nodeValue; } // nodeType is "Text" (3) or "CDATASection" (4)
-      else if (oNode.nodeType === 1 && !oNode.prefix) { // nodeType is "Element" (1)
-        sProp = oNode.nodeName.toLowerCase();
-        vContent = new JXONTree(oNode);
-        if (this.hasOwnProperty(sProp)) {
-          if (this[sProp].constructor !== Array) { this[sProp] = [this[sProp]]; }
-          this[sProp].push(vContent);
-        } else { this[sProp] = vContent; nLength++; }
-      }
-    }
-    this.keyValue = parseText(sCollectedTxt);
-  } else { this.keyValue = null; }
-  if (oParentNode.hasAttributes && oXMLParent.hasAttributes()) {
-    var oAttrib;
-    this.keyAttributes = {};
-    for (nAttrLen; nAttrLen < oXMLParent.attributes.length; nAttrLen++) {
-      oAttrib = oXMLParent.attributes.item(nAttrLen);
-      this.keyAttributes[oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
-    }
-  }
-  /*
-  * Optional properties...
-
-  this.keyLength = nLength;
-  this.attributesLength = nAttrLen;
-  // this.DOMNode = oXMLParent;
-
-  */
-
-  /* Object.freeze(this); */
-}
-
-/*
-* Optional methods... Uncomment the optional properties first!
-
-JXONTree.prototype.valueOf = function () { return this.keyValue; };
-JXONTree.prototype.toString = function () { return String(this.keyValue); };
-JXONTree.prototype.getItem = function (nItem) {
-  if (nLength === 0) { return null; }
-  var nCount = 0;
-  for (var sKey in this) { if (nCount === nItem) { return this[sKey]; } nCount++; }
-  return null;
-};
-JXONTree.prototype.getAttribute = function (nAttrId) {
-  if (nAttrLen === 0 || nAttrId + 1 > nAttrLen) { return null; }
-  var nAttr = 0;
-  for (var sAttrName in this.keyAttributes) { if (nAttr === nAttrId) { return this.keyAttributes[sAttrName]; } nAttr++; }
-  return null;
-};
-JXONTree.prototype.hasChildren = function () { return this.keyLength > 0; };
-
-*/
-
-var myObject = new JXONTree(doc);
-// we got our javascript object! try: alert(JSON.stringify(myObject));
-
- -
Note: If you want to freeze the whole object tree (because of the "static" nature of an XML document), uncomment the string: /* Object.freeze(this); */. The Object.freeze() method prevents new properties from being added to it, prevents existing properties from being removed and prevents existing properties, or their enumerability, configurability, or writability, from being changed. In essence the object tree is made effectively immutable.
- -

With this algorithm our example becomes:

- -
{
- "catalog": {
-   "product": {
-     "catalog_item": [{
-       "item_number": {
-         "keyValue": "QWZ5671"
-       },
-       "price": {
-         "keyValue": 39.95
-       },
-       "size": [{
-         "color_swatch": [{
-           "keyValue": "Red",
-           "keyAttributes": {
-             "image": "red_cardigan.jpg"
-           }
-         }, {
-           "keyValue": "Burgundy",
-           "keyAttributes": {
-             "image": "burgundy_cardigan.jpg"
-           }
-         }],
-         "keyValue": null,
-         "keyAttributes": {
-           "description": "Medium"
-         }
-       }, {
-         "color_swatch": [{
-           "keyValue": "Red",
-           "keyAttributes": {
-             "image": "red_cardigan.jpg"
-           }
-         }, {
-           "keyValue": "Burgundy",
-           "keyAttributes": {
-             "image": "burgundy_cardigan.jpg"
-           }
-         }],
-         "purchased": {
-           "keyValue": null
-         },
-         "keyValue": null,
-         "keyAttributes": {
-           "description": "Large"
-         }
-       }],
-       "keyValue": null,
-       "keyAttributes": {
-         "gender": "Men's"
-       }
-     }, {
-       "item_number": {
-         "keyValue": "RRX9856"
-       },
-       "discount_until": {
-         "keyValue": new Date(1995, 11, 25)
-       },
-       "price": {
-         "keyValue": 42.5
-       },
-       "size": {
-         "color_swatch": {
-           "keyValue": "Black",
-           "keyAttributes": {
-             "image": "black_cardigan.jpg"
-           }
-         },
-         "keyValue": null,
-         "keyAttributes": {
-           "description": "Medium"
-         }
-       },
-       "keyValue": null,
-       "keyAttributes": {
-         "gender": "Women's"
-       }
-     }],
-     "keyValue": null,
-     "keyAttributes": {
-       "description": "Cardigan Sweater"
-     }
-   },
-   "script": {
-     "keyValue": "function matchwo(a,b) {\n if (a < b && a < 0) { return 1; }\n else { return 0; }\n}",
-     "keyAttributes": {
-       "type": "text/javascript"
-     }
-   },
-   "keyValue": null
- },
- "keyValue": null
-}
-
- -

This is a recommanded technique if you don't know the structure of the XML document.

- -

Algorithm #2: a less verbose way

- -

Here is another, simpler, conversion method, in which nodeAttributes are listed under the same object of child nodes but have the “@” prefix (as suggested by the BadgerFish Convention). As above, the text content is stored into the keyValue property. The constructor's argument can be the entire XML Document, a DocumentFragment or simply an Element node of it.

- -
/*\
-|*|
-|*|  JXON Snippet #2 - Mozilla Developer Network
-|*|
-|*|  https://developer.mozilla.org/en-US/docs/JXON
-|*|  https://developer.mozilla.org/User:fusionchess
-|*|
-|*|  This framework is released under the GNU Public License, version 3 or later.
-|*|  http://www.gnu.org/licenses/gpl-3.0-standalone.html
-|*|
-\*/
-
-function parseText (sValue) {
-  if (/^\s*$/.test(sValue)) { return null; }
-  if (/^(?:true|false)$/i.test(sValue)) { return sValue.toLowerCase() === "true"; }
-  if (isFinite(sValue)) { return parseFloat(sValue); }
-  if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
-  return sValue;
-}
-
-function JXONTree (oXMLParent) {
-  if (oXMLParent.hasChildNodes()) {
-    var sCollectedTxt = "";
-    for (var oNode, sProp, vContent, nItem = 0; nItem < oXMLParent.childNodes.length; nItem++) {
-      oNode = oXMLParent.childNodes.item(nItem);
-      if ((oNode.nodeType - 1 | 1) === 3) { sCollectedTxt += oNode.nodeType === 3 ? oNode.nodeValue.trim() : oNode.nodeValue; }
-      else if (oNode.nodeType === 1 && !oNode.prefix) {
-        sProp = oNode.nodeName.toLowerCase();
-        vContent = new JXONTree(oNode);
-        if (this.hasOwnProperty(sProp)) {
-          if (this[sProp].constructor !== Array) { this[sProp] = [this[sProp]]; }
-          this[sProp].push(vContent);
-        } else { this[sProp] = vContent; }
-      }
-    }
-    if (sCollectedTxt) { this.keyValue = parseText(sCollectedTxt); }
-  }
-  if (oParentNode.hasAttributes && oXMLParent.hasAttributes()) {
-    var oAttrib;
-    for (var nAttrib = 0; nAttrib < oXMLParent.attributes.length; nAttrib++) {
-      oAttrib = oXMLParent.attributes.item(nAttrib);
-      this["@" + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
-    }
-  }
-  /* Object.freeze(this); */
-}
-
-var myObject = new JXONTree(doc);
-// we got our javascript object! try: alert(JSON.stringify(myObject));
-
- -
Note: If you want to freeze the whole object tree (because of the "static" nature of an XML document), uncomment the string: /* Object.freeze(this); */. The Object.freeze() method prevents new properties from being added to it, prevents existing properties from being removed and prevents existing properties, or their enumerability, configurability, or writability, from being changed. In essence the object tree is made effectively immutable.
- -

With this algorithm our example becomes:

- -
{
-  "catalog": {
-    "product": {
-      "catalog_item": [{
-        "item_number": {
-          "keyValue": "QWZ5671"
-        },
-        "price": {
-          "keyValue": 39.95
-        },
-        "size": [{
-          "color_swatch": [{
-            "keyValue": "Red",
-            "@image": "red_cardigan.jpg"
-          }, {
-            "keyValue": "Burgundy",
-            "@image": "burgundy_cardigan.jpg"
-          }],
-          "@description": "Medium"
-        }, {
-          "color_swatch": [{
-            "keyValue": "Red",
-            "@image": "red_cardigan.jpg"
-          }, {
-            "keyValue": "Burgundy",
-            "@image": "burgundy_cardigan.jpg"
-          }],
-          "@description": "Large"
-        }],
-        "@gender": "Men's"
-      }, {
-        "item_number": {
-          "keyValue": "RRX9856"
-        },
-        "discount_until": {
-          "keyValue": new Date(1995, 11, 25)
-        },
-        "price": {
-          "keyValue": 42.5
-        },
-        "size": {
-          "color_swatch": {
-            "keyValue": "Black",
-            "@image": "black_cardigan.jpg"
-          },
-          "@description": "Medium"
-        },
-        "@gender": "Women's"
-      }],
-      "@description": "Cardigan Sweater"
-    },
-    "script": {
-      "keyValue": "function matchwo(a,b) {\n  if (a < b && a < 0) { return 1; }\n  else { return 0; }\n}",
-      "@type": "text/javascript"
-    }
-  }
-}
-
- -

This is a possible technique to use if you partially know the structure of the XML document.

- -

Algorithm #3: a synthetic technique

- -

Here is another method of conversion. This algorithm is the closest to the Parker convention. It is very similar to the previous one, except that nodes which do not contain other recognizable nodes than Text or CDATASection are not treated as objects, but directly as booleans, strings, numbers or Date objects (see the Parker convention). Empty nodes (i.e. which do not contain other Element nodes, Text nodes, CDATASection nodes or Attr nodes) have the default value true (see the Code considerations). Also, this time we use a function instead of a constructor. The function's argument can be the entire XML Document, a DocumentFragment, or simply an Element node within it. nodeAttributes have the “@” prefix, as suggested by the BadgerFish Convention. In many cases, this is the most practical conversion method.

- -
/*\
-|*|
-|*|  JXON Snippet #3 - Mozilla Developer Network
-|*|
-|*|  https://developer.mozilla.org/en-US/docs/JXON
-|*|  https://developer.mozilla.org/User:fusionchess
-|*|
-|*|  This framework is released under the GNU Public License, version 3 or later.
-|*|  http://www.gnu.org/licenses/gpl-3.0-standalone.html
-|*|
-\*/
-
-function parseText (sValue) {
-  if (/^\s*$/.test(sValue)) { return null; }
-  if (/^(?:true|false)$/i.test(sValue)) { return sValue.toLowerCase() === "true"; }
-  if (isFinite(sValue)) { return parseFloat(sValue); }
-  if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
-  return sValue;
-}
-
-function getJXONTree (oXMLParent) {
-  var vResult = /* put here the default value for empty nodes! */ true, nLength = 0, sCollectedTxt = "";
-  if (oXMLParent.hasAttributes && oXMLParent.hasAttributes()) {
-    vResult = {};
-    for (nLength; nLength < oXMLParent.attributes.length; nLength++) {
-      oAttrib = oXMLParent.attributes.item(nLength);
-      vResult["@" + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
-    }
-  }
-  if (oXMLParent.hasChildNodes()) {
-    for (var oNode, sProp, vContent, nItem = 0; nItem < oXMLParent.childNodes.length; nItem++) {
-      oNode = oXMLParent.childNodes.item(nItem);
-      if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is "CDATASection" (4) */
-      else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is "Text" (3) */
-      else if (oNode.nodeType === 1 && !oNode.prefix) { /* nodeType is "Element" (1) */
-        if (nLength === 0) { vResult = {}; }
-        sProp = oNode.nodeName.toLowerCase();
-        vContent = getJXONTree(oNode);
-        if (vResult.hasOwnProperty(sProp)) {
-          if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
-          vResult[sProp].push(vContent);
-        } else { vResult[sProp] = vContent; nLength++; }
-      }
-    }
-  }
-  if (sCollectedTxt) { nLength > 0 ? vResult.keyValue = parseText(sCollectedTxt) : vResult = parseText(sCollectedTxt); }
-  /* if (nLength > 0) { Object.freeze(vResult); } */
-  return vResult;
-}
-
-var myObject = getJXONTree(doc);
-// we got our javascript object! try: alert(JSON.stringify(myObject));
-
- -
Note: If you want to freeze the whole object tree (because of the "static" nature of an XML document), uncomment the string: /* if (nLength > 0) { Object.freeze(vResult); } */. The Object.freeze() method prevents new properties from being added to it, prevents existing properties from being removed and prevents existing properties, or their enumerability, configurability, or writability, from being changed. In essence the object tree is made effectively immutable.
- -

With this algorithm, our example becomes:

- -
{
-  "catalog": {
-    "product": {
-      "@description": "Cardigan Sweater",
-      "catalog_item": [{
-        "@gender": "Men's",
-        "item_number": "QWZ5671",
-        "price": 39.95,
-        "size": [{
-          "@description": "Medium",
-          "color_swatch": [{
-            "@image": "red_cardigan.jpg",
-            "keyValue": "Red"
-          }, {
-            "@image": "burgundy_cardigan.jpg",
-            "keyValue": "Burgundy"
-          }]
-        }, {
-          "@description": "Large",
-          "color_swatch": [{
-            "@image": "red_cardigan.jpg",
-            "keyValue": "Red"
-          }, {
-            "@image": "burgundy_cardigan.jpg",
-            "keyValue": "Burgundy"
-          }]
-        }]
-      }, {
-        "@gender": "Women's",
-        "item_number": "RRX9856",
-        "discount_until": new Date(1995, 11, 25),
-        "price": 42.5,
-        "size": {
-          "@description": "Medium",
-          "color_swatch": {
-            "@image": "black_cardigan.jpg",
-            "keyValue": "Black"
-          }
-        }
-      }]
-    },
-    "script": {
-      "@type": "text/javascript",
-      "keyValue": "function matchwo(a,b) {\n  if (a < b && a < 0) { return 1; }\n  else { return 0; }\n}"
-    }
-  }
-}
-
- -

This is a recommended technique if you know the structure of the XML document.

- -

Algorithm #4: a very minimalist way

- -

The following is another possible way to do the conversion. It is very close to the Parker convention, too. With this algorithm, all Element nodes that contain other child Element, Text, or CDATASection nodes in the same level are treated as instances of Boolean, Number, String, or Date Constructors. So any child Element node, if exists, will be nested in these types of objects.

- -

For example:

- -
<employee type="usher">John Smith</employee>
-<manager>Lisa Carlucci</manager>
-
- -

becomes

- -
var myObject = {
-  "employee": new String("John Smith"),
-  "manager": "Lisa Carlucci"
-};
-
-myObject.employee["@type"] = "usher";
-
-// test
-
-alert(myObject.manager); // "Lisa Carlucci"
-alert(myObject.employee["@type"]); // "usher"
-alert(myObject.employee); // "John Smith"
-
- -
Note: This algorithm represents a special case of conversion. The generated JavaScript Object tree is not stringifyable (see the Code considerations). It is very practical for internal JavaScript access, but don't use it if you want to transfer the tree via JSON string!
- -

As for the third algorithm, nodes which do not contain other recognizable nodes than Text or CDATASection are not treated as objects, but directly as booleans, strings, numbers (primitive values) or Date objects; and empty nodes (i.e. which do not contain other Element nodes, Text nodes, CDATASection nodes or Attr nodes) have the default value true. As for the third algorithm it is not used a constructor, but a function. The function's argument can be the entire XML Document, a DocumentFragment or simply an Element node of it. nodeAttributes have the “@” prefix, as suggested by the BadgerFish Convention.

- -
/*\
-|*|
-|*|  JXON Snippet #4 - Mozilla Developer Network
-|*|
-|*|  https://developer.mozilla.org/en-US/docs/JXON
-|*|  https://developer.mozilla.org/User:fusionchess
-|*|
-|*|  This framework is released under the GNU Public License, version 3 or later.
-|*|  http://www.gnu.org/licenses/gpl-3.0-standalone.html
-|*|
-\*/
-
-function parseText (sValue) {
-  if (/^\s*$/.test(sValue)) { return null; }
-  if (/^(?:true|false)$/i.test(sValue)) { return sValue.toLowerCase() === "true"; }
-  if (isFinite(sValue)) { return parseFloat(sValue); }
-  if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
-  return sValue;
-}
-
-function objectify (vValue) {
-  if (vValue === null) {
-    return new (function() {
-      this.toString = function() { return "null"; }
-      this.valueOf = function() { return null; }
-    })();
-  }
-  return vValue instanceof Object ? vValue : new vValue.constructor(vValue);
-}
-
-var aTmpEls = []; // loaded element nodes cache
-
-function getJXONTree (oXMLParent) {
-  var  sProp, vContent, vResult, nLength = 0, nLevelStart = aTmpEls.length,
-      nChildren = oXMLParent.hasChildNodes() ? oXMLParent.childNodes.length : 0, sCollectedTxt = "";
-
-  for (var oNode, nItem = 0; nItem < nChildren; nItem++) {
-    oNode = oXMLParent.childNodes.item(nItem);
-    if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is "CDATASection" (4) */
-    else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is "Text" (3) */
-    else if (oNode.nodeType === 1 && !oNode.prefix) { aTmpEls.push(oNode); } /* nodeType is "Element" (1) */
-  }
-
-  var nLevelEnd = aTmpEls.length, vBuiltVal = parseText(sCollectedTxt);
-
-  if (oParentNode.hasAttributes && oXMLParent.hasAttributes()) {
-    vResult = objectify(vBuiltVal);
-    for (nLength; nLength < oXMLParent.attributes.length; nLength++) {
-      oAttrib = oXMLParent.attributes.item(nLength);
-      vResult["@" + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
-    }
-  } else if (nLevelEnd > nLevelStart) { vResult = objectify(vBuiltVal); }
-
-  for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
-    sProp = aTmpEls[nElId].nodeName.toLowerCase();
-    vContent = getJXONTree(aTmpEls[nElId]);
-    if (vResult.hasOwnProperty(sProp)) {
-    if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
-      vResult[sProp].push(vContent);
-    } else { vResult[sProp] = vContent; nLength++; }
-  }
-
-  aTmpEls.length = nLevelStart;
-
-  if (nLength === 0) { vResult = sCollectedTxt ? vBuiltVal : /* put here the default value for empty nodes: */ true; }
-  /* else { Object.freeze(vResult); } */
-
-  return vResult;
-}
-
-var myObject = getJXONTree(doc);
-alert(myObject.catalog.product.catalog_item[1].size.color_swatch["@image"]); // "black_cardigan.jpg"
-alert(myObject.catalog.product.catalog_item[1].size.color_swatch); // "Black" !
-
- -
Note: If you want to freeze the whole object tree (because of the "static" nature of an XML document), uncomment the string: /* else { Object.freeze(vResult); } */. The Object.freeze() method prevents new properties from being added to it, prevents existing properties from being removed and prevents existing properties, or their enumerability, configurability, or writability, from being changed. In essence the object tree is made effectively immutable.
- -

This is a possible technique if you know the structure of the XML document.

- -

Reverse algorithms

- -

It is possible to reverse the algorithms proposed here in order to build a new XML document starting from a JavaScript Objects Tree. For simplicity, we will propose here a single example, which in a single method represents the inversion of all our algorithms.

- -
/*\
-|*|
-|*|  JXON Snippet #5 - Mozilla Developer Network
-|*|
-|*|  https://developer.mozilla.org/en-US/docs/JXON
-|*|  https://developer.mozilla.org/User:fusionchess
-|*|
-|*|  This framework is released under the GNU Public License, version 3 or later.
-|*|  http://www.gnu.org/licenses/gpl-3.0-standalone.html
-|*|
-\*/
-
-function createXML (oObjTree) {
-  function loadObjTree (oParentEl, oParentObj) {
-    var vValue, oChild;
-    if (oParentObj.constructor === String || oParentObj.constructor === Number || oParentObj.constructor === Boolean) {
-      oParentEl.appendChild(oNewDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 or 1 */
-      if (oParentObj === oParentObj.valueOf()) { return; }
-    } else if (oParentObj.constructor === Date) {
-      oParentEl.appendChild(oNewDoc.createTextNode(oParentObj.toGMTString()));
-    }
-    for (var sName in oParentObj) {
-      if (isFinite(sName)) { continue; } /* verbosity level is 0 */
-      vValue = oParentObj[sName];
-      if (sName === "keyValue") {
-        if (vValue !== null && vValue !== true) { oParentEl.appendChild(oNewDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
-      } else if (sName === "keyAttributes") { /* verbosity level is 3 */
-        for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
-      } else if (sName.charAt(0) === "@") {
-        oParentEl.setAttribute(sName.slice(1), vValue);
-      } else if (vValue.constructor === Array) {
-        for (var nItem = 0; nItem < vValue.length; nItem++) {
-          oChild = oNewDoc.createElement(sName);
-          loadObjTree(oChild, vValue[nItem]);
-          oParentEl.appendChild(oChild);
-        }
-      } else {
-        oChild = oNewDoc.createElement(sName);
-        if (vValue instanceof Object) {
-          loadObjTree(oChild, vValue);
-        } else if (vValue !== null && vValue !== true) {
-          oChild.appendChild(oNewDoc.createTextNode(vValue.toString()));
-        }
-        oParentEl.appendChild(oChild);
-      }
-    }
-  }
-  const oNewDoc = document.implementation.createDocument("", "", null);
-  loadObjTree(oNewDoc, oObjTree);
-  return oNewDoc;
-}
-
-var newDoc = createXML(myObject);
-// we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
-
- -
Note: With this code the Date instances, if they exist, are converted into Strings through the toGMTString() method. Nothing prohibits the use of any other conversion method. In addition, all properties of the tree with a true value will be converted into empty elements with no text nodes (see the Code considerations).
- -

This is a good solution if you want to automate the creation of an XML document. It is a bad choice, however, if you want to re-build an XML document previously converted into JSON. Although the bidirectional conversion is very faithful (except for CDATASection nodes, which will be converted into Text nodes), the process is unnecessarily costly. In fact, if your goal is to edit an XML document, it is strongly recommended to work on it rather than create new ones.

- -

The Parker Convention

- -

The functions listed above for the conversion of an XML document to JSON (often called "JXON algorithms") are more or less freely based on the Parker Convention (especially regarding the transformation of tags names into object properties names, the recognition of the typeof of all the collected text content of each tag and the absorption of solitary Text and/or CDATASection nodes into primitive values). It is called “Parker Convention” in opposition to “BadgerFish Convention”, after the comic Parker & Badger by Cuadrado. See also: BadgerFish Convention.

- -

The following is a transcription of the Parker Convention paper (version 0.4), from the page “TransformingRules” of the xml2json-xslt project site.

- -

This Convention was written in order to regulate the conversion to JSON from XSLT, so parts of it are futile for JavaScript.

- -
Note: On October 29th, 2013, the World Wide Web Consortium relased in a note on official algorithm for converting HTML5 microdata to JSON. However, HTML microdata is not HTML: microdata is a formatted subset of HTML.
- -

Translation JSON

- -
    -
  1. -

    The root element will be absorbed, for there is only one:

    - -
    <root>test</root>
    - -

    becomes

    - -
    "test"
    -
    -
  2. -
  3. -

    Element names become object properties:

    - -
    <root><name>Xml</name><encoding>ASCII</encoding></root>
    - -

    becomes

    - -
    {
    -  "name": "Xml",
    -  "encoding": "ASCII"
    -}
    -
    -
  4. -
  5. -

    Numbers are recognized (integers and decimals):

    - -
    <root><age>12</age><height>1.73</height></root>
    - -

    becomes

    - -
    {
    -  "age": 12,
    -  "height": 1.73
    -}
    -
    -
  6. -
  7. -

    Booleans are recognized case insensitive:

    - -
    <root><checked>True</checked><answer>FALSE</answer></root>
    - -

    becomes

    - -
    {
    -  "checked": true,
    -  "answer": false
    -}
    -
    -
  8. -
  9. -

    Strings are escaped:

    - -
    <root>Quote: &quot; New-line:
    -</root>
    -
    - -

    becomes

    - -
    "Quote: \" New-line:\n"
    -
  10. -
  11. -

    Empty elements will become null:

    - -
    <root><nil/><empty></empty></root>
    - -

    becomes

    - -
    {
    -  "nil": null,
    -  "empty": null
    -}
    -
    -
  12. -
  13. -

    If all sibling elements have the same name, they become an array

    - -
    <root><item>1</item><item>2</item><item>three</item></root>
    -
    - -

    becomes

    - -
    [1, 2, "three"]
    -
    -
  14. -
  15. -

    Mixed mode text-nodes, comments and attributes get absorbed:

    - -
    <root version="1.0">testing<!--comment--><element test="true">1</element></root>
    -
    - -

    becomes

    - -
    { "element": true }
    -
    -
  16. -
  17. -

    Namespaces get absorbed, and prefixes will just be part of the property name:

    - -
    <root xmlns:ding="http://zanstra.com/ding"><ding:dong>binnen</ding:dong></root>
    -
    - -

    becomes

    - -
    { "ding:dong" : "binnen" }
    -
    -
  18. -
- -
Note: Our algorithms comply with points 2, 3, 4 and 7. The third and the fourth algorithm comply also with point 6 (but true instead of null – see the Code considerations). Point 5 is automatically managed by the JavaScript method JSON.stringify(). Regarding point 9, we chose to ignore all nodes which have a prefix; you can include them by removing the string && !oNode.prefix from our algorithms (see the Code considerations).
- -

Extra JavaScript translations

- -

This is the same as the JSON translation, but with these extras:

- -
    -
  1. -

    Property names are only escaped when necessary

    - -
    <root><while>true</while><wend>false</wend><only-if/></root>
    -
    - -

    becomes

    - -
    {
    -  "while": true,
    -  wend: false,
    -  "only-if": null
    -}
    -
    -
  2. -
  3. -

    Within a string, closing elements "</" are escaped as "<\/"

    - -
    <root><![CDATA[<script>alert("YES");</script>]]></root>
    - -

    becomes

    - -
    { script: "<script>alert(\"YES\")<\/script>" }
    -
    -
  4. -
  5. -

    Dates are created as new Date objects

    - -
    <root>2006-12-25</root>
    - -

    becomes

    - -
    new Date(2006, 12 - 1, 25)
    -
    -
  6. -
  7. -

    Attributes and comments are shown as comments (for testing purposes):

    - -
    <!--testing--><root><test version="1.0">123</test></root>
    -
    - -

    becomes

    - -
    /* testing */ { test /* @version = "1.0" */ : 123}
    -
    -
  8. -
  9. -

    A bit of indentation is done, to keep things legible

    -
  10. -
- -
Note: Our algorithms comply with the point 3 (but without month decrease). The points 1 and 2 are automatically managed by the JavaScript method JSON.stringify().
- -

In summary

- -

Let's take the third algorithm as the most representative JXON parsing algorithm. A single structured XML Element might have eight different configurations:

- -
    -
  1. an empty element,
  2. -
  3. an element with pure text content,
  4. -
  5. an empty element with attributes,
  6. -
  7. an element with text content and attributes,
  8. -
  9. an element containing elements with different names,
  10. -
  11. an element containing elements with identical names,
  12. -
  13. an element containing elements and contiguous text,
  14. -
  15. an element containing elements and non contiguous text.
  16. -
- -

The following table shows the corresponding conversion patterns between XML and JSON according to the third algorithm.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CaseXMLJSONJavascript access
1<animal />"animal": truemyObject.animal
2<animal>Deka</animal>"animal": "Deka"myObject.animal
3<animal name="Deka" />"animal": {"@name": "Deka"}myObject.animal["@name"]
4<animal name="Deka">is my cat</animal>"animal": { "@name": "Deka", "keyValue": "is my cat" }myObject.animal["@name"], myObject.animal.keyValue
5<animal> <dog>Charlie</dog> <cat>Deka</cat> </animal>"animal": { "dog": "Charlie", "cat": "Deka" }myObject.animal.dog, myObject.animal.cat
6<animal> <dog>Charlie</dog> <dog>Mad Max</dog> </animal>"animal": { "dog": ["Charlie", "Mad Max"] }myObject.animal.dog[0], myObject.animal.dog[1]
7<animal> in my house <dog>Charlie</dog> </animal>"animal": { "keyValue": "in my house", "dog": "Charlie" }myObject.animal.keyValue, myObject.animal.dog
8<animal> in my ho <dog>Charlie</dog> use </animal>"animal": { "keyValue": "in my house", "dog": "Charlie" }myObject.animal.keyValue, myObject.animal.dog
- -

Code considerations

- -

In these examples we chose to use a property named keyValue for the text content. The lack of standards for XML to JSON conversion leads developers to choose a variety of property names for the text content of XML Element nodes that also contain other child nodes. Sometimes a property called $ is used. Other times a property called #text is used (however, a name like this isn't a good choice, since the text content of a node can be parsed into a non-string value by our algorithms during the conversion). In the algorithms proposed here, you can easily change this name, depending on your needs.

- -

The choice of using a true value instead of a null value to represent empty nodes is due to the fact that when in an XML document there is an empty node the reason is often to express a Boolean, as in this case:

- -
<car>
-  <type>Ferrari</type>
-  <bought />
-</car>
-
- -

If the value were null it would be more cumbersome to launch a code like this:

- -
if (myObject.car.bought) {
-  // do something
-}
-
- -
Note: According to our third algorithm and our fourth algorithm, just CDATASection nodes which contain nothing but white spaces (precisely: /^\s+$/) will be parsed as null.
- -

The fourth algorithm represents a special case of conversion. As you can see, the generated JavaScript Object tree is not stringifyable. It is very practical for internal JavaScript access, but don't use it if you want to transfer the tree via JSON string (as for Worker messages, for example).

- -

We chose to ignore nodes which have a prefix (for example: <ding:dong>binnen</ding:dong>), due to their special case (they are often used in order to represents an XML Schema, which is meta-information concerning how to organize the information of the document, reserved for the XML parser). You can include them removing the string && !oNode.prefix from our algorithms (by doing so the whole tag will become the property name: { "ding:dong": "binnen" }).

- -

An important consideration is that, when using the third or the fourth algorithm, an XML Document can be used to create any type of JavaScript object. For example, If you want to create an object like the following:

- -
{
-  "myboolean": true,
-  "myarray": ["Cinema", "Hot dogs", false],
-  "myobject": {
-    "nickname": "Jack",
-    "registration_date": new Date(1995, 11, 25),
-    "privileged_user": true
-  },
-  "mynumber": 99,
-  "mytext": "Hello World!"
-}
-
- -

you must just create an XML document with the following structure:

- -
<myboolean>true</myboolean>
-<myarray>Cinema</myarray>
-<myarray>Hot dogs</myarray>
-<myarray>false</myarray>
-<myobject>
-  <nickname>Jack</nickname>
-  <registration_date>Dec 25, 1995</registration_date>
-  <privileged_user />
-</myobject>
-<mynumber>99</mynumber>
-<mytext>Hello World!</mytext>
-
- -

This example also shows how the ideal JXON document is an XML document designed specifically to be converted in JSON format, though our algorithms work fine with any kind of XML document.

- -
Note: Despite the term JXON suggesting "lossless" conversions, these techniques are not actually lossless if one needs to preserve ordering of elements, as is common with many XML dialects (including of course XHTML). The ECMAScript standard (JavaScript) indicates that object iteration order is implementation dependent.
- -

Appendix: a complete, bidirectional, JXON library

- -

Now we can create a more complete, bidirectional, JXON library based on all our algorithms (see: #1, #2, #3, #4, reverse). Its usage is modeled on the JSON native object. Before implementing it in a working environment, please read the note about the const statement compatibility. The following code is also available on GitHub.

- -
"use strict";
-
-/*\
-|*|
-|*|  JXON framework - Copyleft 2011 by Mozilla Developer Network
-|*|
-|*|  Revision #3 - October 31th, 2016
-|*|
-|*|  https://developer.mozilla.org/en-US/docs/JXON
-|*|  https://developer.mozilla.org/User:fusionchess
-|*|  https://github.com/madmurphy/jxon.js
-|*|
-|*|  This framework is released under the GNU Public License, version 3 or later.
-|*|  http://www.gnu.org/licenses/gpl-3.0-standalone.html
-|*|
-\*/
-
-const JXON = new (function () {
-
-  function parseText (sValue) {
-    if (rIsNull.test(sValue)) { return null; }
-    if (rIsBool.test(sValue)) { return sValue.toLowerCase() === "true"; }
-    if (isFinite(sValue)) { return parseFloat(sValue); }
-    if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
-    return sValue;
-  }
-
-  function EmptyTree () {}
-
-  EmptyTree.prototype.toString = function () { return "null"; };
-
-  EmptyTree.prototype.valueOf = function () { return null; };
-
-  function objectify (vVal) {
-    return vVal === null ? new EmptyTree() : vVal instanceof Object ? vVal : new vVal.constructor(vVal);
-  }
-
-  function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
-
-    const
-      nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
-      bAttributes = oParentNode.hasAttributes && oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
-
-    var
-      sProp, vContent, nLength = 0, sCollectedTxt = "",
-      vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
-
-    if (bChildren) {
-      for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
-        oNode = oParentNode.childNodes.item(nItem);
-        if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is "CDATASection" (4) */
-        else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is "Text" (3) */
-        else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is "Element" (1) */
-      }
-    }
-
-    const nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
-
-    if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
-
-    for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
-      sProp = aCache[nElId].nodeName.toLowerCase();
-      vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
-      if (vResult.hasOwnProperty(sProp)) {
-        if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
-        vResult[sProp].push(vContent);
-      } else {
-        vResult[sProp] = vContent;
-        nLength++;
-      }
-    }
-
-    if (bAttributes) {
-
-      const
-        nAttrLen = oParentNode.attributes.length,
-        sAPrefix = bNesteAttr ? "" : sAttrsPref, oAttrParent = bNesteAttr ? {} : vResult;
-
-      for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
-        oAttrib = oParentNode.attributes.item(nAttrib);
-        oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
-      }
-
-      if (bNesteAttr) {
-        if (bFreeze) { Object.freeze(oAttrParent); }
-        vResult[sAttrProp] = oAttrParent;
-        nLength -= nAttrLen - 1;
-      }
-
-    }
-
-    if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
-      vResult[sValProp] = vBuiltVal;
-    } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
-      vResult = vBuiltVal;
-    }
-
-    if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
-
-    aCache.length = nLevelStart;
-
-    return vResult;
-
-  }
-
-  function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
-
-    var vValue, oChild;
-
-    if (oParentObj.constructor === String || oParentObj.constructor === Number || oParentObj.constructor === Boolean) {
-      oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 or 1 */
-      if (oParentObj === oParentObj.valueOf()) { return; }
-    } else if (oParentObj.constructor === Date) {
-      oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));
-    }
-
-    for (var sName in oParentObj) {
-      vValue = oParentObj[sName];
-      if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
-      if (sName === sValProp) {
-        if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
-      } else if (sName === sAttrProp) { /* verbosity level is 3 */
-        for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
-      } else if (sName.charAt(0) === sAttrsPref) {
-        oParentEl.setAttribute(sName.slice(1), vValue);
-      } else if (vValue.constructor === Array) {
-        for (var nItem = 0; nItem < vValue.length; nItem++) {
-          oChild = oXMLDoc.createElement(sName);
-          loadObjTree(oXMLDoc, oChild, vValue[nItem]);
-          oParentEl.appendChild(oChild);
-        }
-      } else {
-        oChild = oXMLDoc.createElement(sName);
-        if (vValue instanceof Object) {
-          loadObjTree(oXMLDoc, oChild, vValue);
-        } else if (vValue !== null && vValue !== true) {
-          oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
-        }
-        oParentEl.appendChild(oChild);
-      }
-    }
-
-  }
-
-  /* Uncomment the following code if you want to enable the .appendJXON() method for *all* the "element" objects! */
-
-  /*
-
-  Element.prototype.appendJXON = function (oObjTree) {
-    loadObjTree(document, this, oObjTree);
-    return this;
-  };
-
-  */
-
-  this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
-    const nVerbMask = arguments.length > 1 && typeof nVerbosity === "number" ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
-    return createObjTree(oXMLParent, nVerbMask, bFreeze || false, arguments.length > 3 ? bNesteAttributes : nVerbMask === 3);
-  };
-
-  this.unbuild = function (oObjTree, sNamespaceURI /* optional */, sQualifiedName /* optional */, oDocumentType /* optional */) {
-    const oNewDoc = document.implementation.createDocument(sNamespaceURI || null, sQualifiedName || "", oDocumentType || null);
-    loadObjTree(oNewDoc, oNewDoc, oObjTree);
-    return oNewDoc;
-  };
-
-  const
-    sValProp = "keyValue", sAttrProp = "keyAttributes", sAttrsPref = "@", /* you can customize these values */
-    aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
-
-})();
-
- -
Note: The current implementation of const (constant statement) is not part of ECMAScript 5. It is supported in Firefox & Chrome (V8) and partially supported in Opera 9+ and Safari. It is not supported in Internet Explorer 6-9, or in the preview of Internet Explorer 10. const is going to be defined by ECMAScript 6, but with different semantics. Similar to variables declared with the let statement, constants declared with const will be block-scoped. We used it only for didactic purpose. If you want a full browser compatibility of this library, please replace all the const statements with the var statements.
- -

Usage

- -

The obtained non-native JXON global object will have two methods:

- - - - - - - - - - - - - - - - -
MethodDescription
JXON.build(document[, verbosity[, freeze[, nesteAttributes]]])Returns a JavaScript Object based on the given XML Document.
JXON.unbuild(objTree[, namespaceURI[, qualifiedNameStr[, documentType]]])Returns an XML Document based on the given JavaScript Object.
- -

These methods are inverses of each other. So, you can work with the JXON object by inserting the previous code at the beginning of your scripts. If you are not interested in a bidirectional conversion, don't use it, use only one of our algotithm instead.

- -

Sample usage:

- -
var myObject = JXON.build(doc);
-// we got our javascript object! try: alert(JSON.stringify(myObject));
-
-var newDoc = JXON.unbuild(myObject);
-// we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
- -

…the same thing using AJAX:

- -
function reqListener () {
-
-    var myObject = JXON.build(this.responseXML);
-    // we got our javascript object!
-    alert(JSON.stringify(myObject));
-
-    var newDoc = JXON.unbuild(myObject);
-    // we got our Document instance!
-    alert((new XMLSerializer()).serializeToString(newDoc));
-
-};
-
-var oReq = new XMLHttpRequest();
-oReq.onload = reqListener;
-oReq.open("get", "example.xml", true);
-oReq.send();
- -

JXON.build syntax

- -

JXON.build(document[, verbosity[, freeze[, nesteAttributes]]])

- -

JXON.build description

- -

Returns a JavaScript Object based on the given XML Document.

- -

JXON.build parameters

- -
-
document
-
The XML document to be converted into JSON format.
-
verbosity Optional
-
The verbosity level of conversion (optional), from 0 to 3. It is almost equivalent to our algorithms from #4 to #1 (default value is 1, which is equivalent to the algorithm #3).
-
freeze Optional
-
A boolean (optional) expressing whether the created object must be freezed or not (default value is false).
-
nesteAttributes Optional
-
A boolean (optional) expressing whether the the nodeAttributes must be nested into a child-object named keyAttributes or not (default value is false for verbosity levels from 0 to 2; true for verbosity level 3).
-
- -

JXON.unbuild syntax

- -

JXON.unbuild(objTree[, namespaceURI[, qualifiedNameStr[, documentType]]])

- -

JXON.unbuild description

- -

Returns an XML Document based on the given JavaScript Object.

- -

JXON.unbuild parameters

- -
-
objTree
-
The JavaScript Object from which you want to create your XML Document.
-
namespaceURI Optional
-
Is a DOMString containing the namespace URI of the document to be created, or null if the document doesn't belong to one.
-
qualifiedNameStr Optional
-
Is a DOMString containing the qualified name, that is an optional prefix and colon plus the local root element name, of the document to be created.
-
documentType Optional
-
Is the DocumentType of the document to be created. It defaults to null.
-
- -

Extend the native Element.prototype object

- -

If you want to enable the .appendJXON() method for all the native element objects, you can uncomment the following code from the JXON library:

- -
  /* Uncomment the following code if you want to enable the .appendJXON() method for *all* the "element" objects! */
-
-  /*
-
-  Element.prototype.appendJXON = function (oObjTree) {
-    loadObjTree(document, this, oObjTree);
-    return this;
-  };
-
-  */
- -

Example

- -

Imagine you want to populate the following HTMLElement through JSON:

- -
<div id="form_container"></div>
- -

Then, the following code:

- -
document.getElementById("form_container").appendJXON({
-  "form": {
-    "script": {
-      "@type": "text/javascript",
-      "keyValue": "\n  function numbersOnly (oToCheckField, oKeyEvent) {\n  return oKeyEvent.charCode === 0 || /\\d/.test(String.fromCharCode(oKeyEvent.charCode));\n  }\n"
-    },
-    "input": [{
-      "@type": "hidden",
-      "@name": "instId",
-      "@value": 1234
-    }, {
-      "@type": "hidden",
-      "@name": "currency",
-      "@value": "GBP"
-    }, {
-      "@type": "hidden",
-      "@name": "amount",
-      "@value": 0
-    }, {
-      "@type": "hidden",
-      "@name": "name",
-      "@value": "CAPTURED"
-    }],
-    "table": {
-      "tr": [{
-        "th": {
-          "@style": "text-align: right;",
-          "keyValue": "Product:"
-        },
-        "td": {
-          "span": [{
-            "input": {
-              "@type": "radio",
-              "@name": "nome",
-              "@id": "rel_tshirt",
-              "@value": "tshirt"
-            },
-            "label": {
-              "@for": "rel_tshirt",
-              "keyValue": "T-Shirt"
-            },
-            "@class": "product"
-          }, {
-            "input": {
-              "@type": "radio",
-              "@name": "nome",
-              "@id": "rel_trousers",
-              "@value": "trousers"
-            },
-            "label": {
-              "@for": "rel_trousers",
-              "keyValue": "Trousers"
-            },
-            "@class": "product"
-          }, {
-            "input": {
-              "@type": "radio",
-              "@name": "nome",
-              "@id": "rel_pullover",
-              "@value": "pullover"
-            },
-            "label": {
-              "@for": "rel_pullover",
-              "keyValue": "Pullover"
-            },
-            "@class": "product"
-          }]
-        }
-      }, {
-        "th": {
-          "@style": "text-align: right;",
-          "keyValue": "Quantity:"
-        },
-        "td": {
-          "input": {
-            "@type": "text",
-            "@name": "myInput",
-            "@onkeypress": "return numbersOnly(this, event);",
-            "@onpaste": "return false;"
-          }
-        }
-      }]
-    },
-    "p": {
-      "input": {
-        "@type": "submit",
-        "@value": "Purchase!"
-      }
-    },
-    "@action": "https://secure-test.worldpay.com/wcc/purchase",
-    "@name": "BuyForm",
-    "@method": "POST"
-  }
-});
- -

will populate the previous element in the following way:

- -
<div id="form_container">
-  <form action="https://secure-test.worldpay.com/wcc/purchase" name="BuyForm" method="POST">
-    <script type="text/javascript">
-      function numbersOnly(oToCheckField, oKeyEvent) {
-        return oKeyEvent.charCode === 0 || /\d/.test(String.fromCharCode(oKeyEvent.charCode));
-      }
-    </script>
-    <input type="hidden" name="instId" value="1234" />
-    <input type="hidden" name="currency" value="GBP" />
-    <input type="hidden" name="amount" value="0" />
-    <input type="hidden" name="name" value="CAPTURED" />
-    <table>
-      <tr>
-        <th style="text-align: right;">Product:</th>
-        <td><span class="product"><input type="radio" name="nome" id="rel_tshirt" value="tshirt"/><label for="rel_tshirt">T-Shirt</label></span><span class="product"><input type="radio" name="nome" id="rel_trousers" value="trousers"/><label for="rel_trousers">Trousers</label></span><span class="product"><input type="radio" name="nome" id="rel_pullover" value="pullover"/><label for="rel_pullover">Pullover</label></span>
-        </td>
-      </tr>
-      <tr>
-        <th style="text-align: right;">Quantity:</th>
-        <td>
-          <input type="text" name="myInput" onkeypress="return numbersOnly(this, event);" onpaste="return false;" />
-        </td>
-      </tr>
-    </table>
-    <p>
-      <input type="submit" value="Purchase!" />
-    </p>
-  </form>
-</div>
- -

Other examples

- -

Example #1: How to use JXON to create an HTML document instead of an XML document:

- -
/* The structure of my document */
-var oMyHTMLStruct = {
-  "html": {
-    "head": {
-      "meta": {
-        "@http-equiv": "Content-Type",
-        "@content": "text/html; charset=UTF-8"
-      },
-      "title": "My HTML Document",
-      "script": {
-        "@type": "text/javascript",
-        "keyValue": "alert(\"Welcome!\");"
-      },
-      "style": "p:first-letter {\n  font: italic bold 30px Georgia, serif;\n}"
-    },
-    "body": {
-      "h1": "My HTML Document",
-      "p": "Hello world!!"
-    }
-  }
-};
-
-/* Create the document */
-var oMyHTMLDoc = JXON.unbuild(oMyHTMLStruct, "http://www.w3.org/1999/xhtml");
- -

…And here is the output of alert((new XMLSerializer()).serializeToString(oMyHTMLDoc)):

- -
<html>
-
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <title>My HTML Document</title>
-  <script type="text/javascript">
-    alert("Welcome!");
-  </script>
-  <style>
-    p:first-letter {
-      font: italic bold 30px Georgia, serif;
-    }
-  </style>
-</head>
-
-<body>
-  <h1>My HTML Document</h1>
-  <p>Hello world!!</p>
-</body>
-
-</html>
- -
Note: As we already said in the note within Code considerations, despite the bidirectional conversion between XML and JSON is lossless regarding the whole content and the structure of an XML document, it is not lossless regarding the ordering of elements, which for some XML dialects (like XHTML) is part of the information. For instance, a bidirectional conversion of the following HTML paragraph: - -
<p>She <strong>loves</strong> you. And definitely <strong>hates</strong> me.</p>
-would determine a result like the following: - -
<p><strong>loves</strong><strong>hates</strong>Sheyou. And definitelyme.</p>
-As you can see in this special case, the whole information is preserved, the ordering of the elements is not.
-It turns out then that for some XML dialects JXON can be not the best choise, while it can be a really powerful tool in dealing with standard XML. One conversion method which is lossless for element order, as it relies on arrays (but, with a less human-readable, JavaScript-friendly syntax), is JsonML.
- -

About this library

- -

The JXON.build() method summarizes all our four ways of conversion (see: #1, #2, #3, #4). The result is therefore the same of our four algorithms, depending on the level of verbosity utilised. As above, optional properties and methods (commented in the example) of the first algorithm (verbosity level: 3) are not included.

- -

The JXON.unbuild() method utilises our reverse algorithm.

- -

Therefore, all code considerations remain the same.

- -

Resources

- - - -

See also

- - diff --git a/files/es/archive/mdn/index.html b/files/es/archive/mdn/index.html deleted file mode 100644 index 95f78220b5..0000000000 --- a/files/es/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/es/archive/meta_docs/index.html b/files/es/archive/meta_docs/index.html deleted file mode 100644 index b81d50a9bc..0000000000 --- a/files/es/archive/meta_docs/index.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: MDN "meta-documentation" archive -slug: Archive/Meta_docs -tags: - - Archive - - MDN - - NeedsTranslation - - TopicStub -translation_of: Archive/Meta_docs ---- -

Here you'll find archived "meta-documentation"; that is, documentation about how to write documentation on MDN. The articles here are obsolete and should no longer be referenced; we are retaining them here for reference while we migrate some content to new places, but very little of this is useful.

-

-
Clases CSS
Estas son las clases CSS que hemos definido para los wikis del MDC. Si por alguna razón necesitas una clase CSS a medida para las páginas que edites, puedes ponerte en contacto con Dria.
MDN page layout guide
These guides supplement the MDN style guide with specific layouts for the various types of pages on MDN. This helps contributors create new content that's structurally consistent with the rest of MDN.
-
-

diff --git a/files/es/archive/meta_docs/mdn_content_on_webplatform.org/index.html b/files/es/archive/meta_docs/mdn_content_on_webplatform.org/index.html deleted file mode 100644 index efe6963c37..0000000000 --- a/files/es/archive/meta_docs/mdn_content_on_webplatform.org/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: MDN content on WebPlatform.org -slug: Archive/Meta_docs/MDN_content_on_WebPlatform.org -translation_of: Archive/Meta_docs/MDN_content_on_WebPlatform.org ---- -

Web Platform Docs (WPD) is a site for documentation and education about Web standards, run by W3C and supported by Mozilla, among others. Anyone is welcome to contribute content from MDN to WebPlatform.org, under the terms of MDN's Creative Commons Share-Alike 2.5 (CC-BY-SA) license. Content that originates from MDN must be attributed to MDN, with a link to the source article. The Web Platform Docs site provides support for doing this in a systematic way.

- -

If you create an account on WPD and create a new page, you’ll see that there is an option in the "new page" form to indicate that the content you’re contributing came from MDN, and to provide the original URL on MDN. There is also a way on WPD to mark sections of articles as coming from MDN, for cases where they get merged into CC-BY content. (CC-BY is the default license for reuse on WPD.) The External Attribution page on WebPlatform.org describes how to do all of that.

- -

Questions?

- -
-
About MDN or its content
-
Post them to MDN's discussion forum, or ask in #mdn on irc.mozilla.org.
-
About Mozilla's license terms
-
Send e-mail to licensing@mozilla.org.
-
About Web Platform Docs, its content, its license, or its terms-of-use
-
Post them to the public-webplatform mailing list, run by W3C, or ask in #webplatform on irc.freenode.org.
-
diff --git a/files/es/archive/meta_docs/mdn_page_layout_guide/index.html b/files/es/archive/meta_docs/mdn_page_layout_guide/index.html deleted file mode 100644 index 018759b970..0000000000 --- a/files/es/archive/meta_docs/mdn_page_layout_guide/index.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: MDN page layout guide -slug: Archive/Meta_docs/MDN_page_layout_guide -translation_of: Archive/Meta_docs/MDN_page_layout_guide ---- -
-

These guides supplement the MDN style guide with specific layouts for the various types of pages on MDN. This helps contributors create new content that's structurally consistent with the rest of MDN.

-
- -

There are no subpages at this time.

diff --git "a/files/es/archive/misc_top_level/im\303\241genes,_tablas_y_huecos_misteriosos/index.html" "b/files/es/archive/misc_top_level/im\303\241genes,_tablas_y_huecos_misteriosos/index.html" deleted file mode 100644 index 6c3febef05..0000000000 --- "a/files/es/archive/misc_top_level/im\303\241genes,_tablas_y_huecos_misteriosos/index.html" +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: 'Imágenes, tablas y huecos misteriosos' -slug: 'Archive/Misc_top_level/Imágenes,_tablas_y_huecos_misteriosos' -tags: - - CSS - - Todas_las_Categorías -translation_of: 'Archive/Misc_top_level/Images,_Tables,_and_Mysterious_Gaps' ---- -

 

-

No importa cuándo hayas empezado a crear páginas web, es muy probable que tengas uno o más diseños basados en el clásico paradigma de "Tablas complicadas y muchas imágenes". Puede que hayas cortado algún logo para que encajara bien en el diseño, o usado un montón de GIF espaciadores de un píxel, los principios y peligros son los mismos. En el pasado, esta forma de maquetar funcionaba porque los navegadores creaban las celdas tan altas y anchas como la imagen que contenían.

-

A partir de 2001 y el auge de los navegadores conformes que muestran las páginas usando HTML y CSS en vez de sus propios algoritmos de diseño, y a causa de un detalle poco conocido de la especificación de CSS, todo diseño basado en maquetación con tablas e imágenes espaciadoras se ha convertido en un desastre visual esperando ser visitado. Todo lo que necesitas es un navegador moderno, un DOCTYPE apropiado, y... ¡Boom!

-

Los componentes

-

Veamos más de cerca la reproducción del problema, y el porqué del mismo. Empezaremos con un ejemplo sencillo, ilustrado en la Figura 1: una celda de una tabla que contiene una imagen.

-

Figura 1

-

Evidentemente la mayoría de los diseños son más complicados que este, pero no necesitamos más para lo que nos proponemos. Una imagen y una celda es todo lo que necesitamos. Aparentemente no hay nada incorrecto en ese ejemplo. Y no debería haberlo, ya que es una muestra de cómo los navegadores se comportaban tradicionalmente.

-

Veamos ahora cómo es mostrada esa misma tabla en un navegador moderno cuando la página tiene un DOCTYPE estricto.

-

Figura 2

-

Observa el espacio que aparece debajo de la imagen en la Figura 2. El diseño de ambas tablas y celdas es el mismo, es el modo de renderizado el que ha cambiado. La celda, en vez de ceñirse a las dimensiones de la imagen, ahora envuelve también la línea en la que reposa la imagen. La imagen reposa en una línea porque las imágenes son, por defecto, contenido en línea. Eso es lo que pasa.

-

Cómo se construye el contenido en línea

-

Para entender qué ha sucedido, veremos la construcción de una línea, el emplazamiento de las imágenes dentro de una línea, y el emplazamiento de una línea dentro de la celda de una tabla. Primero veamos una línea básica que contiene texto, como la de la Figura 3.

-

Figura 3

-

La parte más importante de la Figura 3 es la línea base (representada con una línea azul), y su posición dentro de la línea. El emplazamiento exacto de la línea base depende de la tipografía por "defecto" de la línea (representada por el cuadro rojo). La tipografía está determinada por el valor de font-family del elemento que contiene la línea. El autor no puede cambiar la línea base directamente; por eso, donde quiera que esté, ahí se queda. El espacio debajo de la línea base se llama "espacio de descenso" ya que es hasta donde desciende el trazo inferior de letras como "j", "y", o "q". La Figura 4 nos muestra qué pasa cuando añadimos una imagen a la composición.

-

Figura 4

-

Observa dónde reposa por defecto la imagen: su parte inferior esta alineada con la línea base. Este emplazamiento se puede cambiar con vertical-align, hablaremos de ello en breve, pero casi nadie cambia su valor por defecto. Quitemos el texto y dejemos sólo la imagen, como hemos hecho en la Figura 5.

-

Figura 5

-

Tenemos una imagen posada en la línea base de la línea que contiene la imagen. Veamos qué ocurre cuando ponemos esa línea en la celda de una tabla (Figura 6).

-

Figura 6

-

Aquí lo tienes, espacios abiertos donde nunca se han visto antes. Es incluso peor con imágenes pequeñas, como las espaciadoras de un píxel, como la que se muestra en la Figura 7.

-

Figura 7

-

Ahora sobra espacio por todos lados. Suficiente para volver loco a cualquier diseñador.

-

¿Qué tal si lo arreglamos?

-

Hay una solución evidente, dejar de crear diseños que dependan de tablas e imágenes espaciadoras o recortadas. Pero para muchos diseñadores esto no resulta práctico, y seguro que no ayudará a arreglar diseños antiguos que de repente se ven mal en los navegadores actuales. Hay otra solución, asegurarte de que tu documento no activa el modo de renderizado "estándar".

-

Puedes hacerlo usando un DOCTYPE que active el modo quirks o el modo "casi estándar", o no usando ningún DOCTYPE. No usar DOCTYPE te impedirá validar el código, por lo que no es recomendable. Para los autores que estén trabajando con documentos heredados, el modo "quirks" es la mejor opción. En los casos en los que el autor esté escribiendo documentos nuevos o intentando migrar un diseño para hacerlo tan estándar como sea posible, entonces el modo "casi estándar" será probablemente la mejor elección.

-

Por supuesto, los documentos creados en XHTML estricto o HTML estricto usarán el modo de renderizado "estándar", por lo que tenemos dos vías para solventar el problema en los documentos estrictos.

-

Poner las imágenes en bloque

-

La primera opción, que funcionará para la mayoría de los diseños con mucho contenido gráfico, es convertir la imagen que es inicialmente un elemento en línea, en un elemento en bloque. Hazlo y no se generará nunca más una imagen en línea, y así el problema queda resuelto, esto asumiendo que esa imagen es la única cosa que está en esa celda. En los casos simples, podemos añadir en el css un estilo como este:

-
 td img {display: block;}
-

Este recurso se aplica no sólo a las imágenes sino también a los objetos como por ejemplo las animaciones Flash (swf). Para los objetos debemos introducir en el css la línea:

-
 td object {display: block;}
-


-Considera esta regla cuando la aplicamos al siguiente código:

-
<table cellspacing="0" cellpadding="0" border="0" width="500">
-<tr> <td> <img src="boton1.gif"> <img src="boton2.gif"> <img src="boton3.gif">
-          <img src="boton4.gif"> <img src="boton5.gif"> </td> </tr>
-<tr> <td style="background: red;">
-          <img src="puntorojo.gif" height="1" width="1"> </td> </tr>
-<tr> <td>
-        <p style="margin: 0.5em;">Este texto esta en otra celda de la tabla.
-         Dentro del texto hay un icono <img src="icon2.gif">
-         que indica que el enlace apunta a otra página.  Es muy astuto. </p> </td> </tr>
-</table>
-
-

Como podemos ver en la Figura 8, eso funciona bien en algunos casos pero no tanto en otros.

-

Figura 8

-

La línea roja muestra que el GIF espaciador de un píxel está haciendo ahora que la celda tenga un píxel de alto, como el diseñador pretendía. Por desgracia, ahora los botones de la celda están todos en bloque, y por eso aparecen uno debajo del otro, en vez de mostrarse uno al lado del otro.

-

Una posible solución es añadir un class a cualquier imagen que necesite estar en bloque y después escribir la regla que se adapte.

-
td img.enbloque {display: block;}
-
-<td><img src="reddot.gif" class="enbloque"></td>
-

Dependiendo del diseño, puede que tengamos que añadir muchos class para conseguir este simple efecto. Aún más si hay varias celdas de un píxel que se espere que creen "stacked lines" o algo parecido. Si tienes un código de este tipo, puedes aplicar la clase en las filas de la tabla en vez de en las imágenes. Para lo que tendrás:

-
  tr.enbloque img {display: block;}
-
-

...así como el siguiente cambio en el código html:

-
<tr class="enbloque"><td style="background: red;">
-<img src="puntorojo.gif" height="1" width="1">
-</td></tr>
-

El resultado es que sólo el GIF espaciador está en bloque, así dejamos las otras imágenes tranquilas. Esto nos lleva al resultado que se ve en la Figura 9.

-

Figura 9

-

Como alternativa, si lo prefieres, puedes ponerle la clase a las celdas en vez de a las filas. En cualquier caso, poner las imágenes en bloque puede provocar efectos indeseados si las celdas de tus tablas contienen más de una imagen, como en la Figura 8.

-

Por supuesto, aunque tenemos un espaciador de celda de un píxel en la Figura 9, hay un espacio indeseado justo debajo de los botones de navegación de la parte superior. Deshacerse de este espacio es tan fácil como poner cada imagen en su propia celda y hacer que todas estén en bloque, pero dejémoslas todas juntas en una única celda y así podremos ilustrar otro ejemplo.

-

Usar la alineación vertical

-

Otra elección habitual es dejar la imagen en línea y modificar el alineamiento vertical de la imagen con respecto a la caja de la línea. Por ejemplo, puedes probar lo siguiente:

-
td img {vertical-align: bottom;}
-

Esto hará que el borde inferior de las imágenes se alinee con la parte inferior de la caja de la línea, en vez de alinearse con la línea base. Como podemos ver en el la Figura 10, tiene el efecto deseado: el espacio debajo de las imágenes de la barra de navegación ha desaparecido. Sin embargo, la celda decorativa es aún demasiado alta, y otras imágenes esta desalineadas respecto del texto de circundante.

-

Figura 10

-

De nuevo, podemos ponerle clases a las imágenes, celdas, o filas para reducir el efecto del problema. Sin embargo, los estilos anteriormente mostrados no solucionarán el problema de las imágenes de un píxel, porque la caja en línea que la contiene tendrá la altura que tenga el tamaño de la fuente, y por ello no nos lo reducirá. La imagen se moverá a la parte inferior de la celda, pero la celda no se ajustará a la imagen. Además, cualquier otra imagen que sea más pequeña que la altura de la caja de la línea tendrá espacio alrededor, como pasaba con la celda espaciadora roja. La imagen de un píxel en la celda se alineará con la parte inferior de la misma, pero la caja en línea ha vuelto y con el tamaño del texto normal.

-

Mira, por ejemplo, la Figura 11, donde el tamaño de la fuente del documento es bastante grande. Las imágenes de la barra de navegación tienen ahora un espacio encima, y el espaciador rojo ahora es incluso más grande.

-

Figura 11

-

Es difícil evitar esto, ya que las imágenes aún están en línea y por eso participan en la creación de la caja en línea. Si esa caja en línea se hace lo suficientemente alta, aparecerá un espacio rodeando las imágenes.

-

Esperando una solución

-

Gracias a la minuciosa implementación de CSS 2 por parte de Mozilla, el problema de las imágenes en línea dentro de celdas que crean espacios indeseados ha llamado la atención del grupo de trabajo de CSS. Se han planteado varias propuestas para solucionar el problema, una de las más prometedoras es la propiedad line-box-contain, que ha sido propuesta para su inclusión en CSS 3. Cuando esta propiedad sea adoptada, cualquier navegador que la implemente podrá emular el comportamiento tradicional de "reducción" sin modificar otros diseños con la siguiente regla:

-
td {line-box-contain: font replaced;}  /* propuesto para CSS3 */
-

Hay otros posibles arreglos dentro del plan de trabajo actual de CSS3, como la line-height-policy. Evidentemente, cuanto antes se encuentre e implemente una solución, antes se complacerá a todos los autores.

-

Recomendaciones

-

Sin soporte para CSS3 es difícil facilitar una serie de pasos a seguir para solucionar todas las variantes de este problema, ya que la mejor solución para un documento dado dependerá en gran medida de su estructura. Si tu documento usa un marcado transitional, asegúrate de que tu DOCTYPE refleja ese hecho y no activa el modo "estándar". Esto evitará que los navegadores usen el renderizado estándar, y de esta manera se evitan todos los problemas de diseño en las imágenes. Si estas usando HTML estricto, o necesitas por otros motivos el renderizado "estándar", entonces recuerda estas pautas:

- -

Con una juiciosa mezcla de aproximaciones y reduciendo los trucos con imágenes de un píxel, los cuales -en un navegador que implemente CSS- son innecesarios, es posible evitar estos efectos extraños derivados de la implementación de los estándares. La mejor solución podría ser asegurarse que las imágenes están siempre en una celda ellas solas, esto permite a los autores ponerlas en bloque, pero como siempre esto dependerá del diseño del autor.

-

Enlaces relacionados

- -
-

Información del documento original

-
-

 

-

diff --git a/files/es/archive/misc_top_level/index.html b/files/es/archive/misc_top_level/index.html deleted file mode 100644 index 95bf3b61ab..0000000000 --- a/files/es/archive/misc_top_level/index.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Misc top level -slug: Archive/Misc_top_level -translation_of: Archive/Misc_top_level ---- -

In progress. These pages were moved from the top level of MDN in a spate of furious reorganization.

- -

diff --git a/files/es/archive/misc_top_level/usar_las_preferencias_de_contenido/index.html b/files/es/archive/misc_top_level/usar_las_preferencias_de_contenido/index.html deleted file mode 100644 index d188b50bf4..0000000000 --- a/files/es/archive/misc_top_level/usar_las_preferencias_de_contenido/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Usar las preferencias de contenido -slug: Archive/Misc_top_level/Usar_las_preferencias_de_contenido -tags: - - Firefox 3 -translation_of: Archive/Misc_top_level/Using_content_preferences ---- -

-Firefox 3 introduce el concepto de las preferencias sobre el contenido. Esto permite ejecutar código dentro del chrome (en otras palabras: las extensiones y el navegador en sí, no los sitios web) para guardar las preferencias a nivel local en cada sitio. Esto hace posible escribir una extensión que permita al usuario personalizar la apariencia de sitios web específicos (por ejemplo, poner el tamaño de letra más grande en los sitios que utilizan fuentes muy pequeñas). -

El servicio de preferencias de contenido, ejecutado por nsIContentPrefService, ofrece funciones para fijar y recuperar las preferencias para determinados sitios o preferencias globales. Las preferencias globales se utilizan cada vez que una preferencia para un sitio específico no está disponible. -

-

Ejemplo: Configurar y recuperar preferencias

-

Este ejemplo demuestra como guardar preferencias y después recuperarlas

-
var ioSvc = Components.classes["@mozilla.org/network/io-service;1"]
-            .getService(Components.interfaces.nsIIOService);
-var prefService = Components.classes["@mozilla.org/content-pref/service;1"]
-                  .getService(Components.interfaces.nsIContentPrefService);
-
-// Crea un objeto URI con la referencia del sitio por el cual se guardará la preferencia
-var uri = ioSvc.newURI("http://developer.mozilla.org/", null, null);
-
-// Define el valor de la preferencia "devmo.somesetting" a "foo".
-
-prefService.setPref(uri, "devmo.somesetting", "foo");
-
-...
-
-// Devuelve el valor de la preferencia "devmo.somesetting".
-
-var value = prefService.getPref(uri, "devmo.somesetting");
-
-

Véase también

-

nsIContentPrefService, nsIContentPrefObserver -


-


-

-
-
diff --git a/files/es/archive/mozilla/firefox/el_uso_de_microformatos/index.html b/files/es/archive/mozilla/firefox/el_uso_de_microformatos/index.html deleted file mode 100644 index e264fc04c9..0000000000 --- a/files/es/archive/mozilla/firefox/el_uso_de_microformatos/index.html +++ /dev/null @@ -1,218 +0,0 @@ ---- -title: El uso de microformatos -slug: Archive/Mozilla/Firefox/El_uso_de_microformatos -tags: - - Firefox 3 - - Microformatos -translation_of: Archive/Mozilla/Firefox/Using_microformats ---- -

Los microformatos permiten a un sitio web ofrecer datos semánticos a los navegadores de forma que sea posible presentar resúmenes de la información en una página sin que sea necesario saber cómo analizar el documento en si mismo. Firefox 3 implementa un objeto global Microformats que permite el acceso a estos microformatos. Este objeto y su API hacen de la búsqueda y lectura de microformatos, algo fácil.

- -

Cargar el API de Microformatos

- -

El objeto Microformats se crea usando el nuevo cargador de JavaScript integrado en Firefox 3. Para usar este API, primero necesitas cargar el objeto:

- -
Components.utils.import("resource://gre/modules/Microformats.js");
-
- -

Una vez cargado del API de Microformatos, puedes manejar los Microformatos usando los métodos que aquí listamos. Para información sobre cómo analizar los Microformatos, lee: Analizar microformatos en JavaScript.

- -

Microformatos predefinidos

- -

Firefox 3 ofrece varios Microformatos integrados:

- -
-
adr
-
Representa una dirección (como una calle o una dirección postal).
-
geo
-
Representa una localización geográfica usando coordenadas de latitud y longitud.
-
hCard
-
Representa la información de contacto de una persona.
-
hCalendar
-
Representa una entrada en un calendario o la cita en una agenda.
-
tag
-
Se usa para añadir pestañas a otros Microformatos.
-
- -

Métodos

- -

add()

- -

Añade un nuevo Microformato al módulo de Microformatos.

- -
-

Nota: Si ya existe un microformato con el mismo nombre, será reemplazado por el nuevo.

-
- -
add(name, definition);
-
- -
Parámetros
- -
-
name
-
El nombre del microformato a añadir al módulo.
-
definición
-
Una estructura JavaScript que describe el microformato. Ver Crear microformatos en JavaScript para más detalles.
-
- -

count()

- -

Cuenta el número de microformatos que hay en un documento que cumple con determinado criterio.

- -
numMicroformats = Microformats.count(name, rootElement, options);
-
- -
Parámetros
- -
-
name
-
El nombre del microformato que queremos contar.
-
rootElement
-
Requerido. El elemento DOM en dónde empezar la búsqueda. Si deseas buscar en el documento entero, especifica content.document.
-
options
-
Opcional. Cuando se especifica, este es un objeto JavaScript que contiene cero o más de los siguientes flag:
-
- -
-
-
recurseExternalFrames
-
Si es true, se incluyen los marcos (frames) hijos en la búsqueda. Por defecto es true.
-
showHidden
-
Si es true, se añaden microformatos ocultos, en caso contrario, se ignoran. Por defecto es false.
-
debug
-
Se especifica a true cuando se usa el modo de "debug", en caso contrario es false. Por defecto es false.
-
-
- -
Valor devuelto
- -

Un valor entero que indica el número de microformatos que cumplen el criterio especificado.

- -

debug()

- -

Devuelve una cadena que describe un objeto microformato.

- -
-

Nota: Pueds simplemente llamar a debug() en un objeto microformato: microformatObject.debug() en lugar de usar este método, si lo prefieres.

-
- -
dumpString = debug(microformatObject)
-
- -
Parámetros
- -
-
microformatObject
-
El objeto microformato a descargar.
-
- -
Valor devuelto
- -

Una cadena que describe el contenido del objeto microformato especificado.

- -

get()

- -

Devuelve una matriz de objetos microformato encontrados, que cumplen con el criterio especificado.

- -
microformatsArray = Microformats.get(name, rootElement, options, targetArray);
-
- -
Parámetros
- -
-
name
-
El nombre del microformato a encontrar.
-
rootElement
-
Requerido. El elemento DOM donde debe comenzar la búsqueda. Si quieres buscar el documento entero, especifica content.document.
-
options
-
Opcional. Si se especifica, es un objeto JavaScript que contiene cero o más de los siguientes flag:
-
- -
-
-
recurseExternalFrames
-
Si es true, se incluyen los marcos hijo que hagan referencia a contenido externo, en la búsqueda. Por defecto es true.
-
showHidden
-
Si es true, se incluyen los microformatos ocultos, en caso contrario se ignoran. Por defecto es false.
-
debug
-
Especifica true si se está en modo "debug", en caso contrario es false. Por defecto es false.
-
-
- -
-
targetArray
-
Opcional. Cuando se especifica, es una matriz de objetos microformatos en donde se añaden lso objetos microformato resultantes de la búsqueda.
-
- -
Valor devuelto
- -

Una nueva matriz de objetos microformato que cumplen con el criterio de búsqueda, o la matriz especificada por microformats con los nuevos microformatos encontrados añadidos.

- -

getNamesFromNode()

- -

Devuelve una lista, delimitada por espacios, de nombres de microformatos que corresponde al nodo especificado.

- -
nameList = Microformats.getNamesFromNode(node);
-
- -
Parámetros
- -
-
node
-
El nodo en el cual leer una lista de nombres de microformatos.
-
- -
Valor devuelto
- -

Si el node especificado es un microformato, el resultado es una cadena conteniendo, delimitados por especios, los nombres de todos los microformatos que corresponden al nodo. Si el nodo no es un microformato, no se devuelve nada.

- -

getParent()

- -

Devuelve el nodo padre del microformato especificado o hijo de un microformato.

- -
parentNode = Microformats.getParent(node);
-
- -
Parámetros
- -
-
node
-
El nodo cuyo padre quieres obtener.
-
- -
Valor devuelto
- -

El padre del nodo especificado. No devuelve nada si el node especificado no es un microformato o el hijo de un microformato.

- -

isMicroformat()

- -

Determina si el nodo DOM especificado es o no un microformato.

- -
flag = Microformats.isMicroformat(node);
-
- -
Parámetros
- -
-
node
-
El nodo DOM a comprobar si es un microformato.
-
- -
Valor devuelto
- -

Devuelve true si el nodo es un microformato y false en caso contrario.

- -
-

Nota: Este métodono devuelve true si el nodo es hijo de un microformato.

-
- -

Ver también

- -

 

- - - -

 

diff --git a/files/es/archive/mozilla/firefox/index.html b/files/es/archive/mozilla/firefox/index.html deleted file mode 100644 index 9e61c718ff..0000000000 --- a/files/es/archive/mozilla/firefox/index.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Firefox -slug: Archive/Mozilla/Firefox -translation_of: Archive/Mozilla/Firefox ---- -

In progress. Out-of-date information about the Firefox project.

- -

diff --git a/files/es/archive/mozilla/firefox/soap_en_los_navegadores_basados_en_gecko/index.html b/files/es/archive/mozilla/firefox/soap_en_los_navegadores_basados_en_gecko/index.html deleted file mode 100644 index 0ab155e7b2..0000000000 --- a/files/es/archive/mozilla/firefox/soap_en_los_navegadores_basados_en_gecko/index.html +++ /dev/null @@ -1,264 +0,0 @@ ---- -title: SOAP en los navegadores basados en Gecko -slug: Archive/Mozilla/Firefox/SOAP_en_los_navegadores_basados_en_Gecko -tags: - - SOAP - - Servicios_Web_XML - - Todas_las_Categorías -translation_of: Archive/Mozilla/Firefox/SOAP_in_Gecko-based_Browsers ---- -

 

-

Este artículo muestra cómo acceder a los servicios web utilizando las posibilidades de SOAP y JavaScript disponibles en los últimos navegadores basados en Gecko.

-

Introducción

-

SOAP (Simple Object Access Protocol, protocolo simple de acceso a objetos) es la base sobre la que se construyen los servicios web. Es un protocolo basado en XML utilizado para poder comunicarse e interoperar con los servicios web. Mozilla 1.0 (sobre el cual ha sido construido Netscape 7.0x) y Firefox son capaces de comunicarse directamente con los servicios web a través de su implementación de SOAP a bajo nivel a través de JavaScript.

-

La interfaz de JavaScript de Gecko que establece llamadas SOAP es una API de bajo nivel que precisa de una para construir el mensaje SOAP utilizando varios objetos de JavaScript específicos para SOAP. Este artículo explicará las operaciones básicas de SOAP. Para más detalles véase la API de SOAP a bajo nivel en Gecko aquí.

-

Traducido cross domain access como acceso multidominio ¿¿?? El uso de JavaScript para la comunicación con los servicios web está sujeto a las mismas políticas de seguridad que otros scripts en términos de acceso multidominio. Por tanto, el acceso a servicios web ubicados en servidores distintos al servidor en el que se está ejecutando JavaScript violará la política de multidominio. Este artículo mostrará cómo esquivar temporalmente esto para hacer pruebas.

-

Configurar una llamada SOAP

-

El objeto más básico es SOAPCall, el cual es usado para iniciar e invocar una llamada SOAP.

-

Figura 1 : Configuración básica e invocación de una llamada SOAP

-
var mySOAPCall = new SOAPCall();
-mySOAPCall.transportURI = "http-based service URI"
-
-var parameters = new Array();
-mySOAPCall.encode(SOAPCall.VERSION_1_1,
-                  // method
-                  "method", "namespaceURI",
-                  // header block
-                  0, null,
-                  // parameter
-                  parameters.length, parameters);
-
-var response = mySOAPCall.invoke();
-
-

El objeto SOAPCall posee un miembro llamado transportURI que es el URI de la localización a donde se debe enviar la llamada SOAP. El método encode() necesita el nombre del método a llamar en el servicio web, su - - namespaceURI - , el número de - - SOAPParameters - pasados y un array de - - SOAPParameters - que contendrá todos los parámetros. Todos estos parámetros pueden conocerse en el fichero WSDL del servicio web, el cual será explicado en la sección de ejemplos.

-

Los parámetros SOAP son creados usando el objeto SOAPParameter. Son pares de nombre/valor que son pasados al servicio web.

-

Figura 2: Crear un parámetro SOAP

-
var param = new SOAPParameter();
-param.name = "translationmode";
-param.value = "en_fr";
-
-

Manejar una respuesta

-

Una vez invoke() ha sido llamado, Gecko genera el contenedor SOAP y lo envía al URI especificado. Como la petición es síncrona, la respuesta es el valor devuelto desde invoke().

-

Figura 3 : Manejar la respuesta de una llamada SOAP

-
var returnObject = mySOAPCall.invoke();
-
-if(returnObject.fault){
-  alert("An error occured: " + returnObject.fault.faultString);
-} else {
-  var response = new Array();
-  response = returnObject.getParameters(false, {});
-  alert("Return value: " + response[0].value);
-}
-
-

El valor devuelto desde invoke() se guarda y comprueba en el miembro fault. Si éste existe, entonces ocurrió un error en el servicio web y el mensaje de error se guarda en fault.faultString. Si fault no existe, se puede llamar a la función getParameters() del objeto retornado para obtener los SOAPParameters devueltos.

-

Ejemplo

-

El siguiente ejemplo utiliza un servicio web real, Bablfish, proporcionado por xmethods.net. El servicio web Babelfish permite la traducción entre varios idiomas. Toma como entrada dos parámetros: una cadena con formato "<idioma_original>_<idioma_destino>" y otra cadena con el texto a traducir. El fichero WSDL para el servicio web de Bablfish está disponible aquí y contiene toda la información necesaria para configurar y hacer una llamada SOAP de bajo nivel al servicio web.

-

El primer paso es conocer la localización del servicio web, la cual será el valor del miembro transportURI de SOAPCall. Esto se puede sacar del elemento service del WSDL, concretamente del atributo location de soap:address.

-

Figura 4 : Obtener la localización del servicio web a partir de su WSDL

-
WSDL:
-  <service name="BabelFishService">
-    <documentation>
-      Translates text of up to 5k in length, between a variety of languages.
-    </documentation>
-    <port name="BabelFishPort" binding="tns:BabelFishBinding">
-      <soap:address location="http://services.xmethods.net:80/perl/soaplite.cgi"/>
-    </port>
-  <service>
-
-JavaScript:
-  var babelFishCall = new SOAPCall();
-  babelFishCall.transportURI = "http://services.xmethods.net:80/perl/soaplite.cgi";
-  ...
-
-

El siguiente paso es el más complicado: conocer exactamente qué parámetros espera recibir el servicio web. El servicio web de Babelfish sólo tiene un método, "Babelfish", el cual está representado en el WSDL en las etiquetas operation y que son hijas del elemento portType. Cada operation del WSDL tiene dos hijos: los elementos input y output, los cuales contienen el tipo esperado. Los tipos están definidos en los elementos message de los cuales hay dos: BabelFishRequest, que es lo que va a ser pasado al servicio web y babelFishResponse, que es el tipo devuelto.

-

BabelFish espera recibir dos parámetros de entrada: translationmode y sourcedata. El ejemplo mostrado en la figura 5 traducirá la cadena "I am" del inglés al francés.

-

Figura 5 : Estableciendo los parámetros necesarios

-
WSDL:
-  <message name="BabelFishRequest">
-    <part name="translationmode" type="xsd:string"/>
-    <part name="sourcedata" type="xsd:string"/>
-  </message>
-
-  <message name="BabelFishResponse">
-      <part name="return" type="xsd:string"/>
-  </message>
-
-  <portType name="BabelFishPortType">
-    <operation name="BabelFish">
-      <input message="tns:BabelFishRequest"/>
-      <output message="tns:BabelFishResponse"/>
-    </operation>
-  </portType>
-
-JavaScript:
-  // SOAP parameters
-  var param1 = new SOAPParameter();
-  param1.value = "en_fr";
-  param1.name = "translationmode";
-
-  var param2 = new SOAPParameter();
-  param2.value = "I am";
-
-  param2.name = "sourcedate";
-
-  // combine the 2 params into an array
-  var myParamArray = [param1,param2];
-
-

Luego, es hora de configurar e invocar el objeto SOAPCall. "BabelFish" es el método usado por el ejemplo para el servicio web. El siguiente parámetro es el espacio de nombres que se espera para pasárselo al servicio web para el método BabelFish.

-

Esto se puede saber mirando el elemento binding del WSDL. El elemento binding tiene un hijo operation para el método BabelFish. El espacio de nombres necesarios es el valor del atributo namespace de soap:body dentro del elemento input.

-

Figura 6 : Configurando el método encode

-
WSDL:
-  <binding name="BabelFishBinding" type="tns:BabelFishPortType">
-    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
-    <operation name="BabelFish">
-      <soap:operation soapAction="urn:xmethodsBabelFish#BabelFish"/>
-      <input>
-        <soap:body use="encoded" namespace="urn:xmethodsBabelFish"
-                   encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
-      </input>
-      ...
-    </operation>
-  </binding>
-
-JavaScript:
-  babelFishCall.encode(0, "BabelFish", "urn:xmethodsBabelFish", 0, null, myParamArray.length, myParamArray);
-
-  var translation = babelFishCall.invoke();
-
-

Como muestra la figura 5, la respuesta del método de BabelFish ("BabelFishResponse") tiene un parámetro, concretamente una cadena de texto. Tras asegurarnos de que no se ha devuelto un error, el método getParameters() del objeto devuelto es usado para obtener un array de SOAPResponses. Dado que se espera un solo parámetro (el texto traducido), el método alert() será usado para mostrar dicha traducción.

-

Figura 7 : Manejando la respuesta

-
JavaScript:
-  if(translation.fault){
-    // error returned from the web service
-    alert(translation.fault.faultString);
-  } else {
-    // we expect only one return SOAPParameter - the translated string.
-    var response = new Array();
-    response = translation.getParameters(false, {});
-    alert("Translation: " + response[0].value);
-  }
-
-

Como se dijo en la introducción, las llamadas SOAP obedecen la política de acceso multidominio en los scripts.

-

Existen dos formas de rodear la política de seguridad para hacer pruebas:

-
-
-  
-
-
    -
  1. -

    Ejecuta el script en el disco local.

    -

    Guarda el código localmente en tu disco duro.

    -

    El modelo de seguridad multidomino no afecta al código ejecutado desde el disco duro local.

    -
  2. -
  3. -

    Habilita el acceso multidominio

    -

    Se puede saltar la comprobación multidominio estableciendo una opción como se explica en el artículo Bypassing Security Restrictions and Signing Code y añadiéndolo al comando JavaScript para decirle a la petición que ignore la comprobación multidominio.

    -

    Tras sortear la comprobación, ejecuta el navegador y carga esta página con el ejemplo modificado. Te preguntará (mediante un cuadro de diálogo) los permisos para desactivar el multidominio (para esa sesión) para la función generadora de la llamada SOAP. El único cambio realizado ha sido añadir netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); a la función que genera la llamada SOAP.

    -
  4. -
-

Figura 8 : Código final - Ejemplo local, Ejemplo multidominio

-
JavaScript:
-  var babelFishCall = new SOAPCall();
-  babelFishCall.transportURI = "http://services.xmethods.net:80/perl/soaplite.cgi";
-
-  // SOAP params
-  var param1 = new SOAPParameter();
-  param1.value = "en_fr";
-  param1.name = "translationmode";
-
-  var param2 = new SOAPParameter();
-  param2.value = "I am";
-  param2.name = "sourcedate";
-
-  // combine the 2 params into an array
-  var myParamArray = [param1,param2];
-
-  babelFishCall.encode(0, "BabelFish", "urn:xmethodsBabelFish", 0, null, myParamArray.length, myParamArray);
-
-  var translation = babelFishCall.invoke();
-
-  if(translation.fault){
-    // error returned from the web service
-    alert(translation.fault.faultString);
-  } else {
-   // we expect only one return SOAPParameter - the translated string.
-   var response = new Array();
-   response = translation.getParameters(false, {});
-   alert("Translation: " + response[0].value);
- }
-
-

Tras la pista del contenedor Soap

-

Aquí se muestra un volcado HTTP (usando la aplicación multiplataforma Ethereal) de lo que realmente se envía y se recibe cuando se ejecuta el ejemplo:

-

Figura 9 : Volcado HTTP

-
Sent:
-POST /perl/soaplite.cgi HTTP/1.1
-Host: services.xmethods.net:80
-...
-Content-Type: text/xml
-Content-Length: 516
-
-<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
-              xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/"
-              env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
-              xmlns:xs="http://www.w3.org/1999/XMLSchema"
-              xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">
-  <env:Header/>
-  <env:Body>
-      <a0:BabelFish xmlns:a0="urn:xmethodsBabelFish">
-          <a0:translationmode xsi:type="xs:string">en_fr</a0:translationmode>
-          <a0:sourcedata xsi:type="xs:string">I am</a0:sourcedata>
-      </a0:BabelFish>
-  </env:Body>
-</env:Envelope>
-
-
-Recieved:
-HTTP/1.1 200 OK
-Date: Tue, 11 Mar 2003 20:28:11 GMT
-Server: Apache/1.3& (Unix) Enhydra-Director/3 PHP/4.0.6 DAV/1.0.3 AuthNuSphere/1.0.0
-SOAPServer: SOAP::Lite/Perl/0.52
-Content-Length: 532
-
-...
-Content-Type: text/xml; charset=utf-8
-
-<?xml version="1.0" encoding="UTF-8"?>
-<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
-                   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
-                   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
-                   xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
-                   xmlns:xsd="http://www.w3.org/1999/XMLSchema">
-  <SOAP-ENV:Body>
-    <namesp1:BabelFishResponse xmlns:namesp1="urn:xmethodsBabelFish">
-      <return xsi:type="xsd:string">je suis</return>
-    </namesp1:BabelFishResponse>
-  </SOAP-ENV:Body>
-</SOAP-ENV:Envelope>
-
-

Recursos

-

SOAP Scripts in Mozilla por Ray Whitmer
- Using the Mozilla SOAP API por Scott Andrew LePera and Apple Developer Connection.
- The Latest w3.org SOAP Specification
- Calling SOAP Servers from JS in Mozilla OnLamp.com article by Zachary Kessin
- SOAPCall documentation on XULPlanet.com
- SOAPResponse documentation on XULPlanet.com

-
-

Información del documento original

- -
-

 

diff --git a/files/es/archive/mozilla/index.html b/files/es/archive/mozilla/index.html deleted file mode 100644 index 855e3e8ae6..0000000000 --- a/files/es/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.

-

Introducción a la extension del API de audio
La extension de audio de la API se extiende de la especificación de HTML5 {HTMLElement("audio")}} y <video> multimedia mediante la exposición de elementos metadata de audio y datos puros en audio. Esto permite a los usuarios visualizar los datos de audio, para procesarlos y crear nuevos datos de audio.
Table Layout Regression Tests
Changes in layout, parser and content code can have unintended side effects, also known as regressions. It is good style to check for these unwanted regressions and fixing them before checkin rather than causing Bugzilla avalanches.

diff --git a/files/es/archive/mozilla/jetpack/index.html b/files/es/archive/mozilla/jetpack/index.html deleted file mode 100644 index 7e80cca2b8..0000000000 --- a/files/es/archive/mozilla/jetpack/index.html +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Jetpack -slug: Archive/Mozilla/Jetpack -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Mozilla/Jetpack ---- -

- -

Jetpack

- -

Jetpack is a project to make it easy to build Firefox add-ons using common web technologies.

- -
-

Get Started

- -
    -
  1. Visit the Getting Started tutorial
  2. -
  3. Download the Add-on SDK (formerly called the Jetpack SDK)
  4. -
- -

Documentation

- - - -

Join the Jetpack Community

- - -
diff --git a/files/es/archive/mozilla/table_layout_regression_tests/index.html b/files/es/archive/mozilla/table_layout_regression_tests/index.html deleted file mode 100644 index 564a8273bf..0000000000 --- a/files/es/archive/mozilla/table_layout_regression_tests/index.html +++ /dev/null @@ -1,204 +0,0 @@ ---- -title: Table Layout Regression Tests -slug: Archive/Mozilla/Table_Layout_Regression_Tests -translation_of: Archive/Mozilla/Table_Layout_Regression_Tests ---- -

-

Advertencia: The content of this article may be out of date. While the information on the layout debugger is still useful, the testing information is much less relevant now than it has been, as the "rtest" testing framework described here has been superseded by the reftest framework. It is unclear whether or how well rtest continues to work and whether it is still used or not.

-

- -

Subject Overview

- -

Changes in layout, parser and content code can have unintended side effects, also known as regressions. It is good style to check for these unwanted regressions and fixing them before checkin rather than causing Bugzilla avalanches.

- -

Prerequisites

- -

In order to run these tests, you will need to have:

- -
    -
  1. Make sure that your build is a debug build (in short you need ac_add_options --enable-debug in your .mozconfig file).
  2. -
  3. to build the layoutdebugger itself, build either all extensions or include layoutdebug in your .mozconfig file. For example ac_add_options --enable-extensions=all.
  4. -
  5. a Mozilla tree with the test files at %MOZ_SRC%/layout/html/tests,
  6. -
  7. DISABLE_TESTS should not be defined (so ac_add_options --enable-tests),
  8. -
  9. patience and time.
  10. -
- -

Test Runs

- - - -

Be prepared to cycle.

- -

How the layout regression tests work

- -

First the URL's to test are red from rtest.lst files in various directories. layout/html/tests/block/rtest.lst points to them.

- -

Snippet from rtest.lst in the table/marvin directory:

- -
body_col.html
-body_tbody.html
-body_tfoot.html
-body_thead.html
-col_span.html
-
- -

The regression tests compare the frame tree dumps recorded at two different times. The URL's to test are red from rtest.lstFor every file in rtest.lst Mozilla takes the root frame and dumps the whole tree via nsFrame::DumpRegression.

- -

The frame tree dumps are invoked by the nsILayoutDebugger. The frame trees are dumped to separate files in a baseline or verify directory for all URL's in rtest.lst (see: nsRegressionTester::DumpFrameModel).

- -

Their name is generated by replacing the old extension .html or .xml with .rgd. For appendCells1.html a file appendCells1.rgd will be created in the baseline or verify subdirectory.

- -

A typical beginning of a dump (*.rgd file) looks like:

- -
<frame va="15022440" type="Viewport(-1)" state="270340" parent="0">
-  <view va="47171904">
-  </view>
-  <stylecontext va="15022232">
-
-    <font serif 240 240 0 />
-    <color data="-16777216"/>
-    <background data="0 2 3 -1 0 0 "/>
-    <spacing data="left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0" />
-    <list data="100 100 " />
-    <position data="left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  " />
-
-    <text data="0 0 0 Normal  Normal  0[0x0]tw  Normal  " />
-    <textreset data="0 10[0xa]enum  " />
-    <display data="0 1 0 0 0 0 0 0 0 0 0 0 " />
-    <visibility data="0 1 1.000000" />
-    <table data="0 0 4 -1 1 " />
-    <tableborder data="1 Null  Null  0 2 " />
-
-    <content data="0 0 0 Null  " />
-    <quotes data="0 " />
-    <ui data="3 0 0 1 " />
-    <uireset data="7 0 4" />
-    <xul data="0 0 0 0 0 1    <svg data="0 1.000000 1.000000 0 1.000000" />
-  </stylecontext>
-
- -

The baseline log will look like:

- -
Type Manifest File: e:\moz_src\mozilla\obj-i586-pc-msvc\dist\bin\components\xpti.dat
-+++ JavaScript debugging hooks installed.
-++WEBSHELL == 1
-++DOMWINDOW == 1
-++WEBSHELL == 2
-++DOMWINDOW == 2
-Note: styleverifytree is disabled
-Note: frameverifytree is disabled
-Note: verifyreflow is disabled
-++WEBSHELL == 3
-++DOMWINDOW == 3
-Running baseline test for E:\moz_src\mozilla\layout\html\tests\block\rtest.lst.
-Writing regression data to E:\moz_src\mozilla\layout\html\tests\block\base\baseline\width-fixed_html.rgd
-Writing regression data to E:\moz_src\mozilla\layout\html\tests\block\base\baseline\width-percent_html.rgd
-Writing regression data to E:\moz_src\mozilla\layout\html\tests\block\base\baseline\margin1_html.rgd
-Writing regression data to E:\moz_src\mozilla\layout\html\tests\block\base\baseline\pre_html.rgd
-Writing regression data to E:\moz_src\mozilla\layout\html\tests\block\base\baseline\pre1_html.rgd
-
- -

The second verify run creates first the frame dumps in the verify subdirectories (verify) and compares each frame dump with the corresponding reference frame dump. If they differ in critical points the test fails.

- -

A typical part of the verify log would look like:

- -
Type Manifest File: e:\moz_src\mozilla\obj-i586-pc-msvc\dist\bin\components\xpti.dat
-+++ JavaScript debugging hooks installed.
-++WEBSHELL == 1
-++DOMWINDOW == 1
-++WEBSHELL == 2
-++DOMWINDOW == 2
-Note: styleverifytree is disabled
-Note: frameverifytree is disabled
-Note: verifyreflow is disabled
-++WEBSHELL == 3
-++DOMWINDOW == 3
-Running verify test for E:\moz_src\mozilla\layout\html\tests\block\rtest.lst.
-Writing regression data to E:\moz_src\mozilla\layout\html\tests\table\core\verify\standards1.rgd
-Comparing to regression data from E:\moz_src\mozilla\layout\html\tests\table\core\baseline\standards1.rgd
-frame bbox mismatch: 0,26437,4824,600 vs. 0,26437,4872,600
-Node 1:
-  TableOuter(table)(144) 0x10004 0,26437,4824,600, |null attr|-16777216|left: 0[0x0]tw top: 0[0x0]tw right: 0[0x0]tw bottom: 0[0x0]tw  left: 0[0x0]tw top: 0[0x0]tw right: 0[0x0]tw bottom: 0[0x0]tw  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 8 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-Node 2:
-  TableOuter(table)(144) 0x10004 0,26437,4872,600, |null attr|-16777216|left: 0[0x0]tw top: 0[0x0]tw right: 0[0x0]tw bottom: 0[0x0]tw  left: 0[0x0]tw top: 0[0x0]tw right: 0[0x0]tw bottom: 0[0x0]tw  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 8 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-frame bbox mismatch: 0,0,4824,600 vs. 0,0,4872,600
-Node 1:
-  Table(table)(144) 0x10004 0,0,4824,600, |null attr|-16777216|left: Null top: 0[0x0]tw right: Null bottom: 0[0x0]tw  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  2 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 8 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-Node 2:
-  Table(table)(144) 0x10004 0,0,4872,600, |null attr|-16777216|left: Null top: 0[0x0]tw right: Null bottom: 0[0x0]tw  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  2 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 8 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-frame bbox mismatch: 24,24,4776,552 vs. 24,24,4824,552
-Node 1:
-  TableColGroup(table)(144) 0x80010004 24,24,4776,552, |null attr|-16777216|left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 12 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-Node 2:
-  TableColGroup(table)(144) 0x80010004 24,24,4824,552, |null attr|-16777216|left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 12 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-frame bbox mismatch: 0,0,2400,552 vs. 0,0,2424,552
-Node 1:
-  TableCol(table)(144) 0x30010004 0,0,2400,552, |null attr|-16777216|left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 11 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-Node 2:
-  TableCol(table)(144) 0x30010004 0,0,2424,552, |null attr|-16777216|left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 11 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-frame bbox mismatch: 2424,0,2352,552 vs. 2448,0,2376,552
-Node 1:
-  TableCol(table)(144) 0x30010004 2424,0,2352,552, |null attr|-16777216|left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 11 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-Node 2:
-  TableCol(table)(144) 0x30010004 2448,0,2376,552, |null attr|-16777216|left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  left: 1[0x1]enum top: 1[0x1]enum right: 1[0x1]enum bottom: 1[0x1]enum  left: Null top: Null right: Null bottom: Null  left: Null top: Null right: Null bottom: Null  1[0x1]enum 0|1 1 [none]|left: Auto top: Auto right: Auto bottom: Auto  Auto  0[0x0]tw  Null  Auto  0[0x0]tw  Null  0 Auto  |0 0 0 Normal  Normal  0[0x0]tw  Normal  |0 11 1,000000 0 0 0 0 0 0 0 0 0 0 0 [none]|0 0 0 -1 1 |0 0 0 Null
-Comparison for file:///E:/moz_src/mozilla/layout/html/tests/table/core/baseline/standards1.rgd  failed.
-
- -

The first regression test has failed and it is marked so.

- -

Adding new regression tests

- -

Once you have checked in the code:

- - - -

Additional Notes

- -

There is a special type of frame dumps - the printing regression tests, they are invoked by the -Prt command line argument to the viewer and include first a display then a frame dump taking into account the printer pages. Please contact if you need help with running those tests.

- -

I would like to thank Chris Karnaze for his guidance and fantasai for her language support.

- -
-

Original Document Information

- - -
diff --git a/files/es/archive/mozilla/xbl/index.html b/files/es/archive/mozilla/xbl/index.html deleted file mode 100644 index 0cc0e0d40a..0000000000 --- a/files/es/archive/mozilla/xbl/index.html +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: XBL -slug: Archive/Mozilla/XBL -tags: - - XBL -translation_of: Archive/Mozilla/XBL ---- -

-

XML Binding Language (XBL, algunas veces simplemete denominado Extensible Bindings Language) es un lenguaje para describir vinculaciones que pueden ser adjuntadas a elementos en otros documentos. El elemento al cual el vinculado es añadido, llamado elemento vinculado, adquiere el nuevo comportamiento especificado por el vínculo. -

Las vinculaciones pueden contener eventos handlers que son registrados en el elemento vinculado, una implementación de nuevos métodos y propiedades que ahora son accesibles por el elemento vinculado, y contenido anónimo que es insertado a través del elemento vinculado. -

Muchos widgets XUL son, por lo menos, parcialmente implementados usando XBL. Puedes construir tus propios widgets reusables a partir de XUL, HTML, SVG existentes, y otras primitivas usando XBL. -

-

Especificaciones

-

XBL 1.0 está especificado en Referencia XBL 1.0. Desafortunadamente, la implementación actual en Mozilla es diferente de la especificación, y no hay documento conocido donde se describan las diferencias. Afortunadamente, la Referencia será actualizada para describir dichas diferencias. -

XBL 1.0 es una tecnología específica de Mozilla, y no un estándard W3C . Sin embargo, al menos dos estándares estan siendo implementados: sXBL y XBL 2.0. -

- -

Algunas diferencias entre sXBL y XBL2 están expuestas en un artículo de Anne van Kesteren. -

-

Véase también

- - diff --git a/files/es/archive/mozilla/xul/action/index.html b/files/es/archive/mozilla/xul/action/index.html deleted file mode 100644 index f44a54305b..0000000000 --- a/files/es/archive/mozilla/xul/action/index.html +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: action -slug: Archive/Mozilla/XUL/action -tags: - - para_revisar - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/action ---- -

- « Referencia de XUL [ - Ejemplos | - Atributos | - Propiedades | - Methoden | - Métodos ] -

-

Utilizado para especificar el contenido que debe ser generado para cada resultado correspondiente de una consulta. La acción debe estar contenido dentro de un elemento query o rule.

-

Un descendiente de la acción debe tener un atributo uri seteado a la variable miembro. Este elemento y sus descendientes pueden utilizar variables en lugar de valores de atributos. Las variables son un signo de interrogación seguido por un nombre. Por regla general, cada variable será una referencia a los datos dentro de la fuente de datos, determina a partir de la consulta. Si la misma variable aparece varias veces, tendrá el mismo valor en cada lugar.

-

Para más información, ver Acciones.

-

Ejemplos

-
se necesitan ejemplos
-
-

Atributos

- - - - - - -

Heredados desde el elemento 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

-
-

Propiedades

- -

Propiedades Heredadas
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

Métodos

- -

Métodos Heredados
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/es/archive/mozilla/xul/attribute/index.html b/files/es/archive/mozilla/xul/attribute/index.html deleted file mode 100644 index 4914368c25..0000000000 --- a/files/es/archive/mozilla/xul/attribute/index.html +++ /dev/null @@ -1,304 +0,0 @@ ---- -title: Atributos -slug: Archive/Mozilla/XUL/Attribute -translation_of: Archive/Mozilla/XUL/Attribute ---- -
« Referencia de XUL
- - diff --git a/files/es/archive/mozilla/xul/bestiario_xul/index.html b/files/es/archive/mozilla/xul/bestiario_xul/index.html deleted file mode 100644 index 7d2f8b3a9d..0000000000 --- a/files/es/archive/mozilla/xul/bestiario_xul/index.html +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: Bestiario XUL -slug: Archive/Mozilla/XUL/Bestiario_XUL -tags: - - Complementos - - Todas_las_Categorías - - XUL - - extensiones -translation_of: Archive/Mozilla/XUL/A_XUL_Bestiary ---- -

 

-

Este documento sobre XUL presenta algunos de los conceptos clave y términos del entorno de desarollo XUL. El propósito de este artículo no es explicar estos elementos en profundidad sino decir lo que son en términos sencillos. Se han seleccionado los elementos para este grupo porque parecen que están inmersos en el misterio, que son poco usados como conceptos o términos, o que son infravalorados de acuerdo a su papel en XUL y al desarrollo multiplataforma. En contraposición al - - Mozilla Jargon File - , este artículo explica los elementos de especial interés para el desarrollo web o de contenidos y pretende establecer un contexto para comprender las nuevas tecnologías de Mozilla y en particular el lenguaje de interfaces de usuario basado en XML de Mozilla: XUL.

-

Chrome

-

Algunas de las más potentes y con frecuencia incomprendidas características de XUL y del navegador Mozilla tienen que ver con chrome. El término chrome es usado en diferentes contextos para referirse a cosas distintas. En general, chrome se refiere a una interfaz XUL y a todos sus ficheros de apoyo. chrome quiere decir que el contenido y estructura XUL + la apariencia que le da CSS + cualesquiera ficheros de configuración regional y específicos de la plataforma son parte de dicha interfaz XUL. En comparación, la apariencia es sólo el CSS y los gráficos referenciados para el fichero XUL, las cadenas de texto de la configuración regional están almacenadas en un DTD y el contenido es sólo el XUL.

-

La URL chrome

-

El concepto de chrome como algo integrado y dinámico separado de alguna forma del núcleo de la aplicación se realiza a través de la url chrome apuntando a partes de XUL a sus ficheros relacionados. La url chrome se parece a las direcciones http, como se muestra en la siguiente instrucción de proceso de apariencia global:

-
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-

Esto especifica un chrome para que pueda ser cargado por el motor de renderizado Gecko. En el ejemplo anterior, el chrome es simplemente un fichero de apariencia cargado en el fichero XUL, aunque el chrome puede además cargar otros chromes, como cuando un menuitem de una ventana muestra un nuevo chrome:

-
<menuitem
-  value="Mozilla Help"
-  oncommand="window.openDialog('chrome://help/content/help.xul',
-                               '_blank',
-                               'chrome,all,dialog=no')" />
-
-

En el ejemplo anterior, la url chrome se usa para apuntar a un chrome dentro de la jerarquía de paquetes de la aplicación Mozilla. Existe un chrome - - Help - definido en mozilla/bin/chrome/help que es invocado desde el menú de Ayuda. Nótese que cuando no se especifica el nombre de fichero en la ruta del directorio del chrome se supone que dicho nombre de fichero coincide con el del paquete. En otras palabras, una url chrome como el apuntador global de antes pediría un fichero llamado global.css y el apuntador de ayuda anterior podría ser reescrito como 'chrome://help/content' dado que el nombre del paquete es "help".

-

Ver otros chromes que no son de Mozilla

-

Existe un modificador especial que puede ser usado al iniciar Mozilla con algún otro chrome diferente al predeterminado. Cuando Mozilla es ejecutado desde la línea de comandos con el modificador -chrome, se puede especificar el chrome que se quiera, como el del anterior ejemplo.

-
mozilla -chrome chrome://help/content/help.xul
-
-

Esto mostrará el paquete de ayuda mencionado anteriormente como un chrome - - independiente - . Esta opción especial te permite crear y acceder a chromes independientes del navegador Mozilla y es un punto de inicio para explicar las posibilidades de XUL como plataforma más alla del simple rediseño del navegador.

-

Paquetes

-

Un paquete es de algún modo parecido a un chrome pero específico para la arquitectura de Mozilla. Un paquete es un trozo de código de interfaz que se ubica en un lugar en particular dentro de la jerarquía de paquetes de Mozilla. Como un chrome, dicho trozo generalmente alberga contenido XUL, información de apariencia CSS y gráficos, cadenas de configuración regional y quizá algo de código específico para la plataforma. El navegador es un paquete definido en mozilla/bin/chrome/navigator, la parte de correo y noticias es un paquete situado en mozilla/bin/chrome/mailnews/, etc... El directorio de cada paquete tiene tres subdirectorios: content, skin y locale; en el que se ubican el XUL, el CSS y la información de configuración regional, respectivamente:

-
navigator/
-  content/
-    default/
-      navigator.xul
-      ...
-  skin/
-    default/
-      navigator.css
-      nav-icon.gif
-      ...
-  locale/
-    US-en/
-      navigator.dtd
-
-

El directorio predeterminado (default) subyacente de cada uno de esos subdirectorios del paquete principal se asume en la url chrome (p.e.: chrome://help/content/help.xul no incluye un directorio predeterminado como parte de la url, pese a que dicho directorio exista en la estructura real). Cuando se crean diferentes chromes para un paquete, se puede crear un directorio subyacente al directorio content cuyo contenido será cargado en lugar del predeterminado. Por ejemplo, si se quiere crear una nueva apariencia con la que dotar al paquete navigator se puede crear un subdirectorio bajo navigator/skin/ cuyo contenido sea cargado en lugar del predeterminado. Así, la estructura quedaría:

-
navigator/
-  content/
-    default/
-      navigator.xul
-      ...
-  skin/
-    default/
-      navigator.css
-      nav-icon.gif
-      ...
-      myNewSkin/
-        newskin.css
-        newgifs.gif
-        ...
-  locale/
-    US-en/
-      navigator.dtd
-
-

Para cargar la información del chrome guardada en el paquete del nuevo directorio como el de antes, se puede usar la siguiente url chrome:

-
chrome://navigator/skin/myNewSkin/newskin.css
-
-

que cargará los gráficos de dicho subdirectorio cuando se necesiten:

-

Apariencia

-

La apariencia es el conjunto de CSS y gráficos que proporcionan el aspecto o presentan a XUL. XUL por sí mismo contiene muy poca información sobre cómo deben de presentarse los controles en la interfaz. Antes incluso de que se aplique la apariencia global (la cual es cargada en casi cada fichero XUL que se ve en Mozilla y cuya ausencia de los propios ficheros XUL puede hacer que se muestren de modo extraño, sin sentido, invisibles, o todo a la vez), el fichero xul.css es cargado para proporcionar algo de información de presentación muy básica para los controles comunes. Por todo esto, CSS es una parte vital de lo que hace a XUL lo que es, especialmente con el llegada de CSS 2 y sus nuevas capacidades de posicionamiento.

-

Los cambios de apariencia son más apropiados cuando se trata de cambiar dinámicamente la apariencia general de una aplicación. Pese a que esto aún no existe en el navegador, muy pronto será posible cambiar por completo el aspecto de la aplicación dinámicamente aunque sólo para ampliar la apariencia definida en el global.css principal o en otra apariencia global. Cuando se crean estilos en las etiquetas <tags>, como atributos de estilo para elementos individuales, o en ficheros CSS personalizados se está rompiendo la capacidad de Gecko para dotar de apariencia a la aplicación a la que pertenece el XUL.

-

Controles

-

Los controles (widgets en inglés) son las piezas que permiten ser ensambladas para construir un interfaz. Los menús, las barras de herramientas, los botones y las barras de desplazamiento son controles y como tales son piezas de propósito general al igual que las cajas (box) y las cajas de relleno (spring). Dichos controles pueden ser creados y ubicados dentro de un fichero XUL como elementos simples: <menu>, <toolbar>, etc... La sintaxis para estos elementos está basada en su mayoría en XML. De modo colectivo, estos controles son también conocidos como el XPToolkit.

-

Modelos de objetos: DOM y AOM

-

El Modelo de Objetos de Documento (DOM) es la representación de un documento como una serie de objetos interactivos mediante código. Cuando un lenguaje de script como JavaScript accede a las diversas partes de un documento HTML, lo hace a través del DOM. Las partes del documento, tales como la cabecera, los enlaces, el cuerpo..., cualquier etiqueta está disponible como nodos cuyos atributos pueden ser leídos y establecidos. Desafortunadamente, existen diferentes modelos de objetos de documento correspondientes a los diferentes tipos de documentos y también a las diferentes nociones propietarias sobre las que un documento debería ser accedido mediante un programa. El W3C ha estandarizado un modelo de objetos de documento en concreto y ya tiene una recomendación candidata para una versión de actualización. Este es el DOM reflejado en XUL y en el navegador Mozilla. El DOM asienta el objeto window en el más alto nivel del árbol de nodos. El objeto window tiene nodos hijos como el objeto document, el objeto history que almacena las páginas que el usuario ha visitado, nodos de marcos, etc... siendo todos ellos accesibles mediante un programa.

-

Con las dramáticas mejoras en el modelo de objetos y el poder del DOM 2 del W3C, el concepto del DOM se ver forzado más allá del más abstracto DHTML. Dado que cualquier desarrollo web dinámico es dependiente una vez el programa accede al documento web (o a la interfaz XUL), y dado que el DOM es un estándar y las primeras nociones del HTML dinámico no, el término "DOM" es usado como sinónimo por o en lugar de términos como "HTML dinámico" o "DHTML".

-

AOM significa modelo de objetos de aplicación y es una extensión del DOM hasta la interfaz definida en XUL. Mientras que HTML es reflejado en el DOM en forma de nodos como - - link - , - - layer - e - - img - , XUL es reflejado en el modelo de objetos de aplicación en la jerarquía de los controles XUL: browser, menu, menuitem, etc... El DOM y el AOM forman una especie de evolución, siendo el conjunto total manipulable desde los estándares sobre los que XUL está basado.

-

Casi sinónimos de XUL

-

Existe una gran confusión sobre las palabras que comienzan con "X" en el proyecto de código abierto de Mozilla. La sección Arquitectura XP de Mozilla que se verá más adelante describe XPCOM, XPIDL y XPConnect; tres tecnologías relacionadas de alguna forma para acceder al código de la aplicación desde la interfaz. Esta sección explica XUL, XPToolkit y XPFE, que son de algún modo sinónimos y a la vez diferentes.

-

En pocas palabras, XUL es el lenguaje basado en XML usado para crear interfaces, XPToolkit es el conjunto de controles XUL (menus, toolbars, etc...) utilizados realmente para este propósito: ser los ladrillos de la interfaz, y XPFE es la parte frontal multiplataforma que ha sido creada a partir de XPToolkit.

-

Las diferencias son significativas: XUL es el universo de elementos, atributos, sintaxis, reglas y relaciones mientras que el XPToolkit es en realidad un counjunto finito de elementos específicos para el interfaz creados en XUL. EL XPFE es lo que ha sido creado fuera del XPToolkit. Una pobre relación análoga para XUL, XPToolkit y XPFE puede ser la que forman HTML, las etiquetas HTML y una página web, respectivamente.

-

Partes XUL

-

La gente se confunde a veces con la sintaxis que describe las partes de un control. Para un control como el menú que se muestra a continuación, - - menu - es el elemento y tanto - - value - como - - id - son atributos.

-
<menu id="file" value="File" >
-  <popup>
-    <menuitem value="New" onclick="CreateNewDoc()" />
-    <menuitem value="Open" onclick="OpenDoc()" />
-    <menuitem value="Close" onclick="CloseDoc()" />
-  </popup>
-</menu>
-
-

El elemento da nombre al item, el control, mientras que los atributos describen características de dicho elemento, tales como su nombre, su estilo, etc... En la jerga orientada a objetos, el elemento es análogo al propio objeto mientras que los atributos son como propiedades. Los atributos tienen un valor asociado a él (tales como la cadena "file" para el atributo id en el ejemplo anterior). Nótese que el elemento - - menu - incluye tanto una etiqueta de apertura al principio como una de cierre al final del ejemplo. De alguna forma, el elemento - - menu - engloba tanto al él mismo como a sus hijos, los elementos - - menuitem - y el elemento - - popup - .

-

Eventos

-

Los eventos son también origen de confusión para muchos desarrolladores inexpertos. De hecho, ni yo mismo estoy seguro de comprenderlos del todo pero aquí va una explicación simple de lo que son los eventos y de cómo utilizarlos, básicamente, en una interfaz basada en eventos como la creada en XUL. Los eventos son mensajes que son enviados desde un objeto cuando dicho objeto realiza alguna acción. Por ejemplo, un documento provoca el evento - - load - cuando es cargado en un navegador. El evento - - click - es provocado por un botón cuando es pulsado.

-

Si no se hace nada con estos eventos, entonces probablemente nunca se sabrá nada de ellos. Los documentos serán cargados, los botones serán pulsados y los enlaces serán sobrevolados... y los eventos serán provocados para cada una de esas acciones de modo imperceptible. En cambio si se escriben - - manejadores de eventos - dentro de - - escuchadores de eventos - como se explicará en breve, se podrán usar estos eventos para realizar otras acciones. El uso de eventos para disparar otros acciones más explícitas explica vagamente lo que es un modelo de eventos.

-

¿Dónde exactamente están estos eventos provocados? ¿Provocados por quién? Los eventos que son lanzados por un objeto, emergen como una - - burbuja - a través del modelo jerárquico que es el DOM (o el AOM) nodo a nodo. Dichos eventos pueden ser manejados en cualquier punto de la jerarquía (incluyendo el mismo nodo en el que es lanzado). Si nadie en un nivel en particular de la jerarquía está interesado en el evento, entonces el evento continúa - - emergiendo - al siguiente nivel superior hasta llegar a lo más alto de la jerarquía.

-

El término no es usado con frecuencia, pero un - - escuchador de eventos - es un atributo especial de un objeto que escucha sus propios eventos. El documento, por ejemplo, tiene un escuchador de eventos onload para escuchar a su evento load. Los botones XUL tienen escuchadores de eventos onclick. Los escuchadores de eventos son algo realmente útil: en lugar de usarlos se podría detectar cuándo un objeto ha disparado un evento, luego averiguar de qué evento se trataba y luego tratar el evento como respuesta, pero el escuchador de eventos proporciona un mecanismo fácil para escribir manejadores de eventos para eventos tanto comunes como específicos.

-

Un manejador de eventos es un retal de código que se escribe en respuesta a un evento. Un manejador de evento onload viene a decir que cuando el documento se cargue, el manejador será llamadao. Y el atributo escuchador de evento proporciona un lugar muy apropiado en el que escribir manejadores de eventos (de hecho es tan apropiado que el término - - manejador de evento - es frecuentemente usado para describir tanto al atributo escuchador de eventos como al código manejador de eventos). Para crear un manejador de eventos, sólo hay que escribir el código que se quiere que sea ejecutado dentro del escuchador de eventos apropiado:

-
<menuitem value="Púlsame" onclick="alert('Evento manejado.')" />
-
-

Esto sigue la explicación de antes de que los manejadores de eventos pueden ser escritos para eventos que son lanzados en algún nivel inferior en la jerarquía. Un menubar en XUL, por ejemplo, puede contener manejadores de eventos para los eventos lanzados por sus menuitems hijos.

-

Arquitectura XP de Mozilla

-

Obviamente, Mozilla es mucho más que una simple interfaz. Es multiplataforma basado en los estándares y, de algún modo, los manejadores de eventos escritos en JavaScript y que residen en la interfaz XUL se están volviendo muy importantes en el núcleo de la aplicación.

-

Cosas como interfaces para sockets, edición, correo/noticias, seguridad... Las tecnologías que hacen esto posible son quizá las menos comprendidas del conglomerado de innovaciones que es Mozilla. Además de los programar estas cosas tan importantes en C++ y compilarlas plataforma a plataforma, los arquitectos y desarrolladores de Mozilla utilizan tres tecnologías - - XP - que unen el núcleo con la interfaz.

-

XPCOM no es un lenguaje de programación sino una aproximación a la programación (en C++) que proporciona un auténtico modelo de objetos de componentes multiplataforma, de donde la tecnología toma su nombre. Basado en COM, XPCOM proporciona un lenguaje e interfaces independientes de la plataforma que otros objetos pueden usar para acceder a sus servicios. XPCOM refuerza las reglas para diseñar y compilar que hacen posible el uso de servicios de un objeto sin conocer nada sobre la implementación.

-

XPIDL, el lenguaje de definición de interfaces multiplataforma, es un lenguaje en el que estas interfaces asistidas por XPCOM pueden ser descritos. Usar XPIDL para describir las interfaces XPCOM hace que éstas estén disponibles en ficheros de cabecera especiales. Finalmente, XPConnect es la tecnología que conecta estas interfaces XPCOM/XPIDL con JavaScript, el lenguaje de script que utiliza XUL. La unión de estas tres tecnologías multiplataforma se ubica en mitad de una arquitectura que tiene este aspecto:

-

Bridging C++ and JavaScript

-

Autor: Ian Oeschger
- Otros documentos: Mozilla Jargon File y Introducción a XUL

-
-

Original Document Information

- -
-

 

diff --git "a/files/es/archive/mozilla/xul/c\303\263mo_implementar_un_componente_procesador_de_consultas_xul/index.html" "b/files/es/archive/mozilla/xul/c\303\263mo_implementar_un_componente_procesador_de_consultas_xul/index.html" deleted file mode 100644 index f53b35c6a3..0000000000 --- "a/files/es/archive/mozilla/xul/c\303\263mo_implementar_un_componente_procesador_de_consultas_xul/index.html" +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: Cómo implementar un componente procesador de consultas XUL -slug: Archive/Mozilla/XUL/Cómo_implementar_un_componente_procesador_de_consultas_XUL -translation_of: Archive/Mozilla/XUL/How_to_implement_a_custom_XUL_query_processor_component ---- -

El servicio XUL apoya el uso de plantillas para crear un bloque de contenidos a partir de una consulta a una fuente de datos. La Guia de Plantillas XUL presenta una gran fuente de información detallada acerca del uso de las plantillas XUL. El servicio XUL proporciona procesadores de consulta de plantillas para RDF, XML y SQL (mozStorage). Este sistema de plantillas también da soporte a la creación de procesadores de consultas personalizadas. Los procesadores de consultas personalizadas son componentes XPCOM que deben implementar la interfaz nsIXULTemplateQueryProcessor y seguir algunos de los criterios que indican cuándo se deben registrar los mismos.

- -

En este ejemplo, crearemos un sencillo componente XPCOM en JavaScript. Dicho componente mantendrá una pequeña selección de objetos de JavaScript en su fuente de datos. En la práctica, se usaría una fuente propia de datos personalizada.

- -

A continuación presentamos un ejemplo del posible aspecto que podría tener nuestro servicio de XUL al utilizar un procesador de consultas personalizado:

- -
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-    <grid>
-        <columns>
-            <column flex="1"/>
-            <column flex="3"/>
-            <column flex="2"/>
-            <column flex="1"/>
-        </columns>
-
-        <rows datasources="dummy" ref="." querytype="simpledata">
-            <template>
-                <row uri="?">
-                    <label value="?name"/>
-                    <label value="?age"/>
-                    <label value="?hair"/>
-                    <label value="?eye"/>
-                </row>
-            </template>
-        </rows>
-    </grid>
-</window>
-
- -

Algunas cosas a tener en cuenta. En realidad no estamos utilizando las fuentes de datos en nuestro componente de ejemplo, por lo que lo configuraremos con un valor no válido. Un hilo vacío también valdría. El tipo de consulta es importante. Se usa para crear un caso de nuestro objeto XPCOM. La contracción de la identidad de nuestro componente XPCOM debería tener la forma de "@mozilla.org/xul/xul-query-processor;1?name=xxx", donde las xxx representan el tipo de consulta utilizado en el bloque de plantillas XUL. A continuación mostramos nuestro ejemplo de procesador de consultas XPCOM de JavaScript:

- -
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-
-// basic wrapper for nsIXULTemplateResult
-function TemplateResult(aData) {
-  this._data = aData;
-  // just make a random number for the id
-  this._id = Math.random(100000).toString();
-}
-
-TemplateResult.prototype = {
-  QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIXULTemplateResult]),
-
-  // private storage
-  _data: null,
-
-  // right now our results are flat lists, so no containing/recursion take place
-  isContainer: false,
-  isEmpty: true,
-  mayProcessChildren: false,
-  resource: null,
-  type: "simple-item",
-
-  get id() {
-    return this._id;
-  },
-
-  // return the value of that bound variable such as ?name
-  getBindingFor: function(aVar) {
-    // strip off the ? from the beginning of the name
-    var name = aVar.toString().slice(1);
-    return this._data[name];
-  },
-
-  // return an object instead of a string for convenient comparison purposes
-  // or null to say just use string value
-  getBindingObjectFor: function(aVar) {
-    return null;
-  },
-
-  // called when a rule matches this item.
-  ruleMatched: function(aQuery, aRuleNode) { },
-
-  // the output for a result has been removed and the result is no longer being used by the builder
-  hasBeenRemoved: function() { }
-};
-
-
-// basic wrapper for nsISimpleEnumerator
-function TemplateResultSet(aArrayOfData) {
-  this._index = 0;
-  this._array = aArrayOfData;
-}
-
-TemplateResultSet.prototype = {
-  QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsISimpleEnumerator]),
-
-  hasMoreElements: function() {
-    return this._index < this._array.length;
-  },
-
-  getNext: function() {
-    return new TemplateResult(this._array[this._index++]);
-  }
-};
-
-
-// The query processor class - implements nsIXULTemplateQueryProcessor
-function TemplateQueryProcessor() {
-  // our basic list of data
-  this._data = [
-                {name: "mark", age: 36, hair: "brown", eye: "brown"},
-                {name: "bill", age: 25, hair: "red", eye: "black"},
-                {name: "joe", age: 15, hair: "blond", eye: "blue"},
-                {name: "jimmy", age: 65, hair: "gray", eye: "dull"}
-               ];
-}
-
-TemplateQueryProcessor.prototype = {
-  QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIXULTemplateQueryProcessor]),
-  classDescription: "Sample XUL Template Query Processor",
-  classID: Components.ID("{282cc4ea-a49c-44fc-81f4-1f03cbb7825f}"),
-  contractID: "@mozilla.org/xul/xul-query-processor;1?name=simpledata",
-
-  getDatasource: function(aDataSources, aRootNode, aIsTrusted, aBuilder, aShouldDelayBuilding) {
-    // TODO: parse the aDataSources variable
-    // for now, ignore everything and let's just signal that we have data
-    return this._data;
-  },
-
-  initializeForBuilding: function(aDatasource, aBuilder, aRootNode) {
-    // perform any initialization that can be delayed until the content builder
-    // is ready for us to start
-  },
-
-  done: function() {
-    // called when the builder is destroyed to clean up state
-  },
-
-  compileQuery: function(aBuilder, aQuery, aRefVariable, aMemberVariable) {
-    // outputs a query object.
-    // eventually we should read the <query> to create filters
-    return this._data;
-  },
-
-  generateResults: function(aDatasource, aRef, aQuery) {
-    // preform any query and pass the data to the result set
-    return new TemplateResultSet(this._data);
-  },
-
-  addBinding: function(aRuleNode, aVar, aRef, aExpr) {
-    // add a variable binding for a particular rule, which we aren't using yet
-  },
-
-  translateRef: function(aDatasource, aRefstring) {
-    // if we return null, everything stops
-    return new TemplateResult(null);
-  },
-
-  compareResults: function(aLeft, aRight, aVar) {
-    // -1 less, 0 ==, +1 greater
-    if (aLeft < aRight) {
-      return -1;
-    }
-    else if (aLeft > aRight) {
-      return  1;
-    }
-    else {
-      return 0;
-    }
-  }
-};
-
-
-var components = [TemplateQueryProcessor];
-
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule(components);
-}
-
- -

Nuestro ejemplo de procesador de consultas es muy fácil. Notas aclaratorias:

- - diff --git a/files/es/archive/mozilla/xul/dialog/index.html b/files/es/archive/mozilla/xul/dialog/index.html deleted file mode 100644 index 90b8773539..0000000000 --- a/files/es/archive/mozilla/xul/dialog/index.html +++ /dev/null @@ -1,383 +0,0 @@ ---- -title: dialog -slug: Archive/Mozilla/XUL/Dialog -translation_of: Archive/Mozilla/XUL/dialog ---- -
- « Referencia de XUL [ - Ejemplos | - Atributos | - Propiedades | - Methoden | - Métodos ] -
- -

Este elemento debería utilizarse en lugar del elemento window para cuadros de diálogo. El atributo buttons puede utilizarse para configurar aquellos botones que deberían aparecer en el cuadro de diálogo. Estos botones serán colocados en el lugar correcto para la plataforma del usuario.

- -

Hay más información disponible en XUL Tutorial y en Dialogs and prompts (fragmentos de código).

- -
-
Atributos
-
buttonaccesskeyaccept, buttonaccesskeycancel, buttonaccesskeydisclosure, buttonaccesskeyextra1, buttonaccesskeyextra2, buttonaccesskeyhelp, buttonalign, buttondir, buttondisabledaccept, buttonlabelaccept, buttonlabelcancel, buttonlabeldisclosure, buttonlabelextra1, buttonlabelextra2, buttonlabelhelp, buttonorient, buttonpack, buttons, defaultButton, ondialogaccept, ondialogcancel, ondialogdisclosure, ondialogextra1, ondialogextra2, ondialoghelp, title
-
- -
-
Propiedades
-
buttons, defaultButton
-
- -
-
Métodos
-
acceptDialog, cancelDialog, centerWindowOnScreen, getButton, moveToAlertPosition
-
- -

Ejemplos

- -
Image:XUL_ref_dialog.png
- -
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
-<dialog id="donothing" title="Dialog example"
-   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-   buttons="accept,cancel"
-   buttonlabelcancel="Cancel"
-   buttonlabelaccept="Save"
-   ondialogaccept="return doOK();"
-   ondialogcancel="return doCancel();">
-
-    <dialogheader title="Options" description="My preferences"/>
-    <groupbox>
-      <caption label="Colour"/>
-      <radiogroup>
-        <radio label="Red"/>
-        <radio label="Green" selected="true"/>
-        <radio label="Blue"/>
-      </radiogroup>
-      <label value="Nickname"/>
-      <textbox />
-   </groupbox>
-</dialog>
-
- -

Atributos

- -

- - -
-
activetitlebarcolor
-
Type: color string
-
Specify background color of the window's titlebar when it is active (foreground). Moreover this hides separator between titlebar and window contents. This only affects Mac OS X.
-
-
- -
-
- buttonaccesskeyaccept
-
- Type: string
-
- The access key to use for the "accept" button.
-
-
- -
-
- buttonaccesskeycancel
-
- Type: string
-
- The access key to use for the "cancel" button.
-
-
- -
-
- buttonaccesskeydisclosure
-
- Type: string
-
- The access key to use for the "disclosure" button.
-
-
- -
-
- buttonaccesskeyextra1
-
- Type: string
-
- The access key to use for the first extra button.
-
-
- - -
-
buttonaccesskeyextra2
-
Type: string
-
The access key to use for the second extra button.
-
-
- -
-
- buttonaccesskeyhelp
-
- Type: string
-
- The access key to use for the "help" button.
-
-
- -
-
- buttonalign
-
- Type: string
-
- The value of the align attribute for the box containing the buttons.
-
-
- - -
-
buttondir
-
Type: string
-
The value of the dir attribute for the box containing the buttons.
-
-
- - -
-
buttondisabledaccept
-
Type: boolean
-
If true, the accept button is disabled.
-
-
- - -
-
buttonlabelaccept
-
Type: string
-
The label to appear on the "accept" button.
-
-
- - -
-
buttonlabelcancel
-
Type: string
-
The label to appear on the "cancel" button.
-
-
- - -
-
buttonlabeldisclosure
-
Type: string
-
The label to appear on the "disclosure" button.
-
-
- - -
-
buttonlabelextra1
-
Type: string
-
The label to appear on the first extra button.
-
-
- - -
-
buttonlabelextra2
-
Type: string
-
The label to appear on the second extra button.
-
-
- - -
-
buttonlabelhelp
-
Type: string
-
The label to appear on the "help" button.
-
-
- - -
-
buttonorient
-
Type: string
-
The value of the orient attribute for the box containing the buttons.
-
-
- - -
-
buttonpack
-
Type: string
-
The value of the pack attribute for the box containing the buttons.
-
-
- -
-
- buttons
-
- Type: comma-separated list of the values below
-
- A comma-separated list of buttons to appear in the dialog box. The buttons will be placed in suitable locations for the user's platform and basic event handling will be performed automatically. The following values can be used in the list: -
    -
  • accept: The OK button, which will accept the changes when pressed. This button will also be the default button.
  • -
  • cancel: The cancel button which will cancel the operation.
  • -
  • help: A help button for displaying help about the dialog.
  • -
  • disclosure: A button to show more information. This might be a button or a disclosure triangle.
  • -
  • extra1: An optional additional button. You can set its label with the buttonlabelextra1 attribute and its command with the ondialogextra1 attribute.
  • -
  • extra2: A second optional additional button. You can set its label with the buttonlabelextra2 attribute and its command with the ondialogextra2 attribute.
  • -
-
-
-
Note: If you don't want to display any buttons in the dialog box, set the value of this attribute to "," (a single comma).
-
Warning: If the accept and cancel buttons are actually shown is system dependent and is mainly controlled by the value of the boolean preference browser.preferences.instantApply. If it is set to true any changes to settings are supposed to be applied immediately. The accept button is therefore unnecessary and is hidden. The cancel button might be shown as an additional possibility to close the dialog in this situation (Windows and Linux) or might be hidden, too (Mac OS).
- The default setting of browser.preferences.instantApply currently is true on Linux and Mac OS and false on Windows (which however might or might not change soon, see bug 738797 and bug 1037225).
-
- - -
-
defaultButton
-
Type: string
-
Normally this attribute should not be set, but if it is, it specifies the default button in the dialog. Typically, this means that the button will be activated when the Enter key is pressed. This should be set to one of the same values as those for the buttons attribute.
-
-
- - -
-
inactivetitlebarcolor
-
Type: color string
-
Specify background color of the window's titlebar when it is inactive (background). Moreover this hides separator between titlebar and window contents. This affects only on Mac OS X.
-
-
- - -
-
ondialogaccept
-
Type: script code
-
The code in this attribute is called when the accept button is pressed, or when the acceptDialog method is called. If the handler returns true, the dialog will indeed go away, but if it returns false it will not.
-
-
- - -
-
ondialogcancel
-
Type: script code
-
The code in this attribute is called when the "cancel" button is pressed or when the cancelDialog method is called. If the routine returns true, the dialog will indeed go away, but if it returns false it will not.
-
-
- - -
-
ondialogdisclosure
-
Type: script code
-
The code in this attribute is called when the "disclosure" button is pressed.
-
-
- - -
-
ondialogextra1
-
Type: script code
-
The code in this attribute is called when the first extra button is pressed.
-
-
- - -
-
ondialogextra2
-
Type: script code
-
The code in this attribute is called when the second extra button is pressed.
-
-
- - -
-
ondialoghelp
-
Type: script code
-
The code in this attribute is called when the "help" button is pressed.
-
-
- - -
-
title
-
Type: string
-
The text to appear in the title bar of the window.
-
-
- -

Propiedades

- -

- -
-
buttons
-
Typo: lista de los valores de abajo separados por comas
-
Una lista separada por comas de botones que aparecerán en el cuadro de diálogo. Los botones serán puestos en lugares adecuados para la plataforma del usuario y la gestión básica de eventos se ejecutará automáticamente. En la lista pueden utilizarse los siguientes valores:
-
- -
- -
-
defaultButton
-
Type: string
-
Normally this attribute should not be set, but if it is, it specifies the default button in the dialog. Typically, this means that the button will be activated when the Enter key is pressed. This should be set to one of the same values as those for the buttons attribute.
-
- -

Métodos

- - - - - - - -
-

Métodos Heredados
-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

- -
-
- acceptDialog()
-
- Return type: no return value
-
- Accepts the dialog and closes it, similar to pressing the OK button.
-
-
cancelDialog()
-
Return type: no return value
-
Cancels the dialog and closes it, similar to pressing the Cancel button.
-
-
centerWindowOnScreen()
-
Return type: no return value
-
Centers the dialog on the screen.
-
-
getButton( type )
-
Return type: button element
-
Returns the button element in the dialog corresponding to the given type.
-
-
moveToAlertPosition()
-
Return type: no return value
-
Moves and resizes the dialog to a position and size suitable for an alert box.
-
- - - -
-
Elementos
-
dialogheader
-
diff --git a/files/es/archive/mozilla/xul/elementos/index.html b/files/es/archive/mozilla/xul/elementos/index.html deleted file mode 100644 index 99aa60adfc..0000000000 --- a/files/es/archive/mozilla/xul/elementos/index.html +++ /dev/null @@ -1,323 +0,0 @@ ---- -title: Elementos -slug: Archive/Mozilla/XUL/Elementos -tags: - - Todas_las_Categorías - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/elements ---- -

« Referencia de XUL «

- - - - - - - - - - - -
Todos los elementos XUL (ordenados alfabéticamente)
-

action
- arrowscrollbox
- assign
- 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
- param
- popupset
- preference
- preferences
- prefpane
- prefwindow
- progressmeter
- query
- queryset
- radio
- radiogroup
- resizer
- richlistbox
- richlistitem
- row
- rows
- rule
- scale
- script
- scrollbar
- scrollbox
- scrollcorner
- separator
- spacer
- spinbuttons
- splitter
- stack
- statusbar

-
-

statusbarpanel
- stringbundle
- stringbundleset
- tab
- tabbrowser (Firefox-a partir de
- Firefox 3/Gecko 1.9)
- tabbox
- tabpanel
- tabpanels
- tabs
- template
- textnode
- textbox
- textbox (Firefox autocomplete)
- textbox (Mozilla autocomplete)
- timepicker
- titlebar
- toolbar
- toolbarbutton
- toolbargrippy
- toolbaritem
- toolbarpalette
- toolbarseparator
- toolbarset
- toolbarspacer
- toolbarspring
- toolbox
- tooltip
- tree
- treecell
- treechildren
- treecol
- treecols
- treeitem
- treerow
- treeseparator
- triple
- vbox
- where
- window
- wizard
- wizardpage

-
-

Referencia de XUL

-

« Referencia de XUL «

- - - - - - - - - - - -
Elementos XUL por categoría
-

VENTANAS

-

dialog
- overlay
- page
- window
- wizard
- wizardpage
- preference
- preferences
- prefpane
- prefwindow

-

ESTRUCTURA
- DE VENTANAS

-

browser
- tabbrowser
- editor
- iframe
- titlebar
- resizer
- statusbar
- statusbarpanel
- dialogheader
- notification
- notificationbox

-

MENUS Y VENTANAS
- EMERGENTES

-

menubar
- menu
- menuitem
- menuseparator
- menupopup
- panel
- tooltip
- popupset

-

BARRAS DE
- HERRAMIENTAS

-

toolbar
- toolbarbutton
- toolbargrippy
- toolbaritem
- toolbarpalette
- toolbarseparator
- toolbarset
- toolbarspacer
- toolbarspring
- toolbox

-

PESTAÑAS Y
- AGRUPAMIENTO

-

tabbox
- tabs
- tab
- tabpanels
- tabpanel
- groupbox
- caption
- separator
- spacer

-
-

CONTROLES

-

button
- checkbox
- colorpicker
- datepicker
- menulist
- progressmeter
- radio
- radiogroup
- scale
- splitter
- textbox
- textbox (Firefox autocomplete)
- textbox (Mozilla autocomplete)
- timepicker

-

TEXTO E
- IMAGENES

-

description
- label
- image

-

LISTAS

-

listbox
- listitem
- listcell
- listcol
- listcols
- listhead
- listheader
- richlistbox
- richlistitem

-

ARBOLES

-

tree
- treecell
- treechildren
- treecol
- treecols
- treeitem
- treerow
- treeseparator

-

 

-
-

DISPOSICION

-

box
- hbox
- vbox
- bbox
- deck
- stack
- grid
- columns
- column
- rows
- row
- scrollbox

-

PLANTILLAS

-

action
- assign
- binding
- bindings
- conditions
- content
- member
- param
- query
- queryset
- rule
- template
- textnode
- triple
- where

-

SCRIPTING

-

script
- commandset
- command
- broadcaster
- broadcasterset
- observes
- key
- keyset
- stringbundle
- stringbundleset

-

ELEMENTOS
- DE AYUDA

-

arrowscrollbox
- dropmarker
- grippy
- scrollbar
- scrollcorner
- spinbuttons

-
-

Otras listas de XUL

- diff --git a/files/es/archive/mozilla/xul/events/index.html b/files/es/archive/mozilla/xul/events/index.html deleted file mode 100644 index 1911016926..0000000000 --- a/files/es/archive/mozilla/xul/events/index.html +++ /dev/null @@ -1,460 +0,0 @@ ---- -title: Eventos -slug: Archive/Mozilla/XUL/Events -translation_of: Archive/Mozilla/XUL/Events ---- -

 

- -

« Referencia de XUL

- -

 

- -

The following tables describe the event handler that are valid for most XUL elements. The events listeners can be attached using addEventListener and removed using removeEventListener.

- -

Some of the events can be attached using attributes as well. When attaching event listeners using attributes, be aware that only one listener can be attached at a time. Any previously attached listeners are disconnected. The attribute name is the event name with an 'on' prefix.

- -

Inherited DOM events

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EventDescription
-

blur

-
-

The opposite of the focus event, the blur event is passed after an element loses the focus.
- attribute: onblur

-
-

change

-
-

This event is sent when the value of the textbox is changed. The event is not sent until the focus is moved to another element.
- attribute: onchange

-
-

click

-
-

This event is sent when a mouse button is pressed and released. You can determine which mouse button was clicked by retrieving the button property of the event object. This event is also sent when the user double-clicks with the mouse. The detail property specifies how many clicks occurred. You can also check for triple-clicks in a similar manner. You should not use this event in XUL to respond to user actions; the command event should be used instead.
- attribute: onclick

-
-

dblclick

-
-

This event is like the click event except it is only sent when the user double clicks with the mouse. This is an alternative to checking the detail property in the click event.
- attribute: ondblclick

-
-

DOMMouseScroll

-
-

This event is sent when the mouse wheel is moved, whether it results in content being scrolled or not.
- The target of this event is the element that was under the mouse pointer when the mouse wheel was scrolled, similar to the click event.

-
-

focus

-
-

The focus event is sent to an element when it receives the focus. Once an element has the focus, keyboard events are sent to it. The focus can be changed by clicking on an element or by pressing TAB to switch to the next element is sequence.
- attribute: onfocus

-
-

keydown

-
-

The keydown event is sent to an element that has the focus and a key is pressed but not released.
- attribute: onkeydown

-
-

keypress

-
-

The keypress event is sent to an element that has the focus and a key is pressed and released. When the user presses a key, the keydown event is first sent, followed by the keypress event and then the keyup event. In a textbox, a user normally can hold down a key to repeat a character In this case, multiple sets of key events are sent as if the user rapidly pressed the same key repeatedly.
- attribute: onkeypress

-
-

keyup

-
-

The keyup event is sent to an element that has the focus and a key is released.
- attribute: onkeyup

-
-

load

-
-

This event is sent to the window after it has been fully loaded. You should place this event handler on the window element. This event may also be used on the image element, or an element that accepts an image attribute, and will be fired when the image has finished loading. For images, this event does not bubble up the element tree, so it will not conflict with the window's load event.
- attribute: onload

-
-

mousedown

-
-

This event is sent when the mouse is pressed on an element but not released.
- attribute: onmousedown

-
-

mousemove

-
-

This event is sent repeatedly as the mouse is moved over an element.
- attribute: onmousemove

-
-

mouseout

-
-

This mouseout event is sent to an element when the user moves the mouse outside the element. This event is the reverse of mouseover.
- attribute: onmouseout

-
-

mouseover

-
-

This event is sent to an element when the mouse first moves over an element. You can use this event to provide feedback to the user.
- attribute: onmouseover

-
-

mouseup

-
-

This event is sent when the mouse is released on an element.
- attribute: onmouseup

-
-

select

-
-

This event is sent to a listbox or tree when an item is selected.
- attribute: onselect

-
-

unload

-
-

This event is sent to a window when the window has closed. This is done after the close event. You should place this event handler on the window element.
- attribute: onunload

-
- -

Mutation DOM events

- - - - - - - - - - - - - - - - - - - - -
EventDescription
-

DOMAttrModified

-
-

This event is sent to an element when one of its attributes is modified. In the event handler, you can retrieve the attribute that was modified using the event's attrName property, and you can retrieve the old and new values of the attribute using the event's prevValue and newValue properties.

-
-

DOMNodeInserted

-
-

This event is sent when a node is added as a child of a element. If you capture this event at the document level, you can be notified of document changes.

-
-

DOMNodeRemoved

-
-

This event is sent when a node is removed from an element. If you capture this event at the document level, you can be notified of document changes.

-
- -

It should be noted that the presence of any mutation event listeners in a document degrades the performance of subsequent DOM operations in that document. In simple tests that can mean that a DOM operation takes between 1.5 and 7 as long as it would without any mutation listener.

- -

Common XUL events

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
EventDescription
-

broadcast

-
-

The event handler should be placed on an observer. The broadcast event is sent when the attributes of the element (such as a broadcaster) being listened to are changed.
- attribute: onbroadcast

-
-

close

-
-

This event is sent when a request has been made to close the window when the user presses the close button. If you place an event handler on the window element, you can trap the window close. If you return false from the close handler, the window will not close. Return true to have it close normally. Note that this event is only fired when the user presses the close button on the titlebar; use the unload event to capture all attempts to unload the window.
- attribute: onclose

-
-

command

-
-

This event handler is called when an element is activated. How it is activated varies for each element and in many cases, there are several ways to activate an element. For example, a button can be activated by clicking on it with the mouse or by pressing ENTER while it has the focus. Menus can be activated by selecting them with the mouse or by pressing a shortcut key. You should always use the command event instead of click because it will be called in all of the needed cases.
- attribute: oncommand

-
-

commandupdate

-
-

This event occurs when a command update occurs on a <commandset> element. You would use this to update the disabled status of its commands.
- attribute: oncommandupdate

-
-

contextmenu

-
-

This event is sent to an element when the user requests to open the context menu for the element. The action to do this varies by platform, but it will typically be a right click. This handler is usually used to dynamically set the commands on a menu when the user requests to display it, or you can use popupshowing event. Returning false from this event handler prevents the popup from appearing.
- attribute: oncontextmenu

-
-

drag

-
-

The drag event is sent to the source node (the node that was dragged) several times a second while the drag is occurring.
- attribute: ondrag

-
-

dragdrop

-
-

This event is sent when the user releases the mouse button to drop an object being dragged. The element, if it accepts the drop, should respond in some manner such inserting the dragged object into itself.
- attribute: ondragdrop

-
-

dragend

-
-

The dragend event is sent to the source node (the node that was dragged) when the drag is finished.
- attribute: ondragend

-
-

dragenter

-
-

The dragenter event is sent when the mouse pointer first moves over an element during a drag. It is similar to the mouseover event but occurs while dragging.
- attribute: ondragenter

-
-

dragexit

-
-

This event is sent when the mouse pointer moves away from an element during a drag. It is also called after a drop on an element. It is similar to the mouseout event but occurs during a drag.
- attribute: ondragexit

-
-

draggesture

-
-

This event is sent when the user starts dragging the element, usually by holding down the mouse button and moving the mouse.
- attribute: ondraggesture

-
-

dragover

-
-

Related to the mousemove event, this event is sent while something is being dragged over an element. The handler should indicate whether the object being dragged can be dropped.
- attribute: ondragover

-
-

input

-
-

This event is sent when a user enters text in a textbox. This event is only called when the text displayed would change, thus it is not called when the user presses non-displayable keys.
- attribute: oninput

-
-

overflow

-
-

This event is only sent to a box or other layout element with a CSS overflow property set to a value other than 'visible'. When there is not enough space to display the contents of the element at full size, the overflow event will be fired. Depending on the value of the overflow property, scrollbars may have appeared. For example, if a box has a maximum size of 100 pixels, and only enough space for 80 pixels is available, the overflow event will be sent to the box. If the size changes, for example, by the user resizing the window, the underflow event will be fired when enough space becomes available.
- attribute: onoverflow

-
-

popuphidden

-
-

This event is sent to a popup after it has been hidden.
- attribute: onpopuphidden

-
-

popuphiding

-
-

This event is sent to a popup when it is about to be hidden.
- attribute: onpopuphiding

-
-

popupshowing

-
-

This event is sent to a popup just before it is popped open. This handler is usually used to dynamically set the contents when the user requests to display it. Returning false from this event handler prevents the popup from appearing.
- attribute: onpopupshowing

-
-

popupshown

-
-

This is event is sent to a popup after it has been opened, much like the onload event is sent to a window when it is opened.
- attribute: onpopupshown

-
-

syncfrompreference

-
-

This event is sent when the element is being changed because a preference changed, or when an element is initialized from a preference. This event will only be sent to elements connected to a preference and in a prefwindow. This is not a real event instead it is just a function call and must use the attribute syntax. The script may return a value to set the element to a specific value rather than the value of the preference. This event is usually used to adjust the preference value so that it is more suitable for display in the user interface.
- attribute: onsyncfrompreference

-
-

synctopreference

-
-

This event is sent when the element connected to a preference has changed. This event will only be sent to elements connected to a preference and in a prefwindow. This is not a real event instead it is just a function call and must use the attribute syntax. The script may return a value to set the preference to a specific value rather than the value of the element.
- attribute: onsynctopreference

-
-

underflow

-
-

This event is sent to an element when there becomes enough space to display it at full size. This applies to boxes and other layout elements with a CSS overflow property other than 'visible'. The underflow event can be used to indicate that a scrolling mechanism is no longer necessary.
- attribute: onunderflow

-
-

DOMMenuItemActive

-
-

This event is sent when a menu or menuitem is hovered over, or highlighted. This event bubbles.

-
-

DOMMenuItemInactive

-
-

This event is sent when a menu or menuitem is no longer being hovered over, or highlighted. This event bubbles.

-
- -

Accessibility events

- -

These events are used to notify the accessibility system of changes to an element. You would not normally use these yourself.

- - - - - - - - - - - - - - - - -
EventDescription
-

CheckboxStateChange

-
-

This event is sent when a checkbox is checked or unchecked, either by the user or a script. Normally, you would use the command event to listen to checkbox changes, however, the command event is only sent when the user modifies the value, while the CheckboxStateChange event is also sent when a script modifies the checked property of a checkbox. For user changes, the CheckboxStateChange event is sent before the command event. The CheckboxStateChange event does not bubble.

-
-

RadioStateChange

-
-

This event is sent when a radio button is selected, either by the user or a script. Normally, you would use the command event to listen to radio button selection changes, however, the command event is only sent when the user changes the selected radio button, while the RadioStateChange event is also sent when a script modifies the selection. For user changes, the RadioStateChange event is sent before the command event. The RadioStateChange event bubbles so you can also attach the event handler to the enclosing radiogroup.

-
diff --git "a/files/es/archive/mozilla/xul/gu\303\255a_de_plantillas/index.html" "b/files/es/archive/mozilla/xul/gu\303\255a_de_plantillas/index.html" deleted file mode 100644 index 6a22cc7d9b..0000000000 --- "a/files/es/archive/mozilla/xul/gu\303\255a_de_plantillas/index.html" +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Guía de plantillas -slug: Archive/Mozilla/XUL/Guía_de_plantillas -translation_of: Archive/Mozilla/XUL/Template_Guide ---- -

This page was auto-generated because a user created a sub-page to this page.

diff --git "a/files/es/archive/mozilla/xul/gu\303\255a_de_plantillas/ordenar_resultados/index.html" "b/files/es/archive/mozilla/xul/gu\303\255a_de_plantillas/ordenar_resultados/index.html" deleted file mode 100644 index 916878ae02..0000000000 --- "a/files/es/archive/mozilla/xul/gu\303\255a_de_plantillas/ordenar_resultados/index.html" +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Ordenar resultados -slug: Archive/Mozilla/XUL/Guía_de_plantillas/Ordenar_resultados -tags: - - Guía_de_plantillas_XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Template_Guide/Sorting_Results ---- -
-

« AnteriorSiguiente »

-
- -

The template content builder uses a separate component to insert generated nodes into the content tree. This is done when inserting the nodes when they are first created as well as when a new result is available. This additional component is called the sort service. It is responsible for determining where to insert nodes into the XUL document. Since the component is called the 'sort service' it is also used to sort the generated results. Since an RDF graph doesn't specify any order to results -- unless the items are in an RDF Seq -- the template builder will handle the results in any order. You may have noticed in the examples that results that are not in a Seq are not output in any particular order.

- -

The sort service may be used to order the results in some particular order, generally, ascending or descending based on the value of some predicate pointing out of the result node. The sort service also supports a third sort order, natural order, which is the default. It causes items to appear without any extra sorting in the order they are added. However, if the results are items in a Seq they will appear in the order listed in the Seq. For instance, the photos are listed in the same order in this example as they appear in the Seq in the datasource.

- -

This method of sorting a Seq works best for simple rule conditions since it is obvious how the starting ref relates to the end member results (they are just the children), or for extended syntax rules that follow a similar pattern. For more complex rules, this natural sorting will not work, because the sort service assumes that the starting ref resource is the container and the end results are the children. In this case, the natural order of the results will just be the order that the template builder generates the results.

- -

For ascending or descending sorts, this doesn't matter, since it will ignore whether results are containers and just sort by a value, alphabetically or numerically depending on the type of data.

- -

The sort service only applies to content builders. The tree builder uses a different and much simpler means of sorting since there is no content to insert. It supports the same three types of sorting, natural, ascending or descending. In the latter two sort types, the tree builder sorts by the value in a column. For instance, if the photos were displayed in a two column tree showing the title and description, you could sort by either title or description. The user can change the sort column and direction by clicking the column headers, however, you can programmatically change the sort as well.

- -

Sorting Tree Results

- -

We'll examine sorting of trees first since trees are the most common element used with sorted items. Using a tree builder, you can sort the results in a tree by a column. To do this, place a sort attribute on a <treecol> element referring to the variable to sort by for that column.

- -
<treecol id="name" label="Name" sort="?name" flex="1"/>
-<treecol id="date" label="Date" sort="?date" flex="1"/>
-
- -

In this example, the first column will be sorted by the ?name variable and the second column by the ?date variable. When the sort is ascending, the tree rows will be sorted in alphabetical order. When the sort is descending, the tree rows will be sorted in the reverse order. For natural sorting, the rows will be sorted according to the natural order in the RDF datasource. Only one column applies a sort at a time. If the tree is sorted by name, and the user clicks on the date column header, the sort will change to the date column.

- -

There are two additional attributes used for sorting, which you may set on a column to specify the initial sort. These attributes are modified when the user changes the sort. The sortDirection attribute may be used to specify the initial sort direction for a column. Only one column should have this attribute set, as a tree may only be sorted by one column at a time. The value should be either 'ascending', 'descending' or 'natural'. This last value is the default if the attribute is not specified. The sortActive attribute may be set to true or false and specifies which column the tree is sorted by. Only one column should have the sortActive attribute set to true at a time. The tree will change both attributes as necessary automatically when the column headers are clicked or the tree is sorted by other means.

- -

If you don't want to allow sorting by a certain column, you can leave out the sort attribute. Only specify this attribute on columns that you wish to allow the user to sort by.

- -

Here is a complete example of sorting a tree.

- -

The sort attribute should be set to the variable that holds the values to sort by. Usually, this would be the same variable that is used to generate the label for the cells in that column, however this is not actually necessary. For instance, in the example the second column sorts by date, but if you were to use a different variable such as ?description, assuming a <binding> set it, the tree would sort by the value of the description variable for each row. In almost all situations however, you would normally sort using the same variable used for the label value. However, one situation where this is not desirable is if the displayed values would not generate the correct order as there is a lower representation that is more accurate. For example, the date 'May 15' would appear after 'August 24' when sorted purely alphabetically but before it when sorted chronologically.

- -

Another way to sort by dates is to use the the parseType="Date" construct in the RDF datasource. This marks a literal as being a date value rather than a string. The builder will recognize this and sort chronologically instead. This also has the advantage that the dates will be displayed according to the user's current locale (meaning that the date is formatted so as to be suitable for the user's language). Here is a sample of how to specify this in the RDF/XML datasource:

- -
<rdf:RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:r="http://www.xulplanet.com/rdf/"
-     xmlns:nc="http://home.netscape.com/NC-rdf#">
-  <rdf:Description rdf:about="http://www.xulplanet.com/ndeakin/images/t/palace.jpg">
-    <r:date nc:parseType="Date">1125966767295<r:date>
-  </rdf:Description>
-</rdf:RDF>
-
- -

You can also specify parseType="Integer" for numbers which will allow sorting numerically. By specifing different types for different values, you can sort alphabetically, numerically or by date.

- -

If you are using the simple rule syntax, there are no variables, so you need to specify the full predicate including the rdf: prefix in the sort attribute. For instance:

- -
<treecol id="name" label="Name" sort="rdf:http://purl.org/dc/elements/1.1/title" flex="1"/>
-
- -

Note that all of this discussion about sorting only applies to tree builders. For other elements or content trees, a different sorting mechanism must be used which will be discussed next.

- -

Content Sorting

- -

For content builders (templates that do not use flags="dont-build-content"), sorting is done using a different means. Instead of sorting on a variable generated during the template generation, sorting for content builders may only be performed using a triple pointing out of the member variable. There is no connection between the generated variables and the resource used for sorting, so it doesn't have to be one used in the template.

- -

You specify the resource used for sorting with the sortResource attribute on the root element, as follows:

- -
<hbox datasources="template-guide-photos5.rdf"
-      sortResource="http://purl.org/dc/elements/1.1/title"
-      sortDirection="ascending"
-      ref="http://www.xulplanet.com/rdf/myphotos">
-  <template>
-    <vbox class="box-padded" uri="rdf:*">
-      <image src="rdf:*"/>
-      <label value="rdf:http://purl.org/dc/elements/1.1/title"/>
-    </vbox>
-  </template>
-</hbox>
-
- -

In this example, the generated items will be sorted by title. The sortDirection attribute specifies the sort direction and may be set to "descending" for a reverse sort. The sortDirection attribute functions similarly to how the tree builder uses it. With a tree builder, each column has its own sort specified using the sort attribute, and the sortActive attribute is used to indicate the column that is currently sorted. For other content, there are no columns and only one sort is applicable, so the sortActive attribute is not necessary.

- -

When the template builder generates a result, the sort service uses the value of the sortResource predicate for the result to determine where in the content the generated output should be inserted. When the RDF datasource changes, and a new result is available, the sort service inserts the new content at the right location.

- -

Unlike with trees, you can sort using a secondary resource with the sortResource2 attribute which is used in the same manner as the sortResource attribute. If the values for the sortResource predicate are the same for two results, the sortResource2 predicate is used to further clarify the order. You can only have one secondary resource, that is, there is no sortResource3 attribute.

- -

To change the sorting for a template's generated contents, you can either change the sort related attributes and rebuild the template, or for listboxes and menus, you can call the sort service's sort method:

- -
var listbox = document.getElementById("aListBox");
-
-var sortService = Components.classes["@mozilla.org/xul/xul-sort-service;1"].
-                    getService(Components.interfaces.nsIXULSortService);
-sortService.sort(listbox, "http://purl.org/dc/elements/1.1/title", "descending");
-
- -

This code will sort a listbox by title in a descending order. The arguments to the sort method specify the root node (the listbox), the sort resource and the sort direction.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/index.html b/files/es/archive/mozilla/xul/index.html deleted file mode 100644 index 1189079118..0000000000 --- a/files/es/archive/mozilla/xul/index.html +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: XUL -slug: Archive/Mozilla/XUL -tags: - - Todas_las_Categorías - - XUL -translation_of: Archive/Mozilla/XUL ---- -

 

-
Empezando
-Tutorial de introducción a XUL, documento original de XULPlanet.
-
-

XUL es el lenguaje XML para interfaces de usuario de Mozilla. Te permite crear potentes aplicaciones multiplataforma que pueden ejecutarse con conexión a Internet o sin ella. Estas aplicaciones son fácilmente personalizables con texto alternativo, gráficos, y diseños por lo que pueden ser fácilmente instalados o traducidos para diversos mercados. Los desarrolladores web que estén familiarizados con HTML Dinámico (DHTML) pueden aprender XUL fácilmente y empezar a crear aplicaciones ya.

-
- -

Documentación

Referencia XUL
Vea también la documentación del MDC sobre prefwindow.
Bestiario XUL
Esta "XULNote" muestra algunos conceptos clave y términos en el entorno de desarrollo XUL.
Xul Periodic Table (en)
Échale un vistazo a los elementos de una Interfaz XUL.
Wikilibro de XUL
Wikilibro con una introducción al lenguaje XUL.

Ver Todos...

Comunidad

  • En la comunidad Mozilla... en inglés.

* Foros de XULPlanet (en)

Ver todas...

Herramientas

Ver todas...

Temas relacionados

JavaScript, XBL, CSS, RDF, Extensiones, XULRunner
-

Categorías

-

Interwiki Language Links automatismos

-

 

-

 

-

 

-

diff --git a/files/es/archive/mozilla/xul/method/index.html b/files/es/archive/mozilla/xul/method/index.html deleted file mode 100644 index 101edc07d5..0000000000 --- a/files/es/archive/mozilla/xul/method/index.html +++ /dev/null @@ -1,174 +0,0 @@ ---- -title: Métodos -slug: Archive/Mozilla/XUL/Method -translation_of: Archive/Mozilla/XUL/Method ---- -

« Referencia de XUL

- - - - - - diff --git a/files/es/archive/mozilla/xul/property/align/index.html b/files/es/archive/mozilla/xul/property/align/index.html deleted file mode 100644 index d3fc019b3d..0000000000 --- a/files/es/archive/mozilla/xul/property/align/index.html +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Align -slug: Archive/Mozilla/XUL/Property/Align -translation_of: Archive/Mozilla/XUL/Property/align ---- -
« Referencia de XUL
- -
-
align
-
Tipo: string
-
Gets and sets the value of the align attribute.
-
diff --git a/files/es/archive/mozilla/xul/property/buttons/index.html b/files/es/archive/mozilla/xul/property/buttons/index.html deleted file mode 100644 index 18c1b31651..0000000000 --- a/files/es/archive/mozilla/xul/property/buttons/index.html +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: buttons -slug: Archive/Mozilla/XUL/Property/Buttons -translation_of: Archive/Mozilla/XUL/Property/buttons ---- -
« Referencia de XUL
- -
-
buttons
-
Typo: lista de los valores de abajo separados por comas
-
Una lista separada por comas de botones que aparecerán en el cuadro de diálogo. Los botones serán puestos en lugares adecuados para la plataforma del usuario y la gestión básica de eventos se ejecutará automáticamente. En la lista pueden utilizarse los siguientes valores:
-
- - diff --git a/files/es/archive/mozilla/xul/property/index.html b/files/es/archive/mozilla/xul/property/index.html deleted file mode 100644 index 1a7ae096bc..0000000000 --- a/files/es/archive/mozilla/xul/property/index.html +++ /dev/null @@ -1,273 +0,0 @@ ---- -title: Propiedades -slug: Archive/Mozilla/XUL/Property -translation_of: Archive/Mozilla/XUL/Property ---- -

« Referencia de XUL

- - - - - - diff --git a/files/es/archive/mozilla/xul/style/index.html b/files/es/archive/mozilla/xul/style/index.html deleted file mode 100644 index 920b41ddce..0000000000 --- a/files/es/archive/mozilla/xul/style/index.html +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Clases de estilo -slug: Archive/Mozilla/XUL/Style -translation_of: Archive/Mozilla/XUL/Style ---- -

« Referencia de XUL

- - diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/actualizar_comandos/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/actualizar_comandos/index.html deleted file mode 100644 index dd76069198..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/actualizar_comandos/index.html +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Actualizar comandos -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Actualizar_comandos -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Updating_Commands ---- -

 

-

En esta sección veremos como actualizar comandos.

-

Invocando comandos

-

Si un comando tiene un atributo oncommand, podemos invocarlo simplemente usando el método doCommand del comando o de un elemento vinculado a él. Para otros comandos, necesitaremos usar un par de líneas de código. Necesitamos usar estos pasos adicionales cuando invocamos comandos implementados por un controlador. Además, tendremos que hacerlo cuando creemos nuestros comandos de menú, por ejemplo para implementar los comandos del menú editar en nuestra aplicación.

-

Afortunadamente, el código extra es bastante simple. Todo lo que necesitamos hacer es obtener el controlador y llamar al comando. Un forma sencilla de hacerlo es la siguiente:

-
var controlador = document.commandDispatcher.getControllerForCommand("cmd_paste");
-if (controlador && controlador.isCommandEnabled("cmd_paste"))
-  controlador.doCommand(command);
-}
-
-

El código mostrado arriba primero obtiene el controlador para comando ‘cmd_paste’ del despachador de comandos. Entonces comprueba que el comando esta habilitado y lo ejecuta usando el método doCommand. Hay que fijarse en que no hace falta adivinar que elemento o controlador usar, el despachador de comandos hace esa faena por nosotros. Tambíen podríamos ejecutar el método doCommand sin comprobar si el comando está habilitado o no, aunque mejor no hacerlo.

-

El código de arriba es lo suficientemente genérico como para crear una función que tome un parametro, comando, y lo ejecute. Esta función podría entonces ser reusada para todos los comandos. De hecho, esto es tan común que Mozilla incluye una librería que hace justo esto. Sí incluyes el guión ‘chrome://global/content/globalOverlay.js’ en un archivo XUL, puede llamar el método goDoCommand que ejecutará el comando que se le pase como parametro. El código para esa función son simplemente unas pocas líneas, así que podemos incluirla directamente en nuestro código si por alguna razón no queremos incluir la librería.

-
<script src="chrome://global/content/globalOverlay.js"/>
-
-<command id="cmd_paste" oncommand="goDoCommand('cmd_paste');/>
-<button label="Pegar" command="cmd_paste"/>
-
-

Este ejemplo implementa un botón Pegar. Está vinculado con un comando que a su vez invoca ese mismo comando para que lo gestione el controlador por defecto. Este código es todo lo que se necesita para implementar la funcionalidad del comando pegar en nuestra aplicación. La única cosa que nos falta es asegurarnos de que el comando pegar, y por ende el botón, este habilitado y se actualize en el momento oportuno, lo que se describe a continuación.

-

Actualizadores de comandos

-

Un actualizador de comandos es una característica extra del elemento commandset, que nos permite actualizar el estado de uno o más comandos cuando ciertos eventos ocurren. Necesitamos pensar cuando un comando es válido y cuando no lo es. Además debemos considerar cuando debe cambiar el estado y cuando debén los comandos ser actualizados.

-

Por ejemplo, el comando pegar es válido cuando una caja de texto tiene el foco y hay algo en el portapapeles que pegar. El comando se habilitará cuando la caja de texto obtenga el foco o el contenido del portapales cambie. Un actualizador de comandos escuchará a estas situaciones y podrá ejecutar código que habilite o deshabilite comandos como sea necesario.

-

Un simple actualizador de comandos puede ser como el siguiente:

-
<commandset id="actualizaPegarElemento"
-            commandupdater="true"
-            events="focus"
-            oncommandupdate="goUpdateCommand('cmd_paste');"/>
-
-

Un actualizador de comandos es indicado cuando se usa el atributo commandupdater, el cual debe ser true. El atributo event se usa para definir los eventos a los cuales debe escuchar el actualizador. Podemos especificar varios eventos si los separamos con comas. En este ejemplo el actualizador de comandos escucha al evento ‘focus’. Esto hará que los comandos se actualizen con un elemento reciba el foco.

-

Cuando ocurre un evento de foco, el código en el atributo oncommandupdate es ejecutado. En el ejemplo, la función goupdateCommand es llamada, que es la función implementada en globalOverlay.js descrita anteriormente. Esto actualizara el comando y habilitará o deshabilitará los botones y menús necesarios. El código detrás de todo esto es bastante sencillo. Simplement coge el controlador adecuado, llama su método isCommandEnabled y el comando queda habilitado o deshabilitado. Si hay varios comandos a actualizar, llamaremos la función goUpdateCommand una vez para cada comando.

-

Cabe mencionar que el actualizador de comandos recibirá avisos sobre todos los eventos de foco en todos los elementos, incluso si otros gestores de eventos responden al evento. Esencialmente, un actualizador de comandos es como un gestor de eventos global.

-

Los actualizadores de comandos puede escuchar a los siguientes eventos, aunque es posible crear nuestros propios eventos.

-
   * focus: ocurre cuando un elemento obtiene el foco
-   * select: ocurre cuando el texto seleccionado cambia
-   * undo: ocurre cuando el buffer de deshacer cambia
-   * clipboard: ocurre cuando los contenidos del portapapeles cambian
-
-

Los siguientes ejemplos demuestran como se usan los actualizadores de comandos en el navegador Mozilla para actualizar los comandos del menú editar. Las funciones usadas pueden ser encontradas en el fichero ‘chrome://communicator/content/utilityOverlay.js’.

-
<commandset id="globalEditMenuItems"
-            commandupdater="true"
-            events="focus"
-            oncommandupdate="goUpdateGlobalEditMenuItems()"/>
-<commandset id="selectEditMenuItems"
-            commandupdater="true"
-            events="select"
-            oncommandupdate="goUpdateSelectEditMenuItems()"/>
-<commandset id="undoEditMenuItems"
-            commandupdater="true"
-            events="undo"
-            oncommandupdate="goUpdateUndoEditMenuItems()"/>
-<commandset id="clipboardEditMenuItems"
-            commandupdater="true"
-            events="clipboard"
-            oncommandupdate="goUpdatePasteMenuItems()"/>
-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/archivos_manifest/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/archivos_manifest/index.html deleted file mode 100644 index e95455ea20..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/archivos_manifest/index.html +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: Archivos Manifest -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Archivos_Manifest -tags: - - Todas_las_Categorías - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Manifest_Files ---- -
-

« AnteriorSiguiente »

-
- -


- En esta sección veremos como incluir ficheros XUL y chrome en un un paquete y crear un archivo Manifest para ellos.

- -

Paquetes

- -

Un paquete es un conjunto de ficheros XUL y scripts que definen la funcionalidad de una interfaz de usuario. Los paquetes se pueden instalar dentro de Mozilla y referenciar con una URL del chrome. Un paquete puede contener cualquier tipo de ficheros que pueden estar separados en distintos subdirectorios dentro del paquete. Un paquete puede estar contenido como un directorio o como un fichero JAR.

- -

Archivos Manifest

- -

Un archivo manifest describe un paquete y mapea su localización en disco a una URL. El archivo manifest en el directorio chrome se examinará al iniciarse la aplicación Mozilla para comprobar los paquetes instalados. Esto significa que todo lo que necesitamos hacer para instalar un nuevo paquete es añadir un nuevo archivo manifest en el directorio chrome de la aplicación o en el directorio chrome específico del usuario. Este último es el utilizado preferentemente, dado que es posible que no tengamos suficientes permisos para escribir en el directorio de la aplicación.

- -

Si únicamente intenta probar código XUL con privilegios en el navegador Firefox, puede hacerlo fácilmente utilizando un archivo manifest con sólo una linea:

- -
    -
  1. Cree un nuevo directorio en algún lugar. Por ejemplo, en una maquina Windows, puede usar C:\testfiles
  2. -
  3. Cree un nuevo fichero ASCII1 llamado test.manifest en el directorio chrome. Realmente no importa cómo se llame el fichero, tan solo que tenga la extensión .manifest. (1. No funciona con UTF-8 com BOM.)
  4. -
  5. Añada la linea siguiente en él:
  6. -
- -
 content tests file:///C:/testfiles/
-
- -

La ruta al fichero deberá apuntar al directorio creado anteriormente. Si no está seguro de cual es la ruta, abra el directorio en el navegador y copie la URL de la barra de dirección.

- -

¡Ya está! Ahora, todo lo que necesita hacer es añadir algunos ficheros XUL dentro del nuevo directorio y será capaz de cargarlos escribiéndolos en una URL chrome de la forma chrome://tests/content/<filename>. Por supuesto, necesitará reiniciar el navegador para que los cambios tengan efecto. Si el fichero no carga, asegúrese de que la ruta del fichero es correcta.

- -

La sintaxis básica de las lineas en un archivo manifest para contener paquetes es:

- -

'content <nombrepaquete> <rutaarchivo>'

- -

El primer campo 'content' indica un paquete contenido. Para los temas utilizamos 'skin', mientras que para la configuración regional utilizamos 'locale'. El <nombrepaquete> es en nuestro ejemplo de arriba 'tests', lo cual significa que el primer campo en la URL chrome es 'tests' como en chrome://tests/content/sample.xul. Si el nombre del paquete fuera 'browser', la URL chrome sería chrome://browser/content/. El campo final es la ruta donde se localiza el archivo. Esta puede ser una ruta de archivo local utilizando una URL de archivo, o un archivo JAR utilizando una URL jar, la cual describiremos a continuación. Puede especificar múltiples paquetes incluyendo otras lineas en el fichero manifest.

- -

El fichero browser.manifest usado por Firefox es algo parecido a esto:

- -
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
-
- -

Aqui se estan listando dos paquetes, 'branding' y 'browser'. Además se están especificando tres recubrimeintos (overlays ), lo cual permite combinar contenidos de distintos paquetes. Las extensiones harán mayor uso de los recubrimientos (overlays), dado que ellas fusionan su UI con la del navegador.

- -

Las rutas de fichero para los paquetes branding y browser utilizan URLs jar dado que el contenido está empaquetado en un archivo. Un archivo JAR puede crearse con una utilidad ZIP. Para un archivo JAR localizado en el directorio chrome, la sintaxis es muy simple:

- -

jar:<filename.jar>!/<ruta_en_el_archivo>

- -

Para el paquete browser, el archivo es browser.jar, situado junto al fichero manifest en el directorio chrome. La ruta 'content/browser' especifica la ruta donde se localizan los ficheros XUL dentro del archivo. No necesita especificar la ruta si no tiene directorio en el archivo. En este caso la hay, dado que los ficheros para el paquete branding se almacenan en diferentes rutas del mismo archivo.

- -

Para el paquete 'tests' creado, los archivos no se encuentran empaquetados por lo que utilizaremos una ruta directa. Ello facilita la labor del desarrollador puesto que no se precisa empaquetar todos los archivos cada vez que se realiza un cambio. Sin embargo, en el momento de la distribución del paquete o la extensión, es preferible hacerlo empaquetado para evitar la instalación de varios pequeños archivos.

- -

La parte xpcnativewrappers=yes del final del manifiesto es un señalador que puede usarse opcionalmente. En javascript es posible sobreescribir las funciones preconstruidas en el código. Si se especifica el señalador xpcnativewrappers, indicará que el script que se ejecuta en un contexto con privilegios no utiliza las versiones sobrecargadas sino las versiones originales. De otro modo, si la extensión intentara llamadas a las versiones modificadas pudiera no funcionar correctamente, o peor aún, crear problemas en la seguridad. Este señalador fue añadido para prevenir estos problemas y debería utlizarse siempre en nuevas extensiones, pero se ha respetado por compatibilidad de antiguas extensiones.

- -

Temas y configuración regional

- -

La estructura para los temas y la configuración regional es similar a la del paquete de contenido, excepto que es necesario especificar el paquete de contenido para el cual se está proporcionando dicho tema o configuración regional. Por ejemplo:

- -
skin browser classic/1.0 jar:classic.jar!/skin/classic/browser/
-locale browser en-US jar:en-US.jar!/locale/browser/
-
- -

A las líneas anteriores se les ha añadido un campo extra para indicar que tanto el tema y la configuración regional se aplican al navegador. El nombre del tema es 'classic/1.0'. Es este caso se usa un número de versión como parte del nombre del tema pero es opcional si vas a crear tu propio tema. Mozilla no utiliza el número de versión de manera especial ya que dicho número simplemente forma parte del nombre del tema. La configuración regional es 'en-US'. Sus URL chrome son mapeadas a chrome://browser/skin y chrome://browser/locale. Si estás creando tu propio tema o configuración regional para el navegador, todo lo que necesitas hacer es crear un fichero manifest con una de estas dos líneas en él, modificándolas para que se adapten al tema o a la configuración regional.

- -

Nuestro dialogo de ejemplo para buscar archivos

- -

Vamos a crear un fichero manifest para el cuadro de diálogo para buscar archivos que desarrollaremos. Puedes combinar los tres tipos anteriores en un único fichero si lo deseas. Esto se puede hacer cuando se crea una extensión con todas sus partes incluidas en un solo fichero. Lo haremos así para el cuadro de diálogo. Crea un fichero llamado findfile.manifest en el directorio chrome y añade lo siguiente a dicho fichero:

- -
content findfile file:///findfile/content/
-skin findfile classic/1.0 file:///findfile/skin/
-locale findfile en-US file:///findfile/locale/
-
- -

Crea los nuevos directorios listados anteriormente. No importa dónde, pero asegúrate de que la rutas de los ficheros en el fichero manifest apuntan a dichos directorios. Naturalmente, lo lógico sería usar los directorios apropiados para tu sistema. Si se va a distribuir el paquete, se necesitaría empaquetarlo en un fichero JAR y modificar estas rutas. En este caso, sólo vamos a crearlo para demostrar el uso del fichero manifest y para preparar los directorios para los ejemplo que veremos en las siguiente secciones.

- -

Nótese que el segundo campo de las líneas del tema y de la configuración regional especifica 'findfile'. Esto significa que el tema y la configuración regional modifican el paquete findfile especificado en la primera línea. Las tres rutas anteriores especifican subdirectorios para cada parte. Seguramente querrás crear estos subdirectorios para mantener los ficheros de cada parte separados.

- -

Instalación de un paquete

- -

Para instalar una aplicación, necesitarás crear un instalador para ella o incluirlo como parte de otra aplicación. El método usado depende de qué clase de aplicación estés creando. Para las extensiones, necesitarás crear un fichero de instalación llamado install.rdf, el cual describe lo que será instalado, el autor de la extensión y con qué versiones del navegador u otras aplicaciones es compatible. También se necesita una estructura de directorios específica ya que las extensiones están limitadas a donde los ficheros deben de ser instalados. Una extensión es empaquetada en un fichero XPI. XPI es la abreviatura de XPInstall y es usada por Mozilla para instalar componentes. Al igual que los ficheros JAR, un fichero XPI sólo es un fichero ZIP al que se le ha cambiado la extensión por lo que puedes crear y ver los ficheros XPI con cualquier herramienta ZIP.

- -

El administrador de extensiones de Firefox maneja automáticamente las extensiones instaladas empaquetadas en ficheros XPI. Se recomienda subir las extensiones al sitio Add-ons de Mozilla, donde los usuarios pueden localizarlas para instalarlas. Aunque pueden ser instaladas desde cualquier lugar, de modo predeterminado no se permiten instalaciones desde otros sitios.

- -

También es posible utilizar un script de instalación escrito en JavaScript para instalar ficheros. Esto permite copiar los ficheros a cualquier ubicación y realizar otras tareas de administración de ficheros. Sin embargo, las aplicaciones instaladas a través de script no serán listadas por el administrador de extensiones ni existe ningún método automatizado para desinstalarlas. Por esta razón, los scripts de instalación no se usan tan asiduamente.

- -

Las aplicaciones independientes pueden ser empaquetadas utilizando XULRunner. Esto crea un fichero ejecutable por separado para que la aplicación pueda ser distribuida independientemente del navegador.

- -

Para más información sobre la creación de extensiones, véase Extensiones. Para más información sobre XULRunner, véase XULRunner.

- -

Aplicaciones antiguas

- -

Si estás creando aplicaciones para las versiones antiguas de Mozilla, es decir, anteriores a Firefox 1.5 o a Mozilla 1.8, el proceso se vuelve un poco más complicado. A continuación se explica cómo configurar un paquete para las primeras versiones. Se puede obviar esta sección si lo que se van a crear son nuevas extensiones o aplicaciones XUL.

- -
Nota: Este antiguo proceso también se aplica al nuevo SeaMonkey 1.0. El código base aún no ha adoptado el formao "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:mi_aplicacion"/>
-  </RDF:Seq>
-
-  <RDF:Description about="urn:mozilla:package:mi_aplicacion"
-          chrome:displayName="titulo"
-          chrome:author="autor"
-          chrome:name="mi_aplicacion"
-          chrome:extension="true"/>
-
-</RDF:RDF>
-
- -
content,install,url,file:///main/app/
-
- -
    -
  1. Crea un directorio cualquiera. La mayoría de la gente lo crearía como subdirectorio del directorio chrome de Mozilla aunque no es imprescindible. El directorio puede estar en cualquier lugar en disco. Pon los ficheros XUL en este directorio.
  2. -
  3. Crea un fichero llamado contents.rdf y ponlo en dicho directorio. Copia el texto mostrado a continuación en este fichero. Este fichero será usado para conocer el identificador de la aplicación, su nombre, autor, versión, etc...
  4. -
  5. Cambia las partes resaltadas del fichero anterior por tus datos. El texto en rojo 'mi_aplicacion' debería corresponder al ID de la aplicación. Te lo puedes inventar pero usualmente el ID corresponde al nombre de la aplicación. Reemplaza el texto resaltado en azul con el título de la aplicación y el autor.
  6. -
  7. Si el campo 'chrome:extension' es true, la aplicación es una extensión de Mozilla Firefox Extension y será mostrada en la ventana de extensiones del navegador. Si es false, no aparecerá.
  8. -
  9. Guarda el fichero contents.rdf y asegúrate de que está en el directorio creado en el paso 1.
  10. -
  11. Abre el fichero <directorio_mozilla>/chrome/installed-chrome.txt, donde <directorio_mozilla> es el directorio deon está instalado Mozilla. Sal de Mozilla antes de hacer esto.
  12. -
  13. A continuación vas a registrar la nueva aplicación con Mozilla para que ésta sepa dónde encontrarla. Añade una línea al final de installed-chrome.txt apuntando al nuevo directorio creado en el paso 1. Cambia el texto resaltado a continuación por la ruta del directorio. Asegúrate de que la URL acaba con una barra (/) y que dejas una nueva línea al final de la línea. Si no estás seguro de qué URL es, abre el directorio creado en el paso 1 en Mozilla y copia la URL desde el campo de localización. Date cuenta de que la referencia debe ser siempre un directorio, no un fichero.
  14. -
  15. Borra el fichero <directorio_mozilla>/chrome/chrome.rdf.
  16. -
  17. Ejecuta Mozilla. Deberías ver cualquier fichero XUL ubicado en el directorio utilizando una URL de la forma chrome://id_aplicacion/content/fichero.xul donde fichero.xul es el nombre del fichero. El fichero XUL principal debería ser id_aplicacion.xul, el cual puede ser cargado usando la URL abreviada chrome://id_aplicacion/content/.
  18. -
- -

Si estás creando temas y/o configuraciones regionales, repite los pasos anteriores, exceptuando que el formato del fichero contents.rdf es ligeramente diferente. Mira el contenido de los ficheros contents.rdf en otras aplicaciones para más detalles.

- -

Localización de fallos

- -

Crear un paquete chrome puede resultar con frecuencia un arte y es difícil detectar errores. A continuación se muestran unos cuantos trucos en caso de que te atasques.

- - - -

En la siguiente sección empezaremos a mirar el lenguaje XUL.

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/atajos_de_teclado/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/atajos_de_teclado/index.html deleted file mode 100644 index 39ab142d19..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/atajos_de_teclado/index.html +++ /dev/null @@ -1,376 +0,0 @@ ---- -title: Atajos de teclado -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Atajos_de_teclado -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Keyboard_Shortcuts ---- -

Puedes usar manejadores de evento de teclado para responder al teclado. Sin embargo, sería tedioso hacer eso para cada botón y elemento de menú.

- -

Creación de un atajo de teclado

- -

XUL provee métodos en los cuales puede definir atajos de teclado. Ya vimos en la sección de menús que podemos definir un atributo llamado accesskey que específica la tecla que un usuario debe presionar para activar el menú o un elemento del mismo. En el ejemplo que está debajo, el menú Archivo puede ser seleccionado presionando 'Alt' y 'F' (o cualquier otra combinación de teclas para una plataforma específica). Una vez que el menú Archivo está abierto, el menú Cerrar puede ser seleccionado presionando la tecla C.

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<menubar id="sample-menubar">
-  <menu id="file-menu" label="Archivo" accesskey="f">
-    <menupopup id="file-popup">
-      <menuitem id="close-command" label="Cerrar" accesskey="c"/>
-    </menupopup>
-  </menu>
-</menubar>
-
- -

Tambié puede usar el atributo accesskey en botones. Cuando la tecla es presionada en este caso, el botón es seleccionado.

- -

Quizás quiera configurar atajos de teclado más generales. Por ejemplo, presionar Control+C para copiar texto al porta papeles. Aunque a veces atajos como estos no siempre son válidos, usualmente funcionarán cada vez que la ventana esté abierta. Usualmente, un atajo del teclado estará permitido en cualquier momento y puede ver ver si deberí estar haciendo algo con algún programa. Por ejemplo, copiar texto al portapapeles sólo debería funcionar cuando hay algún texto seleccionado.

- -

El elemento 'key'

- -

XUL provee de un elemento, key, que permite definir atajos de teclado para una ventana. Tiene atributos para especificar la tecla que debería ser presionada y qué teclas modificadoras (tales como Shift o Control) necesitan ser presionadas simultáneamente. A continuación se muestra un ejemplo:

- -
<keyset>
-  <key id="sample-key" modifiers="shift" key="R"/>
-</keyset>
-
- -

En este ejemplo se define un atajo de teclado que es activado cuando el usuario presiona las teclas 'Shift' y 'R' simultáneamente. El atributo key (tiene el mismo nombre que el elemento) se emplea para indicar qué tecla debe apretarse, en este caso la 'R'. Se puede asignar cualquier caracter (de teclado) a este atributo para requerir que se apriete una tecla en particular. Los modificadores que deben apretarse se indican con el atributo modifiers. Se pueden establecer varios, (ej: modifiers="control alt") asignando como valor una lista separada con espacios de teclas de modificadoras; se listan a continuación:

- -
-
alt 
-
El usuario debe pulsar la tecla Alt. En Macintosh, es la tecla Option.
-
control 
-
El usuario debe pulsar la tecla Control.
-
meta 
-
El usuario debe pulsar la tecla Meta. En Macintosh, es la tecla Command.
-
shift 
-
El usuario debe pulsar la tecla Mayúsculas.
-
accel 
-
El usuario debe pulsar la tecla especial acelerador. La tecla usada por los atajos de teclado en la plataforma del usuario. Habitualmente, éste debería ser el valor que utilizases.
-
- -

Tu teclado no tendrá necesariamente todas las teclas, en cuyo caso serán mapeadas a las teclas modificadoras que tengas.

- -

El elemento key debe colocarse dentro de un elemento keyset; en caso contrario no funcionará. Este elemento esta diseñado para contener un conjunto de elementos key, lo cual sirve para agrupar todas las definiciones de teclas en un solo sitio en cada archivo. Cualquier elemento key fuera de un keyset no funcionará.
-  

- -

Cada plataforma generalmente utiliza una tecla diferente para los atajos de teclado. Por ejemplo, Windows usa la tecla Control y Macintosh usa la tecla Command. Sería conveniente definir elementos key por separado para cada plataforma. Afortunadamente, hay una solución. El modificador accel hace referencia a la tecla usada para atajos de teclado específica de cada plataforma. Funciona igual que otros modificadores, pero no será la misma en todas las plataformas.

- -

Algunos ejemplos adicionales:

- -
<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>
-
- -

El atributo código de tecla (keycode)

- -

El atributo key se utiliza para especificar la tecla que debe ser pulsada. Sin embargo, habrá casos en los que quieras referirte a teclas que no pueden ser especificadas con un caracter (como la tecla Enter o las teclas de función F1..F12). El atributo key sólo puede ser utilizado para caracteres imprimibles. Otro atributo, keycode puede ser utilizado para caracteres no imprimibles.

- -

El atributo keycode debería ser establecido a un código especial que represente la tecla que quieres. A continuación hay una lista de teclas. No todas las teclas están disponibles en todos los teclados.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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   
- -

Por ejemplo, para crear un atajo con las teclas 'Alt y F5':

- -
<keyset>
-  <key id="test-key" modifiers="alt" keycode="VK_F5"/>
-</keyset>
-
- -

El siguiente ejemplo muestra algunos atajos de teclado más:

- -
<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>
-
- -

La primera tecla es invocada cuando el usuario pulsa su atajo específico de la plataforma y C. El segundo es invocado cuando el usuario pulsa F3. El tercero es invocado al pulsar las teclas Control, Alt y 1 a la vez. Si quieres distinguir entre teclas de la parte principal del teclado y el teclado numérico, utiliza las teclas VK_NUMPAD (como VK_NUMPAD1).

- -
-

Consulta la Mozilla Keyboard Planning FAQ and Cross Reference para más información sobre selección atajos de teclado para usar en aplicaciones.

-
- -

Usando los atajos de teclado

- -

Ahora que sabemos cómo definir atajos de teclado, veremos cómo podemos usarlos. Hay dos formas. La primera es la más simple y sólo requiere que utilices el manejador de evento keypress en el elemento key. Cuando el usuario pulsa la tecla, el script será invocado. A continuación se muestra un ejemplo:

- -
<keyset>
-  <key id="copy-key" modifiers="accel" key="C" oncommand="DoCopy();"/>
-</keyset>
-
- -

La función DoCopy será llamada cuando el usuario presione las teclas especificadas en el elemento key, que en este ejemplo, son las teclas para copiar al portapapeles (como Control+C). Esto funcionará mientras la ventana esté abierta. La función DoCopy debería comprobar si hay texto seleccionado y en ese caso copiarlo al portapapeles. Nota que las cajas de texto tienen los atajos del portapapeles ya incluidos, por lo que no tienes que implementarlos por ti mismo.

- -

Asignación de un atajo de teclado a un menú

- -

Si estás asignando un atajo de teclado que ejecuta a un comando que ya existe en un menú, puedes asociar el elemento key directamente con el comando del menú. Para hacer esto, añade un atributo key al menuitem. Establece su valor al id de la tecla que quieras usar. El siguiente ejemplo muestra esto.

- -

Ejemplo 2: Código Ver en funcionamiento

- -
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>
-
- -

El atributo key del elemento menuitem, cuyo valor aquí es paste-key es igual al valor del atributo id de la tecla definida. Puedes usar esto para teclas adicionales así como para definir atajos de teclado para cualquier número de elementos.

- -

También verás que se ha añadido un texto junto a la opción "Paste" para indicar que el comando de menú puede ser invocado mediante Control + V. Esto se realiza automáticamente basándose en los modificadores del elemento key. Los atajos de teclado asociados a los menús funcionarán aunque el menú no esté abierto.

- -

Una característica adicional de las definiciones de teclas es que las puedes desactivar fácilmente. Par hacer esto, añade un atributo disabled al elemento <code>key y establece su valor a true. Esto desactiva el atajo de teclado para que no pueda ser invocado. Es útil cambiar el atributo disabled utilizando un script.

- -
-

Nuestro ejemplo

- -

Vamos a añadir atajos de teclado al diálogo encontrar archivos. Añadiremos cuatro, para los comandos Cortar (Cut), Copiar (Copy) y Pegar (Paste) y otro para el comando Cerrar (Close) cuando el usuario pulse Escape.

- -
  <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>
-
- -

Ahora podemos usar esos atajos para activar los comandos. Por supuesto, los comandos del portapapeles no harán nada porque no hemos escrito esos scripts.

-
- -

Los eventos de tecla

- -

Hay tres eventos de teclado que pueden ser utilizados si las funcionalidades descritas antes no estuvieran disponibles. Estos eventos son:

- -
-
keypress 
-
Llamado cuando una tecla es pulsada y despulsada mientras un elemento tiene el foco. Puedes usar esta tecla para comprobar los caracteres permitidos en un campo.
-
keydown 
-
Llamado cuando una tecla es pulsada (aunque todavía no se haya despulsado) mientras un elemento tiene el foco.
-
keyup 
-
Llamado cuando una tecla es despulsada mientras un elemento tiene el foco.
-
- -

Los eventos de tecla son sólo enviados al elemento que tiene el foco. Típicamente, esto incluye cajas de texto, botones, checkboxes y elementos así. Si no hay ningún elemento focalizado, el evento de la tecla será dirigido al propio documento XUL. En este caso, puedes añadir un escuchador de eventos (event listener) a la etiqueta window. Aunque normalmente, si quieres responder a teclas globalmente, utilizarás un atajo de teclado como se ha descrito antes.

- -

El objeto evento de tecla tiene dos propiedades que registran la tecla que ha sido pulsada. La propiedad keyCode registra el código de la tecla y puede ser comparada con una de las constantes de la anterior tabla de esta sección. La propiedad charCode es utilizada para caracteres imprimibles y registrará el código de caracter de la tecla que fue pulsada.

- -
Nuestro ejemplo: Código Ver en funcionamiento
- -

Seguimos con poner un gestor de foco y selección.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_botones/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_botones/index.html" deleted file mode 100644 index 4181b632c6..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_botones/index.html" +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Añadiendo botones -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Añadiendo_botones -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Adding_Buttons ---- -
-

« AnteriorSiguiente »

-
- -

En esta sección veremos cómo añadir botones sencillos a una ventana.

- -

Añadir botones a una ventana

- -

La ventana que hemos creado no contiene nada hasta ahora, así es que carece de interés. En esta sección vamos a añadir dos botones: Uno para buscar y otro para cancelar. También aprenderemos una forma fácil de ubicarlos dentro de la ventana.

- -

Al igual que HTML, XUL tiene una serie de etiquetas para crear elementos de interfaz de usuario. La más básica de todas es la etiqueta button, que sirve para crear un botón simple.

- -

Cada elementobotón tiene dos propiedades asociadas: label e image, mútuamente compatibles: Se puede tener un botón con imagen y/o con etiqueta. Los botones se usan generalmente para las opciones deAceptar oCancelar en los cuadros de diálogo, por ejemplo.

- -

Sintaxis de los botones

- -

La etiqueta button tiene la siguiente sintaxis:

- -
<button
-    id="identificador"
-    class="dialogo"
-    label="Aceptar"
-    image="imagenes/imagen.jpg"
-    disabled="true"
-    accesskey="t"/>
-
- -

Los atributos son todos opcionales, y se interpretan así:

- -
-
id 
-
Un identificadorúnico (dentro de la página actual) que represente de forma inequívoca al botón. Es muy útil para referirse al botón desde una hoja de estilos CSS o desde un script de código, por ejemplo. Es recomendable rellenar este atributo entodas las etiquetas que uno declare (si no figura explícitamente en cada etiqueta de esta guía es porque se da por sobreentendido).
-
class 
-
La clase-estilo del botón. Se usa de la misma manera que en HTML: Sirve para indicar el estilo que el navegador deberá aplicar al botón creado. En el ejemplo precedente se usa la clase dialogo, aunque por lo general uno no suele establecer una clase específica para un botón.
-
label 
-
El texto que aparecerá dentro del botón. Por ejemplo:Aceptar orCancelar. Si no se rellena, el botón aparece sin texto.
-
image 
-
La URL de la imagen que aparecerá dentro del botón. Si no se rellena, el botón aparecerá sin imagen. Una forma alternativa de especificar esta imagen es desde una hoja de estilo CSS, mediante una propiedad list-style-image.
-
disabled 
-
Indicador de deshabilitado: Si se rellena con valor true, el botón aparecera deshabilitado, lo que quiere decir que no responderá a la acción de pulsar sobre él (y el aspecto, usualmente, será con el texto en gris pálido). Si no se especifica este atributo, el botón está habilitado. También se puede cambiar el estado habilitado/deshabilitado mediante JavaScript.
-
accesskey 
-
En este atributo debe ir una sóla letra que se usará como tecla de acceso directo para pulsar el botón. Esta letra debería pertenecer al valor del atributo label. El aspecto, usualmente, será un subrayado bajo la letra escogida en el botón. Su funcionamiento consiste en que cada vez que el usuario pulse la letra escogida (más un pulsador que pude variar en función de la plataforma; usualmente ALT), desde cualquier lugar de la ventana, el botón recibirá el foco.
-
- -

Atención: La etiqueta button en realidad soportamás atributos de los listados aquí, pero el resto se verán más adelante.

- -

Algunos ejemplos de botones

- -

Example 1 : Código Ver en funcionamiento

- -
Image:buttons1.png
- -
<button label="Normal"/>
-<button label="Disabled" disabled="true"/>
-
- -


- El ejemplo de arriba genera los botones mostrados en la imagen. El primer botón es un botón normal, el segundo está desabilitado.

- -

Empezaremos creando un simple botón "Buscar" para la función buscar fichero. El ejemplo siguiente nos muestra cómo hacer esto.

- -

 

- -
<button id="find-button" label="Buscar"/>
-
- -
FireFox no permite abrir ventanas "chrome" desde páginas web, asi que el links "Ver" en el tutorial abriran una ventana de normal de browser.debido a esto, los botones aparecerán ocupando todo el ancho de la ventana. Puedes colocar align="start" a la etiqueta window para que esto no ocurra.
- -
-
El ejemplo findfile.xul
- -

Coloquemos este código al archivo que habiamos creado en la sección anterior. El código debe ser colocado entre las etiquetas de window. El código que debemos agregar esta aquí abajo en rojo.

- -
<?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
- -

Verás que tambien se agrego el botón Cancel. Le dimos a la ventana una orientación horizontal, de este modo, los botones se muestran uno al lado del otro. Si abres el fichero en Mozilla, obtendras algo como la imagen mostrada aquí.

-
- -

 

- -
Nota: No deberíamos poner el texto de label directamente en el fichero XUL. En lugar de eso, deberíamos usar entes así, el texto puede ser traducido facilmente..
- -

En la próxima sección descubriremos cómo agregar etiquetas e imágenes a una ventana XUL.

- -

Ver también more button fetaures

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_elementos_html/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_elementos_html/index.html" deleted file mode 100644 index c0330768d6..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_elementos_html/index.html" +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: Añadiendo elementos HTML -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Añadiendo_elementos_HTML -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Adding_HTML_Elements ---- -

 

-

Ahora que hemos añadido algunos botones, vamos a añadir algunos otros elementos.

-

Adición de Elementos de HTML a una Ventana

-

Además de todos los elementos XUL que están disponibles, usted también puede añadir elementos de HTML directamente dentro de un archivo XUL. Usted en realidad puede usar cualquier elemento de HTML en un archivo XUL, queriendo decir que programillas Javaneses y mesas pueden ser colocados en una ventana. Usted debería evitar usar elementos de HTML en archivos XUL si usted puede. Sin embargo, esta sección describirá como usarlos de todas maneras. Recuerde que XML es sensible a las mayusculas, entonces usted debera escribir tanto las etiquetas como los atributos en minúscula.

-

Para usar elementos de HTML en un archivo XUL, usted debe declarar que usted hace así la utilización del XHTML namespace. Este camino, Mozilla puede distinguir las etiquetas de HTML de los XUL. El atributo debajo debería para ser añadido a la etiqueta de ventana del archivo XUL, o al elemento de HTML exterior.

-
 xmlns:html="http://www.w3.org/1999/xhtml"
-
-

Esto es una declaración de HTML mucho como el que solíamos declarar XUL. Esto debe ser entrado exactamente como mostrado o esto no trabajará correctamente. Note que Mozilla en realidad no descarga este URL, pero esto realmente lo reconoce como ser HTML.

-

Aquí está un ejemplo como podría ser añadido a la ventana de archivo de hallazgo:

-
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<window
-    id="findfile-window"
-    title="Find Files"
-    orient="horizontal"
-    xmlns:html="http://www.w3.org/1999/xhtml"
-    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-

Entonces, usted puede utilizar etiquetas HTML como lo haría normalmente. Teniendo en cuenta lo sieguiente:

- -

Puede utilizar cualquier etiqueta HTML, aunque algunas como head y body, realmente no son utiles. A continuación se muestran algunos ejemplos.

-
<html:img src="banner.jpg"/>
-
-<html:input type="checkbox" value="true"/>
-
-<html:table>
-  <html:tr>
-    <html:td>
-      A simple table
-    </html:td>
-  </html:tr>
-</html:table>
-
-

These examples will create an image from the file banner.jpg, a checkbox and a single-cell table. You should always use XUL features if they are available and you probably should not use tables for layout in XUL. (There are XUL elements for doing layout). Notice that the prefix html: was added to the front of each tag. This is so that Mozilla knows that this is an HTML tag and not a XUL one. If you left out the html: part, the browser would think that the elements were XUL elements and they would not display because img, input, table, and so on are not valid XUL tags.

-

In XUL, you can add labels with the description or label element. You should use these elements when you can. You can also add labels to controls either by using the HTML label element, or you can simply put the text inside another HTML block element (such as p or div) as in the example below.

-

Example

-

Código Ver en funcionamiento

-
<html:p>
-  Search for:
-  <html:input id="find-text"/>
-  <button id="okbutton" label="OK"/>
-</html:p>
-
-

This code will cause the text 'Search for:' to be displayed, followed by an input element and an OK button. Notice that the XUL button can appear inside the HTML elements, as it does here. Plain text will only be displayed when placed inside an HTML element that would normally allow you to display text (such as a p tag). Text outside of one will not be displayed, unless the XUL element the text is inside allows this (the description element, for example). The examples below may help.

-

Ejemplos de elementos HTML

-

What follows are some examples of adding HTML elements to windows. In each case, the window and other common information has been left out for simplicity.

-

Example: A dialog with a check box

-

Código Ver en funcionamiento

-
<html:p>
-  Click the box below to remember this decision.
-  <html:p>
-    <html:input id="rtd" type="checkbox"/>
-    <html:label for="rtd">Remember This Decision</html:label>
-  </html:p>
-</html:p>
-
-

In this case, one p tag was used to place the text in and another was used to break apart the text into multiple lines.

-

Image:htmlelem-ex1.jpg

-

Example: Text outside of HTML blocks

-

Código Ver en funcionamiento

-
<html:div>
-    Would you like to save the following documents?
-    <html:hr/>
-</html:div>
-Expense Report 1
-What I Did Last Summer
-<button id="yes" label="Yes"/>
-<button id="no" label="No"/>
-
-

Image:htmlelem-ex2.jpg

-

As can be seen in the image, the text inside the div tag was displayed but the other text (Expense Report 1 and What I Did Last Summer) was not. This is because there is no HTML or XUL element capable of displaying text enclosing it. To have this text appear, you would need to put it inside the div tag, or enclose the text in a description tag.

-

Example: Invalid HTML elements

-
<html:po>Case 1</html:po>
-<div>Case 2</div>
-<html:description value="Case 3"/>
-
-

All three of the cases above will not display, each for a different reason.

-
-
- Case 1 
-
- po is not a valid HTML tag and Mozilla has no idea what to do with it.
-
- Case 2 
-
- div is valid but only in HTML. To get it to work, you will need to add the html: qualifier.
-
- Case 3 
-
- A description element is only valid in XUL and not in HTML. It should not have the html: qualifier.
-
-

Next, we'll learn how to adding spacing between elements. Categorías

-

links interwikis

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_etiquetas_e_imagenes/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_etiquetas_e_imagenes/index.html" deleted file mode 100644 index 2ab6c737b7..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_etiquetas_e_imagenes/index.html" +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Añadiendo etiquetas e imagenes -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Añadiendo_etiquetas_e_imagenes -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Adding_Labels_and_Images ---- -

Esta sección describe un modo de añadir etiquetas e imágenes a una ventana. Además, veremos como incluir elementos en grupos.

-

Elementos de Texto

-

Usted no puede integrar el texto directamente en un archivo XUL sin etiquetas alrededor de ello y esperar que ello sea mostrado. El modo más básico de incluir el texto en una ventana es de usar el elemento de etiqueta. Muestran un ejemplo debajo:

-

Ejemplo

-

Código Ver en funcionamiento

-
<label value="This is some text"/>
-
-

El atributo de valor puede ser usado para especificar el texto que usted desea tener mostrado. El texto no se ajustará, de tal forma que el texto aparecerá sobre una sola línea. Esto es conveniente para las secciones cortas de texto.

-

Para el texto más largo, usted puede colocar el contenido dentro de etiquetas de descripción de apertura y cierre. A diferencia del texto especificado con el elemento de etiqueta y el atributo de valor, el texto hijo se ajustará en múltiples líneas si fuera necesario. Redimensione la ventana para ver lo ajustado. Como HTML, saltos de línea y espacios en blanco extras son colapsados en un solo espacio. Más adelante descubriremos como contraemos la anchura de elementos de modo que nosotros podamos ver la envoltura más fácilmente.

-

Ejemplo

-

Código Ver en funcionamiento

-
<description>
-  This longer section of text is displayed.
-</description>
-
-

Internamente, tanto el elemento de etiqueta como el elemento de descripción son lo mismo, lo cual significa que las etiquetas pueden tener texto ajustado si usted coloca el texto dentro de la ´etiqueta´, y las descripciones pueden tener un atributo de valor. El elemento de etiqueta es querido para las etiquetas de mandos, como campos de texto. El elemento de descripción esta prometido a otro texto descriptivo como el texto informativo en el tope de un cuadro de diálogo. Por convención, usted debería seguir esta pauta.

-

Usted puede usar el atributo de control para fijar cual etiqueta de control esta asociada. Cuando el usuario pulsa la etiqueta, ése control será enfocado. Ponga el valor del atributo de control al id del elemento que será enfocado.

-

Ejemplo

-

Código Ver en funcionamiento

-
<label value="Click here:" control="open-button"/>
-<button id="open-button" label="Open"/>
-
-


- En el ejemplo encima, pulsando la etiqueta hará que el botón sea enfocado.

-

Imágenes

-

Como HTML, XUL tiene un elemento para mostrar imágenes dentro de una ventana. Este elemento es adecuadamente llamado image. Note que el nombre de etiqueta es diferente que en HTML (image en vez de img). Usted puede usar el atributo de src para especificar el URL del archivo de imagen. El ejemplo debajo muestra esto:

-
<image src="images/banner.jpg"/>
-
-

Aunque usted pueda usar esta sintaxis, sería mejor usar una hoja de estilo para poner la URL de la imagen. En sesiones posteriores describiremos como usar hojas de estilo, pero un ejemplo se mostrá aqui para ampliar. Usted puede usar lista-estilo-imagen de la propiedad CSS para poner el URL para la imagen. Aquí están algunos ejemplos:

-
XUL:
- <image id="image1"/>
- <image id="search"/>
-
-
Style Sheet:
- #image1 {
-   list-style-image: url("chrome://findfile/skin/banner.jpg");
- }
-
- #search {
-   list-style-image: url("chrome://findfile/skin/images/search.jpg");
- }
-
-

Estas imágenes vienen desde dentro del directorio chrome, en el skin para el paquete findfile. Puesto que estas imágenes varían por el piel, usted debe usualmente poner una imagen en el directorio skin.

-

En la próxima sesión, aprenderemos como añadir algunos controles a una ventana.

-

Categorías

-

links interwikis

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_los_gestores_de_eventos/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_los_gestores_de_eventos/index.html" deleted file mode 100644 index 41b1cce66c..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_los_gestores_de_eventos/index.html" +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: Añadiendo los gestores de eventos -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Añadiendo_los_gestores_de_eventos -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Adding_Event_Handlers ---- -

The find files dialog so far looks quite good. We haven't cleaned it up much but we have created a simple user interface easily. Next, we will show how to add scripts to it.

- -

Usando scripts

- -

Para hacer funcional el diálogo de búsqueda de archivos, necesitaremos algunos scripts los cuales se ejecutarán cuando el usuario interactúe con el diálogo. Podríamos querer agregar un script para manejar el botón Buscar, el botón Cancelar y manejar cada comando del menú. Escribimos esto utilizando funciones JavaScript muchas de la misma forma que en HTML.

- -

Puede utilizar el elemento script para incluir scripts en archivos XUL. Puede incluir el código script directamente en el archivo XUL entre la apertura y cierre de etiquetas script pero es mucho mejor incluir código en un archivo separado ya que de esta manera la ventana XUL cargará ligeramente más rápido. El atributo src es utilizado para enlazar un archivo script externo.

- -
-
Nuestro ejemplo
- -

Agreguemos un script al diálogo buscar archivo. Aunque no importe cómo sea llamado el archivo script, generalmente debería ser el mismo que el archivo XUL con una extensión .js. En este caso, findfile.js será utilizado. Agregue la línea debajo sólo después de la apertura de la etiqueta window y antes de cualquier otro elemento.

- -
<script src="findfile.js"/>
-
- -
Nota: Al agregar el elemento script directamente bajo el elemento window su ámbito será el documento completo. Si se anida bajo otra etiqueta su ámbito se restringirá a los elementos anidados en ella, y no sera "visible" para otras zonas de documento.
- -

Crearemos el archivo script más tarde cuando conozcamos qué queremos poner en él. Definiremos algunas funciones en el archivo y podremos llamarlas desde un manejador de eventos.

-
- -

Puede incluir scripts múltiples en un archivo XUL utilizando múltiples etiquetas script, cada una apuntando a un script diferente. Puede utilizar URLs relativas o absolutas. Por ejemplo, puede utilizar URLs de la siguiente forma:

- -
<script src="findfile.js"/>
-<script src="chrome://findfiles/content/help.js"/>
-<script src="http://www.example.com/js/items.js"/>
-
- -

Este tutorial no intenta describir cómo utilizar JavaScript ya que esto es un tópico extenso y hay variedades de otras fuentes que están disponibles para esto.

- -
Por defecto la consola JavaScript sólo muestra errores desde contenido de red. Para mostrar errores en JavaScript chrome, es necesario cambiar la preferencia javascript.options.showInConsole a verdadero. Puede también cambiar la preferencia javascript.options.strict para la depuración. Estableciendo este valor a verdadero, la sintaxis propensa, pobremente escrita y no estándar causa errores lógicos que son guardados en la consola JavaScript.
- -

Respuesta a eventos

- -

El script contendrá código que responderá a varios eventos disparados por el usuario u otras situaciones. Hay más de treinta eventos diferentes que pueden ser manejados de formas distintas. Un evento típico es que el usuario presione un botón del ratón o presione una tecla. Cada elemento XUL tiene la habilidad de disparar varios eventos en diferentes situaciones. Algunos eventos son disparados solamente por determinados elementos.

- -

Cada evento tiene un nombre, por ejemplo, 'mousemove' es el nombre del evento que es disparado cuando el usuario mueve el ratón sobre un elemento de la Interfaz de Usuario. XUL utiliza el mismo mecanismo de evento definido en eventos DOM. Cuando una acción ocurre que debería disparar un evento, tal como que el usuario mueva el ratón, se crea un objeto evento correspondiente a tal tipo de evento. Las propiedades de dicho objeto se establecen de modo que ofrezca información asociada a la circunstancia en que se produjo, tal como: la posición del ratón, la(s) tecla(s) que fue(ron) presionada(s), el botón del ratón que se utilizó, etc.

- -

El evento es enviado luego en fases al XUL.

- - - -

Puede responder a un evento durante la captura completa de la fase burbujeante. Una vez que el evento ha finalizado de propagarse, cualquier acción por defecto ocurrirá, la cual está incluida en comportamiento del elemento.

- -

Por ejemplo, cuando el ratón sea movido sobre un botón que está dentro de un cuadro, un evento 'mousemove' es generado, y enviado primero a la ventana, seguido por el documento, y luego al cuadro. Eso completa la fase de captura. Luego, el evento 'mousemove' es enviado al botón. Finalmente, la fase burbujeante es esencialmente lo inverso a la fase de captura. Note que algunos eventos no hacen la fase burbujeante.

- -

Puede adjuntar oyentes a cada elemento a ser oído por los eventos durante cada paso de la propagación de eventos. Debido a la forma en que un evento simple es pasado a todos los ancestros, puede adjuntar un oyente a un elemento específico o a un elemento más grande en la jerarquía. Naturalmente, un evento adjunto a un elemento más grande recibirá la notificación de todos los elementos dentro de él, mientras que un evento adjunto a un botón sólo recibirá eventos preparados para ese botón. Esto es útil si hay varios elementos que querrían manejarse utilizando el mismo código o similar.

- -

El evento más común utilizado es el evento 'command'. El evento command es disparado cuando un usuario activa un elemento, por ejemplo presionando un botón, cambiando una casilla de verificación o seleccionando un ítem desde un menú. El evento command es un evento útil ya que automática maneja distintas formas de activar el elemento. Por ejemplo, el evento command ocurrirá sin importar si el usuario utiliza el ratón para seleccionar un botón o presionar la tecla Enter.

- -

Hay dos formas de adjuntar un evento oyente a un elemento. Primero, utilizando un atributo con script como su valor. Segundo, llamando a un método del evento addEventListener. El primero sólo puede manejar eventos burbujeantes pero tiende a ser más simple de escribir. El último puede manejar eventos en cualquier fase y puede también ser utilizado para adjuntar múltiples oyentes para un evento en un elemento. Utilizando la forma atributo es más común para la mayoría de eventos.

- -

Atributos controladores de eventos

- -

Para controlar eventos bajo la forma de atributos se debe asignar un atributo asociado con el evento a controlar en el elemento en en que se desea atraparlo: el atributo será el nombre del evento precedido del prefijo 'on' y se le asignará como valor un llamado a la función o script que se desea ejecutar cuando ocurra el evento. Por ejemplo, para el evento 'command' el atributo correspondiente será 'oncommand' y para 'mouseover' será 'onmouseover'. El código de llamado a la función suele ser muy corto y generalmente llama a un procedimiento que ha sido definido en una etiqueta script o en un archivo separado. A continuación se ofrece un ejemplo de tratamiento de evento en respuesta a pulsar un botón:

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<button label="OK" oncommand="alert('Se apretó el botón!');"/>
-
- -

Como el evento command permea las capas contenedoras (es burbujeante), también es posible ubicar el controlador de eventos en un elemento contenedor. En el ejemplo siguiente, el atributo controlador se establece en una caja y ésta atrapa eventos de los dos elementos que contiene.

- -

Ejemplo 2 : Código Ver en funcionamiento

- -
<vbox oncommand="alert(event.target.tagName);">
-  <button label="OK"/>
-  <checkbox label="Muestra las imágenes"/>
-</vbox>
-
- -

En este ejemplo, el evento command se filtrará desde el elemento en que ocurra - button o checkbox - hasta el elemento vbox, donde es controlado. Si se hubiese colocado un segundo controlador de eventos (atributo oncommand) en el elemento button, su código sería invocado antes, seguido del manejador situado en el elemento vbox. Los controladores de eventos reciben, como argumento implícito, un objeto event al que se puede hacer referencia en código mediante la variable 'event'. Dicho objeto porta, en sus propiedades, la información que específicamente concierne al evento. Cuando varios elementos comparten un controlador de eventos (como en este ejemplo) es usual utilizar la propiedad 'target' del objeto event (event.target), que alberga una referencia al elemento en el que ocurrió. En el código de ejemplo se hace un llamado a la ventana de mensajes para que muestre el nombre de la etiqueta 'tagName' del elemento en que ocurra. La propiedad target resulta útil para controlar la permeabilidad de eventos burbujeantes, de modo que un conjunto de elementos, buttons por ejemplo, comparta y sea controlado mediante un único script.

- -
Nota de traducción: Si se anida controladores de eventos, para un mismo evento, en varias capas; se debe tener cuidado de cancelarlo, una vez controlado en una capa, para evitar que se dispare nuevamente en los controladores situados en las capas contenedoras. A no ser que se desee realizar acciones en cascada.
- -

Se debe notar que la sintaxis para establecer los atibitos controladores es similar a la empleada para asignar eventos en documentos HTML. De hecho, HTML y XUL comparten el mismo mecanismo de definición de eventos. No obstante, hay una diferencia importante: mientras que en HTML se usa el evento 'click' (o el atributo onclick) para responder a acciones sobre los buttons, en XUL se debe usar el evento command en su lugar. XUL soporta el evento click, pero este sólo responde a acciones del ratón (mouse), no al uso del teclado. En consecuencia, se debe evitar el uso del evento click en XUL, a no ser que se tenga alguna razón para responder de modo exclusivo a acciones provocadas con el mouse (ratón). Adicionalmente, cuando se deshabilita un elemento, este no disparará eventos command; mientras que el evento click se produce con independencia de que el elemento en que se dispare esté o no habilitado.

- -
-
Nuestro ejemplo
- -

Un gestor command se puede agregar a los botones Buscar y Cancelar del diálogo de búsqueda de archivos. Presionar el botón Buscar debe iniciar la búsqueda. Como aún no vamos a implementar el proceso de búsqueda, dejaremos esta parte fuera por un rato. Presionar el botón Cancelar debe cerrar la ventana. El código de abajo muestra como hacer esto. Mientras estamos aquí, añadimos el mismo código al menuitem Cerrar.

- -
<menuitem label="Cerrar" accesskey="c" oncommand="window.close();"/>
-...
-
-<button id="cancel-button" label="Cancelar"
-     oncommand="window.close();"/>
-
- -

Aquí se añadieron dos gestores. El atributo oncommand fue añadido al menuitem Cerrar. Usando este gestor, el usuario podrá cerrar la ventana dando click al menuitem con el mouse o seleccionándolo con el teclado.El gestor oncommand también fue añadido al botón Cancelar.

-
- -

Controladores de eventos asignados mediante métodos del DOM

- -

Una segunda vía para asignar controladores de eventos a los elementos es usar su método addEventListener. Este camino permite agregarlos dinámicamente y escucharlos durante la fase de captura. A continuación se ilustra la sintaxis:

- -

Ejemplo 3: Código Ver en funcionamiento

- -
<button id="okbutton" label="OK"/>
-
-<script>
-function buttonPressed(event){
-  alert('Se apretó el botón!');
-}
-
-var button = document.getElementById("okbutton");
-button.addEventListener('command', buttonPressed, true);
-</script>
-
- -

La función getElementById() devuelve el elemento cuyo Id sea pasado como parámetro; en este caso, el button "okbutton". Luego se llama a la función addEventListener() de dicho elemento para agregarle un controlador de eventos: su primer argumento es el nombre del evento al que se va a responder, el segundo es el mombre de la función a llamar cuando el evento ocurra y finalmente, el último argumento debe ser true para controladores en la fase de captura. Si se desea permitir que el evento pase a otras fases se debe asignar el último argumenta como false. La función pasada como segundo argumento, debe a su vez, tener un argumento para pasar el objeto event, como se muestra en la declaración de la función buttonPressed arriba.

- -
Nuestro ejemplo hasta aquí: Código Ver en funcionamiento
- -

Seguimos con más detalles sobre los eventos.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_m\303\241s_elementos/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_m\303\241s_elementos/index.html" deleted file mode 100644 index 5ac33e16d8..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/a\303\261adiendo_m\303\241s_elementos/index.html" +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: Añadiendo más elementos -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Añadiendo_más_elementos -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Adding_More_Elements ---- -

Concluiremos la discusión de cajas adicionando algunas al diálogo de encontrar archivos.

- -

Añadiendo elementos al ejemplo de encontrar archivos

- -

Vamos a agregar ahora algunos elementos al diálogo de encontrar archivos. Primero, vamos a adicionar la capacidad de búsqueda por otra información, tal como el tamaño y la fecha del archivo.

- -
<hbox>
-  <menulist id="searchtype">
-    <menupopup>
-      <menuitem label="Name"/>
-      <menuitem label="Size"/>
-      <menuitem label="Date Modified"/>
-    </menupopup>
-  </menulist>
-  <spacer style="width: 10px;"/>
-  <menulist id="searchmode">
-    <menupopup>
-      <menuitem label="Is"/>
-      <menuitem label="Is Not"/>
-    </menupopup>
-  </menulist>
-  <spacer style="width: 10px;"/>
-  <textbox id="find-text" flex="1" style="min-width: 15em;"/>
-</hbox>
-
- -
Image:boxfinal1.png
- -

Dos cajas de listas desplegables son añadidas al diálogo. Un espaciador ha sido adicionado en medio de cada elemento para separarlos. Estos espaciadores han dado un ancho específico de 10 pixeles cada uno. Usted notará que si la ventana es redimensionada, la caja de texto crece pero los otros componentes no. Igualmente notará que la etiqueta fué removida.

- -

Si usted redimensiona la ventana verticalmente, el elemento no cambia su tamaño. Esto es debido a que está dentro de cajas horizontales. Lo mas apropiado sería que los botones de Encontrar y Cancelar permanecieran siempre al fondo de la ventana. Esto es fácil de hacer agregando un espaciador en medio de las dos cajas horizontales.

- -
<spacer style="height: 10px"/>
-<hbox>
-  <menulist id="searchtype">
-    <menupopup>
-      <menuitem label="Nombre"/>
-      <menuitem label="Medida"/>
-      <menuitem label="Fecha de modificación"/>
-    </menupopup>
-  </menulist>
-  <spacer style="width: 10px;"/>
-  <menulist id="searchmode">
-    <menupopup>
-      <menuitem label="Es"/>
-      <menuitem label="No es"/>
-    </menupopup>
-  </menulist>
-  <spacer style="width: 10px;"/>
-  <textbox id="find-text" flex="1" style="min-width: 15em;"/>
-</hbox>
-
-<spacer style="height: 10px" flex="1"/>
-
-<hbox>
-
- -

Ahora cuando el diálogo es redimensionado, los dos botones se moverán ya que estan siempre a lo largo del fondo del diálogo. El primer espaciador añade espacio extra en medio de la etiqueta del título y los elementos del criterio de búsqueda.

- -

Se vería mejor si hubiera un borde al rededor de los criterios de búsqueda. Hay dos formas de hacer esto. Podemos utilizar la propiedad CSS border de CSS o podemos utilizar el elemento caja de grupo. Este primer método puede requerir que coloquemos el estilo en la caja como tal. Sin embargo, vamos a utilizar el último método. Un caja de grupo tiene la ventaja de que dibuja una caja con un bonito estilo biselado, adecuado para el tema actual.

- -

Vamos a cambiar la caja dentro de un groupbox:

- -

Aquí inserta texto sin formato <groupbox orient="horizontal">

- -
  <caption label="Search Criteria"/>
-  <menulist id="searchtype">
-  .
-  .
-  .
-  <spacer style="width: 10px;"/>
-  <textbox id="find-text" flex="1" style="min-width: 15em;"/>
-</groupbox>
-
- -
Image:boxfinal2.png
- -

Existen otros problemas cosméticos como tal. Podemos también tener que el groupbox crece de tal forma que se extiende verticalmente al final de la caja. También, podemos modificar algunos de los márgenes de tal forma que los elementos queden mejor posicionados.

- -

Veremos más ejemplos del modelo de caja y algunos de sus rasgos a medida que continuemos agregando elementos durante el tutorial.

- -

Ejemplo de encontrar archivos Código Ver en funcionamiento

- -

Seguido, veremos como crear pilas.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/barra_de_herramientas/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/barra_de_herramientas/index.html deleted file mode 100644 index 722fd6fb36..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/barra_de_herramientas/index.html +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Barra de Herramientas -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Barra_de_Herramientas -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Toolbars ---- -

 

-

Una barra de herramientas normalmente se sitúa en la parte superior de la ventana y contiene un número de botones que realizan acciones cotidianas. XUL ofrece la posibilidad de crear barra de herramientas.

-

Añadiendo una barra de herramientas

-

Como otros elementos, las barras de herramientas de XUL son del tipo caja. Generalmente mostrará una fila de botones, pero cualquier otro elemento puede colocarse en una barra de herramientas. Por ejemplo, el navegador Mozilla contiene una caja de texto para mostrar e introducir las direcciones URL.

-

Las barras de herramientas pueden ser colocadas en cualquier parte de la ventana, ya sea horizontalmente o verticalmente. Por supuesto que normalmente no pondremos una caja de texto en una barra de herramientas vertical. En verdad, como las barras de herramientas no son más que cajas, pueden colocarse en cualquier sitio que deseémos, incluso en el centro de la ventana. Sin embargo, es típico que las barras de herramientas se sitúen en la parte superior de la venta, colocandose una debajo de otra si hubíera más de una, agrupandose en un elemento llamadao toolbox.

-

En la parte izquierda de una barra de herramientas se encuentra un pequeño notch que al hacer clic en él contraerá la barra de herramientas, de forma que solo el notch quede visible. Este notch se denomina grippy. Cuando tenemos varias barras de herramientas agrupadas dentro de un elemento toolbox, los grippes se colocarán en una misma fila. Esto compacta el espacio usado de manera eficiente. Para las barras de herramientas verticales, los grippies se sitúan en la parte superior. Un usuario puede contraer las barras de herramientas para obtener más espacio en la ventana principal.

-

He aquí un ejemplo de una simple barra de herramientas.

-

Ejemplo

-
<toolbox>
-  <toolbar id="nav-herramientas">
-    <toolbarbutton label="Atrás" />
-    <toolbarbutton label="Adelante" />
-  </toolbar>
-</toolbox>
-
-

Esto creará una barra de herramientas con dos botones, un botón Atrás y otro Adelante. La barra de tareas ha sido definida dentro de un elemento toolbox. Todo esto ha requerido cuatro nuevos elementos, que son descritos aquí:

-
   * toolbox
-
-

Una caja que contiene barras de herramientas

-
   * toolbar
-
-

Una barra de herramientas que contiene elementos como botones. Las barras de herramientas pueden minimizarse usando el grippy de su borde izquierdo o superior.

-
   * toolbarbutton
-
-

Un botón para la barra de herramientas, el cual tiene las mismas características que un botón normal pero que normalmente se muestra de forma distinta.

-
   * toolbargrippy
-
-

Este elemento crea el notch que puede usarse para contraer y expandir la barra de herramientas. No necesitamos definirla manualmente, ya que se añade automaticamente.

-

El elemento toolbar es el principal y responsable de crear la barra de herramientas. Dentro de él se colocan los elementos que debe mostrar la barra de herramientas, normalmente botones aunque puede ser cualquier otro elemento. La barra de herramientas debería tener un atributo id o el grippy no será capaz de contraer o expandir la barra de herramientas correctamente.

-

En el ejemplo anterior solo creamos una barra de herramientas. Podemos crear más simplemente añadiendo más elementos toolbar después del primero.

-

El elemento toolbox no es más que un contenedor para las barras de herramientas. En algunas aplicaciones, veremos varias barras de herramientas en la parte superior de la venta. Podemos ponerlas todas juntas dentro de un toolbox. Sin embargo no es obligatorio poner las barras de herramientas dentro de un toolbox.

-

Los grippies son creados usando otro elemento, toolbargrippy. No tiene sentido usarlo en ningún otro sitio que no sea una barra de herramientas, ya que esta especialmente diseñador para contraer y expandir barras de herramientas. Sin embargo si es posible aplicarle un estilo diferente. Incluso puedes ocultarlo si incluimos el atributo grippyhidden al elemento toolbar, poniendo su valor a true.

-

Tres barras de herramientas agrupadas en un toolbox

-

Las mismas barras pero con dos de ellas contraidas.

-


- Ahora añadiremos una barra de herramientas a nuestro dialogo. Realmente no lo necesitamos pero crearemos una de todas formas para demostrar su uso. Se definirán dos botones, los tipicos de Abrir y Guardar. En teoría deberían posibilitar que el usuario puediera guardar los resultados de una búsqueda y abrirlos posteriormente.

-
<vbox flex="1">
-    <toolbox>
-        <toolbar id="findfiles-toolbar">
-            <toolbarbutton id="abrirbusqueda" label="Abrir" />
-            <toolbarbutton id="guardarbusqueda" label="Guardar" />
-        </toolbar>
-    </toolbox>
-
-    <tabbox>
-
-

Hemos añadido una barra de herramientas con dos botones. En la imagen, vemos que aparecen alineados horizontalmente en la parte superior. El grippy tambíen aparece en el borde izquierdo. Fijemonos en que hemos colocado la barra de herramientas en la caja vertical, justo encima del elemento tabbox. Lo hemos hecho así porque necesitamos la alineación vertical de la caja para que la barra de herramientas aparezca arriba del todo.

-


- Siguiente, veremos como añadir paneles de contenido.

-

NdT: el elemento ‘toolbargrippy’ no es soportado por Firefox, dada la popularidad de este navegador creo que habría que poner algun comentario al respecto. Ver la ref. de toolbargrippy

-

Categorías

-

links interwikis

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/barras_de_desplazamiento/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/barras_de_desplazamiento/index.html deleted file mode 100644 index 74325c678a..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/barras_de_desplazamiento/index.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Barras de desplazamiento -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Barras_de_desplazamiento -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - para_revisar -translation_of: Archive/Mozilla/XUL/Tutorial/Scroll_Bars ---- -

Ahora, aprenderemos a añadir barras de desplazamiento en una ventana.

- -

Añadir barras de desplazamiento

- -

Una barra de desplazamiento sirve para que un usuario pueda moverse en un documento grande. También puedes usarla cuando tienes que buscar un valor que está dentro de un cierto rango. Las barras de desplazamiento pueden crearse de varias formas. En XUL, puede crearse una usando la etiqueta scrollbar. Algunos elementos, como cajas de texto, también añadirán barras de desplazamiento cuando el contenido de dentro es demasiado grande

- -

En esta sección, hablaremos de la creación de una barra de desplazamiento independiente. El usuario pondrá el valor ajustando la barra de desplazamiento. Probablemente no usarás esto a menudo. Una barra de desplazamiento está compuesta de varias partes: el deslizador, que es la parte principal de la barra de desplazamiento con la caja ajustable, y los dos botones de flecha. Una barra de desplazamiento crea todos estos elementos automáticamente.

- -

Imagen:BarraDesplazamiento.jpg

- -

La sintaxis de una barra de desplazamiento es la siguiente:

- -
<scrollbar
-    id="barrahori"
-    orient="horizontal"
-    curpos="50"
-    maxpos="400"
-    increment="2"
-    pageincrement="10"/>
-
- -

Los atributos son los siguientes:

- -
-
id id
-
El identificador único de la barra de desplazamiento
-
- -
-
orient orient
-
Especifica la dirección de la barra de desplazamiento. Por defecto es horizontal, que crea una barra de desplazamiento que se extiende de izquierda a derecha. También puedes especificar vertical que crea una barra de desplazamiento que se extiende de arriba abajo.
-
- -
-
curpos curpos
-
Indica la posición actual de la barra de desplazamiento (la caja que puedes deslizar hacia adelante y hacia atrás.) El rango de valores se extiende de 0 al valor de maxpos. Este valor no es necesario. El valor por defecto es 0.
-
- -
-
maxpos maxpos
-
Indica la posición máxima de la barra de desplazamiento. Es un valor numérico. El valor por defecto es 100.
-
- -
-
increment increment
-
Este valor especifica cuánto cambia el valor de curpos cuando el usuario pulsa sobre una de las flechas de barra de desplazamiento. El valor por defecto es 1.
-
- -
-
pageincrement pageincrement
-
Este valor especifica cuánto cambia el valor curpos cuando el usuario hace clic sobre las páginas con la barra de desplazamiento, que puede hacerse pulsando sobre la bandeja entre la caja y las flechas. El valor por defecto es 10.
-
- -

El ejemplo dado en la sintaxis anterior creará una barra de desplazamiento que puede extenderse de un valor de 0 a 100. El valor 100 podría ser el número de líneas en una lista, pero podría ser lo que quieras. El valor inicial en este ejemplo es 20. Al hacer clic sobre una de las flechas de barra de desplazamiento, el valor se cambiará por 1 encima de o abajo. Pero paginando por la barra de desplazamiento, el valor se cambiará por 10.

- -

Cuando el usuario haga clic sobre las flechas de la barra de desplazamiento, se moverá la cantidad especificada por el valor increment. El aumento del valor de este atributo hará que la barra de desplazamiento se mueva más lejos con cada clic. La posición más a la izquierda o superior de la barra de desplazamiento tiene el valor 0 y la posición más a la derecha o inferior de la barra de desplazamiento tiene el valor dado por maxpos.

- -

Ajustando los valores de la barra de desplazamiento, puedes tener el thumb posicionado donde quieras y el cambio cuando el usuario haga clic en las flechas tal y como desees.

- -

A continuación, aprenderemos a crear barras de herramientas.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/cajas_de_grupo/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/cajas_de_grupo/index.html deleted file mode 100644 index d3607f1260..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/cajas_de_grupo/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Cajas de grupo -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Cajas_de_grupo -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Groupboxes ---- -

Esta sección describe un método para incluir elementos dentro de grupos.

-

Cajas de grupo

-

HTML provee un elemento, fieldset, que puede ser usado para agrupar otros elementos. Generalmente un borde es trazado alrededor de los elementos para demostrar que están relacionados entre sí. Un ejemplo sería un grupo de casillas de verificación. XUL provee un elemento equivalente, groupbox (caja de grupo), que se utiliza para propósitos similares.

-

Como su nombre implica, la groupbox es un tipo de caja, esto significa que los elementos dentro de ella se alinean de acuerdo a las reglas de las cajas. Hay dos diferencias entre las cajas de grupo y las cajas regulares:

-
    -
  1. Un borde biselado es dibujado alrededor de la caja de grupo de manera predeterminada. Puede cambiarse este comportamiento corrigiendo el estilo CSS.
  2. -
  3. La caja de grupo permite un encabezado que es colocado a lo largo del borde superior.
  4. -
-

Como las cajas de grupo son un tipo de caja pueden utilizarse los mismos atributos, como orient y flex. Puede insertarse cualquier elemento dentro de la caja, pero normalmente estos elementos estarán relacionados de alguna manera.

-

La etiqueta en el borde superior puede ser creada utilizando el elemento caption, esto funciona de manera similar al elemento HTML legend. Un simple elemento caption puesto como el primer hijo será suficiente.

-

El ejemplo siguiente muestra una simple caja de grupo:

-

Ejemplo

-
<groupbox>
-  <caption label="Respuesta"/>
-  <description value="Banana"/>
-  <description value="Mandarina"/>
-  <description value="Casilla telefónica"/>
-  <description value="Kiwi"/>
-</groupbox>
-
-

Image:titledbox1.jpg

-

Esto causará que se vean cuatro segmentos de texto rodeados por una caja con la etiqueta “Respuesta�?. Nótese que la caja de grupo posee orientación vertical por omisión, lo que es necesario para apilar los elementos en una sola columna.

-

También pueden agregarse elementos hijos dentro del elemento caption para crear un encabezado más complejo. Por ejemplo, el panel de preferencias para tipos de letra de Mozilla utiliza un menú desplegable como encabezado. A pesar de que se puede hacer uso de cualquier contenido, usualmente se usa una casilla de verificación o un menú desplegable.

-

Ejemplo

-
<groupbox flex="1">
-  <caption>
-    <checkbox label="Habilitar copias de seguridad"/>
-  </caption>
-  <hbox>
-    <label control="dir" value="Directorio:"/>
-    <textbox id="dir" flex="1"/>
-  </hbox>
-  <checkbox label="Comprimir archivos almacenados"/>
-</groupbox>
-
-

En este ejemplo se ha utilizado como encabezado una casilla de verificación. Podríamos usar un guión para habilitar o deshabilitar los contenidos de la caja de grupo cuando la casilla de verificación sea marcada y desmarcada. La caja de grupo contiene una caja horizontal con una etiqueta y una caja de texto. Tanto la caja de texto como la caja de grupo fueron hechas flexibles así la caja de texto se expandirá cuando la ventana se expanda. La casilla de verificación adicional aparece debajo de la caja de texto por la orientación vertical de la caja de grupo. En la siguiente sección añadiremos una caja de grupo a la ventana de diálogo “Buscar archivos�?.

-

Grupos radiales

-

Puede usarse el elemento radiogroup (grupo radial) para agrupar varios elementos radio (botón radial). El radiogroup es un tipo de caja. Puede agregarse cualquier elemento al mismo, y aparte de su manejo especial de botones radio estos funcionan como cualquier otra caja.

-

Todos los botones radiales insertados en el grupo radial serán agrupados entre sí, aún si se encuentran dentro de cajas anidadas. Esto podría aprovecharse para agregar elementos extras dentro de la estructura, como en el siguiente ejemplo:

-

Ejemplo

-
<radiogroup>
-  <radio id="no" value="no" label="Sin número"/>
-  <radio id="aleatorio" value="aleatorio" label="Número aleatorio"/>
-  <hbox>
-    <radio id="especificado" value="especificado" label="Especifique un número:"/>
-    <textbox id="numeroespecifico"/>
-  </hbox>
-</radiogroup>
-
-

Obsérvese que el elemento radiogroupno dibuja un borde a su alrededor, si se desearan bordes y encabezado deberá ser colocado dentro de una groupbox (caja de grupo).

-

A continuación utilizaremos lo aprendido hasta el momento y añadiremos algunos elementos adicionales a la ventana de diálogo “Buscar archivos�?.

-

Categorías

-

links interwikis

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/caracter\303\255sticas_adicionales_de_la_instalaci\303\263n/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/caracter\303\255sticas_adicionales_de_la_instalaci\303\263n/index.html" deleted file mode 100644 index 12cde3c81f..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/caracter\303\255sticas_adicionales_de_la_instalaci\303\263n/index.html" +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Características adicionales de la instalación -slug: >- - Archive/Mozilla/XUL/Tutorial_de_XUL/Características_adicionales_de_la_instalación -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Additional_Install_Features ---- -

 

-

Esta sección describe algo más específico sobre instaladores.

-

Manipulación De Archivo De Instalación

-

La sección anterior describió un instalador básico. Usted puede desear realizar un proceso más elaborado durante la instalación. Por ejemplo, usted puede desear instalar un paquete solamente cuando se cumplan ciertas condiciones, por ejemplo tener una librería particular instalada.

-

Además del objeto Install, un objeto File también está disponible para el script de instalación. Este objeto proporciona algunas funciones que se puedan utilizar para examinar y para modificar archivos en disco. Usted puede utilizarlo para mover, copiar o borrar archivos antes o después de que los archivos sean instalados. Por ejemplo, usted puede querer hacer primero una copia de respaldo de algunos archivos.

-

El código siguiente hará una copia del archivo "/bin/grep" y la pondrá en el directorio "/main".

-
var binFolder=getFolder("file:///","bin");
-var grep=getFolder(binFolder,"grep");
-
-var mainFolder=getFolder("file:///","main");
-
-File.copy(grep,mainFolder);
-
-


- La primera línea recuperará una referencia al directorio /bin. El texto 'file:///' es una secuencia especial que significa la raíz del sistema de archivos. De allí, conseguimos el archivo 'grep' que esta en el interior del directorio 'bin'. Si no existe este archivo, un error ocurrirá durante la instalación. Después, conseguimos la carpeta 'main', otra vez desde la raíz del sistema de archivos. Finalmente, ejecutamos la función File.copy que copia el archivo desde el fuente al destino.

-

También existen Funciones para mover, renombrar y ejecutar archivos. Así, usted puede mover los archivos que puedan estar en conflicto con su paquete.

-

Manipulación De Errores

-

Usted probablemente deseará manejar de mejor forma los errores. Esto ocurrirá si un archivo o un directorio no puede ser encontrado, hay poco espacio en disco o por otras razones.

-

Usted puede utilizar la función getLastError para determinar si ocurrió un error. Si retornó SUCCESS, no ocurrió ningún error. Si no, el número será un código de error que indica el tipo de error que ocurrió. Usted puede llamar esta función en cualquier punto durante el script de instalación para determinar si un error ocurrió durante la operación pasada.

-

Si ocurre un error, usted deseará probablemente abortar la instalación. Usted puede también exhibir un mensaje de error al usuario. Por ejemplo, usted puede ser que ponga esto como la sección pasada de su script:

-
if (getLastError() == SUCCESS){
-  performInstall();
-}
-else {
-  cancelInstall();
-}
-
-

Los códigos de error que puede retornar getLastError se enumeran en el archivo fuente de Mozilla nsInstall.h. Durante la instalación, se crea un archivo log que contiene las operaciones que se realizan. También mostrará cualquier error que ocurra. El archivo log se puede encontrar en el archivo 'install.log' en el directorio de instalación de Mozilla. Un bloque de texto será agregado a este archivo por cada instalación que ocurra.

-

La función logComment se puede utilizar para escribir una cadena de caracteres al archivo log. Tiene un parámetro, el texto a escribir.

-

El Tutorial XUL se acabo. :D

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/caracter\303\255sticas_de_una_ventana/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/caracter\303\255sticas_de_una_ventana/index.html" deleted file mode 100644 index 57b8fff890..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/caracter\303\255sticas_de_una_ventana/index.html" +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: Características de una ventana -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Características_de_una_ventana -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Features_of_a_Window ---- -

Ya hemos visto algunas de las características de las ventanas. En esta sección veremos algunas más.

- -

Creando otra ventana

- -

Puedes crear otra ventana para tu aplicación de la misma manera como lo harías para crear la primera. Solamente crea un segundo archivo XUL con el código de la ventana en él. Como en HTML, puedes usar la función window.open() para abrir la segunda ventana. Esta función devolverá una referencia de la nueva ventana abierta. Puedes usar esta referencia para llamar funciones de la otra ventana.

- -

La función open toma tres argumentos. El primero es la url del archivo que quieres abrir. El segundo es un nombre interno para la nueva ventana. El tercero es una lista de indicadores. El flag ‘chrome’ es importante para abrir la ventana como un archivo chrome. Si no agregas el flag ‘chrome’, el archivo se abrirá como el contenido de una ventana del navegador.

- -

Por ejemplo:

- -
var myWin =
-window.open("chrome://findfile/content/findfile.xul","findfile","chrome");
-
- -

Especificando el ancho y alto

- -

Deben haber notado que siempre que algunos elementos fueron agregados a una ventana, el ancho de la ventana se expande para hacer caber los nuevos elementos. En realidad la ventana es solo una caja (box) que es flexible y con orientación vertical por defecto. También puedes especificar el ancho y alto directamente en la etiqueta window. Esto causa que la ventana se muestre con un tamaño específico. Si no se especifica, el tamaño se determinará por los elementos que contiene.

- -
<window
-id="findfile-window"
-title="Find Files"
-width="400"
-height="450"
-
-xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- -

En este ejemplo, la ventana se abrirá con un ancho de 400 píxeles y un alto de 450 píxeles. Incluso si no contiene suficientes elementos como para abarcar este tamaño, de todas maneras la ventana se abrirá con este tamaño y quedará espacio en blanco en el área no ocupada. Si contiene demasiados elementos, la ventana no será lo suficientemente grande como para contener los elementos. El usuario deberá ajustar el tamaño del dialogo. Cuando especificas el alto y ancho de una ventana debes tener cuidado para que la ventana no resulte demasiado chica o demasiado grande. Nota que debes especificar ambos, el ancho y alto. Si especificas solo uno, el otro se tomará como 0. Para que la ventana ajuste automáticamente su tamaño, no especifiques ni el ancho ni el alto. El ancho y alto especifican solo el tamaño inicial de la ventana. El usuario podrá cambiar el tamaño de la ventana, asumiendo que la ventana sea dimensionable (‘resizable’) (ver más abajo).

- -

Otras características de las ventanas

- -

Los indicadores de abajo se pueden pasar como parte del tercer argumento a la función window.open. Tu sistema operativo puede que no los soporte todos. También puedes usar cualquiera de los indicadores ya existentes, los cuales deberías encontrar en una referencia de JaveScript. Puedes desactivar alguna característica especificándolo con ‘no’, por ejemplo ‘dialog=no’.

- -
-
alwaysLowered 
-
La ventana aparecerá siempre debajo de otras ventanas.
-
- -
-
alwaysRaised 
-
La ventana aparecerá siempre arriba de otras ventanas.
-
- -
-
centerscreen 
-
La ventana al abrirse se centrará.
-
- -
-
dependent 
-
La ventana aparecerá siempre en relación a la ventana que la abrió. Si la ventana que abrió la nueva ventana se mueve, la nueva ventana se mueve junto a ella.
-
- -
-
dialog 
-
La ventana es un dialogo, el cual puede aparecer diferentemente.
-
- -
-
modal 
-
El dialogo es modal. No se podrá interactuar con la ventana que abrió el dialogo hasta que este se cierre.
-
- -
-
resizable 
-
El usuario puede cambiar el tamaño de la ventana.
-
- -

Depurando una ventana

- -

Otra característica útil solo durante el desarrollo es activar el modo de depuración de una ventana. Para hacerlo, agrega un atributo debug con valor ‘true’ a la ventana. Esto hará que la ventana muestre los ‘box’ y los ‘spacers’ de forma que puedas ver lo que está ocurriendo. Este ejemplo muestra como usarlo.

- -
<window
-id="findfile-window"
-title="Find Files"
-debug="true"
-xmlns:html="http://www.w3.org/1999/xhtml"
-xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- -

La imagen de abajo muestra el efecto cuando se aplica a una ventana sencilla.

- -

 

- - - -

En la imagen, puede que notes algunas cajas (boxes) adicionales. Esto es debido a que cada elemento XUL está hecho de un número de cajas (boxes), definidas con XBL. Las puedes ignorar. Puedes especificar el atributo debug en cualquier caja, no solo en la ventana (window).

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/comandos/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/comandos/index.html deleted file mode 100644 index 561baa97ec..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/comandos/index.html +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: Comandos -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Comandos -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Commands ---- -

 

- -

Un comando es una operación o función que se puede invocar.

- -

El elemento comando

- -

El elemento command se usa para crear comandos los cuales pueden ser usados para llevar a cabo operaciones. Usted no necesitaría usar comandos, ya que usted puede invocar un script para manejar las cosas. Sin embargo, un comando tiene la ventaja de que puede ser deshabilitado automáticamente cuando se necesite y puede ser invocado externamente sin necesidad de saber de los detalles de su implementación. Los comandos son una manera adecuada de abstraer operaciones del código. Además los comandos son muy útiles para aplicaciones extensas.

- -

Para empezar, con el fin de implementar los comandos del menú portapapeles, cortar, copiar y pegar usted puede usar comandos. Si no usara comandos, usted necesitaría averiguar cual campo tiene el foco (focus), luego verificar para asegurarse que la operación es la adecuada para ese elemento. Además, los comandos del menú necesitarían ser habilitados y deshabilitados dependiendo de si el elemento enfocado haya seleccionado texto o no, y para las operaciones de pegar (paste), si hay algo adecuado en el portapapeles (clipboard) para pegar. Como puede ver, esto se vuelve complicado. Usando comandos, gran parte del trabajo es manejada para usted. Usted puede usar un comando para cualquier operación. Mozilla los usa para casi todos los comandos del menú. Ademas, campos de texto y otros accesorios tienen un número de comandos ya soportados y que usted puede invocar. Usted debería usarlos cuando la operación depende de cual elemento es enfocado.

- -

Un comando es identificado por su atributo id. Mozilla usa la convención de que el id del comando comience con 'cmd_'. Usted probablemente querrá usar el mismo id si un comando está siendo usado, sin embargo para sus comandos propios, usted puede usar cualquier id de comando que desee. Para evitar conflictos, usted puede desear incluir el nombre de la aplicación en el id del comando. Una manera simple de usar comandos es como sigue:

- -

 

- -

Ejemplo: un sólo comando

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<command id="cmd_openhelp" oncommand="alert('Ayuda!');"/>
-<button label="Ayuda" command="cmd_openhelp"/>
-
- -

En este ejemplo, en vez de colocar el atributo oncommand en el button, simplemente lo colocamos sobre un elemento command. Los dos son entonces enlazados usando el atributo command el cual tiene el valor del id del comando. El resultado es que cuando el botón es presionado, el comando: 'cmd_openhelp' es invocado.

- -


- Hay dos ventajas al usar ésta técnica:

- - - - - -

Adicionalmente:

- - - -

Ejemplo: toggling command disabled

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<command id="cmd_openhelp" oncommand="alert('Ayuda');"/>
-<button label="Ayuda" command="cmd_openhelp"/>
-<button label="Más ayuda" command="cmd_openhelp"/>
-
-<button label="Desactivado"
-        oncommand="document.getElementById('cmd_openhelp').setAttribute('disabled','true');"/>
-<button label="Activado"
-        oncommand="document.getElementById('cmd_openhelp').removeAttribute('disabled');"/>
-
- -

En este ejemplo, ambos botones usan el mismo comando. Cuando un botón deshabilitar es presionado, el comando es deshabilitado al colocar su atributo desactivado, y ambos botones serán deshabilitados también.

- -

Es normal colocar un grupo de comandos dentro de un elemento

- -

commandset, junto cerca del inicio del archivo XUL, tal como en el siguiente:

- -
<commandset>
-  <command id="cmd_open" oncommand="alert('Abrir!');"/>
-  <command id="cmd_help" oncommand="alert('Ayuda!');"/>
-</commandset>
-
- -

Un comando es invocado cuando el usuario activa el botón u otro elemento agregado al comando. Usted puede también invocar un comando al llamar el método doCommand cualquier elemento de lcomando o un elemento agregado al comando tal como un botón.

- -

Command Dispatching

- -

Es posible usar comandos sin el elemento comando elements, o al menos, sin añadir un atributo oncommand al comando. In this case, the command will not invoke a script directly, but instead, find an element or function which will handle the command. This function may be separate from the XUL itself, and might be handled internally by a widget. In order to find something to handle the command, XUL uses an object called a command dispatcher. This object locates a handler for a command. A handler for a command is called a controller. So, essentially, when a command is invoked, the command dispatcher locates a controller which can handle the command. You can think of the comando element as a type of controller for the command.

- -

The command dispatcher locates a controller by looking at the currently focused element to see if it has a controller which can handle the command. XUL elements have a controladores property which is used to check. You can use the controladores property to add your own controllers. You might use this to have a listbox respond to cut, copy and paste operations, for instance. An example of this will be provided later. By default, only textboxes have a controller that does anything. The textbox controller handles clipboard operations, selection, undo and redo as well as some editing operations. Note that an element may have multiple controllers, which will all be checked.

- -

If the currently focused element does not have a suitable controller, the window is checked next. The window also has a controladores property which you can modify if desired. If the focus is inside a frame, each frame leading to the top-level window is checked as as well. This means that commands will work even if the focus is inside a frame. This works well for a browser, since editing commands invoked from the main menu will work inside the content area. Note that HTML also has a commands and controller system although you can't use it on unprivileged web pages, but you may use it from, for example, a browser extension. If the window doesn't provide a controller capable of handling the command, nothing will happen.

- -

You can get the command dispatcher using the document's commandDispatcher property, or you can retrieve it from the controllers list on an element or a window. The command dispatcher contains methods for retrieving controllers for commands and for retrieving and modifying the focus.

- -

Añadiendo controladores

- -

You can implement your own controllers to respond to commands. You could even override the default handling of a command with careful placement of the controller. A controller is expected to implement four methods, which are listed below:

- -
-
supportsCommand (command) 
-
this method should return true if the controller supports a command. If you return false, the command is not handled and command dispatcher will look for another controller. A single controller may support multiple commands.
-
isCommandEnabled (command) 
-
this method should return true if the command is enabled, or false if it is disabled. Corresponding buttons will be disabled automatically.
-
doCommand (command) 
-
execute the command. This is where you would put the code to handle the command.
-
onEvent (event) 
-
this method handles an event.
-
- -
Ejemplo: implementación del controlador
- -

Let's assume that we want to implement a listbox that handles the delete command. When the user selects Delete from the menu, the listbox deletes the selected row. In this case, you just need to attach a controller to a listbox which will perform the action in its doCommand method.

- -

Try opening the example below (Código Ver en funcionamiento) in a browser window and selecting items from the list. You'll notice that the Delete command on the browser's Edit menu is enabled and that selecting it will delete a row. (See Discussion about opening this example). The example below isn't completely polished. Really, we should ensure that the selection and focus is adjusted appropriately after a deletion.

- -
<window id="controller-example" title="Ejemplo de controlador" onload="init();"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-<script>
-function init()
-{
-  var list = document.getElementById("laLista");
-
-  var listController = {
-    supportsCommand : function(cmd){ return (cmd == "cmd_delete"); },
-    isCommandEnabled : function(cmd){
-      if (cmd == "cmd_delete") return (list.selectedItem != null);
-      return false;
-    },
-    doCommand : function(cmd){
-      list.removeItemAt(list.selectedIndex);
-    },
-    onEvent : function(evt){ }
-  };
-
-  list.controllers.appendController(listController);
-}
-</script>
-
-<listbox id="laLista">
-  <listitem label="Ocean"/>
-  <listitem label="Desert"/>
-  <listitem label="Jungle"/>
-  <listitem label="Swamp"/>
-</listbox>
-
-</window>
-
- -

The controller (listController) implements the four methods described above. The supportsCommand method returns true for the 'cmd_delete' command, which is the name of the command used when the Delete menu item is selected. For other commands, false should be returned since the controller does not handle any other commands. If you wanted to handle more commands, check for them here, since you will often use a single controller for multiple related commands.

- -

The isCommandEnabled method returns true if the command should be enabled. In this case, we check if there is a selected item in the listbox and return true if there is. If there is no selection, false is returned. If you delete all the rows in the example, the Delete command will become disabled. You may have to click the listbox to update the menu in this simple example. The doCommand method will be called when the Delete menu item is selected, and this will cause the selected row in the listbox to be deleted. Nothing needs to happen for the onEvent method, so no code is added for this method.

- -

Override Default Controller

- -

We attach this controller to the listbox by calling the appendController method of the listbox's controladores. The el objeto controlador has a number of methods that may be used to manipulate the controllers. For instance, there is also an insertControllerAt method which inserts a controller into an element before other ones. This might be useful to override commands. For example, the following example will disable pasting into a textbox.

- -
var tboxController = {
-  supportsCommand : function(cmd){ return (cmd == "cmd_paste"); },
-  isCommandEnabled : function(cmd){ return false; },
-  doCommand : function(cmd){ },
-  onEvent : function(evt){ }
-};
-
-document.getElementById("tbox").controllers.insertControllerAt(0,tboxController);
-
- -

In this example, we insert the controller at index 0, which means before any others. The new controller supports the 'cmd_paste' command and always indicates that the command is disabled. The default textbox controller never gets called because the command dispatcher found the controller above to handle the command first.

- -

Seguimos con la actualización de comandos.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/controles_de_entrada/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/controles_de_entrada/index.html deleted file mode 100644 index 30cfc30cbc..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/controles_de_entrada/index.html +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Controles de entrada -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Controles_de_entrada -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Input_Controls ---- -

XUL tiene elementos que son similares a los controles de los formularios de HTML

-

Campos de Entrada de Texto

-

HTML tiene un elemento de entrada que puede ser usado para mandos de entrada de texto. XUL tiene un elemento similar, textbox, usado para campos de entrada de texto. Sin cualquier atributo, el elemento textbox crea una caja en la cual el usuario puede entrar en el texto. Textboxes aceptan muchos de los mismos atributos que mandos de entrada de HTML. Lo siguiente es algunos de ellos:

-

id

-

Un identificador único de modo que usted puede identificar el textbox.

-

class

-

La clase de estilo del textbox.

-

value

-

Si usted quiere que el textbox tenga un texto por defecto, suminístrelo del atributo de valor.

-

disabled

-

Si vale verdadero desactiva el componente.

-

type

-

Existen una serie de valores que cambian el comportamiento del textbox. Por ejemplo 'password' hace que lo escrito quede oculto y suele usarse para campos de contraseña.

-

maxlength

-

El número máximo de los carácteres a los cuales el textbox permite.

-

Note que mientras en HTML, varias clases diferentes de campos pueden ser creadas con el elemento de entrada, en XUL hay elementos separados para cada tipo. El ejemplo siguiente muestra algún textboxes:

-

Ejemplo

-
<label control="some-text" value="Enter some text"/>
-<textbox id="some-text"/>
-<label control="some-password" value="Enter a password"/>
-<textbox id="some-password" type="password" maxlength="8"/>
-
-

Los ejemplos textbox encima crearán las entradas de texto que sólo pueden ser usadas para entrar en una línea de texto. HTML también tiene un elemento textarea para crear una entrada de texto más grande el área. En XUL, usted puede usar el elemento textbox por esta razón también - dos elementos separados no son necesarios. Si usted pone el atributo de multilínea a verdadero, el campo de entrada de texto mostrará filas de mutliple.

-

Ejemplo

-

Código Ver en funcionamiento

-
<textbox multiline="true"
-           value="Esto es un texto que podría ser ajustado en multiples líneas."/>
-
-

Similar al elemnento HTML textarea, puedes usar los tributos rows y cols para seleccionar el tamaño. Esto debería seleccionar el nñumero de filas y columnas de caracteres a mostrar.

-
-

Vamos a añadir un campo de entrada de busqueda para el dialogo buscar archivo. Usaremos el elemento textbox.

-
<label value="Buscar por:" control="find-text"/>
-<textbox id="find-text"/>
-
-<button id="find-button" label="Find"/>
-
-

Añade estas líneas antes de los botones que creamos en la última sección. Si abres esta ventana, verás algo parecido a lo que se muestra en la imagen siguiente.

-

Image:inputs1.jpg

-

Nota que la etiqueta y el campo de entrada de texto ahora aparecen en la ventana. La caja de etxto es completamente funcional y puedes teclear dentro y seleccionar texto. Nota que el atributo de control tiene que estar siendo usado con la caja de texto seleccionada cuando la etiqueta se pulsa.

-
-

Cajas de Chekeo y Botones de Radio

-

Dos elementos adicionales son usados para crear las cajas de chekeo y los botones de radio. Son variaciones de botones. Las cajas de checkeo se usan para opciones que pueden ser habilitadas o desabilitadas. Los Botones de Radio pueden usarse para propositos similares cuando dentro de un grupo de elementos solo podemos seleccionar uno.

-

La mayoría de los atributos de las cajas de checkeo y los botones de radio coinciden con los de los botones. El ejemplo siguiente muestra algunas cajas de checkeo y botones de radio simples.

-
<checkbox id="case-sensitive" checked="true" label="Case sensitive"/>
-<radio id="orange" label="Orange"/>
-<radio id="violet" selected="true" label="Violet"/>
-<radio id="yellow" label="Yellow"/>
-
-

La primera línea crea una caja de checkeo simple. Cuando el usuario hace click en la aja de checkeo, esta cambia entre checkeada y no checkeada. El atributo checked puede usarse para indicar el estado por defecto. Puedes seleccionarlo como true o false. El atributo etiqueta puede usarse para asignar una etiqueta que aparezca despues de la caja de chekeo. Para los botones de radio, deberías usar el atributo selected en lugar del atributo checked. Seleccionalo a true para tener un botón de radio seleccionado por defecto, o dejalo para otros botones de radio.

-

Para que un grupo de botones de radio trabajen junto, necesitas usar el elemento radiogroup. Solo uno de los botones de radio en un grupo de botones de radio puede estar seleccionado. Pulsando en uno desactivaras el resto de los botones de radio en el mismo grupo. El siguiente ejemplo demuestra esto.

-

Ejemplo

-

Código Ver en funcionamiento

-
<radiogroup>
-  <radio id="orange" label="Orange"/>
-  <radio id="violet" selected="true" label="Violet"/>
-  <radio id="yellow" label="Yellow"/>
-</radiogroup>
-
-

Como los botones, la cajas de checkeo y los botones de radio estan hechos de una etiqueta y una imagen, donde la imagen cambia entre checkeado y no checkeado cuando se pulsa. Las cajas de checkeo tienen la muchos de los atributos de los botones:

-
-
- label 
-
- La etiqueta de las cajas de checkeo o botones de radio.
-
- disabled 
-
- Seleecciona entre true or false para habilitar o deshabilitar una caja de checkeo o botón de radio.
-
- accesskey 
-
- Las teclas de acceso rápido pueden usarse para seleccionar el elemento. La letra especificada es normalmente subrallada en la etiqueta.
-
-

Llevando el ejemplo Burcar Archivos más lejos

-

Código Ver en funcionamiento

-

En la siguiente sección, veremos algunos elementos para crear cajas de listas.

-

Categorías

-

links interwikis

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/controles_de_listas/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/controles_de_listas/index.html deleted file mode 100644 index 53a621b470..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/controles_de_listas/index.html +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: Controles de listas -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Controles_de_listas -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/List_Controls ---- -

XUL tiene una cantidad de tipos de elementos para la cración de cajas de listas.

- -

Cajas de listas

- -

Una caja de listas de usa para mostrar un número de elementos en una lista. El usuario puede seleccionar un elemento de la lista.

- -

XUL provee dos tipos de elementos para crear listas, un elemento listbox para crear cajas de listas de multiples filas, y un elemento menulist para crear listas desplegables. Trabajan de forma muy similar al elemento de HTML select, el cual permite embas funciones, pero los elementos XUL tienes caracteristicas adicionales.

- -

La caja de listas más simple usa el elemento listbox para su propia caja, y el elemento listitem para cada elemento. Por ejemplo, esta lista tendrá cuatro filas, una por cada elemento.

- -

Ejemplo 1 Código Ver en funcionamiento

- -
<listbox>
-  <listitem label="Butter Pecan"/>
-  <listitem label="Chocolate Chip"/>
-  <listitem label="Raspberry Ripple"/>
-  <listitem label="Squash Swirl"/>
-</listbox>
-
- -

Image:lists1.jpg

- -

Similar al elemento HTML option, Puedes asignar un valor para cada elemento usando el atributo value. Puedes entonces usar el valor en un script. La caja de listas tendrá por defecto el tamaño de las filas de la lista, pero puedes controlar el tamaño con el atributo rows. Seleccionando el número de rows a mostrar en la caja de lista. Una barra de desplazamiento aparecerá para mostrar al usuario las filas adicionales.

- -

El siguiente ejemplo demuestra estas características adicionales:

- -

Ejemplo 2 Código Ver en funcionamiento

- -
<listbox rows="3">
-  <listitem label="Butter Pecan" value="bpecan"/>
-  <listitem label="Chocolate Chip" value="chocchip"/>
-  <listitem label="Raspberry Ripple" value="raspripple"/>
-  <listitem label="Squash Swirl" value="squash"/>
-</listbox>
-
- -

El ejemplo fue cambiado para mostrar sólo 3 filas a la vez. Los valores se han añadido a los elementos de la lista. Las cajas de listas tienen algunas características adicionales, las cuales se describirán más adelante.

- -

Cajas de lista multi-columna

- -

Las cajas de listas tambien soportan multiples columnas. Cada celda puede tener un contenido arbitrario dentro, aunque generalmente sólo se usa texto. Cuando el usuario selecciona un elemento de la lista, la fila entera se selecciona. No tendrás una sola celda seleccionada.

- -

Se usan dos campos para especificar las columnas en la caja de listas. El elemento listcols se usa para mantener la información de la columna, cada una de las cuales se especifica usando un elemento listcol . Necesitas un elemento listcol para cada columna en la caja de listas.

- -

Las cajas de lista no poseen un equivalente al elemento rows de las grillas. De hecho, hay un equivalente, pero es creado y puesto en la caja de lista automáticamente. También está oculto para que no se sepa que está allí.

- -

El elemento listcell (celda de lista) puede ser utilizado para cada celda en una fila. Si se quiere tener tres columnas, se necesita adicionar tres elementos listcell dentro de cada listitem. Para especificar el texto contenido en una celda debe colocarse dentro del elemento un atributo label. Para el simple caso donde hay una sola columna, también puede ponerse los atributos label directamente en los elementos listitem (ítem de lista) correspondientes y no utilizar elementos listcell, como se muestra en el siguente ejemplo.

- -

(Cuando el usuario selecciona un item, toda la fila es seleccionada. No es posible seleccionar una celda individualmente.)

- -

El siguiente ejemplo es de una caja de lista con dos columnas y tres filas:

- -

Ejemplo 3

- -
<listbox>
- <listcols>
-   <listcol flex="1"/>
-   <listcol flex="2"/>
- </listcols>
- <listitem>
-   <listcell label="Jorge"/>
-   <listcell label="Pintor de casas"/>
- </listitem>
- <listitem>
-   <listcell label="María Elena"/>
-   <listcell label="Fabricante de velas"/>
- </listitem>
- <listitem>
-   <listcell label="Rogelio"/>
-   <listcell label="Matón"/>
- </listitem>
-</listbox>
-
- -

Esta caja de lista posee dos columnas, siendo la segunda el doble de flexible que la primera. Si se reduce el tamaño horizontalmente, las etiquetas en las celdas se recortarán automáticamente. Como con otros elementos, puede utilizarse el atributo crop en las celdas o en los ítems para controlar el recorte.

- -

Filas de encabezado

- -

Las cajas de lista también permiten la utilización de una fila especial, la fila encabezado. Es muy parecida a una fila regular excepto que se la muestra de manera distinta. Puede ser aprovechada para crear encabezados en las columnas. Se utilizan dos elementos.

- -

El elemento cabeza de lista (listhead) se usa para las filas de encabezado, al igual que el elemento listitem se utiliza para filas comunes. Sin embargo la fila de encabezado no es una fila normal, por lo que si se usara un guión para obtener la primer fila en una caja de lista, la fila de encabezado no sería tenida en cuenta.

- -

El elemento listheader (encabezado de lista) indica cada celda en la fila de encabezado. Para indicar el texto dentro de la celda de encabezado se utiliza el atributo label

- -

Este sería el ejemplo anterior pero con una fila de encabezado:

- -

Ejemplo 4

- -
<listbox>
- <listhead>
-   <listheader label="Nombre"/>
-   <listheader label="Ocupación"/>
- </listhead>
- <listcols>
-   <listcol flex="1"/>
-   <listcol flex="2"/>
- </listcols>
- <listitem>
-   <listcell label="Jorge"/>
-   <listcell label="Pintor de casas"/>
- </listitem>
- <listitem>
-   <listcell label="María Elena"/>
-   <listcell label="Fabricante de velas"/>
- </listitem>
- <listitem>
-   <listcell label="Rogelio"/>
-   <listcell label="Matón"/>
- </listitem>
-</listbox>
-
- -

En este ejemplo, el atributo flex se usa para hacer la columna flexible. Este atributo será descrito en una sección posterior, pero aqui permite que la columna rellene todo el espacio horizontal disponible. Puedes redimensionar la ventana para ver que la columna se estrecha cuando la ventana lo hace. Si cortas el tamaño horizontalmente, las etiquetas de las celdas se cortarán automáticamente usando una elipsis. Puedes usar el atributo crop en las celdas o elementos seleccionados con el valor none para deshablitar la elipsis.

- -

Listas desplegables

- -

Las listas desplegables se crean en HTML usando el elemento select . El usuario puede ver una sola elección en una caja de texto y hacer click en la flecha o algo similar como un botón pegado a la caja de texto para realizar una selección diferente. Las otras opciones aparecerán en una ventana emergente. XUL tiene un elemento [[XUL:Elemento#menulista|lista de menú}} que puede usarse para este proposito. Consiste en una caja de texto con un btón adjunto. El nombre se eligió porque muestra un menu emergente con las opciones en el.

- -

Se necesitan tres elementos para describir una lista desplegable. El primero es el elemento menulist , que crea la caja de texto con el botón adjunto. El segundo, menupopup, crea la ventana de menu emergente que aparecerá cuando el botón sea pulsado. El tercero, menuitem, crea cada opción individual.

- -

Su sintaxis se describe mejor con el siguiente ejemplo:

- -

Ejemplo 5 Código Ver en funcionamiento

- -
Image:inputs2.png
- -
<menulist label="Bus">
-  <menupopup>
-    <menuitem label="Coche"/>
-    <menuitem label="Taxi"/>
-    <menuitem label="Bus" selected="true"/>
-    <menuitem label="Tren"/>
-  </menupopup>
-</menulist>
-
- -

Esta lista de menu contiene cuatro opciones, una por cada elemento menuitem . Para mostrar las opciones, haz click en el botón de flecha en la lista de menu. Cuando se seleccione uno, este aparecerá como la opción en la lista de menu. El atributo selected se usa para indicar el valor que tendrá la selección por defecto.

- -

Lista de menú editable

- -

Por defecto, solo puedes seleccionar opciones de la lista. No puedes introducir tu propio texto tecleandolo dentro. Una variante del menulist permite editar el texto dentro del campo. Por ejemplo, el campo URL en el navegador tiene una lista desplegable para seleccionar URLs tecleadas anteriormente, pero puedes teclaearla tu mismo.

- -

Para clear un menulist editable, añada el atributo editable como sigue: Ejemplo 6 Código Ver en funcionamiento

- -
<menulist editable="true">
-  <menupopup>
-    <menuitem label="www.mozilla.org"/>
-    <menuitem label="www.xulplanet.com"/>
-    <menuitem label="www.dmoz.org"/>
-  </menupopup>
-</menulist>
-
- -

El campo URL creado aqui tiene tres opciones predefinidas que el usuario puede seleccionar o puede introducir una propia escribiendo en el campo. El texto que el usuario introduzca no se añadirá como nueva opción. Porque el atributo label no se usa en este ejemplo, el valor por defecto será en blanco.

- -
-

« AnteriorSiguiente »

-
- -

Categorías

- -

links interwikis

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/creando_un_asistente/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/creando_un_asistente/index.html deleted file mode 100644 index e448d38424..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/creando_un_asistente/index.html +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Crear un asistente -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Creando_un_asistente -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - para_revisar -translation_of: Archive/Mozilla/XUL/Tutorial/Creating_a_Wizard ---- -

Muchas aplicaciones usan un asistente para ayudar al usuario a realizar tareas complicadas. XUL proporciona una forma de crear fácilmente un asistente.

- -

El asistente

- -

Un asistente es un tipo especial de diálogo que contiene una serie de páginas. Los botones de navegación entre páginas aparecen en la parte inferior del diálogo. Los asistentes se utilizan habitualmente para ayudar al usuario en la realización de tareas complejas. Cada página contiene una única cuestión o varias preguntas relacionadas. Después de la última página, se lleva a cabo la operación.

- -

XUL proporciona un elemento wizard que permite crear asistentes. Los atributos colocados en el asistente se usan para controlar la navegación de éste. Al crear un asistente se usa la etiqueta wizard en lugar de la etiqueta window.

- -

El contenido del elemento wizard incluye el contenido de cada página del asistente. Las páginas del asistente se crean mediante el elemento wizardpage. Puedes colocar cualquier contenido que desees dentro de cada wizardpage.

- -
Ten en cuenta que actualmente los asistentes solo funcionan adecuadamente desde URLs chrome.
- -

El asistente consta de varias secciones y, por supuesto, el diseño  del asistente puede variar según el sistema operativo de cada plataforma. El asistente se mostrará generalmente con el aspecto de la plataforma del usuario. El aspecto típico incluirá un título en la parte superior, un grupo de botones de navegación en la parte inferior y el contenido de la página en medio de ambos.

- -

El título a lo largo de la parte superior se crea usando el atributo title, muy parecido al que podría usarse para una ventana normal. Los botones de navegación son creados automáticamente. 

- -

Un ejemplo de asistente

- -

Código Ver en funcionamiento

- -
<?xml version="1.0"?>
-
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<wizard id="example-window" title="Select a Dog Wizard"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <wizardpage>
-    <description>
-      Esta asistente le ayudará a seleccionar el tipo de perro que más le conviene."
-    </description>
-    <label value="¿Por qué quiere un perro?"/>
-    <menulist>
-      <menupopup>
-        <menuitem label="Para que la gente se vaya"/>
-        <menuitem label="Para que asuste a un gato"/>
-        <menuitem label="Necesito un buen amigo"/>
-      </menupopup>
-    </menulist>
-  </wizardpage>
-
-  <wizardpage description="Detalles del perro">
-    <label value="Proporcione detalles adicionales sobre el perro que le gustaría:"/>
-    <radiogroup>
-      <caption label="Tamaño"/>
-      <radio value="small" label="Pequeño"/>
-      <radio value="large" label="Grande"/>
-    </radiogroup>
-    <radiogroup>
-      <caption label="Género"/>
-      <radio value="male" label="Macho"/>
-      <radio value="female" label="Hembra"/>
-    </radiogroup>
-  </wizardpage>
-
-</wizard>
-
- -
-
Image:wizard1.jpg
-
- -

El asistente tiene dos páginas, una que tiene un menú desplegable y la otra botones redondos. El asistente será formateado automáticamente, con un título en la parte de arriba y botones en la parte de abajo. El usuario puede navegar entre las páginas con los botones de 'Anterior' (Back) y 'Posterior' (Next). Estos botones se activan y desactivan ellos mismos cuando es necesario. En la última página, además de estos anteriores, aparecerá el botón de Terminar/Finalizar. Todo esto es automático, no hay que hacer nada para manipular las páginas.

- -

El atributo description puede ser opcionalmente colocado en un elemento wizardpage a fin de proporcionar un subtítulo para esa página. En el ejemplo anterior, está puesto en la segunda página, pero no en la primera.

- -

Gestión de los cambios en las página

- -

Generalmente, desearás que se haga algo una vez se presione el botón Finalizar. Se puede definir un atributo onwizardfinish, dentro del elemento wizard para que sea así. Colócalo en un script que realice cualquier tarea que desees y que después devuelva 'true'. Este script se puede usar para guardar la información que incluye el usuario durante el asistente. Por ejemplo:

- -
<wizard id="example-window" title="Select a Dog Wizard"
-  onwizardfinish="return saveDogInfo();"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- -

Cuando el usuario haga clic sobre el botón Finalizar, es llamada la función saveDogInfo(), la cual se definirá en un archivo de script para guardar la información que se ha incluido. Si la función devuelve 'true', el asistente se cierra. Si devuelve 'false', entonces el asistente no se cerrará, lo que suele ocurrir, por ejemplo, si la función saveDogInfo() encuentra una entrada que no es válida.

- -

Existen otros atributos relacionados onwizardback, onwizardnext y onwizardcancel, que son llamados cuando los botones Volver, Siguiente y Cancelar son presionados respectivamente. Estas funciones son llamadas sin considerar qué página se está mostrando actualmente.

- -

Para llamar un código diferente dependiendo de qué página se encuentra el usuario, se utilizan los atributos onpagerewound o onpageadvanced en un elemento wizardpage. Funcionan de manera parecida a las otras funciones con la excepción que se puede usar código diferente en cada página. Esto te permite validar la información incluida en cada página antes de que continúe el usuario.

- -

Un tercer método consiste en usar los atributos onpagehide y onpageshow en el elemento wizardpage. Estos se llamarán cuando la página se oculte o se muestre, independientemente de qué botón se pulse (excepto cuando se presiona Cancel: tienes que usar onwizardcancel para comprobarlo).

- -

Estos tres métodos deberían proporcionar suficiente flexibilidad para gestionar la navegación tanto como necesites. La siguiente tabla es un resumen  de las funciones de los atributos que se llaman cuando el usuario pulsa Siguiente ('Next'), en el orden en que son comprobados. En el momento en que uno devuelva false, se cancelará la navegación.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoEtiquetaLlamada
pagehidewizardpageLlamada a la página que el usuario esta dejando.
pageadvancedwizardpageLlamada a la página que el usuario esta dejando.
wizardnextwizardLlamado en el asitente.
pageshowwizardpageLlamada a la página que el usuario esta entrando.
- -

Un proceso similar ocurre para el botón Volver.

- -
Siempre que trates de usar una función en el evento anterior, como con pageadvanced, deberías usar -

return funcName() en lugar de solo la llamada funcName()o no funcionará como se espera, por ejemplo

- -
 <wizardpage pageadvanced='return funcName()'></wizardpage></code>
-
-
- -


-

-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/creando_un_instalador/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/creando_un_instalador/index.html deleted file mode 100644 index 031f186435..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/creando_un_instalador/index.html +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: Creando un instalador -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Creando_un_instalador -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Creating_an_Installer ---- -

 

- -

Esta sección describe como empaquetar una aplicación de XUL en un instalador.

- -

Paquetes de XPInstall

- -

Mozilla proporciona un mecanismo que se puede utilizar para empaquetar ventanas de XUL, scripts, skins y otros archivos en un solo instalador. Usted puede colocar este instalador en alguna parte para que los usuarios la puedan descargar. Un script simple puede ser usado para tener descargado el paquete e instalarlo. Este mecanismo se llama XPInstall (plataforma cruzada de instalación).

- -

Los instaladores de XPInstall se empaquetan en archivos JAR. Dentro del archivo JAR, usted puede agregar todos los archivos que usted desea haber instalado. Además, los instaladores deben contener un script de instalación (un archivo llamado install.js) que se pueda utilizar para escribir el proceso de la instalación. Este script tiene acceso a varias funciones de instalación que se pueden utilizar para instalar archivos y componentes.

- -

Los instaladores del archivo JAR tienen típicamente la extensión .xpi (se pronuncia zippy) para distinguirlos de otros archivos. Los instaladores serán utilizados generalmente para instalar los componentes de Mozilla tales como skins nuevos, plugins y nuevos paquetes.Texto de Código

- -

Hay varios pasos implicados en abrir un instalador e instalar los componentes. Éstos se describen gradualmente abajo.

- -
    -
  1. Crea una pagina web desde la cual el usuario pueda descargar el software que se instalará. Esta página contendrá un ‘disparador de la instalación’ que es una pequeña parte del script que abre la instalación.
  2. -
  3. Se le presenta al usuario un diálogo indicando que el paquete está siendo instalado. Es posible que el ‘disparador de la instalación’ abra múltiples instaladores. En este caso, serán presentados en una lista. El usuario puede elegir continuar o cancelar.
  4. -
  5. Si el usuario elige continuar, se descargará el instalador del archivo XPI. Una barra de progreso se exhibe al usuario durante este proceso.
  6. -
  7. El archivo install.js es extraído del archivo de la instalación y se ejecutara. Este script abrirá las funciones del instalador que indicarán qué partes del archivo deben ser instalados.
  8. -
  9. Una vez que el script esté completo, el nuevo paquete ya habrá sido instalado. Si los paquetes múltiples están siendo instalados, sus scripts funcionarán en secuencia.
  10. -
- -

Disparadores (triggers) de instalación

- -

Según lo indicado arriba, el proceso de la instalación es empezado por un ‘disparador de instalación’. Esto implica el uso del objeto global especial InstallTrigger. Este contiene varios métodos que se pueden utilizar para comenzar una instalación. Usted puede utilizar este objeto en el contenido local o remoto, significando que es conveniente para una descarga directa del sitio web.

- -

Vamos a crear un ejemplo de un disparador de instalación. Esto involucra el uso de la función InstallTrigger.install. Esta función tiene dos parámetros, el primero es una lista de los paquetes a instalar, y el segundo es una función de rellamada que será usada cuando la instalación se complete. Aquí está un ejemplo:

- -
function doneFn ( name , result ){
-  alert("The package " + name + " was installed with a result of " + result);}
-
-var xpi = new Object();
-xpi["Calendar"] = "calendar.xpi";
-InstallTrigger.install(xpi,doneFn);
-
- -

Primero, definimos una función de rellamada doneFn que será ejecutada cuando la instalación se complete. Usted puede nombrar la función como prefiera. Esta función tiene dos parámetros. El primero es el nombre del paquete que acaba de ser instalado. Esto es importante si usted está instalando múltiples componentes. El segundo es un código de resultado. Si el resultado es 0, la instalación terminó con éxito. Si el resultado no es cero, quiere decir que hubo un error y el valor es el código del error. La función doneFn solo mostrará un mensaje de alerta al usuario.

- -

Después, creamos un vector xpi que contendrá el nombre (calendario) y URL (calendar.xpi) del instalador. Usted puede agregar una línea similar para cada paquete que desee instalar. Finalmente, ejecutamos la función de instalación.

- -

Cuando esta sección del script se ejecute, el archivo calendar.xpi será instalado.

- -
-

Vamos intentar esto con el diálogo de búsqueda de archivos.

- -
function doneFn ( name , result ){
-  if (result) alert("An error occured: " + result);
-}
-
-var xpi = new Object();
-xpi["Find Files"] = "findfile.xpi";
-InstallTrigger.install(xpi,doneFn);
-
-
- -

El archivo de XPI

- -

Se requiere que el archivo XPI contenga un archivo llamado install.js que es un archivo JavaScript que se ejecuta durante la instalación. Los archivos restantes son los archivos que se instalarán. Estos archivos típicamente están colocados dentro de un directorio dentro del archivo pero no es obligatorio. Los archivos cromo (chrome), deben estar estructurados como el directorio chrome.

- -

A menudo, los únicos archivos colocados en un archivo XPI serán el script de instalación (install.js) y un archivo JAR. Este archivo JAR contiene todos los archivos usados por la aplicación. Los componentes proporcionados con Mozilla se almacenan de esta manera.

- -

Debido a que el archivo XPI es un archivo tipo ZIP, usted puede crear y agregar archivos usando una aplicación que manipule estos archivos.

- -

Para el diálogo de búsqueda de archivos, crearemos una estructura en el archivo como el siguiente:

- -
-
install.js
-findfile
-  content
-    contents.rdf
-    findfile.xul
-    findfile.js
-  skin
-    contents.rdf
-    findfile.css
-  locale
-    contents.rdf
-    findfile.dtd
-
-
- -

Se ha agregado un directorio para cada parte del paquete, del contenido, del skin y del ‘locale’. Los archivos contents.rdf también se han agregado porque serán necesarios para registrar los archivos 'chrome'.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/creando_una_ventana/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/creando_una_ventana/index.html deleted file mode 100644 index d751c77611..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/creando_una_ventana/index.html +++ /dev/null @@ -1,105 +0,0 @@ ---- -title: Creando una ventana -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Creando_una_ventana -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Creating_a_Window ---- -
-

« AnteriorSiguiente »

-
- -

Creando un archivo XUL

- -

Un archivo XUL puede tener cualquier nombre, pero debería tener una extensión .xul. El archivo XUL más simple tiene la siguiente estructura:

- -
<?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">
-<!-- Otros elementos irán aquí -->
-</window>
-
- -

Esta ventana no hará nada, ya que no contiene ningún elemento UI (Interfaz de Usuario), éstos serán añadidos en la siguiente sección. A continuación veremos línea por línea el código de arriba:

- -
    -
  1. <?xml version="1.0"?>
    - Esta línea simplemente define que éste es un archivo XML, normalmente deberíamos añadir esta línea al inicio de cada fichero xul, al igual que pondríamos la etiqueta HTML al principio de un archivo HTML.
  2. -
  3. <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
    - Esta línea se usa para especificar la hoja de estilos a utilizar por el archivo, y es la sintaxis que los ficheros XML utilizan para importar hojas de estilo. En este caso, nosotros importaremos los estilos ubicados en el apartado global de un paquete de temas. No especificaremos ningún fichero así Mozilla determinará que ficheros del directorio utilizar. En este caso, el todo-importante fichero global.css es seleccionado. Este fichero contiene todas las declaraciones por defecto para todos los elementos XUL. Como XML no sabe cuantos elementos debe visualizar, el fichero lo indica. Generalmente, deberemos poner esta línea en la parte superior de cada archivo XUL. También podemos importar otra hoja de estilos utilizando una sintaxis parecida. Normalmente importamos la hoja de estilo global desde dentro de nuestro archivo de estilos.
  4. -
  5. <window
    - Esta línea declara que estamos describiendo una window. Cada ventana de la interfaz de usuario es descrita en un fichero por separado. Esta etiqueta es parecida a la etiqueta BODY en HTML que engloba todo el contenido. Los atributos de la ventana serán colocados aquí, en este caso hay cuatro. En el ejemplo cada atributo es colocado en una línea distinta pero esto no debe ser hacer necesariamente.
  6. -
  7. id="findfile-window"
    - El atributo id es usado como un identificador, de esta manera la ventana puede ser llamada desde scripts. Usualmente colocarás el atributo id a todos los elementos. El nombre lo eliges tú.
  8. -
  9. title="Find Files"
    - Este atributo muestra el texto que aparecerá en la barra de títulos cuando se muestre la ventana. En el ejemplo aparecerá "Find Files".
  10. -
  11. orient="horizontal"
    - Este atributo indica el orden de los ítems dentro de la ventana. El valor horizontal indica que los ítems serán colocados a través de la ventana. También puedes usar el valor vertical que ordenará los ítems en una columna. Este es el valor por defecto, asi que tal vez desees no utilizar este atributo si deseas mostrar los datos en columnas.
  12. -
  13. xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
    - Esta línea declara el nombre para XUL, que deberías colocar dentro de la etiqueta window para indicar que todo eso es XUL. Esta dirección no será descargada, Mozilla la reconocerá internamente.
  14. -
  15. <!-- Otros elementos van aquí -->
    - Escribe en este bloque otros elementos (botones, menúes, y otros componentes de interfaz) que aparecen en la ventana. Pondremos algo de eso en el siguiente tomo de la sección..
  16. -
  17. </window>
    - Finalmente, debemos cerrar la etiqueta al final del fichero.
  18. -
- -

Abriendo una ventana

- -

Al fin de abrir una ventana XUL, varios métodos son aplicables. Si se está solo en el estado del desarrollo, se puede escribir la URL (empezando con chrome:, file: o cualquier otro tipo de URL) en la barra de dirección de Mozilla. También se puede hacer doble clic sobre el archivo en la pantalla 'Abrir archivo', suponiendo que los archivos XUL están asociados a Mozilla. La ventana XUL aparecerá en la ventana del navegador en lugar de en una nueva ventana, pero suele ser suficiente durante los principios del desarrollo.

- -

El camino correcto, naturalmente, es de abrir la ventana utilizando a JavaScript. No es necesaria una sintaxis nueva se puede usar la función window.open() igual que para los documentos HTML. Aún así, una opción adicional, llamada 'chrome' es necesaria para indicar al navegador que el documento a abrir es chrome. Ésta se abrirá sin barra de herramientas, ni menúes o cualquier otra cosa de las que suele tener de normal un navegador. La sintaxis se describe a continuación:

- -
window.open(url,windowname,flags);
-
-donde el argumento 'flags' contiene "chrome" como en este ejemplo:
-
-window.open("chrome://navigator/content/navigator.xul", "bmarks", "chrome,width=600,height=300");
-
- -
-
Nuestro ejemplo de búsqueda
- -

Empezaremos por crear el archivo básico para el dialogo de búsqueda. Lo llamaremos 'findfile.xul' y lo pondremos en el directorio especificado en el archivo 'findfile.manifest' (el cual hemos creado en la sección anterior). Ponerle la plantilla mostrada arriba de esta página y guardarlo.

-
- -

Podemos usar el parámetro en línea de comando '-chrome' para especificar que archivo XUL tendrá que abrir Mozilla al empezar. Si no se ha especificado, la ventana por defecto será abierta (habitualmente la ventana del navegador). Por ejemplo, podríamos abrir el dialogo de búsqueda con una de las siguientes órdenes:

- -
mozilla -chrome chrome://findfile/content/findfile.xul
-
-mozilla -chrome resource:/chrome/findfile/content/findfile.xul
-
- -

Si utilizamos esta orden en línea (suponiendo que se pueda hacer en nuestra plataforma), el dialogo de búsqueda de archivo será abierto por defecto en lugar de la ventana de Mozilla. Pero como no hemos puesto ningún elemento gráfico, no la veremos. Colocaremos algunos elementos en la sección siguiente.

- -

Para ver aún así el efecto, lo siguiente abrirá la ventana de marcadores:

- -
Para Mozilla
-mozilla -chrome chrome://communicator/content/bookma...rksManager.xul
-
-Para Firefox
-firefox -chrome chrome://browser/content/bookmarks/b...rksManager.xul
-
- -

El argumento '-chrome' no da al archivo ningún privilegio adicional. En su lugar, causa que el archivo especificado se abra como una ventana en el nivel superior sin ningun atributo del browser chrome, como el campo de direcciones o menus. Solo las URLs chrome tienen privilegios adicionales.

- -
Para escribir y ver inmediatamente los resultados en Mozilla, puede probar con este editor XUL.
- -

Problemas

- - - -
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/detalles_de_vistas_de_un_\303\241rbol/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/detalles_de_vistas_de_un_\303\241rbol/index.html" deleted file mode 100644 index 060dd9e5f9..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/detalles_de_vistas_de_un_\303\241rbol/index.html" +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Detalles de Vistas de un árbol -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Detalles_de_Vistas_de_un_árbol -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Tree_View_Details ---- -

 

-

Además del contenido estático y RDF, los árboles pueden obtener su contenido de una vista personalizada.

-

Creando una vista detallada o personalizada

-

Hasta ahora hemos visto dos formas de definir el contenido de un árbol. Podemos poner filas y celdas estáticas dentro de un árbol o usar una fuente de datos RDF. El primer método funciona bíen siempre y cuando solo se traten de unos pocos datos. Usar una fuente de datos es adecuado cuando hay una disponible, ya sea una proporcionada con Mozilla o una creada por nosotros mismos. En algunos casos, podemos querer guardar datos en algún otro formato o realizar operaciones en ellos. XUL provee un tercer método, el cual requiere la creación de una vista personalizada con un guión.

-

Este método puede ser usado para contener datos para cientos o miles de filas, que el árbol puede mostrar instantaneamente. Para ello implementamos un árbol como hasta ahora pero dejamos el elemento treechildren vacio. El siguiente ejemplo muestra como hacerlo:

-
<tree id="miArbol" flex="1">
-  <treecols>
-    <treecol id="colNombre" label="Nombre" flex="1"/>
-    <treecol id="colFecha" label="Fecha" flex="1"/>
-  </treecols>
-  <treechildren/>
-</tree>
-
-

Para asignar datos y que sean mostrados en el árbol, debemos crear un objecto guión que será usado para indicar que valor toma cada celda, el número total de filas y alguna otra información adicional. El objeto de guión estará asignado al árbol. El árbol llamará a los métodos del objeto para obtener la información que necesita mostrar.

-

El objeto guión, llamado vista de árbol, soporta más o menos treinta métodos que puedes implementar para suministrar información acerca de los contenidos del árbol y su apariencia, pero solo tendremos que implementar una pequeña parte de ellos. Algunos métodos que deberemos implementar son:

-
   * rowCount
-
-

Esta propiedad deberá contener el número de líneas que queremos mostrar en el árbol.

-
   * getCellText( fila, columna )
-
-

Este método devuelve el contenido de una celda, especificada mediante los paramentros ‘fila’ y ‘columna’. Será llamada para mostrar los datos de cada celda. Las filas pasadas como paramentro es un número contando desde 0. Las columnas en cambio son los valores del atributo id definido en las columnas del árbol.

-
   * setTree( arbol )
-
-

Este método es llamado una sola vez para vincular el elemento árbol con la vista. Esto nos permite utilizar la misma vista con distintos árboles.

-

Aquí mostramos un ejemplo de como definir el objeto, el cual puede tener el nombre que deseemos.

-
var vistaArbol = {
-    rowCount : 10000,
-    getCellText : function(fila, columna) {
-      if (columna=="colNombre") return "Fila "+row;
-      else return "18 de Febrero";
-    },
-    setTree: function(arbol){ this.treebox=arbol; },
-    isContainer: function(fila){ return false; },
-    isSeparator: function(fila){ return false; },
-    isSorted: function(fila){ return false; },
-    getLevel: function(fila){ return 0; },
-    getImageSrc: function(fila,columna){ return null; },
-    getRowProperties: function(fila,props){},
-    getCellProperties: function(fila,columna,props){},
-    getColumnProperties: function(idColumna,columna,props){}
-};
-
-

Las funciones de este ejemplo que no han sido descritas anteriormente, no necesitan realizar ninguna acción, pero si deben estar declaradas, ya que el árbol las llamará para intentar conseguir información adicional.

-

Este ejemplo puede usarse para mostrar un arbol con 10.000 filas. El contenido de las celdas en la primera columna contendrán el texto ‘Fila X’, donde X es el número de fila. En la segunda columna todas las celdas contendrán el texto con la fecha ‘18 de Febrero’. La condición if de la función getCellText() compara el parametro columna con el texto ‘colNombre’. Este texto corresponde al id de la primera columna en la definición del árbol del ejemplo anterior. Por supuesto que este ejemplo es muy simple, en realidad deberíamos tener datos mucho más complejos en cada celda.

-

El último paso es asociar el objeto vista con el árbol. El árbol tiene una propiedad llamada view, la cual puede ser asignada al objeto vista declarado anteriormente. Podremos asignarle un valor a esta propiedad en cualquier momento para poner o cambiar una vista.

-
function ponerVista() {
-    document.getElementById('miArbol').view = vistaArbol;
-}
-
-

A continuación se incluye el ejemplo completo. Un guión incrustado ha sido usado aquí para simplificar el ejemplo. No obstante, normalmente pondremos los guiones en ficheros separados.

-

Ejemplo 7.6.1

-
<?xml version="1.0"?>
-
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<window title="Ejemplo de árbol" id="ventana-arbol"
-   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-   onload="ponerVista();">
-
-<script>
-var vistaArbol = {
-    rowCount : 10000,
-    getCellText : function(fila, columna) {
-      if (columna=="colNombre") return "Fila "+row;
-      else return "18 de Febrero";
-    },
-    setTree: function(arbol){ this.treebox=arbol; },
-    isContainer: function(fila){ return false; },
-    isSeparator: function(fila){ return false; },
-    isSorted: function(fila){ return false; },
-    getLevel: function(fila){ return 0; },
-    getImageSrc: function(fila,columna){ return null; },
-    getRowProperties: function(fila,props){},
-    getCellProperties: function(fila,columna,props){},
-    getColumnProperties: function(idColumna,columna,props){}
-};
-
-function ponerVista() {
-    document.getElementById('miArbol').view = vistaArbol;
-}
-</script>
-
-<tree id="miArbol" flex="1">
-  <treecols>
-    <treecol id="colNombre" label="Nombre" flex="1"/>
-    <treecol id="colFecha" label="Fecha" flex="1"/>
-  </treecols>
-  <treechildren/>
-</tree>
-
-</window>
-
-

En la imagen, podemos ver dos columnas, cada una con datos generados por la función getCellText(). La función ponerVista() ha sido llamada en el gestor de eventos onload de la ventana. Tambíen hubieramos podido definir la vista más tarde si hubieramos querido. Podemos cambiar la vista en cualquier momento.

-

Cabe especial mención que la función getCellText solo es llamada cuando es necesario para mostrar los contenidos. En el ejemplo anterior de 10.000 filas, getCellText solo es llamada para las celdas que se están mostrando actualmente. Cuando el usuario se desplaze por el árbol se irá llamando para las celdas que se pongan a la vista. Esto hace que el árbol sea mucho más eficiente.

-

Tambíen podemos usar el objeto vista para árboles sin una vista personalizada. Por ejemplo, árboles construidos desde datos RDF tendrán un objeto vista que cogerá información de la fuente de datos RDF. Podemos usar el objeto vista para obtener información acerca de los datos mostrados por el árbol.

-

El interfaz nsiTreeView (inglés) lista todas la propiedades y métodos que podemos implementar para las vistas de árbol.

-

Siguiente, descubriremos como usar los comandos.

-

NdT. según un comentario del tutorial del 5/3/05, el parametro Columna de la función getCellText() ya no es un string en las últimas versiones, sino un nsITreeColumn, el cual podemos obtener a través de columns.getNamedColumn(string)

-

Categorías

-

links interwikis

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/detalles_del_modelo_de_caja/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/detalles_del_modelo_de_caja/index.html deleted file mode 100644 index d97360678c..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/detalles_del_modelo_de_caja/index.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Detalles del modelo de caja -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Detalles_del_modelo_de_caja -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Box_Model_Details ---- -

 

-

Hemos visto gran cantidad de características del modelo de caja. Aquí descubriremos unos cuantos detalles más con algunos ejemplos.

-

Más detalles del esquema

-

Las propiedades de estilo como min-width y max-height pueden ser aplicadas a cualquier elemento. Las hemos añadido a botones y cajas de texto, también podemos añadirlas a espaciadores o cajas. Además, el atributo flex puede ser aplicado a cualquier elemento.

-

Ejemplo

-
<hbox flex="1">
-  <button label="Izquierda" style="min-width: 100px;" flex="1"/>
-  <spacer flex="1"/>
-  <button label="Derecha" style="min-width: 100px;" flex="1"/>
-</hbox>
-
-

En el ejemplo anterior, los tres elementos se redimensionarán solos porque todos ellos son flexibles. Los dos botones indican un ancho mínimo de 100 píxeles, su tamaño nunca será inferior al indicado pero podrán crecer a mayor altura. Aquí la ventana debería aparecer con unos 200 píxeles de ancho, eso es suficiente para los dos botones. Ya que estos tres elementos son flexibles, pero no requieren un mayor lugar, la flexibilidad no agregará espacio extra.

-

Image:boxdet1.jpg

-

Como se muestra en la imagen anterior, hay dos botones que se expandirán verticalmente hasta acomodarse a su contenedor, que en éste caso es un hbox. El atributo align controla este comportamiento en una caja horizontal. También puede prevenirse esta expansión insertando una altura máxima en los elementos o, mejor aún, en la misma caja. Si una caja posee una altura máxima, los elementos dentro de la misma serán ceñidos a ella. Sin embargo, el problema con esto es que se deberá conocer de antemano qué tan grande será el elemento. Lo siguiente muestra el ejemplo anterior con un atributo align establecido.

-

Ejemplo

-
<hbox flex="1" align="top">
-  <button label="Izquierda" style="min-width: 100px;" flex="1"/>
-  <spacer flex="1"/>
-  <button label="Derecha" style="min-width: 100px;" flex="1"/>
-</hbox>
-
-

Para lograr esquemas complicados, generalmente se necesitará añadir cajas anidadas, especificar tamaños mínimos y máximos en algunos elementos, y convertir a ciertos elementos en flexibles. La mejor internase es la que puede ser exhibida en varios tamaños sin problemas. El modelo de caja podría ser difícil de entender sin antes realizar varias cosas por uno mismo.

-

A continuación una reseña de ambos tipos de cajas:

-

Cajas horizontales

-
    -
  1. Sitúan sus elementos uno después del otro horizontalmente.
  2. -
  3. Los elementos flexibles se flexionan horizontalmente.
  4. -
  5. El empaque controla la colocación horizontal de los elementos hijos.
  6. -
  7. La alineación regula cómo la fila de elementos es alineada verticalmente.
  8. -
-

Cajas verticales

-
    -
  1. Ponen sus elementos verticalmente en una columna.
  2. -
  3. Los elementos flexibles se flexionan verticalmente.
  4. -
  5. El empaque controla la ubicación vertical de los elementos hijos.
  6. -
  7. La alineación regula cómo se alinea horizontalmente la columna de elementos hijos.
  8. -
-

Pueden ponerse cajas en cualquier parte de un archivo XUL, incluso dentro de un elemento HTML como una tabla; sin embargo, el esquema estará parcialmente controlado por el elemento HTML. Esto quiere decir que el flex podría no funcionar exactamente como se desee. Recuerde que la flexibilidad solo tiene significado para elementos que se encuentran directamente dentro de una caja o de algún elemento que sea un tipo de caja.

-

Ejemplos

-

1. Utilización de espaciadores

-
<hbox>
-  <button label="Uno"/>
-  <spacer style="width: 5px"/>
-  <button label="Dos"/>
-</hbox>
-
-

Aquí se utiliza un espaciador como separador entre dos botones, fijándole explícitamente un ancho de 5 píxeles. También podrían establecerse márgenes (usando la propiedad CSS margin).

-

Here, a spacer is used as a separator between the two buttons, by setting an explicit width of 5 pixels. You could also set margins (using the CSS margin property).

-

2. Centrado de botones

-
<hbox pack="center" align="center" flex="1">
-  <button label="¡Mírame!"/>
-  <button label="¡Presióname!"/>
-</hbox>
-
-

Este ejemplo contiene una caja horizontal flexible con dos botones en ella. La caja posee el atributo pack que se utiliza para centrar los botones horizontalmente. El atributo align alinea los botones verticalmente. El resultado es que los botones estarán centrados en la caja en ambas direcciones. Este ejemplo también funcionará con una caja vertical, aunque el segundo botón estará debajo del primero en lugar de a su lado.

-

3. Una ventana de diálogo “Buscar texto�?

-
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<window id="buscartexto" title="Buscar Texto" orient="horizontal"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <vbox flex="3">
-    <label control="t1" value="Texto a buscar:"/>
-    <textbox id="t1" style="min-width: 100px;" flex="1"/>
-  </vbox>
-
-  <vbox style="min-width: 150px;" flex="1" align="start">
-    <checkbox id="c1" label="Ignorar mayúsculas/minúsculas"/>
-    <spacer flex="1" style="max-height: 30px;"/>
-    <button label="Buscar"/>
-  </vbox>
-
-</window>
-
-

Aquí son creadas dos cajas verticales, una para la caja de texto y la otra para la casilla de verificación y el botón. La caja izquierda posee una flexibilidad que es tres veces mayor que la caja derecha así siempre recibirá el triple de espacio extra cuando se incremente el tamaño de la ventana. A la caja derecha se le impone un ancho mínimo de 150 píxeles.

-

La caja de texto es flexible así podrá redimensionarse cuando la ventana lo haga, también se le ha impuesto un ancho mínimo de 100 píxeles. La casilla de verificación aparece a la derecha junto con su etiqueta. Justo debajo de esta caja hay un espaciador, el mismo crecerá y se reducirá pero sin exceder los 30 píxeles. El resultado es que la casilla de verificación y el botón de búsqueda estarán separados uno del otro por un espacio nunca mayor a 30 píxeles.

-

La segunda caja posee un valor de alineación start, esto causa que los elementos hijos sean alineados en el borde izquierdo. Si esto fuera especificado, el valor por omisión sería stretch, lo que haría que los elementos se estiren horizontalmente. Como no queremos que el botón de búsqueda cambie su tamaño necesitamos especificar una alineación. Image:boxdet-ex3.jpg

-

A continuación aprenderemos sobre un tipo da caja más especializado, la caja de grupo.

-

Categorías

-

links interwikis

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/divisores/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/divisores/index.html deleted file mode 100644 index 729af7c557..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/divisores/index.html +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: Divisores -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Divisores -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Splitters ---- -

Ahora podemos ver como añadir divisores/separadores a una ventana.

- -

División de una caja

- -

Hay momentos en los cuales se necesita tener dos secciones en la ventana donde el usuario pueda dimensionar las partes. Un ejemplo es la ventana del navegador de Mozilla, donde se puede cambiar el tamaño del panel lateral desplazando la línea de intersección de los cuadros. También se puede esconder, picando la cruz del panel.

- -

El elemento separador

- -

Ésta funcionalidad es cumplida utilizando un elemento llamado un splitter. Este elemento crea una barra fina entre los dos cuadros, lo cual permite dimensionar estos. Se puede poner un separador donde se quiera o necesite para permitir dimensionar los elementos situados antes o después de él en una misma caja.

- -

Cuando un separador se coloca en una caja horizontal, permite dimensionar horizontalmente. Si se coloca en una caja vertical, permite dimensionar verticalmente.

- -

La sintaxis de un separador es la siguiente:

- -
<splitter
-    id="identifier"
-    state="open"
-    collapse="before"
-    resizebefore="closest"
-    resizeafter="closest">
-
- -

Los atributos son los que siguientes:

- -
-
id
-
El identificador único de este separador.
-
- -
-
state
-
Indica el estado del separador. Se pone en open, que es la opción por defecto, si se quiere que el panel dimensionable esté inicialmente abierto o en collapsed para que uno de los paneles sea completamente reducido y que el otro ocupe (colapse) todo el espacio.
-
- -
-
collapse
-
Indica de que lado el panel debe reducirse cuando el separador es agarrado o iniciado en estado de colapse. Se definirá en before para designar elemento anterior al separador y en after para el elemento posterior. Poniéndolo en none, lo cual es la opción por defecto, el separador al ser agarrado no reducirá los paneles.
-
- -
-
resizebefore
-
Cuando un separador es desplazado, los elementos a su izquierda (o encima) cambian de dimensiones. Éste atributo indica cual de los elementos puede dimensionarse. Para que el elemento inmediatamente a la izquierda del separador sea dimensionado, se definirá en closest (el valor por defecto) y en farthest para que sea el elemento más lejos a la izquierda (el primer elemento en la caja) el que sea dimensionado.
-
- -
-
resizeafter
-
Cuando un separador es desplazado, los elementos a su derecha (o debajo) cambian de dimensiones. Éste atributo indica cual de los elementos puede dimensionarse. Para que el elemento inmediatamente a su derecha sea dimensionado, se definirá en closest (el valor por defecto) y en farthest para que sea el elemento más lejos a derecha (el último elemento en la caja) el que sea dimensionado. Éste atributo también se puede definir en grow, en este caso los elementos a su derecha no cambiarán de tamaño al mover el separador, pero si la caja entera.
-
- -

Si se pone el atributo collapse, se añadirá también el elemento grippy dentro del splitter para permitir que el usuario pueda utilizar el separador.

- -

Ejemplo con separador

- -

Aquí un ejemplo que puede ayudar:

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<vbox flex="1">
-  <iframe id="content-1" width="60" height="20" src="w1.html"/>
-  <splitter collapse="before" resizeafter="farthest">
-    <grippy/>
-  </splitter>
-  <iframe id="content-2" width="60" height="20" src="w2.html"/>
-  <iframe id="content-3" width="60" height="20" src="w3.html"/>
-  <iframe id="content-4" width="60" height="20" src="w4.html"/>
-</vbox>
-
- -
Image:splitter-ex1.jpg
- -

Aquí, cuatro marcos han sido creados y un separador colocado entre el primero y el segundo. El atributo de colapso se ha definido en el valor before, para que si el separador es agarrado, el primer cuadro desaparezca y que el divisor y los marcos restantes se desplacen a la izquierda. El punto del cursor para mover el separador es centrado en relación a él-mismo.

- -

Al separador se le ha dado un valor resizeafter de farthest. Ésto hace que cuando el separador es movido, el elemento más lejos a su derecha cambiará de tamaño, en este caso el cuadro 4.

- -

A value has not been specified for resizebefore so it will default to a value of closest. In this case, there is only one frame before the splitter, so frame 1 will change size.

- -

Frames 2 and 3 will only change size if you drag the splitter far enough to the right that frame 4 has reached its minimum size.

- -
Image:splitter-ex2.jpg
- -

This image shows the 4 panels with the splitter in a collapsed state.

- -
Image:splitter-ex3.jpg
- -

This image shows the 4 panels with the splitter resized to the right. Notice how the middle two panels have not changed size. Only panel 1 and panel 4 have changed size. You can just see part of the fourth panel. If you continue to drag the splitter to the right, the other two panels will shrink.

- -

You can use the style properties such as min-width, max-height on the iframes to specify minimum or maximum widths or heights in the box. If you do, the splitter will detect this and not allow the user to drag the splitter past the minimum and maximum sizes.

- -

For example, if you specified a minimum width of 30 pixels on panel 4 above, it would not shrink below that size. The other two panels would have to shrink. If you set the minimum width of panel 1 to 50 pixels, you would only be able to drag the splitter 10 pixels to the left (as it starts at 60 pixels wide). You can still collapse the splitter however.

- -

You can also place more than one splitter in a box if you want, in which case you could collapse different parts of it. Similarly, you do not have to collapse just iframes. Any element can be collapsed.

- -

Nuestro ejemplo de búsqueda

- -
-

Let's see what the find file dialog looks like with a splitter in it. One possibility would be to add the results of the search in the dialog. We'll add an area in-between the search criteria and the buttons along the bottom. A splitter will allow you to collapse, or hide, the search results.

- -
</tabbox>
-
- <iframe src="results.html"/>
- <splitter resizeafter="grow"/>
-
- <hbox>
-
- -

Here, a splitter and an iframe have been added to the dialog. We don't need the spacer after the tabbox any more so we can remove it. The content of the frame is contained in a file called 'results.html'. Create this file and put whatever you want in it for now. The iframe will be replaced más tarde with a results list when we know how to create it. For now, it serves to demonstrate the splitter.

- -

The splitter has been set to a collapse value of before meaning that the element just before the splitter will collapse. Here, it is the iframe. As the images below show, when the grippy is clicked, the iframe is collapsed and the buttons shuffle up.

- -

The resizeafter attribute has been set to grow so that the elements after the splitter push themselves down when the splitter is dragged down. This results in the content of the frame growing to any size. It should be noted that the window does not resize itself automatically. You'll also notice that this is a horizontal splitter because it has been placed in a vertical box.

- -

Estado normal:

- -

Image:splitter1.png

- -

Estado colapsado:

- -

Image:splitter2.png

- -

Nuestro ejemplo: Código Ver en funcionamiento

-
- -


-

-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/di\303\241logos_abrir_y_guardar/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/di\303\241logos_abrir_y_guardar/index.html" deleted file mode 100644 index ee9354c54b..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/di\303\241logos_abrir_y_guardar/index.html" +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Diálogos Abrir y Guardar -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Diálogos_Abrir_y_Guardar -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Open_and_Save_Dialogs ---- -

Un tipo común de diálogo es aquello donde el usuario puede elegir un archivo para abrirlo o guardarlo.

- -

Selectores de archivos

- -

Un selector de archivos es un diálogo que permite al usuario seleccionar un archivo. Generalmente se utiliza para las órdenes de menú: Abrir y Guardar, pero se pueden utilizar en cualquier lugar en que el usuario necesita elegir un archivo. Para implementar el selector de archivos se utiliza la interfaz nsIFilePicker de XPCOM.

- -

Se puede usar el selector de archivos de un modo de los tres siguientes:

- - - -

La apariencia del diálogo será distinta en cada tipo y variará en cada plataforma. Cuando el usuario ha seleccionado un archivo o una carpeta, lo puede leer o escribir en él.

- -

La interfaz del selector de archivo nsIFilePicker es la encargada de mostrar el diálogo en uno de los tres modos. Usando la interfaz se puede configurar una serie de características del diálogo. Cuando se cierra el diálogo, se pueden usar las funciones de la interfaz para obtener el archivo que fue seleccionado.

- -

Creando un selector de archivo

- -

Para empezar, debes crear un componente selector de archivos e iniciarlo.

- -
var nsIFilePicker = Components.interfaces.nsIFilePicker;
-var fp = Components.classes["@mozilla.org/filepicker;1"]
-      .createInstance(nsIFilePicker);
-fp.init(window, "Select a File", nsIFilePicker.modeOpen);
-
- -

Primero, se crea un nuevo objeto selector de archivos y es almacenado en la variable ‘fp’. La función ‘init’ se usa para iniciar el selector de archivos. Esta función toma tres argumentos, la ventana que está abriendo el diálogo, el título del diálogo y el modo. Aquí el modo es modeOpen (modoAbrir) el cual es usado para un diálogo Abrir. También se puede usar modeGetFolder (modoObtenerCarpeta) y modeSave (modoGuardar) para los otros dos modos. Estos modos son constantes de la interfaz nsIFilePicker.

- -

Directorio y filtros por defecto

- -

Hay dos características del diálogo que se pueden configurar antes de que se muestre.

- - - -

Se puede configurar el directorio por defecto con la propiedad displayDirectory del objeto selector de archivos. El directorio debe ser un objeto nsILocalFile. Si no asignas ningún valor, un directorio por defecto será escogido automáticamente. Para agregar filtros, se llama la función apeendFilters() para configurar los tipos de archivos que se desea mostrar.

- -
fp.appendFilters(nsIFilePicker.filterHTML | nsIFilePicker.filterImages);
-fp.appendFilters(nsIFilePicker.filterText | nsIFilePicker.filterAll);
-
- -

El primer ejemplo agrega filtros para archivos HTML e imágenes. Al usuario se le permitirá seleccionar sólo esos tipos de archivos. La forma de realizar esto depende de la plataforma. En algunas plataformas, cada filtro será separado y el usuario podrá seleccionar entre archivos HTML e imágenes. El segundo ejemplo agrega filtros para archivos de texto y para todos los archivos. Luego el usuario tiene la opción de elegir entre mostrar solo los archivos de texto o todos los archivos.

- -

También se puede usar filterXML y filterXUL para filtrar archivos XML y XUL. Si se desea crear un filtro en particular se puede utilizar la función appendFilter() de la siguiente manera:

- -
fp.appendFilter("Audio Files","*.wav; *.mp3");
-
- -

Esta línea agregará un filtro para archivos WAV y MP3. El primer argumento es el título del tipo de archivos y el segundo es una lista de máscaras de archivos separadas por punto y coma. Se puede agregar más o menos máscaras como sea necesario. También se puede llamar la función appendFilters tantas veces como sea necesario para agregar filtros adicionales. El orden en que se agregan determina su prioridad. Generalmente, el primero que se agrega es seleccionado por defecto.

- -

Conseguir el archivo seleccionado

- -

Finalmente, se puede mostrar el diálogo llamando la función ‘show’. No toma ningún parámetro pero devuelve un código de estado que indica que eligió el usuario. Note que la función no devuelve hasta que el usuario haya seleccionado un archivo. La función devuelve una de las tres siguientes constantes:

- - - -

Se debería revisar el valor retornado para luego recuperar el objeto del archivo desde el selector de archivos usando la propiedad file.

- -
var res = fp.show();
-if (res == nsIFilePicker.returnOK){
-  var thefile = fp.file;
-  // --- do something with the file here ---
-}
-
- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/el_modelo_de_caja/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/el_modelo_de_caja/index.html deleted file mode 100644 index 4ed1b2660f..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/el_modelo_de_caja/index.html +++ /dev/null @@ -1,192 +0,0 @@ ---- -title: El modelo de caja -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/El_modelo_de_caja -translation_of: Archive/Mozilla/XUL/Tutorial/The_Box_Model ---- -

{{ PreviousNext("Escuela_XUL/Agregar_eventos_y_comandos", "Escuela_XUL/Agregar_ventanas_y_dialogos") }}

- -

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.

- -

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 is the fact that XUL boxes can be vertically oriented (like divs) or horizontally oriented (unlike divs).

- -

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("Escuela_XUL/Agregar_eventos_y_comandos", "Escuela_XUL/Agregar_ventanas_y_dialogos") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/emisores_y_receptores/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/emisores_y_receptores/index.html deleted file mode 100644 index dc19a9e359..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/emisores_y_receptores/index.html +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: Emisores y receptores -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Emisores_y_receptores -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Broadcasters_and_Observers ---- -

There may be times when you want several elements to respond to events or changes of state easily. To do this, we can use broadcasters.

- -

Command Attribute Forwarding

- -

We've already seen that elements such as buttons can be hooked up to commands. In addition, if you place the desactivado attribute on the comando element, any elements hooked up to it will also become disabled automatically. This is useful way to simplify the amount of code you need to write. The technique also works for other attributes as well. For instance, if you place a label attribute on a comando element, any buttons attached to the command will share the same label.

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<command id="mi_comando" label="Abrir"/>
-
-<button command="mi_comando"/>
-<checkbox label="Abrir en una ventan nueva" command="mi_comando"/>
-
- -

In this example, the button does not have a label attribute, however it is attached to a command that does. The button will share the label with the command. The checkbox already has a label, however, it will be overridden by the command's label. The result is that both the button and the checkbox will have the same label 'Open'.

- -

If you were to modify the command's label attribute, the label on the button and checkbox will adjust accordingly. We saw something like this in a previous section where the desactivado attribute was adjusted once and propagated to other elements.

- -

This attribute forwarding is quite useful for a number of purposes. For instance, let's say that we want the Back action in a browser to be disabled. We would need to disable the Back command on the menu, the Back button on the toolbar, the keyboard shortcut (Alt+Left for example) and any Back commands on popup menus. Although we could write a script to do this, it is quite tedious. It also has the disadvantage that we would need to know all of the places where a Back action could be. If someone added a new Back button using an extension, it wouldn't be handled. It is convenient to simply disable the Back action and have all the elements that issue the Back action disable themselves. We can use the attribute forwarding of commands to accomplish this.

- -

El emisor

- -

There is a similar element called a emisor. Broadcasters support attribute forwarding in the same way that commands do. They work the same as commands except that a command is used for actions, while a broadcaster is instead used for holding state information. For example, a comando would be used for an action such as Back, Cut or Delete. A emisor would be used to hold, for instance, a flag to indicate whether the user was online or not. In the former case, menu items and toolbar buttons would need to be disabled when there was no page to go back to, or no text to cut or delete. In the latter case, various UI elements might need to update when the user switches from offline mode to online mode.

- -

The simplest broadcaster is shown below. You should always use an id attribute so that it can be referred to by other elements.

- -
<broadcasterset>
-  <broadcaster id="isOffline" label="Offline"/>
-</broadcasterset>
-
- -

Any elements that are watching the broadcaster will be modified automatically whenever the broadcaster has its label attribute changed. This results in these elements having a new label. Like other non-displayed elements, the broadcasterset element serves as a placeholder for broadcasters. You should declare all your broadcasters inside a broadcasterset element so that they are all kept together.

- -

Making elements observers

- -

Elements that are watching the broadcaster are called observers because they observe the state of the broadcaster. To make an element an observer, add an observes attribute to it. This is analogous to using the comando attribute when attaching an element to a comando element. For example, to make a button an observer of the broadcaster above:

- -
<button id="offline_button" observes="isOffline"/>
-
- -

The observes attribute has been placed on the button and its value has been set to the value of the id on the broadcaster to observe. Here the button will observe the broadcaster which has the id isOffline, which is the one defined earlier. If the value of the label attribute on the broadcaster changes, the observers will update the values of their label attributes also.

- -

We could continue with additional elements. As many elements as you want can observe a single broadcaster. You can also have only one if you wanted to but that would accomplish very little since the main reason for using broadcasters is to have attributes forwarded to multiple places. You should only use broadcasters when you need multiple elements that observe an attribute. Below, some additional observers are defined:

- -
<broadcaster id="offline_command" label="Offline" accesskey="f"/>
-
-<keyset>
-  <key id="goonline_key" observes="offline_command" modifiers="accel" key="O"/>
-</keyset>
-<menuitem id="offline_menuitem" observes="offline_command"/>
-<toolbarbutton id="offline_toolbarbutton" observes="offline_command"/>
-
- -

In this example, both the label and the accesskey will be forwarded from the broadcaster to the key, menu item and the toolbar button. The key won't use any of the received attributes for anything, but it will be disabled when the broadcaster is disabled.

- -

You can use a broadcaster to observe any attribute that you wish. The observers will grab all the values of any attributes from the broadcasters whenever they change. Whenever the value of any of the attributes on the broadcaster changes, the observers are all notified and they update their own attributes to match. Attributes of the observers that the broadcaster doesn't have itself are not modified. The only attributes that are not updated are the id and persist attributes; these attributes are never shared. You can also use your own custom attributes if you wish.

- -

Broadcasters aren't used frequently as commands can generally handle most uses. One thing to point out is that there really is no difference between the comando element and the emisor element. They both do the same thing. The difference is more semantic. Use commands for actions and use broadcasters for state. In fact, any element can act as broadcaster, as long as you observe it using the observes attribute.

- -

El observador

- -

There is also a way to be more specific about which attribute of the broadcaster to observe. This involves an observes element. Like its attribute counterpart, it allows you to define an element to be an observer. The observes element should be placed as a child of the element that is to be the observer. An example is shown below:

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<broadcasterset>
-  <broadcaster id="isOffline" label="Offline" accesskey="f"/>
-</broadcasterset>
-
-<button id="offline_button">
-  <observes element="isOffline" attribute="label"/>
-</button>
-
- -

Two attributes have been added to the observes element. The first, elemento, specifies the id of the broadcaster to observe. The second, atributo, specifies the attribute to observe. The result here is that the button will receive its label from the broadcaster, and when the label is changed, the label on the button is changed. The observes element does not change but instead the element it is inside changes, which in this case is a botón. Notice that the accesskey is not forwarded to the button, since it is not being obseved. If you wanted it to be, another observes element would need to be added. If you don't use any observes elements, and instead use the observes attribute directly on the button, all attributes will be observed.

- -

El evento emisor

- -

There is an additional event handler that we can place on the observes element which is onbroadcast. The event is called whenever the observer notices a change to the attributes of the broadcaster that it is watching. An example is shown below.

- -

Example 3: Código Ver en funcionamiento

- -
<broadcasterset>
-  <broadcaster id="colorChanger" style="color: black"/>
-</broadcasterset>
-
-<button label="Test">
-  <observes element="colorChanger" attribute="style" onbroadcast="alert('Color changed');"/>
-</button>
-
-<button label="Observer"
-  oncommand="document.getElementById('colorChanger').setAttribute('style','color: red');"
-/>
-
- -

Two buttons have been created, one labeled Test and the other labeled Observer. If you click on the Test button, nothing special happens. However, if you click on the Observer button, two things happen. First, the button changes to have red text and, second, an alert box appears with the message 'Color changed'.

- -

What happens is the oncommand handler on the second button is called when the user presses on it. The script here gets a reference to the broadcaster and changes the style of it to have a color that is red. The broadcaster is not affected by the style change because it doesn't display on the screen. However, the first button has an observer which notices the change in style. The elemento and the atributo on the observes tag detect the style change. The style is applied to the first button automatically.

- -

Next, because the broadcast occured, the event handler onbroadcast is called. This results in an alert message appearing. Note that the broadcast only occurs if the attributes on the emisor element are changed. Changing the style of the buttons directly will not cause the broadcast to occur so the alert box will not appear.

- -

If you tried duplicating the code for the first botón several times, you would end up with a series of alert boxes appearing, one for each button. This is because each button is an observer and will be notified when the style changes.

- -

Seguimos con el uso del DOM con elementos XUL.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/estructura_xul/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/estructura_xul/index.html deleted file mode 100644 index 0859e26e37..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/estructura_xul/index.html +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: Estructura XUL -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Estructura_XUL -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/XUL_Structure ---- -

{{ PreviousNext("Tutorial de XUL:Introducción", "Tutorial de XUL:La URL chrome") }}

- -

 

- -

Comenzaremos viendo cómo se procesa XUL por parte de Mozilla.

- -

Cómo se procesa XUL

- -

En Mozilla, XUL se procesa en forma similar al procesamiento de HTML y otros tipos de contenido. Cuando el usuario escribe la URL de una página HTML en el campo de dirección del navegador, éste busca el sitio web y descarga su contenido. El motor de presentación de Mozilla toma el contenido en el formato HTML y lo transforma en un árbol de documento. Este árbol se convierte en un conjunto de objetos que pueden mostrarse en la pantalla. Los estilos CSS, imágenes y otras tecnologías son usados para controlar la presentación. El procesamiento de XUL es muy similar.

- -

De hecho, en Mozilla, todos los tipos de documento, sin importar si son HTML, XUL o aún SVG son procesados por el mismo código. Esto significa que las mismas propiedades CSS pueden usarse para definir el estilo tanto del HTML como de XUL, y muchas de las características pueden compartirse entre ambos. Sin embargo, hay características que son específicas del HTML como son los formularios, y otras que son específicas de XUL como son los overlays (revestimientos). Ya que XUL y HTML se procesan de la misma forma, se pueden cargar desde el sistema de archivos local del usuario, desde una página web, desde una extensión del navegador o desde una aplicación XULRunner.

- -

El contenido de fuentes remotas, como por ejemplo: http://localhost/~username/, sin importar si es HTML, XUL o cualquier otro tipo de documento, está limitado en la clase de operaciones que pueden realizar, por razones de seguridad. Por este motivo, Mozilla proporciona un método para instalar contenido en forma local y registrar los archivos instalados para que formen parte del sistema chrome. Esto permite usar una URL especial llamada la URL chrome://. Al acceder a un archivo usando la URL chrome, éstos reciben privilegios para acceder a archivos locales, preferencias, marcadores de página y ejecutar otras operaciones privilegiadas. Obviamente, las páginas web no obtienen estos privilegios, a menos que estén firmadas con un certificado digital y el usuario dé el permiso para ejecutar estas operaciones.

- -

Este registro en el paquete chrome es la forma en la que las extensiones de Firefox pueden añadir características al navegador. Las extensiones son pequeños paquetes con archivos XUL, Javascript, hojas de estilo e imágenes empaquetados en un sólo archivo. Este archivo puede crearse usando una utilidad ZIP. Cuando el usuario descarga la extensión, ésta es instalada en su máquina. La extensión se ensambla en el navegador usando una característica especial de XUL llamada overlay (revestimiento), la cual permite que se combinen el XUL de la extensión y el XUL del navegador. Para el usuario, puede parecer que la extensión ha modificado al navegador, pero en realidad el código está separado y la extensión se puede desinstalar fácilmente.

- -

Por supuesto, no es necesario que los paquetes registrados usen revestimientos. Si no los usan, no se puede acceder a ellos desde la interfaz del navegador, pero sí por medio de la URL chrome, si se sabe cuál es.

- -

Las aplicaciones XUL autónomas (que no necesitan el navegador) pueden incluir código XUL de la misma forma, pero este código se incluirá como parte de la instalación, en lugar de tener que instalarse de forma separada como una extensión. Sin embargo, este código XUL debe ser registrado en el sistema chrome de tal forma que las aplicaciones puedan mostrar la UI.

- -

Vale la pena anotar que el navegador Mozilla realmente es un conjunto de paquetes que contienen archivos XUL, JavaScript y hojas de estilo. Estos paquetes son accesibles usando una URL chrome, tienen privilegios ampliados y trabajan como cualquier otro paquete. Por supuesto, el navegador es más grande y más sofisticado que la mayoría de las extensiones. Firefox, Thunderbird y muchos otros componentes también están escritos en XUL y se puede acceder a ellos usando la URL chrome. Se puede examinar estos paquetes mirando el directorio chrome donde Firefox o cualquier otra aplicación XUL esté instalada.

- -

La URL chrome siempre comienza por 'chrome://'. De la misma forma que la URL 'http://' se refiere a sitios web remotos accesibles por medio de HTTP y la URL 'file://' siempre se refiere a archivos locales, la URL 'chrome://' se refiere a los paquetes y extensiones instalados. En la próxima sección veremos con detalles la sintaxis de la URL chrome. Es importante anotar que si se accede a un contenido a través de una URL chrome, éste gana los privilegios ampliados que se han mencionado anteriormente y que otras clases de URL no tienen. Por ejemplo, una URL HTTP no tiene ningún privilegio especial, y ocurrirá un error si la página web intenta leer un archivo local. Sin embargo, un archivo cargado por medio de una URL chrome podrá leer archivos sin restricciones.

- -

Esta diferenciación es importante. Significa que hay ciertas cosas que el contenido de las páginas web no puede hacer, tales como leer los marcadores de página del usuario. Esta diferenciación no está basada en la clase de contenido a ser mostrado, sólo en el tipo de URL empleada. Tanto el HTML como el XUL colocados en un sitio web no tienen permisos adicionales, sin embargo si el HTML o el XUL son cargados por medio de una URL chrome tendrán permisos ampliados.

- -

Si Ud. va a usar XUL en un sitio web, debe colocar el archivo XUL en el sitio web tal como lo haría con un archivo HTML, y luego cargar su URL en el navegador (http://localhost/xul.php). Debe asegurarse que el servidor web esté configurado para enviar los archivos XUL con el tipo de contenido de application/vnd.mozilla.xul+xml (con PHP sería: header('content-type: application/vnd.mozilla.xul+xml');). Este tipo de contenido permite a Mozilla diferenciar entre HTML y XUL. Mozilla no usa la extensión del archivo, a menos que esté leyendo archivos del disco local, pero se debería usar la extensión .xul para todos los archivos XUL. Es posible abrir archivos XUL desde el navegador o el gestor de archivos.

- -
Recuerde que los archivos XUL remotos tienen restricciones significativas sobre lo que pueden hacer.
- -

Tipos de documentos: HTML XML XUL CSS

- -

Mozilla emplea una clase totalmente diferente de objeto de documento (DOM) para el HTML y el XUL, aunque compartan mucha funcionalidad. En Mozilla existen tres tipos principales de documentos: HTML, XML y XUL. Naturalmente, el documento HTML se usa para los documentos HTML, el documento XUL se utiliza en los documentos XUL y el documento XML se emplea para otros tipos de documentos XML. Ya que el formato XUL también es XML, el documento XUL es una subclase del documento XML que es más genérico. Existen diferencias sutiles de funcionalidad. Por ejemplo, mientras los controles de un formulario en HTML es accesible por medio de la propiedad document.forms, en los documentos XUL no está disponible ya que XUL no tiene formularios en el mismo sentido que HTML. De otro lado, características específicas de XUL como los revestimientos y las plantillas sólo están disponibles en los documentos XUL.

- -

La distinción entre documentos es importante. Es posible usar muchas características de XUL en documentos HTML o XML ya que no son específicas al tipo de documento, sin embargo, otras características requieren un tipo de documento específico. Por ejemplo, se pueden usar los tipos de disposición de XUL en otros documentos ya que no dependen del tipo de documento XUL para funcionar.

- -

Para resumir los puntos expuestos anteriormente:

- - - -

En las próximas secciones describiremos la estructura básica de un paquete chrome que será instalado dentro de Mozilla. Sin embargo, si desea comenzar a construir una aplicación simple, puede saltar a creando una ventana y volver más tarde.

- -

Organización del paquete

- -

Mozilla está organizado de tal forma que te permite tener tantos componentes pre-instalados como quieras. Cada extensión es, además, un componente con un chrome URL distinto. Además tendrá un componente para cada tema o configuración regional instalado. Cada uno de estos componentes o paquetes, está compuesto de un conjunto de ficheros que describen la interfaz de usuario para cada uno. Por ejemplo, el componente de mensajería tendrá descripciones de la ventana de listado de mensajes de correo, la ventana de composición y los cuadros de la libreta de direcciones.

- -

Los paquetes que vienen con Mozilla están localizados en la carpeta chrome, que puedes encontrar en el directorio donde instalaste Mozilla. La carpeta chrome es donde encontrarás todos estos archivos que describen la interfaz de usuario para el navegador Mozilla, el cliente de correo y para otras aplicaciones. Habitualmente pondrás todos los archivos XUL para una aplicación en esta carpeta, excepto para las extensiones, que serán instaladas en la carpeta de extensiones de un usuario concreto. El simple hecho de copiar un archivo XUL a la carpeta 'chrome' no proporcionará al archivo ningún permiso extra ni será accesible a través de chrome URL. Para conseguir estos privilegios extras, tendrás que crear un archivo manifest y ponerlo en la carpeta chrome. Este archivo es fácil de crear, y habitualmente sólo contiene un par de líneas de código. Se usa para enlazar un chrome URL a un archivo o ruta de una carpeta del disco donde están los archivos XUL. Detalles de cómo crear este archivo serán vistos en la siguiente sección.

- -

La única forma de acceder a contenido a través de una URL chrome es crear un paquete como se describe en las siguientes secciones. Esta carpeta se denomina 'chrome' porque parece ser un nombre conveniente para el directorio donde se mantienen los paquetes chrome que se incluyen con Mozilla.

- -

Para agrandar la confusión, hay otros dos sitios donde la palabra chrome puede aparecer. El primero es el argumento '-chrome', y el segundo el modificador chrome para la función window.open(). La llamada de estas características no otorga privilegio alguno. Son usadas para abrir una nueva ventana arriba del todo sin el menú o la barra de herramientas del navegador. Habitualmente se usará esta característica en aplicaciones XUL donde no se quiera que aparezca las diferentes barras del navegador alrededor de los cuadros de diálogo.

- -

Los archivos para un paquete son normalmente unidos en un simple archivo JAR. Un archivo JAR debe ser creado y examinado usando una aplicación ZIP. Por ejemplo, puedes abrir un archivo JAR en la carpeta chrome de Mozilla para ver la estructura básica de un paquete. Aunque es normal unir los archivos en un archivo JAR, los paquetes pueden ser accesibles de forma expandida en un directorio. No es habitual distribuir un paquete de esta forma, pero es práctico durante su desarrollo, ya que puedes editar el archivo directamente para después recargarlo sin tener que volver a empaquetar o reinstalar los archivos.

- -

Por defecto, las aplicaciones Mozilla analizan los archivos XUL y los scripts, y guardan una versión pre-compilada en la memoria para mejorar el resto de la sesión. Esto mejora la ejecución. Sin embargo, por culpa de esto, el archivo XUL no será recargado aún cuando el archivo fuente haya cambiado. Para desactivar este mecanismo, es necesario cambiar las preferencia nglayout.debug.disable_xul_cache. En Firefox, ésta preferencia se puede añadir a las preferencias del usuario poniendo "about:config" en la barra de dirección y cambiar ese valor por verdadero (true). O manualmente editando el archivo de preferencias user.js y añadiéndole la siguiente línea:

- -
pref("nglayout.debug.disable_xul_cache", true);
-
- -


- Habitualmente hay tres partes distintas en un paquete chrome, aunque son opcionales. Cada parte está almacenada en una carpeta distinta. Estas tres partes son el contenido, la piel (skin) y la configuración regional, explicados más abajo. Un paquete particular debe proporcionar una o más pieles (skins) y locales, pero un usuario puede reemplazarlos con los suyos propios. Además, el paquete debe incluir varias aplicaciones distintas cada una accesible a través de diferentes chrome URLs. El sistema de paquetes es suficientemente flexible por lo que puedes incluir todas las partes que necesites y permitir que otras partes, como el texto para diferentes idiomas, sean descargadas de forma separada.

- -

Los tres tipos de paquetes chrome son:

- - - -

Paquetes de contenido

- -

El nombre de un archivo JAR debe describir lo que contiene, pero no se puede asegurar el contenido si no se mira a dentro. Vamos a usar el paquete del navegador incluido con Firefox como ejemplo. Si extraemos los archivos de browser.jar, nos encontraremos con una jerarquía de directorios similar a la que se muestra a continuación:

- -
content
-   browser
-      browser.xul
-      browser.js
-      -- otros ficheros XUL y JS van aquí --
-      bookmarks
-         -- los archivos de marcadores, aquí --
-      preferences
-         -- los archivos de preferencias, aquí --
-.
-.
-.
-
- -

el ejemplo original <pre> content browser browser.xul browser.js -- other browser XUL and JS files goes here -- bookmarks -- bookmarks files go here -- preferences -- preferences files go here -- . . . </pre>

- -

Ésto es fácilmente reconocible como un paquete de contenido, ya que el directorio superior se llama content. Para aspectos(skins) esta carpeta normalmente será denominada skin y para configuración regional se le llamará locale. Este esquema de nombres no es necesario pero es una práctica habitual para hacer más claras las partes de un paquete. Algunos paquetes deben incluir una sección de contenidos, una piel (skin) y un locale. En este caso, encontraremos un sub-directorio para cada tipo. Por ejemplo, Chatzilla está distribuido de esta forma.

- -

La carpeta content/browser contiene un número de archivos con extensiones .xul y .js. Los archivos XUL son los que tienen la extensión .xul. Los archivos con extensiones .js son archivos JavaScript que contienen los scripts que se encargan de la funcionalidad de una ventana. Muchos archivos XUL tienen un archivo script asociado con ellos, y muchos deben tener más de uno.

- -

En el listado superior, dos archivos han sido vistos. De hecho hay otros, pero para simplificar no serán vistos. El archivo browser.xul es el archivo XUL que describe la ventana principal del navegador. La ventana principal para un paquete de contenido debe tener el mismo nombre que el paquete con una extensión .xul. En este caso, el nombre del paquete es "browser", por eso esperaremos encontrarnos con browser.xul. Algunos de los otros archivos XUL describen ventanas distintas. Por ejemplo, el archivo pageInfo.xul describe el cuadro de información de la página.

- -

Muchos paquetes incluirán un archivo contents.rdf que describe el paquete, su autor y el revestimiento que usa. Sin embargo, este archivo está obsoleto y ha sido reemplazado con un mecanismo más simple. Este nuevo método es el archivo manifest mencionado anteriormente, y encontraremos estos archivos con la extensión .manifest en el directorio chrome. Por ejemplo, browser.manifest describe el paquete del navegador.

- -

Varias subcarpetas, como son marcadores y preferencias (bookmarks y preferences), describen secciones adicionales del navegador. Están ubicadas en diferentes carpetas sólo para mantener los archivos más organizados.

- -

Aspectos (skins) o Temas

- -

Al código subyacente de Mozilla se le llama aspectos (skins), aunque a la interfaz de usuario se la llama temas, pero ambos se refieren a la misma cosa. El archivo classic.jar describe el tema por defecto que viene con Firefox. La estructura es similar a los paquetes de contenido. Por ejemplo, examinando classic.jar:

- -
skin
-   classic
-      browser
-         -- browser skin files go here --
-      global
-         contents.rdf
-         -- global skin files go here --.
-.
-.
-
- -

Nuevamente, esta estructura de carpetas no es necesaria y es usada por comodidad. Realmente puedes colocar todos los archivos en una carpeta arriba del todo y no usar subcarpetas. Sin embargo, para aplicaciones mayores, las subcarpetas son usadas para separar los diferentes componentes. En el ejemplo anterior, una carpeta es para los archivos del tema para el navegador y otra para los archivos del tema global. La carpeta global contiene archivos de la piel (skin) que son comunes a todos los paquetes. Estos archivos se aplicarán a todos los componentes y serán incluídos para tus aplicaciones autónomas. La parte global define el aspecto de todos los chismes comunes XUL, mientras que las otras carpetas contienen archivos que son específicos de estas aplicaciones. Firefox incluye tanto los archivos del tema global como los del navegador en un archivo, pero ambos pueden ser incluídos por separado.

- -

Una piel (skin) se compone de archivos CSS y de un número de imágenes usadas para definir el aspecto y la interfaz. El archivo browser.css es usado por browser.xul y contiene estilos que definen el aspecto de varias partes de la interfaz del navegador. Nuevamente, nótese como el archivo browser.css tiene el mismo nombre que el paquete. Cambiando los archivos CSS, puedes ajustar el aspecto de una ventana sin cambiar su función. De esta forma puedes crear un nuevo tema. La parte XUL continúa igual pero la parte de la piel (el skin) cambia independientemente.

- -

Configuración regional

- -

El archivo en-US.jar describe la información del idioma para cada componente, en este caso para US English. Como las pieles (skins), cada idioma contendrá archivos que especifican texto usado por el paquete pero para un idioma concreto. La estructura para la configuración regional es similar a las otras, por eso no será explicada aquí.

- -

El texto de idioma es almacenado en dos tipos de archivos: archivos DTD y archivos de propiedades. Los archivos DTD tienen una extensión .dtd y contienen declaraciones de identidad, una para cada cadena de texto usada en una ventana. Por ejemplo, el archivo browser.dtd contiene declaraciones de identidad para cada comando del menú. Además, los atajos de teclado para cada comando también están definidos, ya que pueden ser diferentes en cada idioma. Los archivos DTD son usados por los archivos XUL por eso, en general, tendrás uno por cada archivo XUL. La parte de configuración regional también contiene archivos de propiedades, que son similares, pero son usados por archivos script. El archivo browser.properties contiene algunas cadenas de idioma.

- -

Esta estructura nos permite traducir Mozilla o un componente a un idioma distinto sólo añadiendo una nueva configuración regional para ese idioma. No tienes que cambiar la parte de XUL. Además, otra persona puede proporcionar un paquete separado que aplica una piel (skin) o configuración regional a tu parte de contenido, proporcionando soporte de esta manera a un nuevo tema o idioma sin tener que modificar el paquete original.

- -

Otros paquetes

- -

Hay un paquete especial llamado toolkit (o global). Vimos anteriormente el directorio global para skins (pieles). El archivo toolkit.jar contiene el contenido correspondiente para ello. Contiene algunos diálogos globales y definiciones. Además, define la apariencia por defecto y la funcionalidad de varios chismes XUL comunes como son los cuadros de texto y los botones. Los archivos localizados en la parte global de un paquete skin contienen la apariencia por defecto para todos los elementos de la interfaz XUL. El paquete toolkit es usado por todas las aplicaciones XUL.

- -

Añadiendo un paquete

- -

Mozilla coloca los paquetes incluidos con la instalación en la carpeta chrome. Sin embargo, no es necesario colocarlos aquí. Si tienes otro paquete instalado, puede ser colocado en cualquier parte del disco, siempre que un archivo manifest apunte a él. Es una práctica frecuente colocar los paquetes en la carpeta chrome simplemente por ser conveniente, sin embargo sólo funcionarán correctamente desde otro directorio o desde algún lugar de tu red local. No puedes almacenarlos en un lugar remoto, a no ser que el sitio remoto sea montado a través del sistema de ficheros local.

- -

Hay dos carpetas chrome usadas para las aplicaciones XUL, una está instalada en el mismo sitio donde las aplicaciones están instaladas, y la otra es parte del perfil del usuario. La primera permite a los paquetes ser compartidos por todos los usuarios, mientras que la segunda permite la creación de paquetes sólo por un usuario o grupo específico. Las extensiones, cuando son instaladas en una carpeta de extensiones diferente, son también normalmente específicas del usuario. Cualquier archivo manifest situado en cualquier carpeta chrome será examinado para ver que los paquetes instalados.

- -

En la siguiente sección, veremos como referirse a un paquete chrome usando la URL chrome.

- -

{{ PreviousNext("Tutorial de XUL:Introducción", "Tutorial de XUL:La URL chrome") }}

- -

Interwiki Language Links

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/foco_y_selecci\303\263n/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/foco_y_selecci\303\263n/index.html" deleted file mode 100644 index 89f2b7bfdd..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/foco_y_selecci\303\263n/index.html" +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Foco y Selección -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Foco_y_Selección -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Focus_and_Selection ---- -

Esta sección describe como gestionar el foco y la selección de los elementos.

- -

Elementos con foco

- -

El elemento con foco se refiere al elemento que actualmente recibe los eventos de entrada. Si hay tres campos de texto en una ventana, el que tiene el foco es en el que el usuario puede introducir texto. Sólo un elemento por ventana puede tener el foco en un momento dado.

- -

El usuario puede cambiar el foco haciendo clic en un elemento o usando la tecla TAB. Cuando la tecla TAB es presionada, el foco pasa al siguiente elemento. Para ir al elemento anterior puede pulsarse Mayúsculas + Tab.

- -

Reordenación del orden de tabulación

- -

Puedes cambiar el orden en que los elementos reciben el foco cuando el usuario presiona TAB si especificas un valor para el atributo tabindex en cada elemento. El valor de este atributo debe ser un número. Cuando el usuario presiona la tecla TAB, el foco cambiará al elemento con el tabindex inmediatamente superior al elemento actual. Esto significa que puedes ordenar los elementos si les asignas índices en forma secuencial. Normalmente, sin embargo, no especificarás un valor para el atributo tabindex. Si no lo especificas, presionar la tecla TAB pondrá el foco en el siguiente elemento marcado en el código. Sólo necesitas especificarlo si deseas usar un orden distinto. Aquí hay un ejemplo:

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<button label="Botón 1" tabindex="2"/>
-<button label="Botón 2" tabindex="1"/>
-<button label="Botón 3" tabindex="3"/>
-
- -

El evento enfoque

- -

El evento onfocus (enfoque) se usa para responder cuando un elemento recibe el foco. El evento onblur (desenfocado) se usa para responder cuando el foco se retira de un elemento. Ambos eventos funcionan igual que sus equivalentes en HTML. Puedes usar estos gestores para iluminar un elemento o mostrar un texto de ayuda en la barra de estado. El siguiente ejemplo puede ser usado para aplicar una función a la gestión del evento de enfoque.

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<script>
-function displayFocus()
-{
-  var elem=document.getElementById('sbar');
-  elem.setAttribute('value','Introduce tu número de teléfono.');
-}
-</script>
-
-<textbox id="tbox1"/>
-<textbox id="tbox2" onfocus="displayFocus();"/>
-<description id="sbar" value=""/>
-
- -

El evento onfocus, cuando ocurra, llamará a la función displayFocus(). Esta función cambiará el valor de la etiqueta. Podemos extender este ejemplo para eliminar ese texto cuando el elemento pierde el foco. Generalmente, usarás los eventos de enfoque y desenfocado para actualizar partes de la interfaz cuando el usuario seleccione elementos. Por ejemplo, calculando un total cuando usuario introduzca valores en otros campos, o usando los eventos de foco para validar ciertos valores. No muestres diálogos de alerta durante los eventos de foco ya que generalmente esto incomodará o distraerá al usuario y por ello se considera un diseño de interfaz bastante pobre.

- -

También puedes añadir gestores de eventos dinámicamente usando la función del DOM addEventListener. Puedes usarla para cualquier tipo de elemento. Toma tres parametros, el tipo de evento, la función a ejecutar cuando ocurre el evento y un booleano indicando si debe ser capturado o no.

- -

Obtención del elemento actualmente enfocado

- -

El elemento enfocado actualmente se registra en un objeto llamado despachador de comandos (command dispatcher), del cual sólo hay una instancia en cada ventana. El despachador de comandos es responsable de mantener controlado el elemento que tiene el foco cuando el usuario usa el interfaz. El despachador de comandos también tiene otras tareas, que serán discutidas en un próxima sección sobre los comandos. Por ahora, miraremos algunas de las características relacionadas con la focalización.

- -

Puedes obtener el despachador de comandos de la ventana usando la propiedad commandDispatcher del documento. Desde ahí, puedes saber el elemento enfocado actualmente con el atributo focusedElement del despachador. El siguiente ejemplo ilustra cómo hacerlo.

- -

Ejemplo 3: Código Ver en funcionamiento

- -
<window id="focus-example" title="Ejemplo de Foco"
-       onload="init();"
-       xmlns="http://www.mozilla.org/keymaster/gat...re.is.only.xul">
-
-  <script>
-  function init()
-  {
-    addEventListener("focus",setFocusedElement,true);
-  }
-
-  function setFocusedElement()
-  {
-    var focused = document.commandDispatcher.focusedElement;
-    document.getElementById("focused").value = focused.tagName;
-  }
-  </script>
-
-  <hbox>
-    <label control="username" value="Nombre de usuario:"/>
-    <textbox id="username"/>
-  </hbox>
-
-  <button label="Hola"/>
-  <checkbox label="Recuerda esta decisión"/>
-  <label id="focused" value="-Sin Foco-"/>
-
-</window>
-
- -

En este ejemplo, el gestor de eventos del foco se adjunta a la ventana. Queremos usar un gestor de eventos capturador, así que debemos usar el método addEventListener. Este registrará un gestor de eventos capturador con la ventana, que se encargará de llamar al método setFocusedElement(). Este método coge el elemento que contiene el foco actualmente del despachador de comandos y pone el valor de la etiqueta con el nombre del elemento. Cuando el foco cambia de elemento, la etiqueta mostrará el nombre del elemento que contiene el foco. Algunas cosas que cabe mencionar son las siguientes:

- - - -

Hacer una etiqueta enfocable

- -

Si tuvieras que crear un elemento personalizado, tendrías que definir si este nuevo elemento puede obtener el foco o no. Para ello, puedes usar una propiedad de estilo especial : -moz-user-focus. Esta propiedad controla si un elemento puede ser focalizable. Por ejemplo, podrías crear una etiqueta focalizable como en el siguiente ejemplo.

- -

Ejemplo 4: Código Ver en funcionamiento

- -
<label id="focused" style="-moz-user-focus: normal;"
-         onkeypress="alert('Etiqueta Focalizada');" value="Focalizame"/>
-
- -

La propiedad de estilo está puesta como normal. También puedes ponerla como ignore para que el elemento no sea focalizable. Esta propiedad no debe ser usada para deshabilitar un elemento, para ello puedes usar el atributo disabled ya que se diseñó específicamente para ello. Una vez la etiqueta del ejemplo obtiene el foco, puede responder a pulsaciones del teclado. Naturalmente, la etiqueta no da ninguna indicación de estar focalizada, ya que normalmente no debería poder obtener el foco.

- -

Cambio del foco

- -

Hay distintas formas de cambiar el elemento actualmente enfocado. La más simple es llamando al método focus del elemento XUL que deseas tener enfocado. El método blur sería usado para desfocalizar un elemento. El siguiente ejemplo muestra su uso.

- -

Ejemplo 5: Código Ver en funcionamiento

- -
<textbox id="addr"/>
-
-<button label="Foco" oncommand="document.getElementById('addr').focus()"/>
-
- -

Opcionalmente puedes usar los métodos advanceFocus y rewindFocus del despachador de comandos. Estos métodos mueven el foco al siguiente o anterior elemento respectivamente. Esto es lo que pasa cuando se presiona TAB o Mayúsculas+TAB.

- -

Para las cajas de texto, un atributo especial focused se añade cuando el elemento tiene el foco. Puedes comprobar la presencia del atributo para determinar si el elemento está enfocado, ya sea mediante un guión o desde una hoja de estilos. Tendrá el valor true si la caja de texto tiene el foco y si no lo tuviera el atributo ni siquiera estará presente.

- -

Comportamientos específicos de plataforma

- -
-
Max OS X
-
Hay una preferencia llamada "Acceso Total al Teclado" (Full Keyboard Access, FKA). Nota que XUL es fiel a esto. Esto quiere decir que cuando la preferencia FKA estáoff, sólo las cajas de texto y las listas/árboles son enfocables con el teclado, así como de tu teclado utilizando el método focus.
-
- -

Manejo de cambios de texto

- -

Hay dos eventos que pueden ser utilizados cuando el usuario cambia el valor de una caja de texto. Naturalmente, estos eventos sólo serán enviados a la caja de texto que tiene el foco.

- - - -

Selección de texto

- -

Cuando trabajamos con cajas de texto, seguramente deseemos obtener el texto seleccionado en lugar de todo el texto. También es posible que necesitemos cambiar la selección actual.

- -

Las cajas de texto en XUL soportan una forma de obtener y modificar la selección. La forma más sencilla es seleccionar todo el texto de la caja. Esto involucra usar el método select de la caja de texto.

- -
tbox.select();
-
- -

Sin embargo, podrías querer seleccionar tan sólo una parte del texto. Para hacerlo puedes usar la función setSelectionRange. Toma dos parametros, el primero es la posición del caracter inicial y el segundo es la posición del caracter inmediatamente posterior al fin de la selección. Los valores comienzan en 0, así que la posición del primer caracter es 0, la del segundo 1 …

- -
tbox.setSelectionRange(4,8);
-
- -

Este ejemplo seleccionará el quinto, sexto, séptimo y octavo caracteres. Si tan sólo hubiera seis caracteres, sólo el quinto y el sexto serían seleccionados, sin provocar ningún error.

- -

Si usas el mismo valor para ambos parametros, el inicio y fin de la selección cambia a la misma posición. Esto equivale a cambiar la posición del cursor dentro de la caja de texto. Por ejemplo, la siguiente línea puede usarse para mover el cursor al inicio del texto.

- -
tbox.setSelectionRange(0,0);
-
- -

Puedes obtener la selección actual usando las propiedades selectionStart y selectionEnd. Estas propiedades contienen los valores de inicio y final de la selección actual respectivamente. Si ambas contienen el mismo valor, significa que no hay ningún texto seleccionado, y los valores serán la posición actual del cursor. Una vez que tienes la posición inicial y final puedes extraer la subcadena del texto completo.

- -

Puedes obtener y modificar el contenido de una caja de texto usando la propiedad value.

- -

Otra propiedad de las cajas de texto bastante útil es textLength, la cual nos dirá el número de caracteres del campo.

- -

Selección de otros elementos

- -

Muchos otros elementos proporcionan métodos para obtener los elementos seleccionados dentro de ellos. Listas, menús y cajas de pestañas tienen la propiedad selectedIndex que podemos usar para obtener el índice del elemento actualmente seleccionado.

- -

Si asignas un valor a la propiedad selectedIndex puedes cambiar el elemento seleccionado.

- -
-

« AnteriorSiguiente »

-
- -

Categorías

- -

links interwikis

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/herencia_de_atributos_xbl_en_firefox_1.5_y_2.0/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/herencia_de_atributos_xbl_en_firefox_1.5_y_2.0/index.html deleted file mode 100644 index 930be87618..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/herencia_de_atributos_xbl_en_firefox_1.5_y_2.0/index.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Herencia de atributos xbl en Firefox 1.5 y 2.0. -slug: >- - Archive/Mozilla/XUL/Tutorial_de_XUL/Herencia_de_atributos_xbl_en_Firefox_1.5_y_2.0. -tags: - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/XBL_Attribute_Inheritance ---- -

 

- -

Herencia de atributos xbl en Firefox 1.5 y 2.0.

- -

He visto por internet que muchas personas están teniendo problemas con xbl:inherits en firefox 1.5 y 2.0 en cualquier plataforma, igual que yo, así que pues me di un tiempo después del trabajo para solucionear el problema, tienes que escribir los xmlns como en mi ejemplo.

- -

 

- -
<?xml version="1.0"?>
-<bindings xmlns="http://www.mozilla.org/xbl" xmlns:xbl="http://www.mozilla.org/xbl" xmlns:xul="http://www.mozilla.org/keymaster/gat...re.is.only.xul">
-<binding id="zona">
- <content>
-  <xul:deck xbl:inherits="selectedIndex" flex="1">
-   <xul:stack>
-           <xul:image src="green1.jpg" />
-           <xul:hbox pack="center">
-             <xul:vbox pack="center">
-               <xul:image style="height: 80px; width: 80px;" src="yinyan-m.jpg" />
-             </xul:vbox>
-           </xul:hbox>
-         </xul:stack>
-   <xul:stack>
-           <xul:image src="green1.jpg"/>
-           <xul:vbox pack="center">
-             <xul:image src="set.jpg"/>
-           </xul:vbox>
-         </xul:stack>
-  </xul:deck>
- </content>
-</binding>
-</bindings>
-
- -

Este archivo se guarda con la extensión .xml por ejemplo miarchivo.xml, de esta manera la herencia de atributos de la forma xbl:inherits funciona incluso con atributos definidos en un namespace. RECUERDEN PONER ATENCIÓN A LOS NAMESPACES xmlns.

- -

 

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/index.html deleted file mode 100644 index 6dbfec687b..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/index.html +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: Tutorial de XUL -slug: Archive/Mozilla/XUL/Tutorial_de_XUL -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial ---- -

-


-

-
-

Este tutorial de XUL fue creado por Neil Deakin. Él nos dio su permiso para que lo usáramos como parte de MDC. -

-
-

Este tutorial describe XUL, el lenguaje de usuario XML. Este lenguaje fue creado para la aplicación Mozilla y es usado para dibujar su interface. -

-

Introducción

- -

Elementos simples

- -

El modelo de caja

- -

Más elementos de diseño

- -

Barra de herramientas y menús

-

Eventos y scripts

- -

Modelo de objeto de documento

- -

Árboles

- -

Plantillas y RDF

- -

Aspectos/temas y configuración

- -

Vinculaciones

- -

Tipos de ventanas especializadas

- -

Instalación

- -
-

Información original del documento

-
-
-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/instalando_scripts/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/instalando_scripts/index.html deleted file mode 100644 index 80db82b861..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/instalando_scripts/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Instalando Scripts -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Instalando_Scripts -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Install_Scripts ---- -

 

-

Esta sección describe el script de instalación.

-

Creando un script de instalación

-

Usted deseará generalmente alguna forma de control sobre el proceso de instalacion. Por ejemplo, usted puede desear comprobar versiones de archivos e instalar solamente archivos actualizados, o quizás usted desea aplicar parches a los archivos existentes. El script de instalación es lo suficiente flexible para permitirle desinstalar archivos. Por esta razón, los instaladores incluyen un script de instalación para manejar el proceso de la instalación.

-

El script de instalación se debe llamar install.js y se debe colocar en el nivel superior del archivo del instalador. El script contendrá código Javascript que ejecutará varias funciones de instalación.

-

En un documento HTML, o un documento XUL, el objeto window es el objeto global de la raíz. Eso significa que usted puede llamar los métodos del objeto window sin usar el calificador antes de la llamada, lo que significa que window.open(…) se puede escribir simplemente open(…). En un script de instalación, no hay ventana asociada, sin embargo el objeto global será un objeto Install que contiene varias funciones para personalizar el proceso de instalación. Algunas de las funciones del objeto Install serán descritas abajo.

-

El script de instalación debe seguir los siguientes pasos:

-
    -
  1. Inicie la instalación especificando qué paquete y versión está siendo instalada.
  2. -
  3. Utilice las funciones de instalación para indicar qué archivos y directorios necesitan ser instalados. Usted puede también fijar los archivos que se moverán y serán suprimidos.
  4. -
  5. Comience el proceso de instalar los archivos necesarios.
  6. -
-

Es importante observar que durante el paso dos, usted indica solamente qué archivos deben ser instalados y que suceda cualquier otra operación que usted desee. Ningún archivo se copia hasta el paso tres. Debido a esto, usted puede especificar fácilmente un número de archivos que se instalarán, viene a través de una cierta clase de error, y aborta el proceso entero sin la modificación del sistema del usuario.

-

El Registro de Componentes

-

Mozilla mantiene un archivo que es un registro de todos los componentes que están instalados actualmente. Los componentes incluyen los nuevos paquetes de chrome, skins y extensiones. Cuando un nuevo componente es instalado, el registro se actualiza. El registro almacena los archivos y la información de versión de los componentes instalados. De esa forma, es más fácil comprobar si una versión de su componente está presente y actualizarlo solamente en caso de necesidad.

-

Los componentes del registro trabajan como el registro de Windows. Consiste en una jerarquía de llaves y de valores. Usted no necesita saber mucho sobre eso para crear aplicaciones XUL a menos que usted esté creando sus propios componentes XPCOM.

-

Lo qué usted necesita saber para una instalación es que el registro almacena un sistema de información sobre su aplicación, tal como la lista del archivo y las versiones. Toda esta información se almacena en una llave (y dentro de subkeys) que usted proporciona en la escritura de la instalación (en el paso 1 mencionado arriba).

-

Esta llave esta estructurada como un directorio de la trayectoria de la forma siguiente:

-
/Author/Package Nombre
-
-

Substituya la palabra Author por su nombre y substituya el nombre del paquete por el nombre del paquete que usted está instalando. Por ejemplo:

-
/Xulplanet/Find Files
-
-/Netscape/Personal Security Manager
-
-

El primer ejemplo es el que utilizaremos para el diálogo de búsqueda de archivos. El segundo es la llave usada para el Personal Security Manager.

-

Iniciar la Instalación

-

El objeto Install tiene una función, initInstall, que se puede utilizar para iniciar la instalación. Debe ser ejecutada al principio de su script de instalación. La sintaxis de esta función es como sigue:

-

initInstall( packageName , regPackage , version );

-

Ejemplo:

-

initInstall("Find Files","/Xulplanet/Find Files","0.5.0.0");

-

El primer parámetro es el nombre del paquete en forma legible. El segundo parámtro es la llave del registro usada para guardar la información del paquete según lo descrito antes. El tercer parámetro es la versión del paquete que esta siendo instalado.

-

Después, necesitamos definir el directorio donde serán instalados los archivos. Hay dos maneras de hacer esto. El método simple asigna un directorio de la instalación e instala todos los archivos en él. El segundo método permite que usted asigne una destinación basándose en el archivo-por-archivo (o directorio). El primer método se describe abajo.

-

La función setPackageFolder asigna un directorio de la instalación. Para el diálogo de búsqueda de archivos, instalaremos los archivos en el directorio chrome. (realmente podría ponerlos dondequiera.) El setPackageFolder toma una discusión, el directorio donde sera instalado. Para una máxima portabilidad, usted no puede especificar una cadena de caracteres para el directorio. En lugar de eso, usted especifica un identificador de un directorio conocido y abre subdirectorios de él. Así, si sus aplicaciones necesitan instalar algunas bibliotecas de sistema, usted no necesitará saber el nombre de esos directorios.

-

Los identificadores de directorio se enumeran en XULPlanet reference. Para el directorio chrome, el identificador del directorio es 'Chrome'. La función getFolder se puede utilizar para conseguir uno de estos directorios especiales. Esta función tiene dos parámetros, el primero es el identificador y el segundo es un subdirectorio. Por ejemplo:

-
findDir = getFolder("Chrome","findfile");
-setPackageFolder(findDir);
-
-

Aquí, conseguimos la carpeta findfile en la carpeta chrome y la pasamos directamente a la función del setPackageFolder. La segunda discusión al getFolder es el subdirectorio en el cual vamos a instalar, que no tiene que existir. Usted puede dejar esta discusión enteramente afuea si usted no necesita uno.

-

Especificar los archivos a instalar

-

Después, usted necesita especificar qué archivos deben ser instalados. Esto implica el uso de dos funciones, addDirectory y addFile. La función addDirectory le dice al instalador que un directorio del archivo XPI (y de todo su contenido) debe ser instalado a un lugar particular. El addFile es similar pero para un solo archivo.

-

Las funciones addDirectory y addFile tienen varias formas. Las más simples solo tienen una discusión, el directorio del instalador para instalar al directorio asignado de la instalación.

-

addDirectory ( dir ); addFile ( dir );

-

Ejemplo:

-

addDirectory("findfile");

-

El ejemplo anterior especificará que el directorio findfile del archivo del instalador debe ser instalado. Podemos llamar estas funciones múltiples veces para instalar otros archivos.

-

Después, desearemos colocar los archivos de busqeuda en el sistema del chrome para poderlo utilizar con un cromo URL. Esto se puede hacer con la función registerChrome. Toma dos discusiones, el primero es el tipo de chrome a colocarse (contenido, skin o ‘locale’). El segundo es el directorio que contiene el archivo de contents.rdf para colocarse. Porque el diálogo de los archivos de busqueda tiene contenido, un archivo skin y un archivo ‘locale’, el registerChrome necesitará ser abierto tres veces.

-
registerChrome(Install.CONTENT | Install.DELAYED_CHROME, getFolder(findDir, "content"));
-registerChrome(Install.SKIN | Install.DELAYED_CHROME, getFolder(findDir, "skin"));
-registerChrome(Install.LOCALE | Install.DELAYED_CHROME, getFolder(findDir, "locale"));
-
-

La bandera de DELAYED_CHROME se utiliza para indicar que el cromo debe ser instalado la próxima vez Mozilla está funcionado.

-

Terminar la Instalación

-

Las funciones addDirectory y addFile no copian ningun archivo. Indican solamente qué archivos deben ser instalados. Semejantemente, el registerChrome indica solamente que el chrome debe ser colocado. Para terminar el proceso y para comenzar a copiar archivos, abra la función performInstall. No toma ninguna discusión.

-

el script final para instalar el componente de búsqueda de archivos se muestra abajo:

-
-

Ejemplo

-
initInstall("Find Files","/Xulplanet/Find Files","0.5.0.0");
-
-findDir = getFolder("Chrome","findfile");
-setPackageFolder(findDir);
-
-addDirectory("findfile");
-
-registerChrome(Install.CONTENT | Install.DELAYED_CHROME, getFolder(findDir, "content"));
-registerChrome(Install.SKIN | Install.DELAYED_CHROME, getFolder(findDir, "skin"));
-registerChrome(Install.LOCALE | Install.DELAYED_CHROME, getFolder(findDir, "locale"));
-
-performInstall();
-
-
-

A continuación veremos algunas funciones adicionales de instalación

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/interfaces_xpcom/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/interfaces_xpcom/index.html deleted file mode 100644 index 5965efa462..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/interfaces_xpcom/index.html +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Interfaces XPCOM -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Interfaces_XPCOM -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/XPCOM_Interfaces ---- -

 

-

En esta sección, vamos a echar un pequeño vistazo a XPCOM (Cross-platform Component Object Model o Modelo de Objeto de Componentes Multiplataforma), el sistema de objetos que utiliza Mozilla.

-

Llamando a Objetos Nativos

-

Usando XUL podemos construir una interfaz de usuario compleja. Podemos asociarle scripts que modificarán la interfaz y ejecutarán tareas. Pero hay bastantes cosas que no podemos hacer directamente con JavaScript. Por ejemplo, si quisieramos crear una aplicación de correo, necesitaríamos escribir scripts que se conectaran con los servidores de correo para obtener el correo y mandarlo. Pero JavaScript no puede hacer esta clase de cosas.

-

La única forma de llevar a cabo estas tareas sería escribiendo código nativo. También necesitaríamos una forma de que nuestros scripts pudieran comunicarse con el código nativo de forma sencilla. Mozilla nos proporciona todo esto con XPCOM (Modelo de Objeto de Componentes Multiplataforma).

-

Acerca de XPCOM

-

Mozilla está construido mediante una colección de componentes, cada uno de ellos responsable de ejecutar una cierta tarea. Por ejemplo, hay un componente para cada menú, botón y elemento. Estos componentes se construyen a partir de un conjunto de definiciones llamadas interfaces.

-

Una interfaz en Mozilla es una definición de un conjunto de funcionalidades que pueden ser implementadas mediante componentes. Los componentes son los encargados de implementar el código que ejecuta las distintas tareas en Mozilla. Cada componente implementa la funcionalidad tal como está descrita en la interfaz. Un único componente puede implementar múltiples interfaces. Y varios componentes pueden implementar la misma interfaz.

-

Tomemos el ejemplo de un supuesto componente archivo. Se necesitaría crear una interfaz que describiera las propiedades y funciones que pueden realizarse sobre los archivos. Un archivo necesitaría propiedades para almacenar su nombre, la fecha de modificación y su tamaño. Entre las funciones del archivo podríamos incluir movernos por el archivo, copiarlo o borrarlo.

-

La interfaz Archivo solo describe las características de un archivo, no las implementa. La implementación de la interfaz Archivo es tarea del componente. El componente tendrá código que será capaz de obtener el nombre del archivo, la fecha y su tamaño. Además, tendrá código que permita copiarlo y renombrarlo.

-

Mientras implemente la interfaz correctamente, no nos preocupa cómo hace todas estas cosas. Evidentemente, necesitaremos diferentes implementaciones, una para cada plataforma. Las versiones de un componente archivo en Windows y Macintosh serán bastante diferentes. De todas formas, ambas implementarán la misma interfaz. Por lo tanto, podemos utilizar un componente accediendo a las funciones que conocemos de la interfaz.

-

En Mozilla, el nombre de las interfaces viene precedido de ‘nsI’ de forma que sean facilmente reconocibles. Por ejemplo, nsIAddressBook es la interfaz que se utiliza para interaccionar con una libreta de direcciones (address book), nsISound se utiliza para reproducir sonidos y nsILocalFile se utiliza para manejo de archivos.

-

Los componentes XPCOM suelen implementarse con código nativo, lo que significa que normalmente pueden hacer cosas que JavaScript no puede por sí mismo. Existe una forma sencilla de llamar a este código nativo, que veremos dentro de poco. Podemos ejecutar cualquiera de las funciones proporcionadas por el componente tal como se describe en las interfaces que implementa. Por ejemplo, una vez que tenemos un componente, podemos comprobar si implementa nsISound, y, si es el caso, podemos reproducir sonidos a través de él.

-

El proceso de llamar a XPCOM desde un script se realiza a través de XPConnect, una capa que traduce los objetos de script en objetos nativos.

-

Creando Objetos XPCOM

-

Hay tres pasos a seguir a la hora de llamar a un componente XPCOM.

-
    -
  1. Obtener el componente
  2. -
  3. Obtener la parte del componente que implementa la interfaz que queremos utilizar.
  4. -
  5. Llamar a la función que necesitamos
  6. -
-

Una vez que se han llevado a cabo los dos primeros pasos, podemos repetir el último paso tantas veces como sea necesario. Digamos que queremos renombrar un archivo. Para eso podemos utilizar la interfaz nsILocalFile. El primer paso es obtener un componente archivo. Después, hacemos una petición al componente y obtenemos la porción que implementa la interfaz nsILocalFile. Por último, llamamos a las funciones proporcionadas por la interfaz. Esta interfaz se utiliza para representar un único archivo.

-

Hemos visto que las interfaces siempre se nombran comenzando con ‘nsI’. Los componentes, por otra parte, se referencian utilizando una sintaxis URI. Mozilla almacena una lista de todos los componentes disponibles en su propio registro. Un usuario puede instalar nuevos componentes si lo desea. Todo esto funciona de forma muy parecida a los plug-ins.

-

Mozilla proporciona un componente archivo, es decir, un componente que implementa nsILocalFile. Este componente puede ser referenciado para ser utilizado usando la URI ‘@mozilla.org/file/local;1’. Para especificar un determinado componente se utiliza la forma componente: URI. Se puede referenciar otros componentes de forma similar.

-

Se puede utiliar esta URI para obtener el componente. Para obtener un componente podemos utilizar un código JavaScript similar al siguiente:

-
var unArchivo = Components.classes["@mozilla.org/file/local;1"].createInstance();
-
-

Se obtiene el componente archivo y éste se almacena en la variable unArchivo.

-

La palabra clave Components del ejemplo anterior hace referencia a un objeto general que proporciona algunas funciones relacionadas con componentes. En este caso, obtenemos la clase de un componente a partir de la propiedad classes. La propiedad classes es un vector de todos los componentes disponibles. Para obtener un componente diferente, simplemente tendrías que reemplazar la URI de este componente por la del componente que quieras utilizar. Por último, se crea una instancia con la función createInstance.

-

Deberías comprobar el valor de retorno de createInstance para asegurarte de que no sea null, lo que indicaría que el componente no existe.

-

Llegados a este punto tenemos solo una referencia al componente archivo en sí. Para poder llamar a sus funciones necesitamos obtener una de sus interfaces, en este caso nsILocalFile. Necesitamos añadir una segunda línea de código:

-
var unArchivo = Components.classes["@mozilla.org/file/local;1"].createInstance();
-if (unArchivo) unArchivo.QueryInterface(Components.interfaces.nsILocalFile);
-
-

QueryInterface es una función proporcionada por todos los componentes que puede ser utilizada para obtener una interfaz específica de ese componente. Esta función toma un solo parámetro, la interfaz que queremos obtener. La propiedad interfaces del objeto Components contiene una lista de todas las interfaces disponibles. En este caso, utilizamos la interfaz nsILocalFile y la pasamos como parámetro a QueryInterface. El resultado es que unArchivo será una referencia a la parte del componente que implementa la interfaz nsILocalFile.

-

Las dos líneas de JavaScript anteriores pueden ser utilizadas para obtener cualquier interfaz de un componente. Simplemente reemplaza el nombre del componente con el nombre del componente que quieras utilizar y sustituye también el nombre de la interfaz. Por supuesto, también puedes utilizar cualquier nombre de variable. Por ejemplo, para obtener una interfaz sonido, puedes hacer lo siguiente:

-
var sonido = Components.classes["@mozilla.org/sound;1"].createInstance();
-if (sonido) sonido.QueryInterface(Components.interfaces.nsISound);
-
-

Las interfaces XPCOM pueden heredar de otras interfaces. Las interfaces que heredan de otras tienen sus propias funciones y las funciones de todas las interfaces de las que heredan. Todas las interfaces heredan de una interfaz raíz llamada nsISupports. En esta interfaz se define la función QueryInterface, que ya hemos visto. Dado que todos los componentes implementan la interfaz nsISupports, la función QueryInterface está disponible en todos los componentes.

-

Varios componentes distintos pueden implementar la misma interfaz. Normalmente, suelen ser subclases de la original pero no es necesario. Cualquier componente puede implementar la funcionalidad de nsILocalFile. Además, un componente puede implementar varias interfaces. Por esto es por lo que se necesitan dos pasos a la hora de obtener una interfaz con la que llamar a las funciones.

-

De todas formas, existe un atajo que podemos utilizar dado que estas dos líneas se utilizan tan amenudo:

-
var aLocalFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
-
-

Esto tiene el mismo efecto que las dos líneas anteriores pero en una sola línea de código, lo cual elimina la necesidad de crear la instancia y pedir una interfaz en dos pasos distintos.

-

Si llamas a QueryInterface sobre un objeto y la interfaz pedida no está soportada por el objeto, se lanza una excepción. Si no estas seguro de si un componente soporta una determinada interfaz, puedes utilizar el operador instanceof para comprobarlo:

-
var unArchivo = Components.classes["@mozilla.org/file/local;1"].createInstance();
-if (unArchivo instanceof Components.interfaces.nsILocalFile){
-  // hacer algo
-}
-
-

El operador instanceof devuelve verdadero si unArchivo implementa la interfaz nsILocalFile. Esto tiene el efecto secundario de llamar a QueryInterface, de forma que unArchivo será un nsILocalFile después.

-

Llamando a las Funciones de una Interfaz

-

Ahora que tenemos un objeto que referencia un componente con la interfaz nsILocalFile, podemos llamar a las funciones de nsILocalFile a través de él. La tabla siguiente muestra alguna de las propiedades y métodos de la interfaz nsILocalFile.

-

Propiedad / método Descripción

-
-
- initWithPath 
-
- Este método se utiliza para inicializar la ruta y el nombre de archivo para nsILocalFile. El primer parámetro debería ser la ruta del archivo, como ‘/usr/local/mozilla’
-
- leafName  
-
- El nombre de archivo sin la parte del directorio
-
- fileSize 
-
- El tamaño del directorio
-
- isDirectory() 
-
- Devuelve verdadero si nsILocalFile representa un directorio
-
- delete(recursivo) 
-
- Borra un archivo. Si el parámetro recursivo es true, también permite borrar un directorio y todos sus archivos y subdirectorios.
-
- copyTo(directorio,nuevonombre) 
-
- Copia un archivo a otro directorio, puede usarse también para renombrar el archivo. El parámetro directorio debería ser un nsILocalFile que sirva como apuntador del directorio donde se quiere copiar el archivo.
-
- moveTo(directorio,nuevonombre) 
-
- Permite mover un archivo a otro directorio, o renombrar el archivo. El parámetro directorio debería ser un nsILocalFile apuntando al directorio al que se quiere mover el archivo.
-
-

Para borrar un archivo primero tenemos que asignarlo al nsILocalFile. Podemos llamar al método initWithPath para indicar el archivo al que nos referimos. Simplemente asigna la ruta del archivo a su propiedad. Después, llamamos a la función delete. Esta función toma un parámetro que indica si debe borrar de forma recursiva. El siguiente código sirve como demostración de estos dos pasos:

-
var unArchivo = Components.classes["@mozilla.org/file/local;1"].createInstance();
-if (unArchivo instanceof Components.interfaces.nsILocalFile){
-  unArchivo.initWithPath("/mozilla/archivoprueba.txt");
-  unArchivo.delete(false);
-}
-
-

Este código obtiene el archivo de /mozilla/testfile.txt y lo borra. Prueba este ejemplo añadiendo este código a un manejador de evento. Deberías cambiar el nombre de archivo a un archivo existente en tu sistema de archivos y que quieras borrar.

-

En la tabla de funciones anterior, verás dos funciones copyTo y moveTo. Estas dos funciones puede ser utilizadas para copiar archivos y mover archivos respectivamente. Ten en cuenta que estos no toman una cadena de caracteres como parámetro indicando el directorio al que copiar o mover el archivo, si no un nsILocalFile. Esto significa que tendrás que obtener dos componentes archivo. El siguiente ejemplo muestra como copiar un archivo.

-
function copiarArchivo(archivofuente,dirdestino)
-{
-  // obtenemos un componente para el archivo a copiar
-  var unArchivo = Components.classes["@mozilla.org/file/local;1"]
-    .createInstance(Components.interfaces.nsILocalFile);
-  if (!unArchivo) return false;
-
-  // obtenemos un componente para el directorio donde queremos copiar
-  var unDirectorio = Components.classes["@mozilla.org/file/local;1"]
-    .createInstance(Components.interfaces.nsILocalFile);
-  if (!unDirectorio) return false;
-
-  // asignamos las URLs a los componentes archivo
-  unArchivo.initWithPath(archivofuente);
-  unDirectorio.initWithPath(dirdestino);
-
-  // finalmente, copiamos el archivo, sin renombrarlo
-  unArchivo.copyTo(unDirectorio,null);
-}
-
-copyFile("/mozilla/archivoprueba.txt","/etc");
-
-

Servicios XPCOM

-

Existen algunos componentes XPCOM especiales llamados servicios. No tienes que crear instancias de ellos porque solo puede existir uno. Los servicios proporcionan funciones de carácter general que pueden obtener o establecer el valor de información global o ejecutar operaciones en otros objetos. En lugar de llamar a createInstance, llamamos a getService para obtener una referencia al componente del servicio. A parte de eso, los servicios no son demasiado diferentes de los demás componentes.

-

Uno de los servicios que proporciona Mozilla es un servicio de marcadores. Este permite añadir marcadores a la lista de marcadores del usuario. A continuación podemos ver un ejemplo:

-
var marcadores = Components.classes["@mozilla.org/browser/bookmarks-service;1"].getService();
-marcadores.QueryInterface(Components.interfaces.nsIBookmarksService);
-marcadores.addBookmarkImmediately("http://www.mozilla.org","Mozilla",0,null);
-
-

Primero obtenemos el componente “@mozilla.org/browser/bookmarks-service;1�? y su servicio se coloca en una variable marcadores. Utilizamos QueryInterface para obtener la interfaz nsIBookmarksService. La función addBookmarkImmediately proporcionada por esta interfaz puede utilizarse para añadir marcadores. Los dos primeros parámetros de la función son la URL y el título del marcador. El tercer parámetro es el tipo del marcador que valdrá 0 normalmente, y el último parámetro es la codificación de caractéres del documento que estamos añadiendo a marcadores, que puede ser null.

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/introducci\303\263n/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/introducci\303\263n/index.html" deleted file mode 100644 index 9c010ca596..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/introducci\303\263n/index.html" +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Introducción -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Introducción -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Introduction ---- -
-

Siguiente »

-
- -

Este tutorial te guiará durante el aprendizaje de XUL (XML Lenguaje de Interfaz de Usuario) el cual es un lenguaje múltiplataforma para describir la interfaz de usuario de las aplicaciones.

- -

Este tutorial te mostrará la creación de una sencilla interfaz de usuario de un buscador de archivos, muy parecida a la suministrada por la aplicación de Macintosh Sherlock o el cuadro de diálogo de búsqueda de archivos en Windows. Observa que solo se creará la interfaz de usuario y su funcionalidad será limitada. No se implementará la búsqueda de archivos propiamente dicha. Se mostrará una linea azul en la parte izquierda del párrafo donde se modificará el diálogo de búsqueda.

- -

¿Qué es XUL y porque fue creado?

- -

XUL (se pronuncia “sul? y rima con “cool?) fue creado para facilitar y acelerar el desarrollo del navegador Mozilla. Es un lenguaje XML, por lo tanto todas las características del XML están también en XUL.

- -

La mayoría de las aplicaciones necesitan ser desarrolladas usando características de una plataforma específica, convirtiendo el desarrollo de aplicaciones múltiplataformas en una tarea costosa y que consume mucho tiempo. Esto podrá no importarle a algunas personas, pero el usuario podría querer usar la aplicación en otros dispositivos, como equipos de bolsillo.

- -

En el pasado se desarrollaron muchas soluciones multiplataforma. Por ejemplo, Java tiene como un punto fuerte de venta la soportabilidad. XUL es un lenguaje diseñado específicamente para construir interfaces soportables.

- -

Desarrollar una aplicación toma mucho tiempo incluso si es sólo para una plataforma. El tiempo requerido para compilar y depurar también puede ser muy largo. Con XUL, una interfaz puede ser implementada y modificada de forma fácil y rápida.

- -

XUL tiene todas las ventajas de otros lenguajes XML. Por ejemplo, XHTML u otros lenguajes XML como MathML o SVG se pueden usar junto a él. Además, el texto que se muestra con XUL es fácilmente localizable, lo que significa que puede ser traducido a otros idiomas con poco esfuerzo. Se pueden aplicar hojas de estilo para modificar la apariencia de la interfaz de usuario (muy parecido a las funcionalidades de aspectos o temas presentes en Winamp o algunos gestores de ventanas).

- -

¿Que tipo de interfaz se puede hacer con XUL?

- -

XUL proporciona la habilidad de crear la mayoría de los elementos encontrados en las interfaces gráficas modernas. Es tan general que este puede ser aplicado a las necesidades específicas de ciertos dispositivos y tan poderoso que los desarrolladores pueden crear sofisticadas interfaces con éste.

- -

Algunos elementos que pueden ser creados son:

- - - -

El contenido mostrado puede ser creado desde el contenido de un archivo XUL o con datos de una fuente de datos. En Mozilla, tales fuentes de datos son utilizadas para los mensajes de una cuenta de correo, los marca-páginas y los resultados de búsqueda. El contenido de los menúes, árboles y otros elementos pueden ser llenados con estos datos, o con sus propios datos suministrados en un archivo RDF (Resource Description Framework).

- -

Existen varios casos en los cuales aplicaciones XUL son creadas:

- - - -

Los tres primeros tipos necesitan cada uno su instalación en la máquina del usuario. Por lo cual, estos tipos de aplicaciones no tienen restricciones de seguridad, pueden acceder a los archivos locales y leer y escribir las preferencias, por ejemplo. El contenido XUL es normalmente cargado desde un paquete instalado dentro de Mozilla. Los archivos XUL, "scripts" asociados e imágenes de una aplicación podrán ser empaquetados dentro de un simple archivo, descargados e instalados por el usuario. Mozilla proporciona una manera de tener estos paquetes instalados y registrados sin tener que escribir un montón de códigos complejos. Además, estos paquetes pueden incorporarse al navegador u otras aplicaciones para adicionarles características; esta es la forma en que trabajan las extensiones de Firefox.

- -

También es posible abrir directamente archivos XUL desde el sistema de archivos o desde un sitio web remoto, sin embargo ellos estarán restringidos en el tipo de operaciones que puedan hacer, y algunas características de XUL no trabajarán. En cambio, si Ud. quiere cargar el contenido XUL desde un sitio remoto, el servidor web debe estar configurado para enviar archivos XUL con contenidos de tipo 'application/vnd.mozilla.xul+xml'. El XUL es usualmente almacenado en archivos con una extensión .xul. Ud. puede abrir un archivo XUL con Mozilla tal como abre otros archivos, usando el comando Abrir Archivo desde el menú de Archivo o escribiendo la URL en la barra de dirección.

- -

¿Que necesita conocer para utilizar este tutorial?

- -

Debe tener conocimentos de HTML (HyperText Markup Language) y por lo menos, conocimientos básicos de XML y CSS (Cascading Style Sheets). Aquí se exponen algunas reglas que debe tener en mente:

- - - -

XUL está soportado en Mozilla y otros navegadores basados en el motor Gecko, tales como Netscape 6 o posteriores y Mozilla Firefox. Debido a los diversos cambios que ha tenido la sintaxis de XUL en el tiempo, tener la última versión de su navegador permitirá que los ejemplos trabajen adecuadamente. La mayoría de los ejemplos deben funcionar en Mozilla 1.0 o posteriores. XUL es bastante similar en Firefox y los otros navegadores, aunque tiene algunas diferencias específicas como el soporte de barras de herramientas personalizables.

- -

Este tutorial intenta cubrir gran parte de la funcionalidad de XUL, no obstante, no trata todas las características. Una vez se haya familiarizado con el lenguaje XUL puede utilizar la referencia de elementos del lenguaje XUL (en) para encontrar otras características soportadas por elementos específicos del lenguaje.

- -
-

Siguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/introducci\303\263n_a_rdf/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/introducci\303\263n_a_rdf/index.html" deleted file mode 100644 index 8315441b4c..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/introducci\303\263n_a_rdf/index.html" +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: Introducción a RDF -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Introducción_a_RDF -tags: - - RDF - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Introduction_to_RDF ---- -

En ésta sección, miraremos el Marco de Descripción de Recursos (RDF) (Resource Description Framework).

- -

Marco de descripción de recursos

- -

Podemos usar los elementos del árbol para mostrar un conjunto de datos, tales como bookmarks o mensajes de email. Sin embargo, Sería inconveniente hacerlo así ingresando los archivos diretamente en el archivo XUL. Eso haría muy difícil modificar los (marcadores) bookmarks si ellos estuviesen directamente en el archivo XUL. La forma de solucionar ésto es usando un recurso de datos RDF.

- -

RDF (Marco de Descripción de Recursos) Es un formato que puede ser usado para almacenar recursos tales como marcadores o bookmarks y correos. Alternativamente, datos en otros formatos pueden ser usados y códigos de escritura que leerán el archivo y crearán datos RDF de ellos. Así es como Mozilla funciona, cuando él lee los datos tal como marcadores o bookmarks, el historial o los correos, Mozilla provee datos de recurso para este dato común para que pueda facilmente usarlos.

- -

Puedes usar cualquiera de los datos de recurso RDF proveidos para poblar árboles con datos a or you can point to an RDF file stored in XML which contains the data. This makes it very convenient to display trees with lots of rows in them. RDF can also populate other XUL elements as well such as listboxes and menus. We'll see this in the next section.

- -

A very brief overview of RDF will be provided here. For a more detailed guide to RDF, ver Introducción al modelo RDF, en XULPlanet. It is recommended that you read this guide if you are new to RDF.

- -

Para más información sobre RDF, ver la especificación RDF.

- -

RDF/XML

- -

RDF consta de un modelo, el cual es una representación gráfica de datos. RDF/XML es un lenguaje XML que puede ser usado para representar un dato RDF. Ello contiene un conjunto de elementos bastante simples. El ejemplo de abajo muestra una simple plantilla RDF

- -
<?xml version="1.0"?>
-<RDF:RDF
-  xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-  ...
-</RDF:RDF>
-
- -

Ésto tiene similitudes con el encabezador de XUL. En vez de window element, el elemento RDF es usado. puedes ver el namespace (espacio de nombre) para RDF fue declarado así para que los elementos RDF sean reconocidos apropiadamente. Dentro del elemento RDF, podrás colocar el dato. para ver algún ejemplo de archivos RDF/XML, Mira aquellas proveidas por Mozilla. Ellos tienen la extensión rdf.

- -

Base de datos RDF

- -

Tomemos el ejemplo de una lista de marcadores generados desde RDF.Una lista de marcadores contiene un conjunto de registros,Cada uno con un conjunto asociado a ello, tal como una URL, Un título de marcador y un fecha de visita.

- -

Piensa en el marcador como una base de datos, el cual es almacenado en una grande tabla con numerosos campos. En el caso de RDF o como sea, Las listas pueden ser jerarquizadas también. Esto es necesario para nosotros podamos tener carpetas o categorías de los marcadores. cada uno de los campos en la base de datos RDF es un recurso, cada uno con su nombre asociado a ello. El nombre es descrito por un URI.

- -

Por ejemplo, una selección de campos en la lista de marcadores de Mozilla es descrito por los URIs below:

- - - - - - - - - - - - - - - - - - - - - - - - -
Nombrehttp://home.netscape.com/NC-rdf#NombreBookmark name
URLhttp://home.netscape.com/NC-rdf#URLURL to link to
Descripciónhttp://home.netscape.com/NC-rdf#DescripciónBookmark description
Fecha última visitahttp://home.netscape.com/WEB-rdf#FechaÚltimaVisitaLa fecha en la cual se visitó por última vez
- -

These are generated by taking a namespace name and appending the field name. In the next section, we'll look at how we can use these to fill in the field values automatically. Note that the last visited date has a slightly different namespace than the other three.

- -

Ejemplo de archivo RDF/XML

- -

Below, a sample RDF/XML file is shown, listing a table with three records and three fields.

- -
<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-         xmlns:ANIMALS="http://www.some-fictitious-zoo.com/rdf#">
-
-  <RDF:Seq about="http://www.some-fictitious-zoo.com/all-animals">
-    <RDF:li>
-       <RDF:Description about="http://www.some-fictitious-zoo.com/mammals/lion">
-         <ANIMALS:name>León</ANIMALS:name>
-         <ANIMALS:species>Panthera leo</ANIMALS:species>
-         <ANIMALS:class>Mamífero</ANIMALS:class>
-       </RDF:Description>
-    </RDF:li>
-    <RDF:li>
-       <RDF:Description about="http://www.some-fictitious-zoo.com/arachnids/tarantula">
-         <ANIMALS:name>Tarántula</ANIMALS:name>
-         <ANIMALS:species>Avicularia avicularia</ANIMALS:species>
-         <ANIMALS:class>Araña</ANIMALS:class>
-       </RDF:Description>
-    </RDF:li>
-    <RDF:li>
-       <RDF:Description about="http://www.some-fictitious-zoo.com/mammals/hippopotamus">
-         <ANIMALS:name>Hipopótamo</ANIMALS:name>
-         <ANIMALS:species>Hippopotamus amphibius</ANIMALS:species>
-         <ANIMALS:class>Mamífero</ANIMALS:class>
-       </RDF:Description>
-    </RDF:li>
-  </RDF:Seq>
-</RDF:RDF>
-
- -

Here, three records have been described, one for each animal. Each RDF:Description tag describes a single record. Within each record, three fields are described, name, species and class. It isn't necessary for all records to have the same fields but it makes more sense to have them all the same.

- -

Each of three fields have been given a namespace of ANIMALS, the URL of which has been declared on the RDF tag. The name was selected because it has meaning in this case, but we could have selected something else. The namespace feature is useful because the class field might conflict with that used for styles.

- -

The Seq and li elements are used to specify that the records are in a list. This is much like how HTML lists are declared. The Seq element is used to indicate that the elements are ordered, or in sequence. Instead of the Seq element, you can also use Bag to indicate unordered data, and Alt to indicate data where each record specifies alternative values (such as mirror URLs).

- -

The resources can be referred to in a XUL file by combining the namespace URL followed by the field name. In the example above, the following URIs are generated which can be used to refer to the specific fields:

- - - - - - - - - - - - - - - - -
Nombrehttp://www.some-fictitious-zoo.com/rdf#name
Especieshttp://www.some-fictitious-zoo.com/rdf#species
Clasehttp://www.some-fictitious-zoo.com/rdf#class
- -

Next, we'll see how we can use RDF to populate XUL elements.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/la_url_chrome/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/la_url_chrome/index.html deleted file mode 100644 index d62ed39007..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/la_url_chrome/index.html +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: La URL chrome -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/La_URL_chrome -translation_of: Archive/Mozilla/XUL/Tutorial/The_Chrome_URL ---- -
-

« AnteriorSiguiente »

-
- -


- La siguiente sección describe cómo referirse a los documentos XUL y otros archivos chrome.

- -

La URL Chrome

- -

Los archivos XUL pueden accederse con una URL HTTP común, igual que los archivos HTML. Sin embargo, se puede hacer referencia a los paquetes que se instalan dentro del sistema chrome de Mozilla con un URL chrome especial. Los paquetes incluidos con Mozilla ya se encuentran instalados, pero tu puedes registrar los tuyos.

- -

Los paquetes instalados tienen la ventaja de que no tienen restricciones de seguridad establecidas, que es necesario para muchas aplicaciones. Otra ventaja sobre otro tipo de URL es que maneja automáticamente múltiples temas e idiomas. Por ejemplo, una URL chrome permite referirse a un archivo del tema como una imagen, sin necesidad de saber cuál es el tema que el usuario está usando. Siempre y cuando los nombres de los archivos sean iguales en cada tema, te puedes referir a ellos usando una URL chrome. Mozilla se encargará de determinar dónde se encuentran los archivos para retornar los datos correctos. Esto significa que realmente no importa dónde se encuentre instalado el paquete para poder acceder a el. Las URL chrome son independientes de donde se encuentren instalados fisicamente los archivos. Esto hace más fácil escribir aplicaciones que tienen muchos archivos ya que no tienes que preocuparte por el detalle de dónde se encuentran localizados.

- -

La sintaxis básica de una URL chrome es la siguiente

- -
chrome://<nombre del paquete>/<parte>/<archivo.xul>
-
- -

El texto <nombre del paquete> es el nombre del paquete, como lo puede sermessenger (IM) o el editor HTML. La <parte> es normalmente 'content', 'skin' o 'locale', depende la parte que quieras. <archivo.xul> es simplemente el nombre del archivo.

- -

Ejemplo: chrome://messenger/content/messenger.xul

- -

El ejemplo se refiere a la ventana messenger. Puedes apuntar a un archivo que es parte del skin reemplazando 'content' con 'skin' y cambiando el nombre del archivo. Similarmente puedes apuntar a un archivo que es parte de locale usando 'locale' en lugar de 'content'.

- -

Cuando abres una URL chrome, Mozilla echa un vistazo a través de su lista de paquetes instalados e intenta localizar el archivo JAR o el directorio que concuerde con el nombre del paquete y la parte. El mapeado entre las URL chrome y los archivos JAR se especifica en el archivo de manifiesto almacenado en el directorio chrome. Si reubicases el archivomessenger.jar en algun otro lugar al original y actualizases el archivo de manifiesto adecuadamente, todo continuaría funcionando correctamente ya que está restringido a su lugar de instalación. Usando URLs chrome podemos permitirle detalles como este a Mozilla. Análogamente, si el usuario cambia su tema, la parte 'skin' de la URL chrome se redirecciona a una colección de archivos diferente, sin que se tengan que hacer cambios en el XUL y en los scripts.

- -

Aquí hay otros ejemplos. Fíjate como ninguna de las URLs de tema o locale establecen especificamente algun directorio.

- -
chrome://messenger/content/messenger.xul
-chrome://messenger/content/attach.js
-chrome://messenger/skin/icons/folder-inbox.gif
-chrome://messenger/locale/messenger.dtd
-
- -

Para referirse a algun subdirectorio, solo es necesario agregarlo al final de la URL chrome. Las siguientes URLs se refieren a la ventana de favoritos (bookmarks), presta atención que en ambas se refieren al mismo archivo, pero varía de paquete ya que uno es para la Suite de Mozilla y la otra se usa en Firefox

- -
chrome://communicator/content/bookmarks/bookmarksManager.xul (Mozilla)
-chrome://browser/content/bookmarks/bookmarksManager.xul (Firefox)
-
- -

Puedes usar las URLs chrome en cualquier lugar donde se usan las URLs comunes. Incluso puedes escribirlas directamente en la barra de dirección (URL) de la ventana del navegador de Mozilla. Si escribes una de las URL de arriba en la barra de direccion, verás una ventana que aparece donde normalmente iría una pagina web y que en su mayoría es tan funcional como si fuera una ventana separada. Algunas ventanas de dialogo pueden no funcionar correctamente si precisan de argumentos que debe asignar la ventana que la abre.

- -

En ocaciones verás URLs chrome sin el nombre de un archivo especificado, por ejemplo:

- -
chrome://browser/content/
-
- -

En este caso, solo el nombre del paquete y la parte son especificados. Este tipo de referencia selecciona automáticamente un archivo apropiado del directorio correspondiente. Para contenido, se selecciona un archivo con el mismo nombre del paquete y con la extension xul. En el ejemplo de arriba, el archivo browser.xul es el que se selecciona. Para messenger, el arhivo seleccionado sería messenger.xul. Cuando creas tus propias aplicaciones, deberías crear un archivo con la ventana principal usando el mismo nombre de tu aplicación, así podrás referirte a ella de una manera más práctica y corta. Esta es una práctica común para que los usuarios solo necesiten saber el nombre del paquete para ejecutar la aplicación. Por supuesto, para una extensión que modifica la interfaz del navegador, el usuario no necesitar saber la URL ya que la extensión se presenta ella misma en la interfaz gráfica.

- -

Para una piel (skin), el archivo <nombre_del_paquete>.css se selecciona; para una configuración regional, el archivo <nombre_del_paquete>.dtd es seleccionado.

- -

Recuerda, chrome URL no está relacionado con su ubicación en el disco. Las dos primeras piezas de chrome URL son el nombre del paquete y la parte (ya sea contenido, piel (skin), o locale). A pesar de que es común colocar los archivos de contenido en un directorio llamado 'content', esto está fuero de convenio alguno, y estos archivos deben ser colocados en una estructura distinta.

- -

En la siguiente sección veremos como crear archivos .manifest y paquetes.

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/manipulando_listas/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/manipulando_listas/index.html deleted file mode 100644 index 90a38d41c6..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/manipulando_listas/index.html +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Manipulando listas -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Manipulando_listas -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Manipulating_Lists ---- -

The XUL listbox provides a number of specialized methods.

- -

Manipulación de una lista

- -

The listbox element provides numerous methods to retrieve and manipulate its items. Although listboxes may be manipulated using the standard DOM functions as well, it is recommended that the specialized listbox functions be used instead when possible. These functions are bit simpler and will do the right thing.

- -

The appendItem() function is used to append a new item to the end a list. Similar to the DOM appendChild() function except that it takes a string label, and you do not have to worry about where to add it in the list structure. Here is an example:

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<script>
-function addItem(){
-  document.getElementById('thelist').appendItem("Thursday", "thu");
-}
-</script>
-
-<listbox id="thelist"/>
-
-<button label="Add" oncommand="addItem();"/>
-
- -

The appendItem() takes two arguments, the label, in this case 'Thursday', and a value 'thu'. The two arguments correspond to the label attribute and the value attribute on the listitem element. The value is used only as an extra optional value associated with an item which you might wish to use in a script.

- -

Similarly, there is also an insertItemAt() and a removeItemAt() function which inserts a new item and removes an existing item respectively. The syntax is as follows:

- -
list.insertItemAt(3, "Miércoles", "mié");
-list.removeItemAt(3);
-
- -

The insertItemAt() function takes an additional argument, the position to insert the new item. The new item is inserted at this index, so, in the example, the new item will be added at position 3 while the item previously at that position will now be at position 4. Remember that the first item is 0. The removeItemAt() function will remove the item at a specific index.

- -

These three methods are also available for several other XUL elements and work in the same manner. In fact, these methods are part of the nsIDOMXULSelectControlElement interface so any XUL elements which implement this interface have these methods. This includes the menulist, radiogroup and tabs elements. For example, to add a new item to a menulist, you can use the same syntax as for a listbox. The right kind of element will be appended in each situation.

- -

Lista de selección

- -

The nsIDOMXULMultiSelectControlElement interface provides two additonal properties, selectedIndex and selectedItem. The former returns the index of the selected item while the latter returns the selected element. For instance the selectedItem of a menulist will be the menuitem that is selected. If no item is selected, selectedIndex will return -1, while selectedItem will return null.

- -

Obteniendo el ítem seleccionado

- -

These two properties are commonly inspected during a select event, as in the following example:

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<listbox id="thelist" onselect="alert(this.selectedItem.label);">
-  <listitem label="Corto"/>
-  <listitem label="Medio"/>
-  <listitem label="Largo"/>
-</listbox>
-
- -

The select event is fired for a listbox when an item in the list is selected. The select handler here displays an alert containing the label of the selected item in the list. Since the select event fired we can assume that an item is selected. In other cases, you may wish to check to ensure that selectedItem is not null before continuing.

- -

The select event is also fired when a radio button in a radiogroup is selected and when a tab is selected in a tabs element. However, menulists do not fire the select event; instead you can listen to the command event to handle when an item is selected.

- -

For the tabs element, it is often more convenient to use functions of the tabbox element instead. It also has a selectedIndex function which will return the index of the selected tab. However, to get the selected item, use the tabbox's selectedTab property instead. Or, use the selectedPanel property to get the selected panel, that is, return the content associated with the tab.

- -

Cambiando la selección

- -

All of the selection related properties described above may also be assigned a new value to change the selection. In the next example, the selectedIndex property of a radiogroup element is changed based on the value entered in a textbox. This code isn't foolproof though; for example it doesn't check if the value entered is out of range. You will want to make sure that you add this kind of error checking.

- -

Ejemplo 3: Código Ver en funcionamiento

- -
<script>
-function doSelect(){
-  var val = document.getElementById('number').value;
-  val = Number(val);
-  if (val != null)
-    document.getElementById('level').selectedIndex = val - 1;
-}
-</script>
-
-<hbox align="center">
-  <label value="Escriba un número del 1 a 3:"/>
-  <textbox id="number"/>
-  <button label="Seleccionar" oncommand="doSelect();"/>
-</hbox>
-
-<radiogroup id="level">
-  <radio label="Excelente"/>
-  <radio label="Bueno"/>
-  <radio label="Pobre"/>
-</radiogroup>
-
- -

Listboxes also support multiple selection and the functions of the nsIDOMXULMultiSelectControlElement interface. This interface provides a number of functions specifically for handling multiple selection. For example the selectedItems property holds a list of the items that are selected, while the selectedCount property holds the number of items selected. Typically, you will use these properties to iterate over the list and perform some operation for each item. Be careful when iterating over the selected items; if you modify the items in the list while iterating, the list will change and the selection properties may return different values. This is one reason why it is useful to manipulate the list by the item rather than by index.

- -

Deleting selected items

- -

The following example shows a method of deleting the selected items properly:

- -

Ejemplo 4: Código Ver en funcionamiento

- -
<script>
-function deleteSelection(){
-  var list = document.getElementById('thelist');
-  var count = list.selectedCount;
-  while (count--){
-    var item = list.selectedItems[0];
-    list.removeItemAt(list.getIndexOfItem(item));
-  }
-}
-</script>
-
-<button label="Delete" oncommand="deleteSelection();"/>
-
-<listbox id="thelist" seltype="multiple">
-  <listitem label="Cheddar"/>
-  <listitem label="Cheshire"/>
-  <listitem label="Edam"/>
-  <listitem label="Gouda"/>
-  <listitem label="Havartie"/>
-</listbox>
-
- -

Inside the while loop we

- - - -

The nsIDOMXULMultiSelectControlElement interface also provides methods for modifying the selected items. For instance, the addItemToSelection() function adds a new item to the set of selected items, without clearing the existing selection. The removeItemFromSelection() function removes a single item from the selection.

- -

Lista desplegable

- -

If there are more rows in the listbox than can be displayed, a scroll bar will appear to allow the user to scroll the list. The scroll position may be adjusted using a couple of listbox methods.

- -

The scrollToIndex() method scrolls to a given row. This listbox will scroll such that the row will be the top row visible, unless the row is near the end of the list of items. The ensureIndexIsVisible() method is similar in that it also scrolls to show a row, but this method does not scroll if the item is already visible. Thus, the former function is used to scroll to a specific row while the latter is used just to make sure that a row is visible. There is also an ensureIndexIsVisible() that takes an item as an argument instead of an index. Compare the effect of both functions at different scroll positions in this example:

- -

Ejemplo 5: Código Ver en funcionamiento

- -
<button label="scrollToIndex"
-           oncommand="document.getElementById('thelist').scrollToIndex(4);"/>
-<button label="ensureIndexIsVisible"
-           oncommand="document.getElementById('thelist').ensureIndexIsVisible(4);"/>
-
-<listbox id="thelist" rows="5">
-  <listitem label="1"/>
-  <listitem label="2"/>
-  <listitem label="3"/>
-  <listitem label="4"/>
-  <listitem label="5"/>
-  <listitem label="6"/>
-  <listitem label="7"/>
-  <listitem label="8"/>
-  <listitem label="9"/>
-  <listitem label="10"/>
-  <listitem label="11"/>
-  <listitem label="12"/>
-</listbox>
-
- -

Seguimos con los objetos de caja de XUL.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/medidores_de_progreso/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/medidores_de_progreso/index.html deleted file mode 100644 index 687e1fbcc3..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/medidores_de_progreso/index.html +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Medidores de Progreso -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Medidores_de_Progreso -tags: - - Tutorial_de_XUL - - XUL ---- -

En esta seccion veremos como crear medidores progreso (o indicador de progreso).

-

Añadiendo un indicador de progreso

-

Un indicador de progreso es una barra que indica la cantidad de trabajo realizado para completar una acción. Son tipicamente usados cuando se han de descargar ficheros o cuando realizamos una larga operación. XUL tiene indicadores de progreso, habiendo dos tipos de ellos: determinados e indeterminados.

-

Los indicadores de progreso determinados se usan cuando conocemos la cantidad de trabajo necesaria para llevar a cabo una operación. El indicador de progreso se irá llenando y una vez lleno completamente, la operación deberá haber terminado. Este puede usarse para dialogos de descarga de ficheros, ya que conocemos el tamaño del fichero.

-

Los indicadores indeterminados se usan cuando no sabemos cuanto trabajo puede llevar una operación.

-

Indicador de progreso determinado : Image:prog-det.png

-

Indicador de progreso indeterminado : Image:prog-udet.png

-

Los indicadores de progreso tienen la siguiente sintaxis:

-
<progressmeter
-    id="identificador"
-    mode="determined"
-    value="0%"/>
-
-

Los atributos son como sigue:

-
id 
El identificador para el indicador de progreso
mode 
El tipo de indicador de progreso. Si es determined, será un indicador de progreso determinado y se irá llenando conforme se realize la tarea. Sí es undetermined será un indicador de progreso indeterminado, donde no conocemos cuando finalizará la operación. El valor por defecto, si no definimos este atributo, es determined.
-
-
value 
El valor actual del indicador de progreso. Solo deberíamos usar cuando el indicador de progreso es del tipo determinado. El valor debe ser un porcentaje desde 0% a 100%. Este atributo puede ser cambiado desde un script conforme vaya completandose la tarea.
-
-
-

Incluyamos un indicador de progreso a nuestro dialogo de encontrar ficheros. Deberíamos poner un indicador indeterminado, ya que no sabemos cuantos ficheros tendremos que comprobar en nuestra búsqueda o cuanto tardaremos en hacerlo. Sin embargo, pondremos uno determinado por ahora para ver como funciona. El indicador de progreso normalmente solo aparecerá cuando la búsqueda se está llevando a cabo. Más tarde crearemos un script para mostrarlo y ocultarlo.

-

 

-
<hbox>
-
-  <progressmeter value="50%" style="margin: 4px;"/>
-
-
  <spacer flex="1" />
-</hbox>
-
-

Image:progress1.png

-

El atributo lo hemos puesto como 50% para poder ver el indicador inicialmente. Tambíen le hemos asignado un margen de 4 pixels para separarlo de los márgenes de la ventana. Tal como indicamos anteriormente, solo queremos ver el indicador de progreso cuando se esté realizando la búsqueda. Un script lo ocultará y mostrará cuando sea necesario.

-
-

En la proxima seccion, aprenderemos como adicionar elementos a una ventana usando HTML.

-

Categorías

-

links interwikis

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_con_desplazamiento/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_con_desplazamiento/index.html" deleted file mode 100644 index c5fb82fb1c..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_con_desplazamiento/index.html" +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Menús con desplazamiento -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Menús_con_desplazamiento -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - para_revisar ---- -

Esta sección describe los menús con desplazamiento y cómo usar el mecanismo con otros elementos.

- -

Crear un menú grande

- -

Te preguntarás qué sucede si creas un menú con muchas opciones en él, de tal forma que no todos los ítems aparezcan en la pantalla a la vez. Mozilla scrolling-menu.jpgproveerá un mecanismo de despliegue que te permitirá moverte a través de los ítems.

- -
Image:menuscroll1.png
- -

Si el espacio disponible es demasiado pequeño, aparecerán flechas al final de cada menú. Si mueves el ratón sobre las flechas, el menú se desplegará hacia abajo o hacia arriba. Si el espacio disponible es lo suficientemente grande, las flechas no aparecerán. Observa que el comportamiento exacto de este mecanismo dependerá del tema actual.

- -

Este comportamiento es automático. No tienes que hacer nada para obtener menús desplegables. Se aplicará a menús en barras de menú, en emergentes o listas de menús. Se implementa usando un elemento arrowscrollbox. Este elemento puede usarse para crear cajas desplegables con flechas.

- -

El elemento arrowscrollbox puede usarse en cualquier lugar donde se pueda usar una caja normal. No tienes que usarlo en menús. Siempre es un caja vertical y puede contener cualquier elemento en su interior. Puedes usarlo para implementar una lista cuando no deseas hacer un menú desplegable.

- -

Ejemplo - lista de botones con desplazamiento

- -

El siguiente ejemplo muestra cómo crear una lista desplegable de botones (tendrás que redefinir el tamaño de la ventana para ver los botones de flechas):

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<arrowscrollbox orient="vertical" flex="1">
-  <button label="Rojo"/>
-  <button label="Azul"/>
-  <button label="Verde"/>
-  <button label="Amarillo"/>
-  <button label="Naranja"/>
-  <button label="Plata"/>
-  <button label="Lavenda"/>
-  <button label="Oro"/>
-  <button label="Turquesa"/>
-  <button label="Melocotón"/>
-  <button label="Marrón"/>
-  <button label="Negro"/>
-</arrowscrollbox>
-
- -

Si pruebas este ejemplo, primero abrirá a tamaño total. Sin embargo, si encoges el alto de la ventana, las flechas de despliegue aparecerán. Al volver a hacer la ventana más grande, las flechas desaparecerán.

- -

Puedes establecer una altura máxima usando la propiedad CSS max-height en el arrowscrollbox para limitar el tamaño de la caja de despliegue y así hacer que las flechas aparezcan todo el tiempo.

- -

El arrowscrollbox es principalmente útil en menús y emergentes.

- -

A continuación veremos cómo añadir gestores de eventos a elementos XUL.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_de_barras_simples/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_de_barras_simples/index.html" deleted file mode 100644 index 30f475f63b..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_de_barras_simples/index.html" +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Barras de menús simples -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Menús_de_Barras_Simples -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - Tutoriales - - XUL - - para_revisar -translation_of: Archive/Mozilla/XUL/Tutorial/Simple_Menu_Bars ---- -

En esta sección veremos cómo crear una barra de menús.

-

Crear un menú

-

XUL tiene varias formas de crear un menú. La más simple es agregar una barra de menús con una fila de menús en ella como tienen muchas aplicaciones. También se pueden crear menús emergentes. Las características de menús en XUL consisten en una cantidad de elementos diferentes que permiten la creación de barras de menú o menús emergentes. Los elementos u opciones en dichos menús pueden ser personalizados sin mucha dificultad. Vimos ya una parte de cómo construir un menú usando menulist. En esta sección ampliaremos el tema.

-

Las barras de menús son creadas, generalmente, de manera muy similar a las barras de herramientas o toolbar. Una barra de menús puede ser ubicada de manera opcional dentro de una toolbox (caja de herramientas) y el menú funcionará como cualquier otra barra de herramientas. XUL, sin embargo, tiene ciertos elementos de menú especiales que proporcionará funciones características de los menús clásicos.

-

Hay 5 elementos asociados con la creación de una barra de menús y sus menús, que se explican brevemente a continuación pero en los que se profundizará más adelante:

-
-
- menubar
-
-  
-
- El contenedor de una fila de menús.
-
-

menu

-
-
-
-
- A pesar del nombre, es sólo el título del menú en la barra (menubar). Este elemento puede aparecer, también, de forma separada.
-
-
-
- menupopup
-
-  
-
- La ventana emergente que aparecerá cuando se haga clic en el título del menú. Esta caja contendrá una lista de comandos.
-
-
-
- menuitem
-
-  
-
- Un comando en un menú. Aparece dentro de menupopup.
-
-
-
- menuseparator
-
-  
-
- Una barra de separación en un menú. Aparece dentro de menupopup.
-
-

Ahora ya se pueden personalizar los menús  dentro de una barra de menús para poder contener lo que queramos en cualquier plataforma excepto Macintosh. Esto es debido a que Macintosh posee su menú especial propio en la parte superior de la pantalla y es controlado por el sistema. Si bien se pueden crear menús personalizados, cualquier regla de estilo especial o elementos que no sean menús pueden ser omitidos. Esto se debe tener muy presente al crear menús.

-
Ejemplo de una barra de menús simple
-

Ejemplo:

-
- simple_mnubar.jpg
-
<toolbox flex="1">
-  <menubar id="ejemplo-barra-de-menus">
-    <menu id="menu-archivo" label="Archivo">
-      <menupopup id="archivo-emergente">
-        <menuitem label="Nuevo"/>
-        <menuitem label="Abrir"/>
-        <menuitem label="Guardar"/>
-        <menuseparator/>
-        <menuitem label="Salir"/>
-      </menupopup>
-    </menu>
-    <menu id="menu-editar" label="Editar">
-      <menupopup id="editar-emergente">
-        <menuitem label="Deshacer"/>
-        <menuitem label="Rehacer"/>
-      </menupopup>
-    </menu>
-  </menubar>
-</toolbox>
-
-

Aquí, una barra de menús sencilla es creada utilizando el elemento menubar. Éste crea una fila en donde se ubicarán los menús. Dos menús: Archivo y Editar se crearon en ella. Los elementos menu crean el título en la parte superior del menú, el que aparece en la barra de menús. Los menús emergentes se crean utilizando el elemento menupopup. Aparecerán cuando el usuario haga clic en el menú padre. El tamaño de dicho menú emergente dependerá de lo que contenga, siempre siendo suficientemente amplio como para que entren todos los comandos creados utilizando el elemento menuitem. Cada uno representa un comando individual dentro del menú emergente.

-

También se pueden crear separadores dentro de los menús utilizando el elemento menuseparator. Se utiliza para separar grupos de menuitems.

- -

menubar es una caja que contiene menús. Nótese que fue ubicada en una toolbox flexible. menubar no tiene atributos especiales sino que es un tipo de caja. Esto significa que se podría crear un menubar vertical con sólo configurar el atributo  orient a vertical.

-

Elemento menu

-

El elemento menu funciona de manera muy similar al elemento button. Acepta algunos atributos idénticos y otros adicionales:

-
-
- id
-
-  
-
- El identificador único del título del menú.
-
-

label

-
-
-
-
- El texto que va a aparecer en el menú (Archivo y Editar en el ejemplo anterior).
-
-
-
- disabled
-
-  
-
- Es un atributo booleano que determina si el menú está deshabilitado o no. Aunque se puede, rara vez se necesita deshabilitar un menú completo. Este atributo puede ser configurado como true o false, siendo este último valor aquél por defecto.
-
-
-
- accesskey
-
-  
-
- La tecla que el usuario puede presionar para activar el menú. Por lo general, ésta es la letra que aparece subrayada en el título del menú. Mozilla se fijará en el atributo label y le agregará el subrayado al carácter especificado aquí. Por esta razón es que se debe especificar un carácter que aparece en dicho título de ser posible (la tecla de acceso aún funcionará si no aparece).
-
-
- Image:menubar-ex2.jpg
-
- El elemento menu normalmente se ubica en un menubar, aunque no necesariamente. Sin embargo, le aportará un aspecto diferente. La imagen muestra lo que el aspecto que tendría el ejemplo anterior sin la barra de menús.
-

Elemento menupopup

-
- El elemento menupopup genera el menú emergente que contiene los comandos. Es un tipo de caja que, por defecto, se orienta verticalmente. Se puede cambiar a horizontal si se desea que se ubiquen en una fila los menuitem. Normalmente sólo elementos menuitem y/o menuseparator se ubicarán en un menupopup; pero se puede ubicar cualquier elemento dentro de un menupopup, aunque será ignorado en una Macintosh.
-

Elemento menuitem

-

El elemento menuitem es muy similar al elemento menu y tiene algunos de los mismos atributos:

-
-
- id
-
-  
-
- El identificador único del título del menú.
-
-
-
- label
-
-  
-
- El texto que va a aparecer en el menú.
-
-
-
- disabled
-
-  
-
- Es un atributo booleano que determina si el menú está deshabilitado o no. Este atributo puede ser configurado como true o false, siendo este último valor aquél por defecto.
-
-
-
- accesskey
-
-  
-
- La tecla que el usuario puede presionar para activar el menú. Por lo general, ésta es la letra que aparece subrayada en el título del menú. Mozilla se fijará en el atributo label y le agregará el subrayado al carácter especificado aquí. Por esta razón es que se debe especificar un carácter que aparece en dicho título de ser posible.
-
-
-
- acceltext
-
-  
-
- Especifica la tecla de acceso rápido que aparece junto al texto del menú. Sin embargo, no asocia dichas teclas al menuitem. Se profundizará en esto más adelante.
-
-

Elemento menuseparator

-

El elemento menuseparator no posee atributos especiales. Simplemente crea una barra horizontal (o vertical) entre los elementos menuitems vecinos.

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_emergentes/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_emergentes/index.html" deleted file mode 100644 index c44daf0dcd..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/men\303\272s_emergentes/index.html" +++ /dev/null @@ -1,228 +0,0 @@ ---- -title: Menús emergentes -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Menús_emergentes -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - para_revisar ---- -

En la última sección vimos cómo crear un menú en una barra de menú. XUL tiene además la capacidad de crear menús emergentes. Los menús emergentes normalmente se muestran cuando el usuario presiona el botón derecho del ratón.

- -

Crear un menú emergente (menú popup)

- -

XUL tiene tres tipos diferentes de elementos emergentes, los cuales se describen a continuación. La principal diferencia entre ellos es la manera en la que aparecen.

- - - -
-
El menú emergente simple es una ventana emergente que aparece al presionar el botón izquierdo del ratón sobre un elemento. Son como los menús que aparecen en las barras de menú, excepto que pueden ponerse en cualquier lugar y se les puede poner cualquier contenido. Un buen ejemplo es el menú con despliegue hacia abajo que aparece cuando haces clic sobre la pequeña flecha hacia abajo que sigue a los botones adelante y atrás en una ventana del explorador.
-
- - - -
-
El menú emergente de contexto es una ventana emergente que aparece cuando el usuario presiona el botón de menú contextual, el cual es usualmente el botón derecho del ratón. La forma exacta en que un menú contextual es abierto varía en cada plataforma. En Macintosh, por ejemplo, el usuario puede bien presionar la tecla Control y hacer clic con el ratón o mantener presionado el botón del ratón por un momento. Además, es posible abrir un menú contextual sin usar el ratón, por ejemplo presionando la tecla Menú en un teclado.
-
- - - -
-
Una ventana emergente de información aparecerá cuando el usuario pasa el ratón sobre un elemento. Este tipo de emergentes puede usarse para proporcionar una descripción de un botón con mayor detalle del que puede ofrecer el botón mismo.
-
- -

Los tres tipos de elementos emergentes difieren en la forma en que son invocados por el usuario. El tipo de elemento emergente es determinado por el elemento que lo invoca.

- -

Declarar el contenido de un emergente

- -

Un elemento emergente se describe usando el elemento menupopup. No tiene atributos especiales y es un tipo de caja. Cuando es invocado, aparecerá una ventana conteniendo lo que sea que hayas puesto dentro del elemento menupopup. Sin embargo, deberías poner siempre un atributo id en el menupopup ya que sirve para asociar el elemento emergente con un elemento. Veremos lo que esto significa pronto. Pero primero, un ejemplo:

- -
<popupset>
-  <menupopup id="clipmenu">
-    <menuitem label="Cortar"/>
-    <menuitem label="Copiar"/>
-    <menuitem label="Pegar"/>
-  </menupopup>
-</popupset>
-
- -

Como puede verse aquí, se ha creado un menú emergente simple con tres órdenes. El elemento menupopup contiene los tres elementos del menú menuitem . Además, como observarás, el id se ha puesto en el elemento menupopup.

- -

El elemento popupset contiene toda la declaración del menú emergente. Este es un contenedor genérico de emergentes y es opcional. Este no aparece en pantalla sino que se usa como un apartado en donde puedes declarar todos tus emergentes. Como su mismo nombre implica (popupset), puedes poner múltiples declaraciones de elementos emergentes dentro de éste. Solamente tienes que añadir, detrás del primer elemento popupset, todos los que quieras adicionalmente. Puedes tener más de un popupset en un archivo, pero lo normal es que tengas únicamente uno.

- -

Asociar un emergente con un elemento

- -

Ahora que hemos creado el elemento emergente, es hora de hacer que se muestre. Para hacerlo necesitamos asociar el emergente con un elemento en donde debería aparecer. Hacemos esto porque queremos que el emergente aparezca únicamente cuando el usuario haga clic en una determinada área de la ventana. Habitualmente será un botón o una caja concretos.

- -

Para asociar el emergente con un elemento agrega un atributo de entre tres posibles al elemento. El atributo que agregues dependerá del tipo de emergente que quieras crear. Para un menú emergente simple, agrega un atributo popup al elemento. Para un menú emergente de contexto, agrega un atributo context. Por último, para un emergente de información, agrega un atributo tooltip.

- -

El valor del atributo debe ser el id del menupopup que quieras que aparezca. Este es el porqué de poner un id en el emergente. De esa manera es fácil tener múltiples menús emergentes en un archivo.

- -

En el ejemplo de arriba, queremos hacer que el emergente sea un menú contextual. Eso significa que necesitamos usar el atributo context y agregarlo al elemento con el cual queremos tener asociado el emergente. El ejemplo de abajo muestra cómo debemos hacer esto:

- -

Ejemplo 1 : Código Ver en funcionamiento

- -
Image:popups-ex1.png
- -
<popupset>
-  <menupopup id="clipmenu">
-    <menuitem label="Cortar"/>
-    <menuitem label="Copiar"/>
-    <menuitem label="Pegar"/>
-  </menupopup>
-</popupset>
-
-<box context="clipmenu">
-  <label value="Haz clic con el botón derecho para ver el menú"/>
-</box>
-
- -

Aquí, el menú emergente ha sido asociado con una caja. Cada vez que hagas clic contextual (clic con el botón derecho) en cualquier lugar de la caja, aparecerá el menú emergente. El emergente también aparecerá aun si haces clic sobre los descendientes de la caja, así que también funcionará si haces clic en el elemento label. El atributo context se ha usado para asociar la caja con un menú emergente con el mismo id. En este caso, aparecerá el menú emergente clipmenu. De esta forma, puedes tener varios emergentes y asociar cada uno con diferentes elementos.

- -

Podrías asociar múltiples emergentes con el mismo elemento poniendo más atributos de diferente tipo en un elemento. Podrías además asociar el mismo emergente con múltiples elementos, lo cual es una ventaja de esta sintaxis. Los emergentes solamente pueden asociarse a elementos XUL; no pueden asociarse con elementos HTML.

- -

Informativos (Tooltips)

- -

Aquí veremos una forma simple de crear emergentes de información. Hay dos maneras de crearlos. La manera más simple, que es la más común, es agregar un atributo tooltiptext a un elemento para el que quieres asignar un emergente de información.

- -

El segundo método es usar un elemento tooltip que tenga el contenido de un emergente de información. Esto requiere que tengas un bloque de contenido separado para cada emergente de información o que tengas un script que establezca el contenido. Sin embargo, esto te permite usar cualquier contenido además de texto en el emergente de información.

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<button label="Guardar" tooltiptext="Haz clic aquí para guardar tu trabajo"/>
-
-<popupset>
-  <tooltip id="moretip" orient="vertical" style="background-color: #33DD00;">
-    <description value="Ver más información"/>
-    <description value="¿De verdad?" style="color: red;"/>
-  </tooltip>
-</popupset>
-
-<button label="Más" tooltip="moretip"/>
-
- -

Estos dos botones tienen un emergente de información cada uno. El primero usa el estilo por defecto. El segundo usa un estilo personalizado que tiene un fondo de diferente color y estilos aplicados al texto. El emergente ha sido asociado al botón Más usando el atributo tooltip, el cual ha sido establecido al correspondiente id del elemento tooltip. Observa que el elemento tooltip sigue estando ubicado dentro de un elemento popupset, como los otros tipos de emergentes.

- -

Alineación del emergente

- -

Por defecto, las ventanas emergentes y de contexto aparecerán donde esté el puntero del ratón. Los emergentes de información se ubicarán ligeramente por debajo del elemento de tal forma que el puntero del ratón no los oculte. Hay casos sin embargo, en los que vas a querer indicar con mayor detalle dónde debe aparecer el emergente. Por ejemplo, el menú emergente que aparece cuando haces clic en el botón Atrás en un explorador debería aparecer por debajo del botón Atrás y no donde está el puntero del ratón.

- -

Para cambiar la posición del emergente, puedes usar un atributo adicional, position, en el menupopup. Puedes incluso agregarlo al elemento menupopup. Este atributo se usa para indicar el lugar del emergente relativo al elemento que lo invoca. Puede establecerse en distintos valores, que se describen brevemente a continuación:

- -
-
after_start
-
El emergente aparece debajo del elemento con los bordes izquierdos de éste y la ventana emergente alineados. Si la ventana emergente es más grande que el elemento, se extiende hacia la derecha. Este es el valor usado para los menús colgantes asociados con los botones Atrás y Adelante de los exploradores.
-
- -
-
after_end
-
El emergente aparece debajo del elemento con los bordes derechos de éste y la ventana emergente alineados.
-
- -
-
before_start
-
El emergente aparece arriba del elemento con los bordes izquierdos de éste y la ventana emergente alineados.
-
- -
-
before_end
-
El emergente aparece arriba del elemento con los bordes derechos de éste y la ventana emergente alineados.
-
- -
-
end_after
-
El emergente aparece a la derecha del elemento con los bordes inferiores de éste y la ventana emergente alineados.
-
- -
-
end_before
-
El emergente aparece a la derecha del elemento con los bordes superiores de éste y la ventana emergente alineados.
-
- -
-
start_after
-
El emergente aparece a la izquierda del elemento con los bordes inferiores de éste y la ventana emergente alineados.
-
- -
-
start_before
-
El emergente aparece a la izquierda del elemento con los bordes superiores de éste y la ventana emergente alineados.
-
- -
-
overlap
-
El emergente aparece encima del elemento.
-
- -
-
at_pointer
-
El emergente aparece en la posición del puntero del ratón.
-
- -
-
after_pointer
-
El emergente aparece en la misma posición horizontal del puntero del ratón pero debajo del elemento. Así es como aparecen los emergentes de información.
-
- -

Al agregar el atributo position al elemento emergente, puedes especificar con precisión dónde aparece el emergente. No puedes especificar la posición exacta de un píxel. El atributo position puede usarse con los tres tipos de emergentes, aunque probablemente no cambiarás el valor de un emergente de información. El ejemplo de abajo demuestra cómo crear un botón Atrás con un menú emergente:

- -

Ejemplo 3: Código Ver en funcionamiento

- -
<popupset>
-  <menupopup id="backpopup" position="after_start">
-    <menuitem label="Página 1"/>
-    <menuitem label="Página 2"/>
-  </menupopup>
-</popupset>
-
-<button label="Hazme aparecer" popup="backpopup"/>
-
- -

Nuestro ejemplo con un buscador de archivos

- -

Agreguemos un menú emergente simple al dialogo de búsqueda de archivos. Por simplicidad, solo repetiremos los contenidos del menú Editar. Hagamos que el emergente aparezca cuando se haga clic sobre la primera pestaña del panel:

- -
<popupset>
-  <menupopup id="editpopup">
-    <menuitem label="Cortar" accesskey="t"/>
-    <menuitem label="Copiar" accesskey="c"/>
-    <menuitem label="Pegar" accesskey="p" disabled="true"/>
-  </menupopup>
-</popupset>
-
-<vbox flex="1">
-.
-.
-.
-
-<tabpanel id="searchpanel" orient="vertical" context="editpopup">
-
- -

Aquí se ha agregado un emergente simple similar al del menú Editar. Si haces clic derecho (Control-clic en Macintosh) en cualquier lugar del primer panel, aparecerá el emergente. Sin embargo, el emergente no aparecerá si haces clic en otro lugar. Observa que la caja de texto tiene su propio contenido para el menú emergente, el cual prevalecerá sobre el especificado por nosotros.

- -

Otro ejemplo : Código Ver en funcionamiento

- -


- A continuación seguiremos con la creación de menús con desplazamiento.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/modelo_de_objeto_de_documento/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/modelo_de_objeto_de_documento/index.html deleted file mode 100644 index 231555c72a..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/modelo_de_objeto_de_documento/index.html +++ /dev/null @@ -1,230 +0,0 @@ ---- -title: Modelo de objeto de documento -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Modelo_de_objeto_de_documento -tags: - - DOM - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Document_Object_Model ---- -

 

- -

El modelo de objeto de documento (DOM) can be used with XUL elements to get information about them or modify them.

- -

Introducción al 'DOM'

- -

El modelo de objeto de documento (DOM) es usado para almacenar el árbol de los nodos XUL. Cuando un archivo XUL es cargado, las etiquetas son analizadas y convertidas en un documento con estructura jerárquica de nodos, uno por cada etiqueta y bloque te texto. La estructura DOM puede ser examinada y modificada usando varios métodos con esta finalidad. Los elementos XUL específicos también proporcionan funciones adicionales que pueden ser usadas.

- -

Cada archivo XUL que es cargado tendrá su propio documento visualizado en una ventana o marco. A pesar que hay solo un documento asociado con una ventana en cada momento, se puede carga documentos adicionales usando varios métodos.

- -

En Mozilla, el DOM puede ser accedido y manipulado utilizando JavaScript. Los diversos objetos DOM tienen funciones las cuales pueden ser llamadas por script. Sin embargo, es importante advertir que la DOM es un API que es accesible por JavaScript. JavaScript por sí mismo , es exactamente un lenguaje de scripting que permite el acceso a dichos objetos porque Mozilla dispone esos objetos para su uso.

- -

En JavaScript, siempre hay un único objeto global que está siempre disponible. Se puede hacer referencia a sus propiedades y métodos. Por ejemplo, si un objeto global tiene como propiedad 'name', se puede cambiar el nombre (name) con el código 'name = 7', sin haber especificado objeto alguno. En el contexto de un browser, la es ventana es un objeto global y asimismo es cierto para XUL. Naturalmente, este objeto global sera diferente para cada ventana. Cada marco tendrá también un objeto ventana separado.

- -

La ventana es a menudo referida usando la propiedad de window, a pesar de que es optativo. En ocasiones, esto se hace simplemente para clarificar el alcance del método al que hace referencia. Por ejemplo, en el siguiente fragmento de código, las dos líneas son equivalentes.

- -
window.open("test.xul","_new");
-open("test.xul","_new");
-
- -

Cuando se declara una función o una variable en el nivel más alto de un script, es decir desde otra función, se está de hecho declarando una propiedad del objeto global. En XUL, cada función declarada será definida como propiedad del objeteo window. Por ejemplo, en el siguiente código se visualizará el texto 'Message' en una alerta doble.

- -
function getText(){
-  return "Message";
-}
-
-alert(getText());
-alert(window.getText());
-
- -

De esta manera, si se desea acceder a variables o llamar a funciones declaradas en un script usado por otra ventana, solo se necesita acceder usando el objeto window de la otra ventana. Por ejemplo, si se combina los dos últimos ejemplos en un único archivo, podríamos querer llamar a la función getText() desde la otra ventana (por ejemplo la ventana 'test.xul'). Para hacerlo, se puede utilizar lo siguiente:

- -
alert(window.opener.getText());
-
- -

Cada ventana tiene un opener property que mantiene a dicho objeto ventana abierto. En este ejemplo, se recupera el opener window y llamamos a la función getText() declarada en el script. Observar que se ha explicitado la propiedad con el identificador 'window' para clarificarlo.

- -

El método de la apertura de la ventana (window's open())también devuelve una referencia a la nueva ventana, por lo que puede llamar a funciones de la nueva ventana desde el opener. Es importante advertir, que sin embargo, el método open() lo devuelve antes de que la ventana haya sido complemetamente cargada, por lo que no estarán disponibles todavía funciones.

- -

EL objeto ventana no está definido por ninguna especificación DOM, pero Mozilla en ocasiones lo considera parte del DOM Level 0, un nombre es usado por varios desarrolladores para referirse a este tipo de funciones antes que se hubieran añadido especificaciones. El documento actual visualizado en una ventana puede ser recuperado usando la propiedad del documento de la ventana. Desde que esto es uno de los más propiedades referenciadas de una ventana, la propiedad documento property es utilizado sin la partícula 'window.' .

- -

Mozilla provee varios objetos documento diferentes dependiendo del tipo de documento. Hay tres documentos principales HTMLDocument, XMLDocument, y XULDocument, para documentos HTML, XML y XUL respectivamente. Obviamente, esto es uno de los últimos tipos de documento usados por XUL. Los tres tipos de documentos son muy parecidos, de hecho comparten la misma implementación básica. Sun embargo, hay algunas funciones especificadads para cada tipo de documento.

- -

Recuperación de elementos

- -

El método más común para recuperar un elemento en un documento es dar al elemento un atributo con el id y el uso del documento getElementById(). Hemos añadido el atributo id a una serie de elementos a encontrar el archivo de diálogo. Por ejemplo, podríamos obtener el estado de una casilla de verificación mediante el código que aparece a continuación:

- -
var state = document.getElementById('casecheck').checked;
-
- -

El valor casecheck corresponde al id del checkbox (que es case sensitive: distingue entre mayúsculas y minúsculas) . Una vez que tenemos una indicación de si está marcada o no, podemos utilizar el estado para llevar a cabo la búsqueda. Podríamos hacer algo similar para las otras casillas de verificación, o cualquier otro elemento que tiene un id. Se necesita para obtener el texto en el campo de entrada, por ejemplo.

- -
-

Nuestro ejemplo

- -

No tiene sentido tener la barra de progreso y el árbol de dato de pruebas desplegado cuando el dialogo de búsqueda de archivos se visualiza primero. Estos se agregaron a fin de que pudiéramos verlos. Dejémoslo fuera y aparecerá sólo cuando se presione el botón Buscar. En primer lugar, tenemos que hacerlos inicialmente invisible. El atributo hidden, se utiliza para controlar si un elemento es visible o no.

- -

Vamos a cambiar la medida del progreso a fin de que esté inicialmente oculta. Además, vamos a añadir un atributo id de manera que podemos referirnos a ella en una secuencia de comandos para mostrar y ocultar. Si bien estamos en ello, también vamos a ocultar los divisores y el árbol de resultados que solo se necesitarán después de que la búsqueda se haya realizado.

- -
<tree id="results" hidden="true" flex="1">
-  .
-  .
-  .
-<splitter id="splitbar" resizeafter="grow" hidden="true"/>
-
-<hbox>
-
-  <progressmeter id="progmeter" value="50%"
-    style="margin: 4px;" hidden="true"/>
-
- -

Hemos agregado el atributo hidden y fijado el valor true. Esto hace que el elemento se oculte cuando aparece por primera vez.

- -

A continuación, vamos a añadir una función que se llama cuando el botón Buscar se presiona. Vamos a poner el scripts en un archivo separado llamado findfile.js. En la sección anterior, añadimos el elemento script en el archivo XUL. Si no lo ha hecho, hagalo ahora, como se indica a continuación. Un controlador oncommand también se añadirá al botón Buscar.

- -
<script src="findfile.js"/>
-  .
-  .
-  .
-<button id="find-button" label="Find"
-   oncommand="doFind();"/>
-
- -

Ahora, crearemos otro archivo llamado findfile.js en el mismo directorio que findfile.xul. Vamos a añadir la función doFind() en este archivo. La etiqueta script permite código que pueda figurar directamente dentro de ella. Sin embargo, por diversas razones, entre ellas un mejor rendimiento, siempre se deben poner scripts en archivos separados, con excepción de breves fragmentos que pueden ponerse directamente en el controlador de eventos.

- -
function doFind(){
-  var meter = document.getElementById('progmeter');
-  meter.hidden = false;
-}
-
- -

Esta función primero obtiene una referencia del medidor de progreso utilizando su identificador, progmeter. La segunda línea del cuerpo de la función cambia el estado oculto de modo que el elemento es visible de nuevo.

- -

Por último, vamos a tener un cuadro de alerta pop-up que muestra lo que será buscado. Por supuesto, no queremos que esté en la versión final, pero vamos a añadirlo para asegurarnos que algo pasará.

- -
function doFind(){
-  var meter=document.getElementById('progmeter');
-  meter.hidden = false;
-  var searchtext=document.getElementById('find-text').value;
-  alert("Searching for \"" + searchtext + "\"");
-}
-
- -

Ahora, con ese cuadro de alerta ahí, sabemos lo que debería suceder cuando haga clic en el botón Buscar. Podríamos añadir código adicional para obtener la selección de los cuadros desplegables.

-
- -

XUL Element DOM

- -

Every XUL element has a set of attributes, a set of properties and a set of children.

- - - -

It is possible to manipulate the attributes, properties and children of an element dynamically using DOM methods.

- -

It is important to note that attributes and properties are separate things. Just because there is an attribute with a given name does not mean that there is a corresponding property with the same name. However, it will often be the case that such a property will exist. For example, to get the flex of an element, you can use the flex property. In this case, the underlying code just returns the value of the attribute. For other properties, XUL will perform more complex calculations.

- -

You can manipulate the attributes of an element using any of the following methods:

- -
-
getAttribute ( nombre )
-
Return the value of the attribute with the given name.
-
hasAttribute ( nombre )
-
Return true if the attribute with the given name has a value.
-
setAttribute ( nombre , valor )
-
Set the value of the attribute with the given name to the given value.
-
removeAttribute ( nombre )
-
Remove the attribute with the given name.
-
- -

These functions allow you to get and change the value of an attribute at any time. For example, to use the value of the flex attribute, you might use code like the following:

- -
 var box = document.getElementById('somebox');
- var flex = box.getAttribute("flex");
-
- var box2 = document.getElementById('anotherbox');
- box2.setAttribute("flex", "2");
-
- -

However, the flex attribute has a corresponding script property which can be used instead. It isn't any more efficient, but it does mean slightly less typing. The following example accomplishes the same as above using the flex property instead.

- -
 var box = document.getElementById('somebox');
- var flex = box.flex;
-
- var box2 = document.getElementById('anotherbox');
- box2.flex = 2;
-
- -

Once you have a reference to an element, you can call the properties of that element. For example, to get the hidden property for an element, you can use the syntax element.hidden where 'element' is a reference to the element. You might note that most of the properties listed in the reference correlate to common attributes on elements. There are differences, of course, for example, while getAttribute("hidden") will return the string 'true' for a hidden element, whereas the hidden property returns a boolean true value. In this case, the type conversion is done for you so the property is more convenient.

- -

As with each document, there is a different element object for XUL elements as for HTML and XML elements. Every XUL element implements the XULElement interface. A XUL element is any element declared with the XUL namespace. So, XUL elements will have that interface even if added to other XML documents, and non-XUL elements will not have that interface. The XULElement interface has a number of properties and methods specific to XUL elements, many inherited from the generic DOM Element interface.

- -

A namespace is a URI which specifies the kind of element. Here are some examples:

- -
<button xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
-<button xmlns="http://www.w3.org/1999/xhtml"/>
-<html:button xmlns:html="http://www.w3.org/1999/xhtml"/>
-<html:button xmlns:html="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
-
- -

Namespaces are specified using the xmlns attribute.

- - - -

This is an important distinction. In fact, the actual text used for the prefix is irrelevant when determining what kind of element is used.

- -

The DOM provides a number of namespace related functions similar to the non-namespace ones. For example, the getAttributeNS() function is similar to the the getAttribute() function except an additional argument may be supplied to specify an attribute in a specific namespace.

- -

Many XUL elements have their own properties that are unique to that element. Refer to the elemento reference for a full guide to the attributes and properties available for an element.

- - - -

The DOM is a tree structure with a single root node with children. You can get a reference to the root node using the document's documentElement property. The root node is always an element, but this is not the case for other nodes in the tree. An element corresponds to a tag is the XUL source, but you may also find text nodes, comment nodes and a few other types in a document tree. In the case of XUL, the root element will be the window tag in the XUL document. Each node in the tree may have children and those children may have child nodes of their own. Since the DOM is a tree structure, you can navigate through the tree using a variety of properties. Some common properties are listed below:

- -
-
firstChild 
-
reference to the first child node of an element
-
lastChild
-
reference to the last child node of an element
-
childNodes
-
holds a list of the children of an element
-
parentNode
-
reference to the parent of an node
-
nextSibling
-
reference to the next sibling in sequence
-
previousSibling
-
reference to the previous sibling in sequence
-
- -

These properties allow you to navigate through a document is various ways. For example, you might get the first child of an element using the firstChild property and then navigate through the children using the nextSibling property. Or, you might accomplish the same thing by iterating through the items in the childNodes list. In Mozilla, the latter method is more efficient.

- -

The following example shows how to iterate over the children of the root node:

- -
var childNodes = document.documentElement.childNodes;
-for (var i = 0; i < childNodes.length; i++) {
-  var child = childNodes[i];
-  // do something with child
-}
-
- -

The childNodes variable will hold the children of the document root element. We then use a for loop to iterate over the children, accessing each item using an array-like notation.

- -
Nuestro ejemplo: Código Ver en funcionamiento
- -

See also: A re-introduction to JavaScript and the referencia de JavaScript

- -

Seguimos con la modificación del DOM.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/modificando_una_interfaz_xul/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/modificando_una_interfaz_xul/index.html deleted file mode 100644 index 2b7fc14bf2..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/modificando_una_interfaz_xul/index.html +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Modificando una interfaz XUL -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Modificando_una_interfaz_XUL -tags: - - DOM - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Modifying_a_XUL_Interface ---- -

El DOM proporciona funciones variadas para modificar el documento.

- -

Creación de nuevos elementos

- -

You can create new elements using the createElement() function of the document. It takes one argument, the tag name of the element to create. You can then set attributes of the element using the setAttribute() function and append it to the XUL document using the appendChild() function. For example, the following will add a button to a XUL window: Ejemplo 1: Código Ver en funcionamiento

- -
<script>
-function addButton(){
-  var aBox = document.getElementById("aBox");
-  var button = document.createElement("button");
-  button.setAttribute("label","A new Button");
-  aBox.appendChild(button);
-}
-</script>
-
-<box id="aBox" width="200">
-  <button label="Añade" oncommand="addButton();"/>
-</box>
-
- - - -

The createElement() function will create the default type of element for the document. For XUL documents, this generally means that a XUL element will be created. For an HTML document, an HTML element will be created, so it will have the features and functions of an HTML element instead. The createElementNS() function may be used to create elements in a different namespace.

- -

The appendChild() function is used to add an element as a child of another element. Three related functions are the insertBefore(), replaceChild() and removeChild functions. The syntax of these functions is as follows:

- -
parent.appendChild(child);
-parent.insertBefore(child, referenceChild);
-parent.replaceChild(newChild, oldChild);
-parent.removeChild(child);
-
- -

It should be fairly straightforward from the function names what these functions do.

- - - -

Note that for all these functions, the reference child or child to remove must already exist or an error occurs.

- -

It is often the case that you want to remove an existing element and add it somewhere else. If so, you can just add the element without removing it first. Since a node may only be in one place at a time, the insertion call will always remove the node from its existing location first. This is a convenient way to move nodes around in the document.

- -

Copying Nodes

- -

To copy nodes however, you may call the cloneNode() function. This function makes a copy of an existing node so that you can add it somewhere else. The original node will stay where it is. It takes one boolean argument which indicates whether to copy all of the node's children or not. If false, only the node is copied, such that the copy won't have any children. If true, all of the children are copied as well. This is done recursively, so for large tree structures make sure that this is desired before passing true to the cloneNode() function. Here is an example:

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<hbox height="400">
-  <button label="Copy"
-          oncommand="this.parentNode.appendChild(this.nextSibling.cloneNode(true));"/>
-
-  <vbox>
-    <button label="First"/>
-    <button label="Second"/>
-  </vbox>
-</hbox>
-
- -

When the Copy button is pressed..

- - - -

Note that some elements, such as listbox and menulist provide some additional specialized modification functions which you should use instead when you can. Ésto se describe en la próxima sección.

- -

Manipulación de elementos básicos

- -

The main XUL elements such as buttons, checkboxes and radio buttons may be manipulated using a number of script properties. The properties available are listed in the referencia al element as those available are different for each element. Common properties that you will manipulate include the label, value, checked and disabled properties. They set or clear the corresponding attribute as necessary.

- -

Ejemplos de propiedades label y value

- -

Here is a simple example which changes the label on a button:

- -

Ejemplo 3: Código Ver en funcionamiento

- -
<button label="Hola" oncommand="this.label = 'Adiós';"/>
-
- -

Cuando el botón es apretado, el label es cambiado. This technique will work for a variety of different elements that have labels. For a textbox, you can do something similar for the value property.

- -

Ejemplo 4: Código Ver en funcionamiento

- -
<button label="Añade" oncommand="this.nextSibling.value += '1';"/>
-<textbox/>
-
- -

This example adds a '1' to the textbox each time the button is pressed. The nextSibling property navigates from the button (this) to the next element, the textbox. The '+=' operator is used to add to the current value so a 1 will be added onto the end of the existing text. Note that you can still enter text into the textbox. You can also retrieve the current label or value using these properties, as in the following example:

- -

Ejemplo 5: Código Ver en funcionamiento

- -
<button label="Hola" oncommand="alert(this.label);"/>
-
- -

Toggling a checkbox

- -

Checkboxes have a checked property which may be used to check or uncheck the checkbox. It should be easy to determine how this is used. In this next example, we reverse the state of the checked property whenever the button is pressed. Note that while the label and value properties are strings, the checked property is a boolean property which will be set either true or false.

- -

Ejemplo 6: Código Ver en funcionamiento

- -
<button label="Change" oncommand="this.nextSibling.checked = !this.nextSibling.checked;"/>
-<checkbox label="Check for messages"/>
-
- -

Radio buttons may be selected as well using properties, however since only one in a group may be selected at a time, the others must all be unchecked when one is checked. You don't have to do this manually of course. The radiogroup's selectedIndex property may be used to do this. The selectedIndex property may be used to retrieve theindex of the selected radio button in the group and well as change it.

- -

Cambio de un elemento desactivado o activado

- -

It is common to disable particular fields that don't apply in a given situation. For example, in a preferences dialog, one might have the choice of several possibilities, but one choice allows additional customization. Here is an example of how to create this type of interface.

- -

Ejemplo 7: Código Ver en funcionamiento

- -
<script>
-function updateState(){
-  var name = document.getElementById("name");
-  var sindex = document.getElementById("group").selectedIndex;
-  name.disabled = sindex == 0;
-}
-</script>
-
-<radiogroup id="group" onselect="updateState();">
-  <radio label="Random name" selected="true"/>
-  <hbox>
-    <radio label="Specify a name:"/>
-    <textbox id="name" value="Jim" disabled="true"/>
-  </hbox>
-</radiogroup>
-
- -

In this example a function updateState() is called whenever a select event is fired on the radio group. This will happen whenever a radio button is selected. This function will retrieve the currently selected radio element using the selectedIndex property. Note that even though one of the radio buttons is inside an hbox, it is still part of the radio group. If the first radio button is selected (index of 0), the textbox is enabled by setting its disabled property to true. If the second radio button is selected, the textbox is enabled.

- -

La sección siguiente proporciona más detalles sobre la manipulación de listas.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_asistentes/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_asistentes/index.html" deleted file mode 100644 index 0ba0eb84c5..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_asistentes/index.html" +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Más asistentes -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Más_asistentes -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/More_Wizards ---- -
-

« AnteriorSiguiente »

-
- -

 

- - - -

Normalmente, un asistente muestra cada wizardpage en el orden en el cual se han puesto en el archivo XUL. En algunos casos sin embargo, se necesita tener diferentes páginas que aparecerán en el asistente en función de lo que seleccionó el usuario en páginas anteriores.

- -

En este caso, el atributo pageid se coloca en cada una de las páginas. Ésto tiene que ser definido en un identificador para cada página. Después, para navegar a una página, se usará uno de estos dos métodos:

- -
    -
  1. Set the next attribute on each page to the page ID of the next page to go to. You can change these attributes as needed to navigate to different pages.
  2. -
  3. Call the wizard's goTo() method. It takes one argument, the page ID of a page to go to. You might call this method in the onpageadvanced or onwizardnext handlers. Remember to return false in this case, because you have already changed the page yourself. Note that the goTo() method, because it causes a page change, will fire the events again, so you'll have to make sure you handle that case.
  4. -
- -

For example, here are a set of wizard pages (the inner content has been omitted):

- -
<wizardpage pageid="type" next="font">
-<wizardpage pageid="font" next="done">
-<wizardpage pageid="color" next="done">
-<wizardpage pageid="done">
-
- - - -

A script will adjust the next attributes as necessary to go to the page with the page ID color when needed.

- -

Funciones de asistente

- -

The wizard works much like a etiquetas, except that the tabs are not displayed and the user navigates between pages by using the buttons along the bottom. Because all of the pages are part of the same file, all of the values of the fields on all pages will be remembered. Thus, you do not have to load and save information between pages.

- -

However, you may want to do some validation of each field on each page. For this, use the handlers described in the previous section. If a field is invalid, you might display an alert. In some cases, it would be more convenient to disable the Next button until valid input has been entered.

- -

The wizard has a property canAdvance, which can be set to true to indicate that the Next button should be enabled. If set to false, the Next button is disabled. You can change the property when invalid or valid data has been entered.

- -

In the following example, the user must enter a secret code into a textbox on the first page of the wizard. The function checkCode() is called whenever the first page is shown as indicated by the onpageshow attribute. It is also called whenever a key is pressed in the textbox, to determine whether the Next button should be enabled again.

- -

Ejemplo de asistente

- -

Código Ver en funcionamiento

- -
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<wizard id="theWizard" title="Asistente de código secreto"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-<script>
-function checkCode(){
-  document.getElementById('theWizard').canAdvance = (document.getElementById('secretCode').value == "cabbage");
-}
-</script>
-
-  <wizardpage onpageshow="checkCode(); return true;">
-       <label value="Escriba el código secreto:"/>
-       <textbox id="secretCode" onkeyup="checkCode();"/>
-  </wizardpage>
-
-  <wizardpage>
-       <label value="Ésto es el código secreto correcto."/>
-  </wizardpage>
-
-</wizard>
-
- -

There is also a corresponding canRewind property that you can use to enable or disable the Back button. Both properties are adjusted automatically as you switch pages. Thus, the Back button will be disabled on the first page so you don't have to set it yourself.

- -

Another useful property of the wizard is currentPage, which holds a reference to the currently displayed wizardpage. You can also modify the current page by changing this property. If you do change it, the various page change events will still be fired.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_caracter\303\255sticas_de_los_botones/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_caracter\303\255sticas_de_los_botones/index.html" deleted file mode 100644 index fdf8c15409..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_caracter\303\255sticas_de_los_botones/index.html" +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Más características de los botones -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Más_características_de_los_botones -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/More_Button_Features ---- -

En esta sección, veremos algunas características adicionales de los botones.

- -

Añadiendo una imagen

- -

Usted puede agregar una imagen a un botón especificando una URL en el atributo imagen. La imagen se carga desde la URL, la cual puede ser relativa o absoluta, entonces la imagen se muestra sobre el botón.

- -

El botón de arriba tendrá label y imagen 'happy.png'. La imagen aparecerá a la izquierda de la etiqueta. Usted puede cambiar la posición usando otros dos atributos. Esto se explicará en un momento.

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<button label="Ayuda" image="happy.png"/>
-
- -

Botón con imagen CSS

- -

Another way to specify the image is by using the CSS list-style-image style property on the button. This is designed to allow the 'skin' (in this case, the appearance of the image) to be changed without changing the XUL file. An example is shown below.

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<button id="find-button"
-  label="Busca" style="list-style-image: url('happy.png')"/>
-
- -

In this case, the image 'happy.png' is displayed on the button. The estilo attribute functions similar to its HTML counterpart. In general, it can be used on all XUL elements. Note that you really should put the style declarations in a separate style sheet.

- -

Posicionando las imágenes

- -

By default, the image on a button will appear to the left of the text label. There are two attributes that can be used to control this position.

- -

The dirección attribute controls the direction of the image and text. By setting this attribute to the value reverse, the image will be placed on the right side of the text. By using the value normal, or leaving the attribute out entirely, the image will be placed on the left side of the text.

- -

The orientación attribute can be used to place the image above or below the text. The default value is horizontal which is used to place the image on the left or right. You can also use the value vertical to place the image above or below. In this case, the dir attribute controls the placement above or below. The same values are used, where normal means place the image above the text, and reverse means place the image below the text.

- -

Ejemplo 3: Código Ver en funcionamiento

- -
Image:advbtns1.png
- -
<button label="Left" image="happy.png"/>
-<button label="Right" image="happy.png" dir="reverse"/>
-<button label="Above" image="happy.png" orient="vertical"/>
-<button label="Below" image="happy.png" orient="vertical" dir="reverse"/>
-
- -

 

- -

The example here shows all four types of alignment of buttons. Note that the two attributes are not specified when the default value can be used.

- -

Botones con contenido extra

- -

Buttons may have arbitrary markup contained inside them, and it will be rendered inside the button. You probably wouldn't use this very often, but you might use it when creating custom elements.

- -

For example, the following will create a button where two of the words are red:

- -

Ejemplo 4: Código Ver en funcionamiento

- -
<button>
-  <description value="This is a"/>
-  <description value="rather strange" style="color: red;"/>
-  <description value="button"/>
-</button>
-
- -

Any XUL element may be placed inside the botón. HTML elements will be ignored, so you need to wrap them inside a descripción element. If you specify the label attribute on the button, it will override any content placed inside the button.

- -

Botón con menú emergente

- -

You can place a menupopup inside the button to cause a menu to drop down when the button is pressed, much like the menulist. However, in this case you must set the type attribute to the value menu.

- -

Ejemplo 5:

- -

Código Ver en funcionamiento

- -
Image:advbtns2.png
- -
<button type="menu" label="Device">
-  <menupopup>
-    <menuitem label="Impresora"/>
-    <menuitem label="Ratón"/>
-    <menuitem label="Teclado"/>
-  </menupopup>
-</button>
-
- -

In this example, the user may click the button to pop up a menu containing three items. Note that selecting one of these menu items doesn't change the label on the button, unlike a menulist. This type of button is intended to be used like a menu, with scripts attached to each item to perform a task. We'll see more on menus later.

- -

You can also set the type attribute to the value menu-button. This also creates a button with a menu, but the appearance will be different. The image to the right shows the difference. The left one is a 'menu' and the second one is a 'menu-button'. It has an arrow indicating the presence of a menu. For the 'menu', the user may click anywhere on the button to show the menu. For the 'menu-button', the user must click the arrow to show the menu.

- -

Seguimos con como los elementos XUL son colocados en una ventana.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_caracter\303\255sticas_de_los_\303\241rboles/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_caracter\303\255sticas_de_los_\303\241rboles/index.html" deleted file mode 100644 index e8eb95ca57..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_caracter\303\255sticas_de_los_\303\241rboles/index.html" +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Más características de los árboles -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Más_características_de_los_árboles -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/More_Tree_Features ---- -

Aquí veremos más características de los árboles.

- -

Árboles jerárquicos

- -

El elemento tree también puede utilizarse para crear listas jerárquicas, similares a las encontradas en un administrador de archivos o a una lista de marcadores de un navegador. Para lograr esto deben realizarse dos cosas:

- -

Primero debe marcarse como contenedor al elemento treeitem que contenga hijos, esto se consigue agregándole el atributo container (contenedor) de la siguiente manera:

- -
<treeitem container="true"/>
-
- -

Esto permite al usuario hacer doble-clic sobre el árbol para expandir y contraer las filas internas. Puede hacerse que las filas hijas sean visibles desde un principio simplemente agregando el atributo open (abierto). Cuando el usuario expanda o contraiga el árbol, éste atributo cambiará para reflejar el estado actual.

- -

El segundo cambio a realizar es colocar el atributo primary (primario) en la primer columna. Esto provocará la aparición de un pequeño triángulo o un signo “+�? delante de las celdas en esa columna. Esto indicará que esas celdas pueden expandirse, además las filas hijas tendrán sangrado. Note que el usuario no puede ocultar la primer columna.

- -

Cada hijo puede especificarse poniendo un elemento treechildren dentro de treeitem, si se coloca dentro de treerow no funcionará.

- -

Puede repetirse este proceso para crear árboles profundamente anidados. En esencia, un elemento treeitem puede contener ya sea filas simples -declaradas con el elemento treerow- o una colección de filas que se declaran con el elemento treechildren.

- -

El siguiente es un ejemplo sencillo:

- -

Ejemplo

- -

Código Ver en funcionamiento

- -
<tree flex="1">
-  <treecols>
-      <treecol id="nombre" label="Nombre" primary="true" flex="3"/>
-      <treecol id="apellido" label="Apellido" flex="7"/>
-  </treecols>
-
-  <treechildren>
-    <treeitem container="true" open="true">
-      <treerow>
-        <treecell label="Tipos"/>
-      </treerow>
-
-      <treechildren>
-        <treeitem>
-          <treerow>
-            <treecell label="Pepe"/>
-            <treecell label="Carpintero"/>
-          </treerow>
-        </treeitem>
-        <treeitem>
-          <treerow>
-            <treecell label="Lito"/>
-            <treecell label="Albañil"/>
-          </treerow>
-        </treeitem>
-      </treechildren>
-    </treeitem>
-  </treechildren>
-</tree>
-
- -

Image:advtrees1.jpg

- -

Esto ha creado un árbol jerárquico. Como puede verse en la imagen, un pequeño símbolo “+�? o “-�? apareció junto a la primer fila, indicando que contiene filas hijas. El usuario puede abrir o cerrar la lista hacienda doble-clic en esa fila. Note como la fila Tipos necesita solamente una columna y es un ítem de posición para sus hijos.

- -

El elemento treeitem externo contiene un elemento treerow y un elemento treechildren, el primero crea los datos para la fila madre y el último contiene las filas hijas.

- -

También pueden anidarse filas profundamente. Debe recordarse que hay que utilizar el atributo container en las filas que contienen filas hijas. La simple presencia de filas hijas no es suficiente indicación ya que puede haber un contenedor que no contenga hijos pero aún debe ser tratado como contenedor. Por ejemplo, un directorio sin archivos dentro debe ser tratado como contenedor aunque esté vacío.

- -

Más sobre las columnas del árbol

- -

Un atributo adicional que puede colocarse al árbol es enableColumnDrag (habilitar arrastre de columna, note las iniciales en mayúscula). Si se encuentra habilitado el usuario podrá arrastrar los encabezados de columna para reconfigurar el orden de las mismas,

- -

El usuario también querrá cambiar el ancho de las columnas, esto se logra poniendo un elemento splitter (divisor) entre cada elemento treecol. Aparecerá una pequeña muesca entre cada encabezado de columna, la cual podrá ser arrastrada por el usuario para cambiar el ancho de la columna. Para esconder la muesca puede fijarse en 0 el atributo CSS max-width del divisor, a pesar de lo cual el ancho de la columna seguirá siendo modificable. La hoja de estilos globales proporciona una clase tree-splitter, la cual realiza esto.

- -

Puede establecerse el ancho mínimo y máximo de una columna utilizando las propiedades de estilo minwidth y maxwidth en el encabezado de la columna.

- -

La columna puede estar oculta de manera predeterminada si se coloca un atributo hidden (oculto) con el valor true. El usuario podrá escoger si ve la columna seleccionándola en el menú desplegable que se encuentra al final de la fila encabezado.

- -

Como con todos los elementos, puede utilizarse el atributo persist (persistir) para almacenar el estado de las columnas entre sesiones. Esto es, una vez que el usuario se decide por una disposición de columnas de su agrado, esta será automáticamente almacenada para la próxima vez. Será necesario guardar un cierto número de atributos como se indica en el siguiente ejemplo:

- -

Ejemplo

- -

Código Ver en funcionamiento

- -
<tree enableColumnDrag="true" flex="1">
-  <treecols>
-    <treecol id="corredor" label="Corredor" flex="2" persist="width ordinal hidden"/>
-    <splitter class="tree-splitter"/>
-    <treecol id="ciudad" label="Ciudad de origen" flex="2" persist="width ordinal hidden"/>
-    <splitter class="tree-splitter"/>
-    <treecol id="horainicio" label="Hora de inicio" flex="1" persist="width ordinal hidden"/>
-    <splitter class="tree-splitter"/>
-    <treecol id="horafin" label="Hora de finalización" flex="1" persist="width ordinal hidden"/>
-  </treecols>
-
-  <treechildren>
-    <treeitem>
-      <treerow>
-        <treecell label="Joshua Granville"/>
-        <treecell label="Vancouver"/>
-        <treecell label="7:06:00"/>
-        <treecell label="9:10:26"/>
-      </treerow>
-    </treeitem>
-    <treeitem>
-      <treerow>
-        <treecell label="Robert Valhalla"/>
-        <treecell label="Seattle"/>
-        <treecell label="7:08:00"/>
-        <treecell label="9:15:51"/>
-      </treerow>
-    </treeitem>
-  </treechildren>
-</tree>
-
- -

En este caso deberán marcarse como persistentes tres atributos de las columnas:

- - - -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_funciones_de_men\303\272/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_funciones_de_men\303\272/index.html" deleted file mode 100644 index 2c90a3fdd9..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_funciones_de_men\303\272/index.html" +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Más funciones de menú -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Más_funciones_de_menú -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - para_revisar -translation_of: Archive/Mozilla/XUL/Tutorial/More_Menu_Features ---- -

En esta sección, veremos cómo crear submenús y menús con marcas de verificación o checks.

- -

Crear submenús

- -

Puedes crear submenús dentro de otros menús (menús jerarquizados ) usando los elementos existentes. Recuerda que puedes poner cualquier elemento dentro de un menupopup. Ya hemos visto cómo colocar menuitems y menuseparators en menupopups. Sin embargo , puedes crear submenús simplemente colocando el elemento de menu dentro del elemento del menupopup . Esto funciona porque el elemento del menú es válido aún cuando no esté colocado directamente en la barra de menú. El ejemplo de abajo crea un submenú simple dentro del menú de File.

- -

Ejemplo 1: Código Ver en funcionamiento

- -
nested-menu.jpg
- -
<toolbox flex="1">
-  <menubar id="sample-menubar">
-    <menu id="file-menu" label="Archivo">
-      <menupopup id="file-popup">
-        <menu id="new-menu" label="Nuevo">
-          <menupopup id="new-popup">
-            <menuitem label="Ventana"/>
-            <menuitem label="Mensage"/>
-          </menupopup>
-        </menu>
-        <menuitem label="Abrir"/>
-        <menuitem label="Guardar"/>
-        <menuseparator/>
-        <menuitem label="Salir"/>
-      </menupopup>
-    </menu>
-  </menubar>
-</toolbox>
-
- -

Adición de un menú a nuestro ejemplo con el Buscador de archivos

- -

Agreguemos un menú al dialogo de búsqueda de archivos. Agregaremos solo unos pocos comandos simples a un menú File y un menú Edit. Este es similar al ejemplo de arriba.

- -
<toolbox>
-
- <menubar id="findfiles-menubar">
-  <menu id="file-menu" label="Archivo" accesskey="f">
-    <menupopup id="file-popup">
-      <menuitem label="Abrir la búsqueda..." accesskey="o"/>
-      <menuitem label="Guardar la búsqueda..." accesskey="s"/>
-      <menuseparator/>
-      <menuitem label="Cerrar" accesskey="c"/>
-    </menupopup>
-  </menu>
-  <menu id="edit-menu" label="Editar" accesskey="e">
-    <menupopup id="edit-popup">
-      <menuitem label="Cortar" accesskey="t"/>
-      <menuitem label="Copiar" accesskey="c"/>
-      <menuitem label="Pegar" accesskey="p" disabled="true"/>
-    </menupopup>
-  </menu>
- </menubar>
-
-<toolbar id="findfiles-toolbar>
-
- -
fnd-dlg-sample.jpg
- -

Aquí hemos agregado dos menús con varios comandos en ellos. Observa cómo la barra de menús fue agregada dentro de la caja. Los tres puntos después de Open y Save son la forma habitual en la que se indica al usuario que se abrirá un dialogo cuando seleccione el comando. Se han agregado claves de acceso para cada menú y elemento de menú. Verás en la imagen que esta letra ha sido subrayada en la etiqueta del menú. Además, el comando Pegar (Paste) ha sido deshabilitado. Asumiremos que no hay nada que pegar.

- -

 Ejemplo de Encontrar archivos  : Código Ver en funcionamiento

- -

Añadir marcas de verificación (checkmarks) a los menús

- -

Muchas aplicaciones tienen elementos de menú que tienen marcas de verificación o checks. Por ejemplo, una característica que este activada tiene una marca de verificación o check al lado del comando y una característica que está deshabilitada no lo tiene. Cuando el usuario selecciona el menú, cambia el estado de la marca o check (habilitado/deshabilitado). Puedes además agregar botones redondos en los elementos del menú.

- -

Las marcas de verificación o checks se crean de manera similar a los elementos checkbox y radio . Esto implica el uso de dos atributos: type para indicar el tipo de  marca o check y name para agrupar comandos. El ejemplo de abajo crea un menú con una marca de verificación.

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<toolbox>
-  <menubar id="options-menubar">
-    <menu id="options_menu" label="Opciones">
-      <menupopup>
-        <menuitem id="backups" label="Hacer copias de seguridad" type="checkbox"/>
-        <menuitem id="backups" label="Enviar un email al administrador" type="checkbox" checked="true"/>
-      </menupopup>
-    </menu>
-  </menubar>
-</toolbox>
-
- -

El atributo type se ha agregado con el fin poder marcar o desmarcar un elemento del menú. Al establecer su valor a checkbox , el elemento del menú puede marcarse o desmarcarse seleccionando dicho elemento.

- -

Menú con botones circulares

- -

Además de las marcas estándares, puedes crear checks con estilo circular cambiando el valor de type a el valor de radio. Un botón circular si usa si se desea agrupar varios elementos del menús pero se puede seleccionar solo uno a la vez. Un ejemplo puede ser a menú de Fuente (font) donde únicamente puede seleccionarse una fuente a la vez. Cuando se selecciona otro elemento, el seleccionado previamente queda deshabilitado.

- -

Con el fin de agrupar un conjunto de elementos del menú, tienes que poner un atributo name a cada uno. Establece el valor para la misma cadena. El ejemplo siguiente lo muestra:

- -

Ejemplo 3: Código Ver en funcionamiento

- -
<toolbox>
-  <menubar id="planets-menubar">
-    <menu id="planet-menu" label="Planetas">
-      <menupopup>
-        <menuitem id="júpiter" label="Júpiter" type="radio" name="ringed"/>
-        <menuitem id="saturno" label="Saturno" type="radio" name="ringed" checked="true"/>
-        <menuitem id="uranus" label="Uranus" type="radio" name="ringed"/>
-        <menuseparator/>
-        <menuitem id="tierra" label="Tierra" type="radio" name="inhabited" checked="true"/>
-        <menuitem id="luna" label="Luna" type="radio" name="inhabited"/>
-      </menupopup>
-    </menu>
-  </menubar>
-</toolbox>
-
- -

Si pruebas a hacer este ejemplo, encontrarás que de los tres primeros elementos del menú, solamente se puede seleccionar uno. Se agrupan juntos porque todos tienen el mismo nombre. El último elemento del menú es Earth, aunque es un botón circular, no es parte de este grupo porque tiene un nombre diferente.

- -

Desde luego, los elementos agrupados deben estar dentro del mismo menú. No se deben ubicar cerca unos de otros en el menú, además no tiene mucho sentido que lo estén.

- -

Seguimos con la creación de menús emergentes.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_gestores_de_eventos/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_gestores_de_eventos/index.html" deleted file mode 100644 index d181cbea94..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/m\303\241s_gestores_de_eventos/index.html" +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Más gestores de eventos -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Más_gestores_de_eventos -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/More_Event_Handlers ---- -

In this section, the event object is examined and additional events are described.

- -

El objeto de evento

- -

Each event handler has a single argument which holds an event object. In the attribute form of event listener, this event is an implied argument to the script code which can be refered to using the name 'event'. In the addEventListener form, the first argument to the listener function will be the event object. The event object has a number of properties which can be examined during an event. The full list can be found in the referencia al objeto en planeta XUL.

- -

We already saw the event's target property in the last section. It holds a reference to the element where the event occured. A similar property currentTarget holds the element that is currently having its event listeners handled. In the example below, currentTarget is always the vbox, whereas target would be the specific element, either the button or checkbox, that was activated. Ejemplo 1: Código Ver en funcionamiento

- -
<vbox oncommand="alert(event.currentTarget.tagName);">
-  <button label="OK"/>
-  <checkbox label="Show images"/>
-</vbox>
-
- -

La evento de parada de propagación

- -

Once you handle an event, regardless of where in the propagation the event is, you will likely want to stop the event from being sent to further elements, essentially stopping the capturing or bubbling phases from continuing. Depending on how you attach the event listener to an element, there are different ways of doing this.

- -

Recall that the capturing phase occurs before the bubbling phase, so any capturing listeners will trigger before any bubbling listeners. If a capturing event stops the event propagation, none of the later capturing listeners, nor any of the bubbling listeners will ever receive notification about the events. To stop event propagation, call the event object's stopPropagation method, as in the following example.

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<hbox id="outerbox">
-  <button id="okbutton" label="OK"/>
-</hbox>
-
-<script>
-function buttonPressed(event){
-  alert('Button was pressed!');
-}
-
-function boxPressed(event){
-  alert('Box was pressed!');
-  event.stopPropagation();
-}
-
-var button = document.getElementById("okbutton");
-button.addEventListener('command',buttonPressed,true);
-
-var outerbox = document.getElementById("outerbox");
-outerbox.addEventListener('command',boxPressed,true);
-</script>
-
- -

Here, an event listener has been added to the button and another event listener has been added to the box. The stopPropagation method has been called in the box's listener, so the button's listener never gets called. If this call was removed, both listeners would be called and both alerts would appear.

- -

Prevent Default Action

- -

If no event handlers have been registered for an event, then after completing the capturing and bubbling phases, the element will handle the event in a default way. What will happen depends on the event and the type of element. For example, the 'popupshowing' event is sent to a popup just before it is displayed. The default action is to display the popup. If the default action is prevented, the popup will not be displayed. The default action can be prevented with the event object's preventDefault method, as in the example below.

- -

Ejemplo 3: Código Ver en funcionamiento

- -
<button label="Tipos" type="menu">
-  <menupopup onpopupshowing="event.preventDefault();">
-    <menuitem label="Vidrio"/>
-    <menuitem label="Plástico"/>
-  </menupopup>
-</button>
-
- -

Alternatively, for attribute event listeners, you can just return false from the code. Note that preventing the default action is not the same as stopping event propagation with the stopPropagation method. Even if the default action has been prevented, the event will still continue to propagate. Similarly, calling the stopPropagation method won't prevent the default action. You must call both methods to stop both from occuring.

- -

Note that once propagation or the default action has been prevented, neither may be re-enabled again for that event.

- -

The following sections list some of the events that may be used. A full list is provided in the referencia al gestor de evento en planeta XUL.

- -

Eventos del ratón

- -

There are several events which can be used to handle mouse specific actions, which are described briefly below:

- -
-
click
-
Called when the mouse is pressed and released on an element.
-
- -
-
dblclick
-
Called when the a mouse button is double clicked.
-
- -
-
mousedown
-
Called when a mouse button is pressed down on an element. The event handler will be called as soon as a mouse button is pressed, even if it hasn't been released yet.
-
- -
-
mouseup
-
Called when a mouse button is released on an element.
-
- -
-
mouseover
-
Called when the mouse pointer is moved onto an element. You could use this to highlight the element, however CSS provides a way to do this automatically so you shouldn't do it with an event. You might, however, want to display some help text on a status bar.
-
- -
-
mousemove
-
Called when the mouse pointer is moved while over an element. The event may be called many times as the user moves the mouse so you should avoid performing lengthy tasks frorm this handler.
-
- -
-
mouseout
-
Called when the mouse pointer is moved off of an element. You might then unhighlight the element or remove status text.
-
- -

There are also a set of drag related events, which occur when the user holds down a mouse button and drags the mouse around. Those events are described in Drag and Drop.

- -

Propiedades del botón del ratón

- -

When a mouse button event occurs, a number of additional properties are available to determine which mouse buttons were pressed and the location of the mouse pointer. The event's button property can be used to determine which button was pressed, where possible values are 0 for the left button, 1 for the right button and 2 for the middle button. If you've configured your mouse differently, these values may be different.

- -

The detail property holds the number of times the button has been clicked quickly in sequence. This allows you to check for single, double or triple clicks. Of course, if you just want to check for double clicks, you can also use the dblclick event instead. The click event will be fired once for the first click, again for the second click, and again for the third click, but the dblclick event will only be fired once for a double click.

- -

The button and detail properties only apply to the mouse button related events, not mouse movement events. For the mousemove event, for example, both properties will be set to 0.

- -

Propiedades de la posición del ratón

- -

However, all mouse events will be supplied with properties that hold the coordinates of the mouse position where the event occured. There are two sets of coordinates. The first is the screenX and screenY properties and are relative to the top left corner of the screen. The second set, clientX and clientY, are relative to the top left corner of the document. Here is an example which displays the current mouse coordinates:

- -

Ejemplo 4: Código Ver en funcionamiento

- -
<script>
-
-function updateMouseCoordinates(event){
-  var text = "X:" + event.clientX + " Y:" + event.clientY;
-  document.getElementById("xy").value = text;
-}
-</script>
-
-<label id="xy"/>
-<hbox width="400" height="400" onmousemove="updateMouseCoordinates(event);"/>
-
- -

In this example, the size of the box has been set explicity so the effect is easier to see. The event handler gets the clientX and clientY properties and creates a string from them. This string is then assigned to the value property of the label. Note that the event argument must be passed to the updateMouseCoordinates function. If you move the mouse quickly across the border of the box, you might notice that the coordinates don't generally stop right at 400. This is because the mousemove events occur at intervals depdending on the speed at which the mouse moves and the mouse is usually moved some distance past the border by the time the next event fires. Obviously, it would be much too inefficient to send a mousemove event for every pixel the mouse is moved.

- -

Element Relative Coordinates

- -

You will often want to get the coordinates of an event relative to the element where the element occured rather than the entire window. You can do this by subtracting the element's position from the event position, as in the following code.

- -
var element = event.target;
-var elementX = event.clientX - element.boxObject.x;
-var elementY = event.clientY - element.boxObject.y;
-
- -

XUL elements have a box object that can be retrieved using the boxObject property. We'll learn more about the box object in una sección más adelante, but it holds information pertaining to how the element is displayed, including the x and y position of the element. In this example code, these coordinates are subtracted from the event coordinates to get the event position relative to the element.

- -

Load Events

- -

The load event is sent to the document (la etiqueta de la ventana - <code>window</code>) once the XUL file has finished loading and just before the content is displayed. This event is commonly used to initialize fields and perform other tasks that need to be done before the user can use the window. You should use a load event to do these kinds of things as opposed to adding script at the top level outside a function. This is because the XUL elements may not have loaded or fully initialized yet, so some things may not work as expected. To use a load event, place an onload attribute on the window tag. Call code within the load handler which will initialize the interface as necessary.

- -

There is also an unload event which is called once the window has closed, or in a browser context, when the page is switched to another URL. You can use this event to save any changed information, for example.

- -


- Next, we'll find out how to add atajos de teclado.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/objeto_de_caja_de_\303\241rbol/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/objeto_de_caja_de_\303\241rbol/index.html" deleted file mode 100644 index d6eaf7a8d9..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/objeto_de_caja_de_\303\241rbol/index.html" +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: Objeto de caja de árbol -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Objeto_de_caja_de_árbol -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Tree_Box_Objects ---- -

 

- -

Ésta sección describe el objeto caja del árbol usada para gestionar como un árbol es mostrado.

- -

Sobre el objeto caja del árbol

- -

Box objects were described in an sección. The tree box object is a specialized box object used specifically for trees. The tree box implements the TreeBoxObject interface.

- -

Redibujando el árbol

- -

We already saw the rowCountChanged() function of the tree box object in the previous section. It is used to indicate that one or more rows have been added to the tree or removed from the tree. The tree will redraw the affected area. You don't need to call the rowCountChanged() function when a row has simply changed in some way, for example if a cell's label changes. In this case, there are other drawing functions that can be used. The simplest is to call invalidateRow() which will redraw a specific row in the tree. The tree will call the view to get the updated data and update the contents of the tree on screen.

- -

Other redrawing functions are

- - - -

Note that redrawing does not occur until the calling script ends since Mozilla does not redraw in the background.

- -

Desplegando el árbol

- -

You can also scroll the tree using four different methods, similar to those available for listboxes. The scrollToRow() function may be used to scroll to a particular row. Here is a simple example.

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<script>
-function doScroll(){
-  var value = document.getElementById("tbox").value;
-  var tree = document.getElementById("thetree");
-
-  var boxobject = tree.boxObject;
-  boxobject.QueryInterface(Components.interfaces.nsITreeBoxObject);
-  boxobject.scrollToRow(value);
-}
-</script>
-
-<tree id="thetree" rows="4">
-  <treecols>
-    <treecol id="row" label="Row" primary="true" flex="1"/>
-  </treecols>
-  <treechildren>
-    <treeitem label="Row 0"/>
-    <treeitem label="Row 1"/>
-    <treeitem label="Row 2"/>
-    <treeitem label="Row 3"/>
-    <treeitem label="Row 4"/>
-    <treeitem label="Row 5"/>
-    <treeitem label="Row 6"/>
-    <treeitem label="Row 7"/>
-    <treeitem label="Row 8"/>
-    <treeitem label="Row 9"/>
-  </treechildren>
-</tree>
-
-<hbox align="center">
-  <label value="Scroll to row:"/>
-  <textbox id="tbox"/>
-  <button label="Scroll" oncommand="doScroll();"/>
-</hbox>
-
- -

Note that we use the rows attribute on the tree to specify that only four rows are displayed at a time. This makes it easier to see how the example works. Also, notice that the first row is 0.

- -

The doScroll() function gets the box object and calls the scrollToRow() function with an argument set to the value of the textbox. You might notice that the tree box object can be retieved in the same way as other box objects using the boxObject property, however we need to call QueryInterface() to cast the box object to the more specific tree box object. The functions of the more general box object are also available to trees.

- -

Additional scroll methods include the scrollByLines(), scrollByPages() and ensureRowIsVisible() functions.

- -

The scrollByLines() scrolls up or down by a certain number of rows. Use a positive number to go down and a negative number to go up. The scrollByPages() function scrolls by a number of pages and is called automatically when the user presses the page up or page down keys while the tree is focused. A page is equal to the number of visible rows. For example if the tree shows 10 rows at a time, a page will be equivalent to 10 rows. This is a convenient method since when the user resizes a flexible tree, the page size will grow and shrink, so you don't need to calculate the page size manually. This isn't too hard to calculate manually anyway since the tree box object also provides a getPageLength() function which returns the number of rows in a page. In the scrolling example above, getPageLength() would return four.

- -
-

Note that in Firefox 1.0 and Mozilla 1.7 and earlier, the getPageLength() function is called getPageCount() instead. The name was changed to getPageLength() since it was confusing before since it doesn't return the number of pages, but the size of each page. You could determine the number of pages by dividing the total number of rows by the page length.

-
- -

The ensureRowIsVisible() function will scroll to a row just as scrollToRow() does, but does not scroll if the row is already visible.

- -

Coordenadas de celda

- -

Some of the most interesting functions of the tree box object are several functions which may be used to get the parts of the tree at specific coordinates and vice versa.

- - - -
tree.boxObject.getRowAt( 50, 100 );
-
- -

This example will return the index of the row with a horizontal position of 50 and a vertical position of 100. Naturally, it doesn't really matter what the value of the x coordinate is since rows always take up the entire horizontal space of the tree.

- -
One important thing to note is that the coordinates are measured from the upper left corner of the containing document, not the edge of the tree itself.
- -

This makes it easy to pass event coordinates directly to these functions, as in the following example of the getCellAt() function.

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<script>
-function updateFields(event){
-  var row = {}, column = {}, part = {};
-  var tree = document.getElementById("thetree");
-
-  var boxobject = tree.boxObject;
-  boxobject.QueryInterface(Components.interfaces.nsITreeBoxObject);
-  boxobject.getCellAt(event.clientX, event.clientY, row, column, part);
-
-  if (column.value && typeof column.value != "string")
-    column.value = column.value.id;
-
-  document.getElementById("row").value = row.value;
-  document.getElementById("column").value = column.value;
-  document.getElementById("part").value = part.value;
-}
-</script>
-
-<tree id="thetree" flex="1" onmousemove="updateFields(event);">
-  <treecols>
-    <treecol id="utensil" label="Utensil" primary="true" flex="1"/>
-    <treecol id="count" label="Count" flex="1"/>
-  </treecols>
-  <treechildren>
-    <treeitem>
-      <treerow>
-        <treecell label="Fork"/>
-        <treecell label="5"/>
-      </treerow>
-    </treeitem>
-    <treeitem>
-      <treerow>
-        <treecell label="Knife"/>
-        <treecell label="2"/>
-      </treerow>
-    </treeitem>
-    <treeitem>
-      <treerow>
-        <treecell label="Spoon"/>
-        <treecell label="8"/>
-      </treerow>
-    </treeitem>
-  </treechildren>
-</tree>
-
-<label value="Row:"/>
-<label id="row"/>
-<label value="Column:"/>
-<label id="column"/>
-<label value="Child Type:"/>
-<label id="part"/>
-
- -

The getCellAt() function takes five arguments, the coordinates to look up and three out parameters. An out parameter is used since the function needs to return more that one value. You will see a number of interfaces that use out parameters in the XULPlanet object reference. These are indicated by the word 'out' before the argument. For these, you will need to supply an empty object and the function will fill in the 'value' property with the necessary value.

- -

The three out parameters will be filled in with the row, the column and a child type. The row is the index of the row the mouse is over, since we call it with the event coordinates of a mousemove event. If the coordinate is not over a row, the row value will be set to -1. The column is a column object in Mozilla 1.8 and later. In earlier versions, columns are identified with a string, the id of the column. In later versions, a separate column object exists, which can be queried for column data.

- -

The following line is used so that the example above will work in all versions.

- -
if (column.value && typeof column.value != "string")
-  column.value = column.value.id;
-
- -

If the column is a string, we are running on Mozilla 1.7 or earlier, but for later versions we get the column id from the column object. If you are writing code for multiple versions, you should check for this as above.

- -

The last argument to getCellAt() is the child type which is filled in with a string depending on what part of the cell the coordinate is at. If you move the mouse around in the previous example, you might notice the label change between 'text' and 'cell'. The value 'text' indicates the area where the text would be drawn and the value 'cell' indicates the area around the text, for example, the margin on the left side where the open and close twisties are normally drawn. If there was a twisty, however, the value would be 'twisty' instead. This is convenient since you could determine whether the user clicked on a twisty instead of another part of the row. In fact, this is what the underlying tree code does when the user double clicks the twisty. The final value that may be returned is 'image' if there is an image in the tree cell and the coordinate corresponds to a location where the image is. Of course, in many cases you may not care what part of the cell the coordinate is on and just want the row and column.

- -

To go in reverse and get the cell at a specific coordinate, use the getCoordsForCellItem() function. It takes seven arguments, as described below.

- -
var x = {}, y = {}, width = {}, height = {};
-if (typeof tree.columns != "undefined") column = tree.columns[column];
-tree.boxObject.getCoordsForCellItem( row, column, part, x, y, width, height );
-
- -

The row, column, and part arguments are similar to those returned from the getCellAt() function. Again, the column should be either a string or a column object depending on which version you are using. The cell part type may be used to get the coordinates of either the text, the entire cell, the twisty or the image in the cell. The same values as the getCellAt() function are used. The getCoordsForCellItem() function returns the x and y coordinates in addition to the width and height, all as out parameters.

- -

Next, we'll look at RDF which can be used to automatically populate trees and other elements.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/paneles_de_contenidos/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/paneles_de_contenidos/index.html deleted file mode 100644 index 3be2bfc904..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/paneles_de_contenidos/index.html +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Paneles de contenidos -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Paneles_de_contenidos -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Content_Panels ---- -

 

-

En esta sección veremos como crear paneles capaces de mostrar páginas HTML o XUL.

-

Añadiendo marcos

-

Hay veces en que queremos tener parte de un documento cargado desde una página separada. Como por ejemplo en los dialogos guiados paso a paso, en los que pasamos secuencialmente de una pantalla a otra, preguntando una serie de preguntas. Cada vez que el usuario hace clic en el boton ‘siguiente’, la siguiente pantalla se muestra.

-

Se podrían crear estos dialogos guiados abriendo una ventana para cada pantalla, sin embargo hay almenos tres problemas con esta aproximación. Primero, cada ventana podría aparecer en un sitio diferente (aunque hay formas de evitarlo). Segundo, algunos elementos como los botones ‘atrás’ y ‘siguiente’ son siempre iguales durante todas las pantallas, por lo que sería mucho mejor si solo el área de contenidos fuera la que cambiara. Tercero, sería dificil coordinar los scripts si se ejecutarán en diferentes ventanas.

-

Cabe destacar que XUL nos ofrece el elemento wizard, que podemos usar para crear dialogos guiados. Este elementos se explicará más adelante.

-

Otra aproximación es usar marcos de contenido, el elemento iframe en XUL, el cual funciona practicamente igual que el elemento del mismo nombre en HTML. Crea un documento separado dentro de la ventana. Tiene la ventaja de que puede colocarse en cualquier parte de la ventana y de que su contenido puede guardarse en un fichero separado. Podemos decidir que fichero queremos que se muestre usando el atributo src. Este fichero puede ser de cualquier tipo, aunque normalmente usaremos ficheros HTML o XUL. Podemos cambiar los contenidos de un iframe, sin afectar a la ventana principal, usando un script.

-

En la ventana del navegador Mozilla, el área donde se muestra la página web se crea usando un iframe. Cuando el usuario introduce una dirección o hace clic en un enlace del documento, el atributo src del iframe es cambiado.

-

El siguiente ejemplo muestra el uso de los marcos de contenido:

-

Ejemplo: Usando iframe

-
<toolbox>
-  <toolbar id="nav-toolbar">
-    <toolbarbutton label="Atrás"/>
-    <toolbarbutton label="Siguiente"/>
-    <textbox id="urlfield"/>
-  </toolbar>
-</toolbox>
-
-<iframe id="contenidos" src="http://www.mozilla.org" flex="1"/>
-
-

Este ejemplo presenta el interfaz para un navegador web muy simple. Hay dos elementos principales, un toolbox (contenedor para barras de herramientas) y un iframe (marco de contenidos). Los botones Atrás y Siguiente, así como la caja de texto para la dirección se han incluido en una barra de herramientas. Las páginas web aparecerían dentro del elemento iframe, en este caso la página de la fundación Mozilla sería la que aparecería por defecto.

-

Este ejemplo no es completamente funcional. Posteriormente, necesitaremos adicionar un script el cual cambia el atributo en el tiempo deseado, por ejemplo cuando el usuario presiona la tecla Enter.

-

Browsers

-

There is a second type of content panel, using the browser tag. You would use this when you want to create a frame that displays content like a browser. Actually, the iframe can do this too, but the browser has a variety of additional features. For example, the browser maintains a page history for use with Back and Forward buttons. The browser can also load pages with referers and other flags. Essentially, the browser tag should be used when you want to create a browser-like interface, but the iframe may be used when you just need a simple panel.

-

A similar element, tabbrowser, provides the functionality of browser but also provides a tab bar for switching between multiple pages. This is the widget used by the Mozilla browser for its tabbed browsing interface. The tabbrowser element is actually implemened as a tabbox containing a set of browser elements. Both types of browser offer similar control over pages that are displayed.

-

Here is an example browser:

-

Example

-

Código Ver en funcionamiento

-
<browser src="http://www.mozilla.org" flex="1"/>
-
-

As with the iframe, you can specify the url in a browser using the src attribute. For a tabbrowser, you cannot set the url directly like this, as it doesn't display just one url. Instead, you must use a script and call the loadURI function.

-

There are three classes of browser, depending on the kind of content that you want to display inside. The type may be specified using the type attribute. The first type is the default and is used if you don't specify a type. In this case, the content loaded inside the browser is treated as if it was part of the same application and has access to the outer window. That means that when a script loaded inside the browser tries to get the topmost window, it will get the outer XUL window.

-

This would be suitable for a child XUL panel that is part of your application, but this isn't what you want for a browser that loads a web page. Instead, you would want to restrict the web page to only getting access to the web page content. You might note that a Mozilla browser window has XUL content for the toolbars and statusbar and so forth with a tabbrowser forming the main area. This inner area displays a web page, but the web page cannot access the XUL around it. This is because it uses the second type of browser, specified by setting the type attribute to the value content. This prevents the content from traversing up to the XUL window. An example:

-
<browser src="http://www.mozilla.org" type="content" flex="1"/>
-
-

It is important that you set the type attribute correctly if you are going to be displaying remote web sites inside the browser element. The tabbrowser sets the content type automatically on all tabbed browsers that it creates. So you don't have to set this explicitly for tabbed browsers.

-

The third type is used when your window contains multiple browser elements, for example if you have a sidebar displaying some extra content. Set the type attribute on the main browser element to content-primary to indicate that its content will be the primary content inside the window. This acts just like the content value except that the content inside is accessible using the XUL window's 'content' property. This makes it easy to access the content of the main browser using a script. The tabbrowser automatically sets the type attribute of whichever browser is currently visible to content-primary, which means that you will always be able to access the currently visible content in this way.

-

Next, we'll look at how to create a splitter.

-

Categorías

-

links interwikis

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/plantillas/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/plantillas/index.html deleted file mode 100644 index 96b7e38150..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/plantillas/index.html +++ /dev/null @@ -1,191 +0,0 @@ ---- -title: Plantillas -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Plantillas -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Templates ---- -

En esta sección descubriremos cómo poblar elementos con datos.

- -

Poblando elementos

- -

XUL provee un método con el cual creamos elementos a partir de datos proporcionados por RDF, ya sea desde un archivo RDF o desde un origen de datos interno. Mozilla suministra muchas fuentes de datos, como ser marcadores, histórico y mensajes de correo. En la próxima sección se ofrecerán más detalles sobre esto.

- -

Normalmente los elementos tales como treeitem y menuitem serán poblados con datos. Sin embargo, si se desea pueden usarse otros elementos, aunque éstos son mas útiles en casos especiales. A pesar de ello comenzaremos con estos otros elementos ya que los árboles y los menús requieren mas código.

- -

Para permitir la creación de elementos basados en datos RDF se necesitará proporcionar una plantilla simple, la cual será duplicada por cada elemento creado. Esencialmente, se provee únicamente el primer elemento y los restantes son construidos sobre la base de éste.

- -

La plantilla es creada empleando el elemento template (en), dentro del mismo pueden ubicarse los elementos que se desee utilizar para cada elemento a construir. El elemento template debe ser colocado dentro del contenedor que contendrá los elementos construidos. Por ejemplo, si se utiliza un árbol debe colocarse el elemento template dentro de un elemento tree (en).

- -

Ejemplo de plantilla simple

- -

Tomemos un simple ejemplo donde queremos crear un botón por cada marcador de primer nivel. Mozilla ofrece una fuente de datos de marcadores por lo que ésta puede emplearse para adquirir los datos. Este ejemplo únicamente obtendrá los marcadores de primer nivel (o carpetas de marcadores) por lo que crearemos botones. Para los marcadores hijos deberemos usar un elemento que muestre datos de manera jerárquica, como un árbol o un menú.

- -
-

Tanto este ejemplo como cualquier otro que haga referencia a fuentes de datos RDF internas únicamente funcionará si se lo carga desde una URL chrome, ya que por razones de seguridad Mozilla no permite el acceso a ellas desde otras procedencias.

-
- -

Para ver este ejemplo se necesitará crear un paquete chrome y cargar el archivo desde allí, (se puede hacer fácilmente mirando en archivos de manifiesto) entonces se podrá ingresar la URL chrome en la barra de direcciones del navegador.

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<vbox datasources="rdf:bookmarks" ref="NC:BookmarksRoot" flex="1">
-  <template>
-    <button uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
-  </template>
-</vbox>
-
- -

Image:templates1.jpg

- -

Aquí se ha creado una caja vertical que contiene una columna de botones, uno por cada marcador de primer nivel. Puede verse que la plantilla contiene un solo botón (en), éste es utilizado como base para todos los botones que serán creados. En la imagen se observa que se creó un conjunto de botones, uno por cada marcador.

- -

Intente añadir un nuevo marcador en el navegador manteniendo la ventana de ejemplo abierta. Notará que los botones del ejemplo son inmediatamente actualizados, puede ser necesario enfocar la ventana para que se produzca este cambio.

- -

Contenedor y fuentes de dato

- -

La plantilla es colocada dentro de la caja vertical, la caja posee dos atributos especiales que le permiten ser utilizada para plantillas, los cuales se emplean para especificar el origen de los datos. El primer atributo de la caja es datasources, el cual se usa para declarar la fuente de datos RDF que proveerá los datos para crear los elementos, en éste caso rdf:bookmarks. Se habrá adivinado que esto significa que se utilizará la fuente de datos de marcadores, esta fuente es proveída por Mozilla. Para utilizar un origen de datos propio, en el atributo datasources debe especificarse la URL de un archivo RDF, tal como se indica en el siguiente ejemplo:

- -
<box datasources="chrome://zoo/contenidos/animales.rdf"
-     ref="http://www.algun-zoo-ficticio.com/todos-los-animales">
-
- -

Incluso pueden especificarse múltiples fuentes de datos al mismo tiempo separándolas con un espacio en el valor del atributo. Esto puede aprovecharse para mostrar datos desde varios orígenes.

- -

El atributo ref indica la parte de la fuente de datos desde donde se quiere obtener los datos. En el ejemplo de los marcadores, el valor NC:BookmarksRoot es utilizado para indicar la raíz de la jerarquía de marcadores. Otros valores posibles dependerán del origen de datos utilizado, si se utiliza un archivo RDF propio como origen de datos, el valor corresponderá al valor de un atributo about en un elemento Bag RDF, un elemento Seq o un elemento Alt.

- -

Dentro de la plantilla

- -

Al añadir estos dos atributos a la caja de arriba se permitirá la generación de elementos utilizando la plantilla. Sin embargo, los elementos dentro de la plantilla necesitan ser declarados de otra forma. En el ejemplo anterior puede observarse que el botón posee un atributo uri y un valor inusual para el atributo label.

- -

El valor de un atributo dentro de la plantilla que comience con 'rdf:' indica que el valor debe ser obtenido de la fuente de datos, éste es el caso del atributo label en el ejemplo anterior. El resto del valor hace referencia a la propiedad name en la fuente de datos. Esto se construye tomando la URL del área de denominación utilizada por la fuente de datos y agregando la propiedad name. Si no puede comprender esto intente volver a leer la última parte de la sección anterior, la cual explica cómo se pueden referenciar los recursos en RDF. Aquí usamos únicamente el nombre del marcador pero hay muchos otros campos disponibles.

- -

La etiqueta de los botones es fijada a esta URI especial ya que queremos que las etiquetas en los botones contengan los nombres de los marcadores. Podríamos haber puesto una URI en cualquiera de los atributos del botón, o de cualquier otro elemento. Los valores de estos atributos son reemplazados con datos alimentados por la fuente de datos la cual es, en éste caso, la de marcadores. Por ello terminamos con las etiquetas de los botones conteniendo los nombres de los marcadores.

- -

El siguiente ejemplo muestra cómo podríamos establecer otros atributos de un botón empleando una fuente de datos. Naturalmente, esto asume que la fuente de datos provee los recursos apropiados. Si un recurso en particular no puede ser encontrado el valor del atributo será una cadena de texto vacía.

- -
<button class="rdf:http://www.ejemplo.com/rdf#clase"
-        uri="rdf:*"
-        label="rdf:http://www.ejemplo.com/rdf#name"/>
-        crop="rdf:http://www.ejemplo.com/rdf#crop"/>
-
- -

Como puede verse, es posible generar listas de elementos dinámicamente con los atributos proporcionados por un origen de datos diferente. El atributo uri es empleado para especificar el elemento a partir del cual se iniciará la generación de contenido. El primer contenido se generará una vez mientras que el contenido en el interior será generado para cada recurso. Veremos más de esto al crear plantillas para árboles.

- -

Más ejemplos

- -

Al agregar estas características en el contenedor dentro del cual se encuentra la plantilla, que es en este caso una caja, y a los elementos dentro de la plantilla, podremos generar listas de contenido interesantes a partir de datos externos. Claro que podemos poner más de un elemento dentro de una plantilla y añadir las referencias RDF especiales a los atributos en cualquiera de estos elementos. El siguiente ejemplo lo demuestra.

- -

Ejemplo 2: Código Ver en funcionamiento

- -
<vbox datasources="rdf:bookmarks" ref="NC:BookmarksRoot" flex="1">
-  <template>
-    <vbox uri="rdf:*">
-      <button label="rdf:http://home.netscape.com/NC-rdf#Name"/>
-      <label value="rdf:http://home.netscape.com/NC-rdf#URL"/>
-    </vbox>
-  </template>
-</vbox>
-
- -

Esto crea una caja vertical con un botón y una etiqueta por cada marcador. El botón tendrá el nombre del marcador y la etiqueta su URL.

- -

Los elementos que son creados no son funcionalmente diferentes a aquellos insertados directamente en el archivo XUL. Para cada elemento creado a través de una plantilla se añadirá el atributo id, el cual tendrá un valor que identifica el recurso. Esto puede emplearse para identificar el recurso creado.

- -

También es posible especificar en el mismo atributo múltiples valores de recurso separándolos con un espacio, igual que en ejemplo debajo y en más acerca de la sintaxis de recursos (XULPlanet).

- -

Ejemplo 3: Código Ver en funcionamiento

- -
<vbox datasources="rdf:bookmarks" ref="NC:BookmarksRoot"
-     flex="1">
-  <template>
-    <label uri="rdf:*" value="rdf:http://home.netscape.com/NC-rdf#Name rdf:http://home.netscape.com/NC-rdf#URL"/>
-  </template>
-</vbox>
-
- -

Cómo son construidas las plantillas

- -

Cuando un elemento posee el atributo datasources se está indicando que se espera que el elemento sea construido a partir de una plantilla. Note que el rótulo template no es el que determina si el contenido se construirá, es el atributo datasources. Si este atributo está presente, un objeto llamado Builder (constructor) se añadirá al elemento. Este objeto es el responsable de construir el contenido a partir de la plantilla. En JavaScript puede accederse al objeto constructor mediante la propiedad builder, aunque normalmente esto será necesario solo si se desea que el constructor regenere el contenido en situaciones donde esto no se haga automáticamente.

- -

Existen dos tipos diferentes de constructores. El primero es un constructor de contenidos y se utiliza en la mayoría de los casos, y el otro es un constructor de árboles que se usa únicamente para árboles.

- -

El constructor de contenidos toma el contenido dentro del elemento template y lo duplica por cada fila. Por ejemplo, si en el ejemplo anterior el usuario tenía diez marcadores, diez elementos label (en) serán creados y añadidos al elemento vbox (en). Si se utilizaran funciones DOM para recorrer el árbol, podrán encontrarse estos elementos y ver sus propiedades. Los elementos serán visibles pero no la plantilla, aunque aún existe en el documento árbol. Además, la id de cada una de las etiquetas se establecerá con el recurso RDF para esa fila.

- -

Este constructor siempre comienza en el lugar donde se ha especificado uri=“rdf:*�?. Si el atributo uri en un elemento posterior al elemento árbol, los elementos fuera se crearán una sola vez. En el siguiente ejemplo se creará una caja horizontal (hbox), la cual será llenada con una etiqueta por cada ítem.

- -
<template>
-  <hbox>
-    <label uri="rdf:*" value="rdf:http://home.netscape.com/NC-rdf#Name"/>
-  </hbox>
-</template>
-
- -

Si hubiera otros contenidos dentro del elemento con el atributo datasources pero fuera de la plantilla, ésos contenidos también aparecerán. Así puede mezclarse contenidos estáticos y contenidos dinámicos de una plantilla.

- -

Constructor de árbol

- -

El constructor de árboles, por otro lado, no genera los elementos DOM para las filas. En cambio, obtendrá la información directamente de la fuente de datos RDF cuando la necesite. Ya que usualmente se espera que los árboles muestren miles de filas de datos, este método es mucho más eficiente. Crear un elemento por cada celda sería muy costoso. Sin embargo, el trueque es que los árboles únicamente pueden mostrar texto y, como no se crean elementos, no podrán utilizarse propiedades CSS para diseñar celdas de árboles.

- -

El constructor de árboles se utiliza solamente con árboles. Los otros elementos utilizan el constructor de contenido. Esto no causa problema alguno, ya que no se prevé que otros elementos -como los menús- contengan demasiados ítems. También es posible utilizar el constructor de contenido con los árboles, y por cada fila se crearán un elemento treeitem y sus elementos relacionados.

- -

Reglas, líneas o delineación

- -

En la imagen del anterior ejemplo se habrá notado que el tercer botón es simplemente un botón con un guión adentro, éste es un separador en la lista de marcadores. De la manera en que la venimos usando, la fuente de datos RDF de marcadores suministra los separadores como si fueran comunes marcadores. Lo que realmente querríamos lograr es mostrar un pequeño espacio en lugar de un botón para los separadores, esto significa que queremos crear dos tipos diferentes de contenido, uno para los marcadores regulares y otro para los separadores.

- -

Podemos hacer esto empleando el elemento rule (en). Definimos una regla/línea por cada variación en los elementos que queremos crear. En nuestro caso, necesitaremos un delineación para los marcadores y otro para los separadores. Los atributos puestos en el elemento rule determinan cuales reglas se aplican a qué recurso RDF.

- -

Al buscarse qué delineación aplican a los datos, cada regla es revisada en secuencia buscando coincidencias. Esto significa que el orden en que se definen las delineación es importante, ya que los primeros tendrán precedencia sobre los posteriores.

- -

El siguiente ejemplo demuestra el ejemplo anterior con dos reglas:

- -

Ejemplo 4: Código Ver en funcionamiento

- -
<window id="ventana-ejemplo
-  title="Lista de marcadores"
-  xmlns:html="http://www.w3.org/1999/xhtml"
-  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <vbox datasources="rdf:bookmarks" ref="NC:BookmarksRoot" flex="1">
-   <template>
-
-    <rule rdf:type="http://home.netscape.com/NC-rdf#BookmarkSeparator">
-     <spacer uri="rdf:*" height="16"/>
-    </rule>
-
-    <rule>
-      <button uri="rdf:*" label="rdf:http://home.netscape.com/NC-rdf#Name"/>
-    </rule>
-
-  </template>
- </vbox>
-
-</window>
-
- -

Image:templates2.jpg

- -

Al utilizar dos delineaciones hemos permitido que el contenido de la plantilla sea generado selectivamente. En la primer regla se seleccionan separadores de marcadores, como puede observarse en el atributo rdf:type. La segunda delineación no posee atributos, por lo que todos los datos corresponden.

- -

Todos los atributos puestos en el rótulo tag se usan como criterio de correspondencia. En este caso, la fuente de datos bookmarks provee una propiedad rdf:type para distinguir separadores. Este atributo es fijado en un valor especial para los separadores en la fuente de datos RDF de marcadores, así es como podemos distinguirlos de los marcadores que no son separadores. Una técnica similar puede ser utilizada para cualquier atributo que pudiera existir en un elemento RDF Description.

- -

El valor URL específico dado al primer lineamiento en el ejemplo de arriba se utiliza para separadores. Esto significa que los separadores seguirán la regla uno y generarán un elemento spacer, el que mostrará un hueco de 16 píxeles. Los elementos que no sean separadores no coincidirán con la regla uno y caerán en la regla dos, la cual no posee atributos por lo que cualquier dato coincide. Esto es, por supuesto, lo que queremos que le suceda al resto de la información.

- -

Se habrá notado también que como quisimos obtener un atributo del área de denominación RDF (rdf:type) tuvimos que añadir una declaración del área de denominación al rótulo window. Si no hubiéramos hecho esto el atributo (type) se habría buscado en el área de denominación XUL, y como éste atributo no existe en ella la regla no tendría correspondencias. Si se utilizan atributos en un área de denominación propia se deberá añadir una declaración a la misma para corresponderlos.

- -

Debería adivinarse qué sucedería si se eliminara la segunda delineación. Como resultado se vería un solo espacio y ningún marcador ya que los mismos no coincidirían con ninguna de las reglas.

- -

Puesto de manera simple, una delineación corresponde si todos los atributos puestos en el elemento rule coinciden los atributos correspondientes en el recurso RDF. En el caso de un archivo RDF, los recursos serían los elementos Description.

- -

Sin embargo hay pequeñas excepciones. No puede haber correspondencias basadas en los atributos id, rdf:property o rdf:instanceOf, aunque ya que pueden utilizarse atributos propios de áreas de denominación propias esto no debe importar mucho.

- -

Note que una plantilla sin reglas en ella, como en el primer ejemplo, en realidad es funcionalmente un equivalente a una plantilla con un solo lineamiento sin atributos en él.

- -

A continuación veremos cómo utilizar plantillas con los árboles.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/posicionamiento_de_elementos_de_la_ventana/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/posicionamiento_de_elementos_de_la_ventana/index.html deleted file mode 100644 index 8777a6f90c..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/posicionamiento_de_elementos_de_la_ventana/index.html +++ /dev/null @@ -1,229 +0,0 @@ ---- -title: Posicionamiento de elementos de la ventana -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Posicionamiento_de_elementos_de_la_ventana -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Element_Positioning ---- -

Aquí veremos cómo controlar la posición y tamaño de un elemento.

-

Posicionamiento de elementos de la caja

-

Hasta ahora sabemos cómo posicionar vertical u horizontalmente los elementos en el interior de una caja. A menudo necesitaremos mayor control sobre la posición y tamaño de los elementos dentro de la caja, para esto primero necesitamos echar un vistazo a cómo trabaja una caja.

-

La posición de un elemento es determinada por el estilo de esquema de su contenedor. Por ejemplo, la posición de un botón en una caja horizontal es a la derecha del botón anterior, si es que hay alguno. El tamaño de un elemento es determinado por dos factores, el tamaño que el elemento necesita poseer y el tamaño que uno especifique. El tamaño que un elemento requiere es determinado por el tipo de elemento. Por ejemplo, el ancho de un botón es determinado por la cantidad de texto en el botón.

-

Un elemento será generalmente tan amplio como éste necesite para soportar su contenido, y no mayor. Algunos elementos, como las cajas de texto, tienen un tamaño predeterminado. Una caja será suficientemente amplia como para contener los elementos dentro de ella. Una caja horizontal con tres botones en ella será tan ancha como los tres botones, más un pequeño espacio de relleno.

-

En la imagen de abajo, a los primeros dos botones se les ha dado un tamaño adecuado como para contener su texto. El tercer botón es mayor porque tiene más contenido. El ancho de la caja que contiene los botones es el ancho total de los botones más el espacio entre ellos. El alto de los botones es de un tamaño apropiado para contener el texto.

-

posicionamiento_img01.jpg

-

Podría necesitarse tener mayor control sobre el tamaño de un elemento en una ventana. Hay para ello un número de características que permiten controlar el tamaño de un elemento. La forma rápida es simplemente agregar a un elemento los atributos width (ancho) y height (alto), muy parecido a lo que puede hacerse en un rótulo HTML img. Un ejemplo se demuestra abajo:

-

Ejemplo: atributos height y width

-

Código Ver en funcionamiento

-
<button label="Aceptar" width="100" height="40"/>
-
-

Sin embargo, no se recomienda hacer esto, ya que no es muy portable y podría no adaptarse a algunos temas. Una mejor forma es utilizar propiedades de estilo, que funcionan de manera similar a las hojas de estilo en HTML. Pueden utilizarse las siguientes propiedades CSS:

-
-
- width 
-
- Esto especifica el ancho del elemento.
-
- height 
-
- Especifica el alto del elemento.
-
-

Fijando cualquiera de estas propiedades, el elemento será creado con ese ancho y/o largo. Si se especifica solo una propiedad de tamaño, la otra se calculará de acuerdo a lo requerido. El tamaño de estas propiedades de estilo deben especificarse como un número seguido de una unidad de medida.

-

Los tamaños son bastante fáciles de calcular para elementos no flexibles. Estos simplemente obedecen sus anchos y altos especificados, y si el tamaño no fuera especificado, el tamaño predeterminado del elemento será lo suficientemente amplio como para acomodar su contenido. Para elementos flexibles, el cálculo es ligeramente más difícil.

-

Elementos flexibles son aquellos que poseen el atributo flex establecido en un valor mayor que 0. Debe recordarse que los elementos flexibles aumentan y disminuyen su tamaño para acomodarse al espacio disponible. Su tamaño predeterminado aún se calcula igual que el de los elementos no flexibles. El siguiente ejemplo lo demuestra:

-

Ejemplo

-

Código Ver en funcionamiento

-
<window orient="horizontal"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-<hbox>
-  <button label="Sí" flex="1"/>
-  <button label="No"/>
-  <button label="Realmente no sé si uno u otro."/>
-</hbox>
-
-</window>
-
-

La ventana aparecerá inicialmente como la imagen anterior. Los primeros dos botones serán dimensionados a un adecuado ancho predeterminado y el tercer botón será mayor porque tiene una etiqueta más larga. El primer botón fue hecho flexible y los tres elementos han sido puestos dentro de una caja. El ancho de la caja se fijará al ancho total inicial de los tres botones (en la imagen cerca de 430 píxeles).

-

Si se incrementa el ancho de la ventana, los elementos son comprobados para ver si son flexibles y así rellenar el espacio en blanco que aparecerá. El botón es el único elemento flexible, pero no aumentará su ancho porque la caja dentro de la que encuentra no es flexible. Un elemento no flexible nunca cambia su tamaño aún cuando haya espacio disponible, por lo que el botón no podrá crecer. Esto es, el botón no se hará más ancho.

-

La solución es también hacer flexible a la caja. Entonces, cuando se haga más ancha la ventana, habrá espacio extra disponible, por lo que la caja crecerá para ocupar el espacio extra. Como la caja es mayor, también se creará espacio extra dentro de ella, y el botón flexible que contiene crecerá para ajustarse al espacio disponible. Este proceso se repetirá por cada caja anidada existente.

-

Estableciendo tamaños mínimos y máximos

-

Puede ser necesario permitir que un elemento sea flexible, pero restringir su tamaño para que no pueda superar cierta dimensión; o puede necesitarse especificar un tamaño mínimo. Esto puede establecerse utilizando cuatro atributos.

-
-
- minwidth 
-
- Especifica el ancho mínimo del elemento.
-
- minheight 
-
- Especifica la altura mínima del elemento.
-
- maxwidth 
-
- Especifica el ancho máximo del elemento.
-
- maxheight 
-
- Especifica la altura máxima del elemento.
-
-

Estos valores se miden siempre en píxeles. También pueden utilizarse las correspondientes propiedades CSS, min-width, min-height, max-width y max-height.

-

Estas propiedades son aprovechables únicamente por elementos flexibles. Especificando una altura máxima, por ejemplo, un botón flexible podrá crecer solamente hasta esa altura. Aún podrá redimensionarse la ventana más allá de ese punto pero el botón dejará de crecer. Asimismo, la caja en la que se encuentre el botón podrá continuar agrandándose, a menos que también se le fije una altura máxima.

-

Si dos botones son igualmente flexibles, normalmente ambos compartirán el espacio extra. Si un botón tiene un ancho máximo, el segundo continuará creciendo y ocupará todo el espacio restante.

-

Si una caja posee un ancho o alto máximos, los hijos no podrán crecer más allá de ese tamaño máximo. Si una caja tiene un ancho o alto mínimos, los hijos no podrán achicarse menos que ese tamaño mínimo. Aquí hay algunos ejemplos del establecimiento de anchos y altos:

-
<button label="1" style="width: 100px;"/>
-<button label="2" style="width: 100em; height: 10px;"/>
-<button label="3" flex="1" style="min-width: 50px;"/>
-<button label="4" flex="1" style="min-height: 2ex; max-height: 100px"/>
-<textbox flex="1" style="max-width: 10em;"/>
-<description style="max-width: 50px">Este es un aburrido pero simple texto desplegable.</description>
-
-
-
- Ejemplo 1 
-
- el primer botón será mostrado con un ancho de 100 píxeles (px significa píxeles). Debe agregarse la unidad de medida o el ancho será ignorado.
-
- Ejemplo 2 
-
- el segundo botón se mostrará con un alto de diez píxeles y un ancho de 100 ems (un em es la medida de un carácter en el tipo de letra utilizado).
-
- Ejemplo 3 
-
- el tercer botón es flexible, por lo que crecerá basado en el tamaño de la caja en la que se encuentre. Sin embargo, el botón nunca se reducirá a menos de 50 píxeles. Otros componentes flexibles como los espaciadores absorberán el espacio remanente, rompiendo el cociente flex.
-
- Ejemplo 4 
-
- el cuarto botón es flexible y nunca tendrá una altura que sea menor a 2 ex (un ex es normalmente la altura de la letra x en el tipo de letra utilizado) o mayor que 100 píxeles.
-
- Ejemplo 5 
-
- la entrada de texto es flexible pero nunca crecerá más de 10 ems. A menudo se querrá utilizar ems al especificar tamaños de elementos con texto en ellos. Esta unidad de medida es útil para cajas de texto, así el tipo de letra podrá cambiar y las cajas de texto siempre poseerán un tamaño adecuado, aún si el tipo de letra es muy grande.
-
- Ejemplo 6 
-
- el elemento description está restringido a poseer un ancho máximo de 50 píxeles. El texto contenido se desplegará hasta la siguiente línea, luego de cincuenta píxeles.
-
-
-

Agreguemos alguno de estos estilos a la ventana de diálogo "buscar archivos". Lo haremos de tal manera que la caja de texto se redimensione para ocupar toda la ventana.

-

<textbox id="find-text" flex="1" style="min-width: 15em;"/>

-

Aquí, la entrada de texto se ha hecho flexible, de esta manera crecerá si el usuario cambia el tamaño de la ventana. Esto es útil si el usuario desea ingresar una cadena de texto muy larga. También, un ancho mínimo de 15 ems fue fijado para que la caja de texto siempre muestre al menos 15 caracteres. Si el usuario achica el tamaño de la ventana, la entrada de texto no se reducirá pasados los 15 ems. Se dibujará como si se extendiera sobrepasando el borde de la ventana. Nótese en la imagen de abajo que la entrada de texto a crecido para extenderse por el tamaño total de la ventana.

-
-

Empaque de cajas

-

Digamos que se tiene una caja con dos elementos hijos, de los cuales ninguno es flexible, pero la caja sí lo es. Por ejemplo:

-

Ejemplo

-

Código Ver en funcionamiento

-
<box flex="1">
-  <button label="Alegre"/>
-  <button label="Triste"/>
-</box>
-
-

Si se redimensiona la ventana, la caja se expandirá para adaptarse al tamaño de la ventana. Los botones no son flexibles, por lo que sus longitudes no cambiarán. El resultado es espacio extra que aparecerá en el lado derecho de la ventana, dentro de la caja. Puede desearse, sin embargo, que el espacio extra aparezca del lado izquierdo, así los botones se mantendrán alineados a la derecha en la ventana.

-

Esto puede lograrse colocando un espaciador dentro de la caja, pero se volverá confuso cuando haya que realizarlo muchas veces. Una mejor solución es utilizar en la caja un atributo adicional: pack (empaquetar). Este atributo indica cómo empaquetar los elementos hijos dentro de la caja. Para cajas orientadas horizontalmente, controla el posicionamiento horizontal de los hijos. En cajas verticales, controla el posicionamiento vertical. Pueden utilizarse los siguientes valores:

-
-
- start 
-
- Posiciona los elementos en el extremo izquierdo para cajas horizontales y en el extremo superior para cajas verticales. Este es el valor predeterminado.
-
- center 
-
- Centra los elementos hijos en la caja.
-
- end 
-
- Posiciona los elementos al extremo derecho en cajas horizontales y al extremo inferior en cajas verticales.
-
-

El atributo pack se aplica a la caja contenedora de los elementos a ser empaquetados, no a los elementos en sí mismos.

-

Podemos cambiar el ejemplo anterior para centrar los elementos, de esta manera:

-

Ejemplo

-

Código Ver en funcionamiento

-
<box flex="1" pack="center">
-  <button label="Alegre"/>
-  <button label="Triste"/>
-</box>
-
-

Ahora, cuando la ventana sea redimensionada, los botones se centrarán horizontalmente. Compare este comportamiento con el del ejemplo anterior.

-

Alineación de cajas

-

Si la ventana en el ejemplo Alegre/Triste se redimensiona horizontalmente, el ancho de la caja crecerá. Si no obstante se redimensiona la caja verticalmente, notará que la altura de los botones aumenta. Esto sucede porque la flexibilidad en la otra dirección se asume predeterminadamente.

-

Puede regularse este comportamiento con el atributo align (alineación). Para cajas horizontales, éste controla verticalmente la posición de los hijos. En cajas verticales, controla la posición horizontal de los hijos. Los valores posibles son similares a los de pack..

-
-
- start 
-
- Alinea los elementos a lo largo del extremo superior para cajas horizontales y a lo largo del borde izquierdo para cajas verticales.
-
- center 
-
- Centra los elementos hijos en la caja.
-
- end 
-
- Alinea los elementos a lo largo del extremo inferior en cajas horizontales y a lo largo del borde derecho en cajas verticales.
-
- baseline 
-
- Alinea los elementos para que el texto quede alineado. Esto es útil en cajas horizontales únicamente.
-
- stretch 
-
- Este valor, el predeterminado, causa que los elementos crezcan hasta ocupar el tamaño de la caja, muy parecido a un elemento flexible, pero en la dirección opuesta.
-
-

Similar al atributo pack., el atributo align es aplicable únicamente a la caja cuyos elementos deben ser alineados, no a los elementos en sí.

-

Por ejemplo, la primera caja de abajo tendrá a sus hijos expandidos, porque ése es el valor predeterminado. La segunda caja posee un atributo align, por lo que sus hijos se ubicarán centrados.

-

Ejemplo

-

Código Ver en funcionamiento

-
<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<window id="sino" title="Pregunta" orient="horizontal"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <hbox>
-    <button label="Sí"/>
-    <button label="No"/>
-  </hbox>
-  <hbox align="center">
-    <button label="Tal vez"/>
-    <button label="Quizás"/>
-  </hbox>
-
-</window>
-
-

Image:boxstyle2-b.jpg

-

También pueden utilizarse las propiedades de estilo -moz-box-pack y -moz-box-align en lugar de especificar estos atributos.

-
- El ejemplo "Alineador de cajas" podría resultar útil para probar las distintas propiedades de la caja..
-

Recorte de texto y botones

-

Podría llegar a crearse un elemento button que contuviera una etiqueta cuyo ancho sea mayor que el ancho máximo del botón. Por supuesto, una solución sería incrementar el tamaño del botón; sin embargo, los botones (y otros elementos con una etiqueta) tienen un atributo especial llamado crop (recortar) que permite especificar cómo el texto será recortado si este es demasiado largo.

-

Si el texto es recortado, puntos suspensivos (…) aparecerán en el botón de donde el texto fue recortado. Existen cuatro valores posibles:

-
-
- left 
-
- El texto es recortado por su lado izquierdo.
-
- right 
-
- El texto es recortado por su lado derecho.
-
- center 
-
- El texto es recortado en ambos extremos.
-
- none 
-
- El texto no será recortado, este es el valor predeterminado.
-
-

En realidad, este atributo es útil únicamente cuando una ventana de diálogo es diseñada para ser utilizable en cualquier tamaño. El atributo crop también puede ser usado con el elemento description y otros elementos que utilicen el atributo label para etiquetas. Lo siguiente muestra este atributo en uso:

-

Ejemplo

-

Código Ver en funcionamiento

-
<button label="¡Presióname por favor!" crop="right" flex="1"/>
-
-

Image:boxstyle2.jpg

-

Nótese como al texto en el botón se le recortará su lado derecho luego de que la ventana sea achicada.

-

Ejemplo "Buscar archivos" hasta ahora

-

Código Ver en funcionamiento

-

(Siguiente) A continuación, un resumen y algunos detalles adicionales del modelo de caja.

-

Ejemplos: 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6

diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/rejillas/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/rejillas/index.html deleted file mode 100644 index 13b7abab12..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/rejillas/index.html +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: Rejillas -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Rejillas -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Grids ---- -

 

-

XUL posee un conjunto de elementos para crear rejilla tabulares.

-

Diseño tabular en XUL

-

Típicamente las páginas HTML utilizan tablas para diseñar o exhibir una rejillas de datos, XUL posee un conjunto de elementos para realizar este tipo de cosas. El elemento grid (rejilla) se utiliza para declarar una rejilla de datos, y posee algunas similitudes con el rótulo HTML table.

-

Una rejilla (grid) contiene elementos que son alineados en filas al igual que tablas. Dentro de la rejillaa se declaran dos cosas: las columnas y las filas que serán utilizadas. Tal como con las tablas HTML, dentro de las filas se inserta el contenido como ser etiquetas y botones. No se puede agregar contenido dentro de las columnas, pero pueden utilizarse para especificar el tamaño y apariencia de las mismas en la rejilla. Alternativamente, puede colocarse contenido dentro de las columnas y utilizarse las filas para especificar la apariencia. Primero veremos el método de organizar elementos por fila.

-

Para declarar un conjunto de filas se utiliza el rótulo rows (filas), el cual debe ser un elemento hijo del grid. Dentro de él añadiremos elementos row (fila), utilizados para especificar cada fila. Dentro de cada elemento row se agregará el contenido que se desee tener en esa fila.

-

Análogamente, las columnas se declaran con el elemento columns (columnas), que debe ser insertado como un elemento hijo de grid (la rejilla). Dentro de éste irán los elementos column (columna), uno por cada columna que se necesite en la rejilla. Esto debe ser fácil de entender con un ejemplo.

-

Ejemplo

-
<grid flex="1">
-  <columns>
-    <column flex="2"/>
-    <column flex="1"/>
-  </columns>
-
-  <rows>
-    <row>
-      <button label="Conejo"/>
-      <button label="Elefante"/>
-    </row>
-    <row>
-      <button label="Koala"/>
-      <button label="Gorila"/>
-    </row>
-  </rows>
-</grid>
-
-

Image:grids1.jpg

-

A una rejilla se le han añadido dos filas y dos columnas, cada columna es declarada con el rótulo column y se la ha dado el atributo flex. Cada fila contiene dos elementos, ambos botones. El primer hijo de cada elemento row es puesto en la primer columna de la rejilla y el segundo hijo se coloca en la segunda columna. Nótese que no se necesita un elemento para declarar una celda, o sea que no hay un equivalente al elemento tdde HTML. En lugar de esto, los contenidos de cada celda se ponen directamente en los elementos row.

-

Obviamente, además de un button (botón) puede agregarse cualquier tipo de elemento. Si se necesita que una celda en particular contenga múltiples elementos puede utilizarse un hbox (caja anidada) u otro elemento de caja. La hbox es un solo elemento pero dentro de ella pueden colocarse todos los elementos que se quiera. Por ejemplo:

-

Ejemplo

-
<grid flex="1">
-  <columns>
-    <column/>
-    <column flex="1"/>
-  </columns>
-
-  <rows>
-    <row>
-      <label control="titulodoc" value="Título del documento:"/>
-      <textbox id="titulodoc" flex="1"/>
-    </row>
-    <row>
-      <label control="rutadoc" value="Ubicación:"/>
-      <box flex="1">
-        <textbox id="rutadoc" flex="1"/>
-        <button label="Revisar..."/>
-      </box>
-    </row>
-  </rows>
-</grid>
-
-

Image:grids2.jpg

-

Note en la imagen de abajo cómo en la primer columna de elementos que contienen las etiquetas hay un solo elemento en cada fila. La segunda fila de la segunda columna contiene una caja, que a su vez contiene dos elementos, una textbox (caja de texto )y un button (botón). Dentro de una celda podrían insertarse cajas anidadas adicionales o incluso otra rejilla.

-

Si se redimensiona la ventana del ejemplo anterior se verá que las cajas de texto cambian su tamaño, pero los demás elementos no. Esto es porque se añadieron atributos code>flex</code> a las cajas de texto y a la segunda columna. La primer columna no necesita ser flexible porque las etiquetas no requieren cambiar de tamaño.

-

El ancho inicial de una columna es determinado por el elemento más grande en esa columna. Similarmente, la altura de una fila se determina por el tamaño de sus elementos. Para definir los tamaños pueden utilizarse las propiedades CSS minwidth y maxwidth, entre otras.

-

También pueden colocarse los elementos dentro de las column en lugar de las filas. Si se hace esto, las filas serán declaradas únicamente para especificar cuántas filas existen.

-

Ejemplo

-
<grid>
-  <rows>
-    <row/>
-    <row/>
-    <row/>
-  </rows>
-
-  <columns>
-    <column>
-      <label control="primero" value="Primer Nombre:"/>
-      <label control="segundo" value="Segundo Nombre:"/>
-      <label control="apellido" value="Apellido:"/>
-    </column>
-    <column>
-      <textbox id="primero"/>
-      <textbox id="segundo"/>
-      <textbox id="apellido"/>
-    </column>
-  </columns>
-
-</grid>
-
-

Esta rejilla posee tres filas y dos columnas, los elementos row son solamente marcadores de posición para especificar cuántas hay. Puede añadirse el atributo flex a alguna fila para volverla flexible. El contenido es puesto dentro de cada column, el primer elemento dentro de cada elemento column es ubicado en la primer fila, el segundo en la segunda fila y el tercero en la tercer fila.

-

Si se agrega contenido tanto en filas como en columnas, un contenido se superpondrá con el otro, aunque ambos se alinearán correctamente en la rejilla. Esto crea un efecto muy parecido a una rejilla de elementos stack (pila).

-

El orden de los elementos en la grid determina cuál se presentará encima y cuál será ubicado debajo. Si el elemento rows es puesto después del elemento columns, el contenido de las rows será mostrado por encima del contenido de las columns; si se ubica primero el elemento columns, su contenido se verá primero. Análogamente, los eventos como presiones en las teclas del ratón o del teclado se enviarán únicamente al grupo que se encuentre encima. Esta es la razón por la cual en el ejemplo anterior las columnas fueron declaradas después que las filas. Si las columnas se hubieran puesto primero, las filas recibirían los eventos y no podría escribirse en los campos correspondientes.

-

Una de las principales ventajas que tienen las rejilla sobre las cajas anidadas es que pueden crearse celdas que son flexibles tanto horizontal como verticalmente. Esto puede lograrse fijando el atributo flex tanto en el elemento row como en el elemento column correspondientes. El siguiente ejemplo lo demuestra:

-

Ejemplo

-
<grid flex="1">
- <columns>
-  <column flex="5"/>
-  <column/>
-  <column/>
- </columns>
- <rows>
-  <row flex="10">
-    <button label="Cereza"/>
-    <button label="Limón"/>
-    <button label="Uva"/>
-  </row>
-  <row flex="1">
-    <button label="Frutilla"/>
-    <button label="Frambuesa"/>
-    <button label="Durazno"/>
-  </row>
- </rows>
-</grid>
-
-

La primer columna y ambas filas fueron hechas flexibles, esto produce que cada celda de la primer columna sea flexible horizontalmente. Además, cada celda será flexible verticalmente porque ambas filas son flexibles, pero la primer fila es bastante más. La celda en la primer fila y columna (el botón "Cereza"?) será flexible horizontalmente por un factor de 5 y verticalmente por un factor de 10. La siguiente celda (Limón) sólo será flexible verticalmente. El atributo flex también fue añadido al elemento grid por lo que la rejilla completa será flexible, de lo contrario crecería en una sola dirección.

-

The flex attribute has also been added to the grid element so that the entire grid is flexible, otherwise it would only grow in one direction.

-

Column Spanning

-

There is no means of making a cell span a particular number of multiple columns or rows (See Discussion for a way of achieving the same effect). However, it is possible to make a row or column that spans the entire width or height of the grid. To do this, just add an element inside the rows element that isn't inside a row element. You can use a box type for example, and put other elements inside it if you want to use several elements. Here is a simple example:

-

Example

-

Código Ver en funcionamiento

-
<grid>
-  <columns>
-    <column flex="1"/>
-    <column flex="1"/>
-  </columns>
-
-  <rows>
-    <row>
-      <label value="Northwest"/>
-      <label value="Northeast"/>
-    </row>
-    <button label="Equator"/>
-    <row>
-      <label value="Southwest"/>
-      <label value="Southeast"/>
-    </row>
-  </rows>
-</grid>
-
-

The button will stretch to fit the entire width of the grid as it is not inside a grid row. You can use a similar technique to add an element in-between two columns. It would stretch to fit the height of the grid. You could also do both if that is desired.

-

(Siguiente) A continuación veremos características adicionales de las cajas de lista.

-

Categorías

-

links interwikis

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/selecci\303\263n_en_un_\303\241rbol/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/selecci\303\263n_en_un_\303\241rbol/index.html" deleted file mode 100644 index e9d0cbe0a0..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/selecci\303\263n_en_un_\303\241rbol/index.html" +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Selección en un árbol -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Selección_en_un_árbol -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Tree_Selection ---- -

Esta sección describe como obtener y definir los elementos seleccionados en un arbol.

- -

Obteniendo los elementos seleccionados

- -

Cada elemento en un árbol (que corresponde al elemento treeitem -en)- si se usa la vista del contenido del árbol ) puede ser seleccionado individualmente. Si añades el atributo seltype a un árbol y tiene el valor múltiple, el usuario puede seleccionar diversos elementos del árbol al mismo tiempo. La selección no tiene porque ser continua. El árbol provee un número de funciones que nos ayudan a determinar que elementos están seleccionados.

- -

Gestión del evento de selección

- -

Primero veamos como podemos determinar si un elemento esta seleccionado. El gestor de eventos onselect() puede incluirse en el elemento tree -(en))-. Cuando el usuario selecciona un elemento del árbol, el gestor de eventos es llamado. El usuario puede también cambiar la selección usando las teclas del cursor. Si el usuario mantiene pulsadas las teclas del cursor para rápidamente desplazarse por los elementos, el gestor de eventos no es llamado hasta que el usuario deja de presionarlas. Esto ofrece una mayor rapidez y también implica que los elementos se mostrarán como seleccionados aunque nunca se llame al evento select para ellos.

- -

La sintaxis para el gestor de eventos onselect es la siguiente.

- -
<tree id="treeset" onselect="alert('Has seleccionado algo!');">
-
- -

Índices del árbol

- -

El árbol expone la propiedad currentIndex que podemos usar para obtener el elemento actualmente seleccionado, siendo el índice del primero 0. Puedes cambiar el elemento seleccionado si le asignas un nuevo valor a esta propiedad.

- -

Los elementos hijos son incluidos en el contador justo después de sus padres. Esto significa que si hay tres elementos en la raíz y cada uno tiene 2 hijos, habrá un total de nueve elementos. El primer elemento (índice 0) será el primer elemento raíz, el siguiente (índice 1) será el primer hijo, el segundo hijo estará en el índice 2 y el segundo elemento raíz en el índice 3 y así sucesivamente.

- -

Image:seltree1.jpg

- -

En la imagen vemos ocho filas, de las cuales dos están seleccionadas. La primera fila seleccionada tiene el índice 4 y la segunda el índice 7. Las filas que no se muestran no se incluyen en el contador de índices.

- -

Selección múltiple

- -

Para los árboles que permiten selecciones múltiples, obtener la lista de filas seleccionadas es algo más complicado. El elemento árbol tiene la propiedad view, la cual tiene la propiedad selection que a su vez contiene propiedades y métodos relacionados con la selección actual del árbol. Puedes usar esos métodos para obtener un conjunto de elementos seleccionados o modificar la selección.

- -

Ya que los elementos seleccionados en un árbol no tienen porque estar contiguos, puedes obtener distintos grupos de elementos seleccionados que sí lo están, usando las funciones getRangeCount() y getRangeAt(). La primera devuelve el número de rangos de selecciones que hay actualmente. Si solo hay un valor seleccionado, este valor será 1. Deberás utilizar un bucle para recorrer el número de rangos, llamando getRangeAt() en cada uno para obtener los índices del comienzo y fin del rango.

- -

La función getRangeAt() toma tres parámetros.

- - - -
Ejemplo con getRangeAt
- -
var start = new Object();
-var end = new Object();
-var numRanges = tree.view.selection.getRangeCount();
-
-for (var t=0; t<numRanges; t++){
-  tree.view.selection.getRangeAt(t,start,end);
-  for (var v=start.value; v<=end.value; v++){
-    alert("El elemento "+v+" está seleccionado.");
-  }
-}
-
- -

Hemos creado dos objetos llamados ‘start’ y ‘end’. Después hemos recorrido los rangos, el número de los cuales nos lo ha proporcionado la función getRangeCount(). Llamamos a la función getRangeAt() pasándole el índice del rango y los objetos ‘start’ y ‘end’. Estos objetos son devueltos con la propiedad 'value' rellenada. Así que si el primer rango es desde el tercer elemento hasta el séptimo, ‘start.value’ será 2 (recuerda que los índices cuentan desde 0) y ‘end.value’ será 6. Un dialogo de alerta se mostrará para cada índice seleccionado.

- -

If you just want to find out if a specific row is selected, use can use the isSelected() function. It takes a row index as an argument and returns true if that row is selected.

- -
alert(tree.view.selection.isSelected(3));
-
- -

Modificando la selección del árbol

- -

The selection object has a number of functions which may be used to change the selection. The simplest function is the select() function, which deselects any rows that are currently selected and selects one specific row. For example, the following code will select the row at index 5:

- -
tree.view.selection.select(5);
-
- -

Note that you should not just change the tree's currentIndex property to change the selection. Instead, you should use the selection's select function as in the example above. You can select all rows with the selectAll() function. Note that rows nested inside containers that are not open will not be selected. Naturally, this will only have any effect for trees that use multiple selection. There is also a clearSelection() function to clear the selection, and an invertSelection function to reverse the selection, that is, deselect all selected rows and select all unselected rows.

- -

To select specific rows, use the rangedSelect() function which selects all rows in between two indices. Here is an example which selects rows between index 2 and 7. Note that rows 2 and 7 will also be selected.

- -
tree.view.selection.rangedSelect(2,7,true);
-
- -

The last argument indicates whether to add to the current selection or not. If true, the range will be added to the existing selection. If false, all existing selected rows will be deselected first. Finally, the clearRange() function may be used to deselect a range of rows, leaving rows outside the range unaffected.

- -
tree.view.selection.clearRange(2,7);
-
- -

Seguimos con como crear los detalles de vistas de un árbol.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/tutorial_de_xul/usando_espaciadores/index.html b/files/es/archive/mozilla/xul/tutorial_de_xul/usando_espaciadores/index.html deleted file mode 100644 index 37bd1c2052..0000000000 --- a/files/es/archive/mozilla/xul/tutorial_de_xul/usando_espaciadores/index.html +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Usando espaciadores -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Usando_espaciadores -tags: - - Tutorial_de_XUL - - XUL -translation_of: Archive/Mozilla/XUL/Tutorial/Using_Spacers ---- -

En esta sección, averiguaremos como añadir algún espaciado en medio los elementos que hemos creado.

-

Adición de Espaciadores

-

Uno de los problemas con interfaces de usuario que se desarrollan es que cada usuario tiene una demostración diferente. Algunos usuarios pueden tener demostraciones más grandes con resoluciones más altas y los otros pueden tener resoluciones inferiores. Además, plataformas diferentes pueden tener exigencias especiales sobre el interfaz de usuario. Añadiendo el apoyo a múltiples lenguas, el texto para una lengua puede requerir más espacio(cuarto) que el otro.

-

Los usos que tienen que apoyar múltiples plataformas y lenguas por lo general tienen sus ventanas presentadas con mucho espacio para tener esto en cuenta. Algunas plataformas y juegos de herramientas de interfaz de usuario proporcionan los componentes con capacidad para autoajustar sus dimensiones y establecer su nueva posición por sí mismos para adaptarse a las necesidades del usuario. (por ejemplo: Java usa a administradores de disposición.)

-

XUL dota a los elementos con capacidad para ajustar la posición y redimensionarse automáticamente. Como hemos visto, en el ejemplo, la ventana de archivos del buscador ha cambiado su tamaño de modo que los elementos quepan correctamente dentro de ella. Cada vez agregamos algo, la ventana ha crecido.

-

XUL usa un sistema de disposición (capas) llamado 'Modelo de Cajas' que permite dividir las ventanas en conjuntos de 'cajas', anidables, para albergar los elementos. Hablaremos más de esto en la siguiente sección. Las cajas pueden ser ubicadas y redimensionadas asignando valores a sus propiedades directamente o mediante hojas de estilo. Por ahora, basta saber que el elemento de ventana es un tipo de caja.

-

Antes de entrar en el detalle sobre las cajas, introduciremos otro elemento XUL que es útil para controlar la disposición, el espaciador. Un espaciador es muy simple y sólo requiere un atributo, que será explicado en un momento. El espaciador más simple se parece a lo siguiente:

-
<spacer flex= "1" />
-
-

Un espaciador es usado para insertar un espacio vacío entre dos grupos de elementos que se encuentran dentro de un mismo contenedor (ventana o caja). Su función es crecer o encogerse cuando el usuario redimensiona la ventana, de modo que los elementos situados a su derecha, o debajo, sean empujados hacia los bordes (derecho o inferior, según sea el caso) y se mantenjan 'justificados'. Esto equivale a forzar a un grupo de elementos a mantenerse pegados al borde (derecho o inferior) de su contenedor (ventana) con independencia del tamaño adoptado por el mismo. Como veremos, es posible usar espaciadores para crear variados efectos de disposición.

-

En la sintaxis, mostrada arriba, el espaciador tiene un atributo llamado flex. Se usa para establecer la flexibilidad del espaciador. En el caso mostrado, el espaciador tiene un flex de 1. Este valor hace que el elemento espaciador sea elástico; y al insertarlo directamente dentro de una ventana, crecerá hasta copar el espacio disponible dentro de la misma (se descuenta el empleado por otros elementos). Si la ventana cambia su tamaño, el espaciador se ajustará para mentener copado el espacio disponible dentro de la misma. En breve añadiremos un espaciador a nuestro diálogo de búsqueda. Pero antes demos un vistazo a la ventana de diálogo cuando es redimensionada (para comparar, luego, con el efecto logrado al usar el espaciador).

-
-

 find-dlg-nospacer.jpg

-

Como se puede observar, todos los elementos han mantenido sus posiciones al cambiar el tamaño de la ventana; a pesar de que el espacio ofrecido por la misma para alijarlos el más grande. Veamos lo que ocurre al insertar un espaciador entre la caja de texto (textbox) y el botón buscar (Find).

-

find-dlg-wthspacer.jpg

-

Al agregar el espaciador y redimensinar la ventana, podemos ver que se expande para copar el vacío y los botones son empujados hacia la derecha.  El código para insertar el espaciador en el ejemplo es el siguiente: (insértelo inmediatamente antes del botón buscar - 'find-button')

-
<spacer flex="1"/>
-
-<button id="find-button" label="Find"/>
-
-
-

Más acerca de la Flexibilidad

-

XUL dispone los elementos en una ventana calculando dimensiones (ancho y alto) adecuadas para los elementos que contiene y luego agrega espacio, si hace falta, dónde sean flexibles. Salvo, aquellos elementos cuyas dimensiones hayan sido especificadas esplícitamente. El tamaño por defecto de un elemento es determinado por su contenido. Nótese, por ejemplo, que los botones 'find', 'cancel' tiene dimensiones ligeramente distintas de modo que ofrecen suficiente espacio para el texto en su interior. Si se crea un botón con una etiqueta muy larga su tamaño por defecto será el necesario para poder mostrar la etiqueta completa. Otros elementos, tales como las cajas de texto 'textbox' tienen un tamaño por defecto ajustado a su propósito.

-

El atributo flex se emplea para establecer si un elemento puede autoajustar sus dimensiones para copar la 'caja' que lo contiene. (en este caso, la ventana). El atributo flex no sólo aplica para los espaciadores; puede ser establecido para cualquier elemento. Por ejemplo, podríamos querer que se reajustase el botón buscar (find-button) en lugar de empujarlo, sin necesidad de que se autoajuste el espaciador.

-

find-dlg-flexbttn.jpg

-

Como se puede ver en la imagen, el establecer el atributo flex en el botón buscar, éste último se reajusta cuando la ventana lo hace. Un espaciador, en realidad, no es nada especial. Puede ser considerado como un botón oculto: opera sobre el espacio pero sin dibujarse en la pantalla.

-

Si se observa con cuidado la imagen arriba, se puede notar que no sólo creció el tamaño del votón buscar (find); también aparece un espacio vacío entre él y la etiqueta de texto. Desde luego, es consecuencia de que allí se encuentra el espaciador que ubicamos más arriba. El también se ha reajustado en tamaño. Una observación atenta evidenciará que el espacio disponible fue dividido entre los dos elementos que tienen establecido el atributo flex: el espaciador y el botón buscar. Cada uno de ellos recibió la mitad del espacio libre, disponible, para ajustar su tamaño.

-

Proporcionalidad de la flexibilidad (del atributo flex)

-

La razón por la que observamos el efecto anotado es la siguiente: tanto el espaciador como el botón tienen establecido su su atributo flex a 1. (flex="1"); ésto hace que se repartan de modo equivalente el espacio disponible. Pero, tambien es posible lograr un reparto del espacio sujeto a otras condiciones de proporcionalidad:

-

¿Qué pasaría en caso de desear que un elemento tome dos veces más espacio libre que otro? ¿Cómo lograrlo? -  Se puede usar números mayores que 1 como varores del atributo flex. Los valores de este atributo establecen una razón de proporcionalidad. Determinan cuántas partes del espacio disponible serán entragadas a cada uno de los elementos que lo tengan establecido. Si un elemento tiene su flex en 1 y otro tiene un flex de 2, el espacio libre será dividido en tres partes y se entregará 1 al primero y 2 al segundo; de modo que la razón de crecimiento, entre ellos, será  1:2; el segundo crecerá dos veces más que el primero.

-

The flex attribute isn't used to specify an actual size. Instead, it specifies how empty space it divided among the children of a container box. We'll look at boxes in the next section. Once the default sizes of the children of a box are determined, the flexibility values are used to divide up the remaining empty space in the box. For example, if a box is 200 pixels wide and contains two flexible buttons, the first 50 pixels and the other 90 pixels, there will be 60 pixels of space left over. If both buttons have a flex value of 1, the space will be divided evenly with 30 extra pixels of width going to each button. If the second button's flexibility was increased to 2, the first button would receive 20 pixels of the extra space and the second button would receive 40 pixels of extra space instead.

-

The flex attribute can be placed on any element, however it only has any meaning when placed on an element directly inside a XUL box. This means that even though you can place a flex on an HTML element, it will have no effect if that element is inside a non-box element.

-

Let's look at some examples:

-
Example 1:
-  <button label="Find" flex="1"/>
-  <button label="Cancel" flex="1"/>
-
-Example 2:
-  <button label="Find" flex="1"/>
-  <button label="Cancel" flex="10"/>
-
-Example 3:
-  <button label="Find" flex="2"/>
-  <button label="Replace"/>
-  <button label="Cancel" flex="4"/>
-
-Example 4:
-  <button label="Find" flex="2"/>
-  <button label="Replace" flex="2"/>
-  <button label="Cancel" flex="3"/>
-
-Example 5:
-  <html:div>
-    <button label="Find" flex="2"/>
-    <button label="Replace" flex="2"/>
-  </html:div>
-
-Example 6:
-  <button label="Find" flex="145"/>
-  <button label="Replace" flex="145"/>
-
-
-
- Example 1 
-
- in this case the flexibility is divided up evenly between both buttons. Both buttons will change size evenly.
-
- Example 2 
-
- here, both buttons will grow, but the Find button will grow ten times as much as the Cancel button, because it has a flex value that is 10 times the flex value of the Find button. Available space will be divided into one part for the Find button and 10 parts for the Cancel button.
-
- Example 3 
-
- only two of the buttons are marked as flexible here. The Replace button will never change size but the other two will. The Cancel button will always resize twice as large as the Find button because its flex value is twice as large.
-
- Example 4 
-
- in this case, all three buttons are flexible. Both the Find and Replace buttons will be the same size but the Cancel button will be somewhat larger (50% larger to be exact).
-
- Example 5 
-
- here, the two buttons are placed inside a div element. Flexibility is meaningless here as the buttons are not directly in a box. The effect would be the same if the flex attributes were left out.
-
- Example 6 
-
- because the flex values are the same on both buttons, their will flex equally. This would work just as well with flex values of one instead of 145. There's no difference in this case. It is recommended that you use lower numbers for readability.
-
-

Note that other factors such as the button labels and button minimum sizes will affect the actual sizes of the buttons. For instance, a button won't shrink less than the space needed to fit its label.

-

Specifying a flex value of 0 has the same effect as leaving the flex attribute out entirely. It means that the element is not flexible at all. You may also sometimes see a flex value specified as a percentage. This has no special meaning and is treated as if the percent sign was not there.

-

You may have noticed that when you resize the find file dialog vertically, the buttons resize themselves to fit the height of the window. This is because all of the buttons have an implied vertical flex given to them by the window. In the next section we'll learn how to change this.

-

Find files example so far

-

Código Ver en funcionamiento

-

Next, we'll learn some additional features of buttons.

-

Categorías

-

links interwikis

diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/\303\241rboles/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/\303\241rboles/index.html" deleted file mode 100644 index 509017990e..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/\303\241rboles/index.html" +++ /dev/null @@ -1,194 +0,0 @@ ---- -title: Árboles -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Árboles -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Trees ---- -

XUL provides a way to create tabular or hierarchical lists using a tree.

- -

El árbol

- -

One of the more complex elements in XUL is the árbol. A tree may be used to display rows of text in columns. It can be used with rows either in a flat list or arranged into a hierarchy. A tree also allows the user to rearrange, resize and hide individual columns. Some examples of trees include the list of messages in a mail application, or the Bookmarks window in Mozilla.

- -

In some ways, a tree has some similarities with the listbox. Both can be used to create tables of data with multiple rows and columns, and both may contain column headers. The tree also supports nested rows, whereas the listbox does not. However, listboxes may contain any type of content, whereas trees may only contain text and images. (Using advanced features, progress meters or checkboxes also can be added to the tree)

- -

A tree consists of two parts, the set of columns, and the tree body.

- - - -

The tree is unique in that the body of the tree consists only of a single widget which draws all of the data in the tree. This contrasts with the listbox, where individual listitem and listcell tags are used to specify the rows in the listbox. In a tree, all of the data to be displayed is supplied by a separate object, called a tree view. When it comes time to display a cell, the tree widget will call out to this tree view to determine what to display, which in turn will be drawn by the tree. The tree is smart enough to only ask for information from the view for those rows that need to be displayed. This allows the view to be optimized such that it only needs to load the data for displayed content. For instance, a tree might have thousands of rows, yet most of them will be scrolled off the border of the tree, hidden from view. This means that the tree is scalable to any number of rows without any performance problems. Of course, this is independant of the performance of the view object itself.

- -

A tree view is an object which implements the nsITreeView interface. This interface contains thirty properties and functions which you may implement. These functions will be called by the tree as necessary to retrieve data and state about the tree. For instance, the getCellText() function will be called to get the label for a particular cell in the tree.

- -

An advantage of using a tree view is that it allows the view to store the data in a manner which is more suitable for the data, or to load the data on demand as rows are displayed. This allows more flexibility when using trees.

- -

Naturally, having to implement a tree view with thirty or so properties and methods for every tree can be very cumbersome, especially for simple trees. Fortunately, XUL provides a couple of built-in view implementations which do most of the hard work for you. For most trees, especially when you first start to use trees, you will use one of these built-in types. However, you can create a view entirely from scratch if necessary. If you do, you might store the data in an array or JavaScript data structure, or load the data from an XML file.

- -

Since the entire body of the tree is a single widget, you can't change the style of individual rows or cells in the normal way. This is because there are no elements that display the individual cells, like there is with the caja de lista. Instead, all drawing is done by the tree body using data supplied by the view. This is an important point and many XUL developers have trouble understanding this aspect. To modify the appearance of a tree cell, the view must instead associate a set of keywords for a row and cell. A special CSS syntax is used which styles components of the tree body with those keywords. In a sense, it is somewhat like using CSS classes. La estilización de un árbol es discutida con más detalles en una sección posterior.

- -

Elementos del árbol

- -

Trees can be created with the tree element, which is described in the following sections. There are also two elements used to define the columns to be displayed in the tree.

- -
-
tree
-
This is the outer element of a tree.
-
- -
-
treecols
-
This element is a placeholder for a set of treecol elements.
-
- -
-
treecol
-
This is used to declare a column of the tree. By using this element, you can specify additional information about how the data in the columns are sorted and if the user can resize the columns. You should always place an id attribute on a column, as Mozilla uses the ids to identify the columns when rearranging and hiding them. This is no longer required in Mozilla 1.8 and later, but it is still a good idea to use ids on columns.
-
- -
-
treechildren
-
This contains the main body of the tree where the individual rows of data will be displayed.
-
- -
Ejemplo de árbol con dos columnas
- -

Código Ver en funcionamiento

- -
<tree flex="1">
-
-  <treecols>
-    <treecol id="nameColumn" label="Nombre" flex="1"/>
-    <treecol id="addressColumn" label="Dirección" flex="2"/>
-  </treecols>
-
-  <treechildren/>
-
-</tree>
-
- -

First, the entire table is surrounded with a tree element. This declares an element that is used as a table or tree. As with HTML tables, the data in a tree is always organized into rows. The columns are specified using the treecols tag.

- -

You may place as many columns as you wish in a tree. As with listboxes, a header row will appear with column labels. A drop-down menu will appear in the upper-right corner of the tree, which the user may use to show and hide individual columns. Each column is created with a treecol element. You can set the header label using the label attribute. You may also want to make the columns flexible if your tree is flexible, so that the columns stretch as the tree does. In this example, the second column will be approximately twice as wide as the first column. All of the columns should be placed directly inside a treecols element.

- -

In this case we haven't specified a view to supply the tree's data, so we'll only see column headers and an empty tree body. You may have to resize the window to see anything since there isn't any data to display. Since the tree has been marked as flexible, the body will stretch to fit the available space. Making a tree flexible is quite commonly done, as it is often the case that the data in the tree is the most significant information displayed, so it makes sense to make the tree grow to fit. However, you may specify a specific number of rows to appear in a tree by setting the rows attribute on the tree element. This attribute specifies how many rows are displayed in the user interface, not how many rows of data there are. The total number of rows is supplied by the tree view. If there are more rows of data in the tree, a scrollbar will appear to allow the user to see the rest of them. If you don't specify the rows attribute, the default value is 0, which means that none of the rows will appear. In this case, you would make the tree flexible. If your tree is flexible, it doesn't need a rows attribute since it will grow to fit the available space.

- -

Vista del contenido del árbol

- -

Having said that the data to be displayed in a tree comes from a view and not from XUL tags, there happens to be a built-in tree view which gets its data from XUL tags. This may be a bit confusing, but essentially, one of the built-in tree views uses a set of tags which can be used to specify information about the data in the tree. The following tags are used:

- -
-
treeitem
-
This contains a single parent row and all its descendants. This element also serves as the item which can be selected by the user. The treeitem tag would go around the entire row so that it is selectable as a whole.
-
- -
-
treerow
-
A single row in the tree, which should be placed inside a treeitem tag.
-
- -
-
treecell
-
A single cell in a tree. This element would go inside a treerow element.
-
- -

Conveniently, these tags may be placed directly inside the treechildren tag, nested in the order above. The tags define the data to be displayed in the tree body. In this case, the tree uses the built-in tree view, called a content tree view, which uses the labels and values specified on these elements as the data for the tree. When the tree needs to display a row, the tree asks the content tree view for a cell's label by calling the view's getCellText function, which in turn gets the data from the label of the appropriate treecell.

- -

However, the three elements listed above are not displayed directly. They are used only as the source for the data for the view. Thus, only a handful of attributes apply to the treeitem and related elements. For instance, you cannot change the appearance of the tree rows using the style attribute or with other CSS properties and the box related features such as flexibility and orientation cannot be used.

- -

In fact, apart from some tree specific attributes, the only attributes that will have any effect will be the label attribute to set a text label for a cell and the src attribute to set an image. However, there are special ways of styling the tree and setting other features which we will see in later sections.

- -

Also, events do not get sent to treeitem element and their children; instead they get sent to the treechildren element.

- -

That the treeitems are unlike other XUL elements is a common source of confusion for XUL developers. Essentially, the tree content view is a view where the data for the cells is supplied from tags placed inside the tree. Naturally, if you are using a different kind of view, the data will be supplied from another source, and there won't be any treeitem elements at all.

- -

Let's start by looking at how to create a simple tree with multiple columns using the tree content view. This could be used to create a list of mail messages. There might be multiple columns, such as the sender and the subject.

- -

Ejemplo de árbol con treechildren

- -

Código Ver en funcionamiento

- -
Image:trees1.png
- -
<tree flex="1">
-
-  <treecols>
-    <treecol id="sender" label="Sender" flex="1"/>
-    <treecol id="subject" label="Subject" flex="2"/>
-  </treecols>
-
-  <treechildren>
-    <treeitem>
-      <treerow>
-        <treecell label="joe@somewhere.com"/>
-        <treecell label="Top secret plans"/>
-      </treerow>
-    </treeitem>
-    <treeitem>
-      <treerow>
-        <treecell label="mel@whereever.com"/>
-        <treecell label="Let's do lunch"/>
-      </treerow>
-    </treeitem>
-  </treechildren>
-
-</tree>
-
- -

As can be seen in the image, the tree has been created with two rows of data.

- -

This tree has two columns, the second of which will take up more space than the first. You will usually make the columns flexible. You can also supply widths with the width attribute. You should include the same number of treecol elements as there are columns in the tree. Otherwise strange things might happen.

- -

The header row is created automatically. The button in the upper right corner can be used to hide and show the columns. You can place a hidecolumnpicker attribute on the tree and set it to true if you would like to hide this button. If this button is hidden, the user will not be able to hide columns.

- -

Make sure that you set an id attribute on each column or the hiding and showing of columns will not work in all versions of Mozilla.

- -

The treechildren element surrounds all of the rows. Inside the body are individual rows, which may in turn contain other rows. For a simpler tree, each row is created with the treeitem and treerow elements. The treerow element surrounds all of the cells in a single row, while a treeitem element would surround a row and all of its children. Trees with nested rows are described in the next section.

- -

Inside the rows, you will put individual tree cells. These are created using the treecell element. You can set the text for the cell using the label attribute. The first treecell in a row determines the content that will appear in the first column, the second treecell determines the content that will appear in the second column, and so on.

- -

The user can select the treeitems by clicking on them with the mouse, or by highlighting them with the keyboard. The user can select multiple items by holding down the Shift or Control keys and clicking additional rows. To disable multiple selection, place a seltype attribute on the tree, set to the value single. With this, the user may only select a single row at a time.

- -
-

Add a tree to out find files example

- -

Let's add a tree to the find files window where the results of the search would be displayed. The tree will use a content tree view. The following code should be added in place of the iframe.

- -
<tree flex="1">
-  <treecols>
-    <treecol id="name" label="Filename" flex="1"/>
-    <treecol id="location" label="Location" flex="2"/>
-    <treecol id="size" label="Size" flex="1"/>
-  </treecols>
-
-  <treechildren>
-   <treeitem>
-     <treerow>
-       <treecell label="mozilla"/>
-       <treecell label="/usr/local"/>
-       <treecell label="2520 bytes"/>
-     </treerow>
-   </treeitem>
-  </treechildren>
-</tree>
-
-<splitter collapse="before" resizeafter="grow"/>
-
- -

We've added a tree with three columns for the filename, the location and the file size. The second column will appear twice as wide due to the larger flexibility. A single row has been added to demonstrate what the table would look like with a row. In a real implementation, the rows would be added by a script as the search was performed, or a custom view would be created to hold the data.

- -

Ejemplo: Código Ver en funcionamiento

-
- -


- Seguimos con como crear árboles más avanzados.

- -
-

« AnteriorSiguiente »

-
diff --git "a/files/es/archive/mozilla/xul/tutorial_de_xul/\303\241rboles_y_plantillas/index.html" "b/files/es/archive/mozilla/xul/tutorial_de_xul/\303\241rboles_y_plantillas/index.html" deleted file mode 100644 index 7c5277063b..0000000000 --- "a/files/es/archive/mozilla/xul/tutorial_de_xul/\303\241rboles_y_plantillas/index.html" +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Árboles y plantillas -slug: Archive/Mozilla/XUL/Tutorial_de_XUL/Árboles_y_plantillas -tags: - - Todas_las_Categorías - - Tutorial_de_XUL - - XUL - - páginas_a_traducir -translation_of: Archive/Mozilla/XUL/Tutorial/Trees_and_Templates ---- -

Lo siguiente describe como usar una plantilla con un árbol.

- -

Añadiendo fuentes de datos a árboles

- -

When using a tree, you will often use a template to build its content, to handle a large amount of hierarchial data. Using a template with a tree uses very much the same syntax as with other elements. You need to add a datasources and a ref attribute to the tree element, which specify the datasource and root node to display. Multiple rules can be used to indicate different content for different types of data.

- -

El ejemplo siguiente usa el historial de fuentes de datos:

- -
<tree datasources="rdf:history" ref="NC:HistoryByDate"
-          flags="dont-build-content">
-
- -

As described in the previous section, the tree may use a tree builder for template generation instead of the normal content builder. This means that elements will not be created for every row in the tree, making it more efficient. The [[XUL:Atributos:flgs|flags attribute set to the value dont-build-content, as used in the example above, indicates that the tree builder should be used. If you leave the attribute out, the content builder will be used. You can see the difference by using Mozilla's DOM Inspector on a tree with and without the flag.

- -

If you do use a content builder instead, note that the content won't generally get built until it is needed. With hierarchical trees, the children don't get generated until the parent nodes have been opened by the user.

- -

In the template, there will be one treecell for each column in the tree. The cells should have a label attribute to set the label for the cell. This would normally be set to an RDF property so that the label is pulled from the datasource.

- -

Plantilla constructora de árbol

- -

The following example demonstrates a template-built tree, in this case for the file system.

- -

Ejemplo 1: Código Ver en funcionamiento

- -
<tree id="my-tree" flex="1"
-       datasources="rdf:files" ref="file:///" flags="dont-build-content">
-  <treecols>
-    <treecol id="Name" label="Name" primary="true" flex="1"/>
-    <splitter/>
-    <treecol id="Date" label="Date" flex="1"/>
-  </treecols>
-
-    <template>
-      <rule>
-        <treechildren>
-          <treeitem uri="rdf:*">
-            <treerow>
-              <treecell label="rdf:http://home.netscape.com/NC-rdf#Name"/>
-              <treecell label="rdf:http://home.netscape.com/WEB-rdf#LastModifiedDate"/>
-            </treerow>
-          </treeitem>
-        </treechildren>
-      </rule>
-    </template>
-</tree>
-
- -

Aquí, un árbol es creado con dos columnas, para el nombre y la fecha de un archivo. The tree should display a list of the files in the root directory. Only one rule is used, but you may add others if needed. Like with other templates, the uri attribute on an element indicates where to start generating content. The two cells grab the name and date from the datasource and place the values in the cell labels.

- -

This example shows why the uri attribute becomes useful. Notice how it has been placed on the treeitem in the example, even though it is not a direct descendant of the rule element. We need to put this attribute on only those elements that we want repeated for each resource. Because we don't want multiple treechildren elements, we don't put it there. Instead we put the uri attributes on the treeitem elements. Effectively, the elements outside (or above) the element with the uri attribute are not duplicated whereas the element with the uri attribute and the elements inside it are duplicated for each resource.

- -

As the tree builder is used and not the content builder, the structure of the elements in the above example must be as shown, with the treechildren element inside the rule. Although the tree builder doesn't build these elements, it does require this structure in order to determine what to generate correctly.

- -
Image:rdfoutl1.jpg
- -

Note in the image that additional child elements below the top-level elements have been added automatically. XUL knows how to add child elements when the templates or rules contain tree elements or menu elements. It will generate tree elements as nested as necessary based on the available RDF data.

- -

An interesting part of RDF datasources is that the resource values are only determined when the data is needed. This means that values that are deeper in the resource hierarchy are not determined until the user navigates to that node in the tree. This becomes useful for certain datasources where the data is determined dynamically.

- -

Ordenando las columnas

- -

If you try the previous example, you might note that the list of files is not sorted. Trees which generate their data from a datasource have the optional ability to sort their data. You can sort either ascending or descending on any column. The user may change the sort column and direction by clicking the column headers. This sorting feature is not available for trees with static content, although you can write a script to sort the data.

- -

Sorting involves three attributes, which should be placed on the columns. The first attribute, sort, should be set to an RDF property that is used as the sort key. Usually, this would be the same as that used in the label of the cell in that column. If you set this on a column, the data will be sorted in that column. The user can change the sort direction by clicking the column header. If you do not set the sort attribute on a column, the data cannot be sorted by that column.

- -

El atributo sortDirection (note la mezcla) es usado para definir el orden por defecto de la columna. Tres valores son posibles:

- -
-
ascending
-
los datos aparecerán en orden ascendente (por ejemplo: de la A a la Z.
-
descending
-
los datos aparecerán en orden descendente (Z-A).
-
natural
-
los datos aparecerán en el mismo orden en el cual están guardados en la fuente de datos RDF.
-
- -

The final attribute, sortActive should be set to true for one column, the one that you would like to be sorted by default.

- -

Although the sorting will function correctly with only those attributes, you may also use the style class sortDirectionIndicator on a column that can be sorted. This will cause a small triangle to appear on the column header that indicates the direction of the sort. If you don't do this, the user may still sort the columns but will have no indication as to which column is currently sorted.

- -

The following example changes the columns in the earlier example to incorporate the extra features:

- -
<treecols>
-  <treecol id="Name" label="Name" flex="1" primary="true"
-            class="sortDirectionIndicator" sortActive="true"
-            sortDirection="ascending"
-            sort="rdf:http://home.netscape.com/NC-rdf#Name"/>
-  <splitter/>
-  <treecol id="Date" label="Date" flex="1" class="sortDirectionIndicator"
-           sort="rdf:http://home.netscape.com/WEB-rdf#LastModifiedDate"/>
-</treecols>
-
- -

Persistencia del estado de la columna

- -

One additional thing you might want to do is persist which column is currently sorted, so that it is remembered between sessions. To do this, we use the persist attribute on each treecol element. There are five attributes of columns that need to be persisted, to save the column width, the column order, whether the column is visible, which column is currently sorted and the sort direction. The following example shows a sample column:

- -
<treecol id="Date" label="Date" flex="1"
-             class="sortDirectionIndicator"
-             persist="width ordinal hidden sortActive sortDirection"
-             sort="rdf:http://home.netscape.com/WEB-rdf#LastModifiedDate"/>
-
- -

Más detalles sobre el atributo More details about the persist son descritos en la sección próxima.

- -

Reglas adicionales

- -

There are two additional attributes that can be added to the rule element that allow it to match in certain special circumstances. Both are boolean attributes.

- -
-
iscontainer
-
If this attribute is set to true, then the rule will match all resources that have children. For example, we could use this rule to match bookmark folders. This is convenient as the RDF datasource does not need to include any special attributes to indicate this.
-
- -
-
isempty
-
If this attribute is set to true, then the rule will match all resources that have no children.
-
- -

A resource might be a container and be an empty one as well. However, this is different from a resource that is not a container. For example, a bookmark folder is a container but it might or might not have children. However a single bookmark or separator is not a container.

- -

You can combine these two elements with other attribute matches for more specific rules.

- -

Seguimos con las fuentes de datos proporcionadas por Mozilla.

- -
-

« AnteriorSiguiente »

-
diff --git a/files/es/archive/mozilla/xul/xul_reference/index.html b/files/es/archive/mozilla/xul/xul_reference/index.html deleted file mode 100644 index 9e3468106c..0000000000 --- a/files/es/archive/mozilla/xul/xul_reference/index.html +++ /dev/null @@ -1,318 +0,0 @@ ---- -title: XUL Reference -slug: Archive/Mozilla/XUL/XUL_Reference -translation_of: Archive/Mozilla/XUL/XUL_Reference ---- -

« Referencia de XUL «

- - - - - - - - - - - -
Todos los elementos XUL (ordenados alfabéticamente)
-

action
- arrowscrollbox
- assign
- 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
- param
- popupset
- preference
- preferences
- prefpane
- prefwindow
- progressmeter
- query
- queryset
- radio
- radiogroup
- resizer
- richlistbox
- richlistitem
- row
- rows
- rule
- scale
- script
- scrollbar
- scrollbox
- scrollcorner
- separator
- spacer
- spinbuttons
- splitter
- stack
- statusbar

-
-

statusbarpanel
- stringbundle
- stringbundleset
- tab
- tabbrowser (Firefox-a partir de
- Firefox 3/Gecko 1.9)
- tabbox
- tabpanel
- tabpanels
- tabs
- template
- textnode
- textbox
- textbox (Firefox autocomplete)
- textbox (Mozilla autocomplete)
- timepicker
- titlebar
- toolbar
- toolbarbutton
- toolbargrippy
- toolbaritem
- toolbarpalette
- toolbarseparator
- toolbarset
- toolbarspacer
- toolbarspring
- toolbox
- tooltip
- tree
- treecell
- treechildren
- treecol
- treecols
- treeitem
- treerow
- treeseparator
- triple
- vbox
- where
- window
- wizard
- wizardpage

-
-

Referencia de XUL

-

« Referencia de XUL «

- - - - - - - - - - - -
Elementos XUL por categoría
-

VENTANAS

-

dialog
- overlay
- page
- window
- wizard
- wizardpage
- preference
- preferences
- prefpane
- prefwindow

-

ESTRUCTURA
- DE VENTANAS

-

browser
- tabbrowser
- editor
- iframe
- titlebar
- resizer
- statusbar
- statusbarpanel
- dialogheader
- notification
- notificationbox

-

MENUS Y VENTANAS
- EMERGENTES

-

menubar
- menu
- menuitem
- menuseparator
- menupopup
- panel
- tooltip
- popupset

-

BARRAS DE
- HERRAMIENTAS

-

toolbar
- toolbarbutton
- toolbargrippy
- toolbaritem
- toolbarpalette
- toolbarseparator
- toolbarset
- toolbarspacer
- toolbarspring
- toolbox

-

PESTAÑAS Y
- AGRUPAMIENTO

-

tabbox
- tabs
- tab
- tabpanels
- tabpanel
- groupbox
- caption
- separator
- spacer

-
-

CONTROLES

-

button
- checkbox
- colorpicker
- datepicker
- menulist
- progressmeter
- radio
- radiogroup
- scale
- splitter
- textbox
- textbox (Firefox autocomplete)
- textbox (Mozilla autocomplete)
- timepicker

-

TEXTO E
- IMAGENES

-

description
- label
- image

-

LISTAS

-

listbox
- listitem
- listcell
- listcol
- listcols
- listhead
- listheader
- richlistbox
- richlistitem

-

ARBOLES

-

tree
- treecell
- treechildren
- treecol
- treecols
- treeitem
- treerow
- treeseparator

-
-

DISPOSICION

-

box
- hbox
- vbox
- bbox
- deck
- stack
- grid
- columns
- column
- rows
- row
- scrollbox

-

PLANTILLAS

-

action
- assign
- binding
- bindings
- conditions
- content
- member
- param
- query
- queryset
- rule
- template
- textnode
- triple
- where

-

SCRIPTING

-

script
- commandset
- command
- broadcaster
- broadcasterset
- observes
- key
- keyset
- stringbundle
- stringbundleset

-

ELEMENTOS
- DE AYUDA

-

arrowscrollbox
- dropmarker
- grippy
- scrollbar
- scrollcorner
- spinbuttons

-
-

Otras listas de XUL

- diff --git a/files/es/archive/mozilla/xul/xul_reference/xul_element_attributes/index.html b/files/es/archive/mozilla/xul/xul_reference/xul_element_attributes/index.html deleted file mode 100644 index 38b3c37f9a..0000000000 --- a/files/es/archive/mozilla/xul/xul_reference/xul_element_attributes/index.html +++ /dev/null @@ -1,551 +0,0 @@ ---- -title: Atributos de los elementos XUL -slug: Archive/Mozilla/XUL/XUL_Reference/XUL_element_attributes -translation_of: Archive/Mozilla/XUL/XUL_Reference/XUL_element_attributes ---- -
« Referencia de XUL Los siguientes atributos son comunes a todos los elementos XUL:
- -
- -
-
- align
-
- Type: one of the values below
-
- The align attribute specifies how child elements of the box are aligned, when the size of the box is larger than the total size of the children. -
    -
  • For boxes that have horizontal orientation, it specifies how its children will be aligned vertically.
  • -
  • For boxes that have vertical orientation, it specifies how its children will be aligned horizontally.
  • -
-
-
-
-
- start
-
- Child elements are aligned starting from the left or top edge of the box. If the box is larger than the total size of the children, the extra space is placed on the right or bottom side.
-
- center
-
- Extra space is split equally along each side of the child elements, resulting in the children being placed in the center of the box.
-
- end
-
- Child elements are placed on the right or bottom edge of the box. If the box is larger than the total size of the children, the extra space is placed on the left or top side.
-
- baseline
-
- This value applies to horizontally oriented boxes only. It causes the child elements to be aligned so that their text labels are lined up.
-
- stretch
-
- This is the default value. The child elements are stretched to fit the size of the box. For a horizontal box, the children are stretched to be the height of the box. For a vertical box, the children are stretched to be the width of the box. If the size of the box changes, the children stretch to fit. Use the flex attribute to create elements that stretch in the opposite direction.
-
- left
-
- The elements are aligned on their left edges.
-
- center
-
- The elements are centered horizontally.
-
- right
-
- The elements are aligned on their right edges.
-
-
-
- The pack attribute is related to the alignment but is used to specify the position in the opposite direction. You can also specify the value of align using the style property -moz-box-align.
-
-
- -
-
allowevents
-
Type: boolean
-
If true, events are passed to children of the element. Otherwise, events are passed to the element only.
-
- - - - -
- - -
-
allownegativeassertions
-
Type: boolean
-
Valid on any element that has a datasources attribute. When multiple datasources are used, one may override an assertion from another. This attribute, if true, which is the default, allows a datasource to negate an earlier assertion.
-
-
- - -
-
class
-
Type: string
-
The style class of the element. Multiple classes may be specified by separating them with spaces.
-
-
- - -
-
coalesceduplicatearcs
-
Type: boolean
-
Valid on any element that has a datasources attribute. When multiple datasources are used, one may override an assertion from another. This attribute, if true, which is the default, allows a datasource to negate an earlier assertion.
-
-
- - -
-
collapsed
-
Type: boolean
-
If true, then the element is collapsed and does not appear. It is equivalent to setting the CSS visibility property to collapse.
-
- - -
- - -
-
container
-
Type: boolean
-
Set to true if the element is to act as a container which can have child elements. This would be used for folders. This will be set by the template builder as needed.
-
-
- - -
-
containment
-
Type: URI
-
This attribute specifies RDF properties (an RDF predicate) that indicate that a resource is a container. When generating content from a template this is used to determine which resources from the datasource are containers and thus can have child nodes and which ones are not containers.
-
This attribute should be placed on the same element that the datasources and the ref attribute is on. It may be set to a space-separated list of RDF properties or resources.
-
-
- - -
-
context
-
Type: id
-
Should be set to the value of the id of the popup element that should appear when the user context-clicks on the element. A context-click varies on each platform. Usually it will be a right click. You can use the special value '_child' to indicate the first menupopup child of the element.
-
-
- - -
-
contextmenu
-
Type: id
-
Alternate name for the context attribute, but also has a corresponding script property contextMenu.
-
-
- - -
-
datasources
-
Type: space separated list of datasource URIs
-
A space-separated list of datasources that an element's template will use for content generation. These can be either internal datasources such as rdf:bookmarks or a URL. The datasources attribute may be placed on most elements, although it will usually be found on trees and menu related elements. The element should have a template element as a child.
-
For RDF templates, the specified datasources are combined into a single composite datasource which holds the data from all of the datasources. This composite datasource is accesssible via a script through the database property.
-
For XML datasources, only one source is used, either the URL of an XML file or an anchor reference to another element within the same document. For instance, the reference '#data' refers to an element with the id 'data'.
-
If you plan on adding a datasource to an element but don't want one to be added right away, set this attribute to 'rdf:null'. This will make the element so that its contents can be generated from a datasource. Otherwise, you cannot add one later.
-
When the XUL document is contained on a remote web site, the datasources may only be loaded from the same domain as the document.
-
-
- - -
-
dir
-
Type: one of the values below
-
The direction in which the child elements of the element are placed. -
-
normal
-
For scales, the scale's values are ordered from left to right (for horizontal scales) or from top to bottom (for vertical scales)  For other elements, the elements are placed left to right or top to bottom in the order they appear in the XUL code.
-
reverse
-
For scales, the scale's values are ordered from right to left (for horizontal scales) or from bottom to top (for vertical scales). For other elements, they are placed right to left or bottom to top. This is reverse of the order in which they appear in the XUL code.
-
-
-
- - -
- - -
-
empty
-
Type: boolean
-
Set to true if the element is a container that contains no children. This will be set by the template builder as needed.
-
-
- - -
-
equalsize
-
Type: one of the values below
-
This attribute can be used to make the children of the element equal in size. -
-
always
-
For a horizontally oriented element, this will make all of its children have the width of the widest child. For a vertically oriented element, this will make its children all have the height of the tallest child.
-
never
-
All of the children are displayed at the size required by the content or as specified by the width and height attributes or the CSS width and height properties.
-
-
-
-
- - -
-
flags
-
Type: space-separated list of the values below
-
A set of flags used for miscellaneous purposes. Two flags are defined, which may be the value of this attribute. -
    -
  • dont-test-empty: For template generated content, the builder will not check that a container is empty.
  • -
  • dont-build-content: This flag may be used on a tree to indicate that content elements should not be generated. This results in a performance enhancement, but you will not be able to use the DOM functions to retrieve the tree rows.
  • -
-
-
-
- - -
-
flex
-
Type: string (representing an integer)
-
Indicates the flexibility of the element, which indicates how an element's container distributes remaining empty space among its children. Flexible elements grow and shrink to fit their given space. Elements with larger flex values will be made larger than elements with lower flex values, at the ratio determined by the two elements. The actual value is not relevant unless there are other flexible elements within the same container. Once the default sizes of elements in a box are calculated, the remaining space in the box is divided among the flexible elements, according to their flex ratios. Specifying a flex value of 0 has the same effect as leaving the flex attribute out entirely.
-
-
- - -
-
height
-
Type: string (representing an integer)
-
The preferred height of the element in pixels. The actual displayed height may be different if the element or its contents have a minimum or maximum height. The CSS height property may also be used.
-
-
- - -
-
hidden
-
Type: boolean
-
If set to true, the element is not displayed. This is similar to setting the CSS display property to 'none'.
-
- - -
- - -
-
id
-
Type: unique id
-
A unique identifier so that you can identify the element with. You can use this as a parameter to getElementById() and other DOM functions and to reference the element in style sheets.
-
- - -
- - -
-
insertafter
-
Type: id
-
When an element is in an overlay, the insertafter attribute specifies the id of the element in the base window that the element should appear after. This attribute overrides the insertbefore attribute. This value may be a comma-separated list of ids, which are scanned and the first one found in the window is used.
-
-
- - -
-
insertbefore
-
Type: id
-
When an element is in an overlay, the insertbefore attribute specifies the id of the element in the base window that the element should appear before. This value may be a comma-separated list of ids, which are scanned and the first one found in the window is used.
-
-
- - -
-
left
-
Type: string (representing an integer)
-
For elements placed directly within a stack, specifies the pixel position of the left edge of the element relative to the left edge of the stack.
-
-
- - -
-
maxheight
-
Type: string (representing an integer)
-
The maximum height of the element. This corresponds to the max-height CSS property.
-
-
- - -
-
maxwidth
-
Type: string (representing an integer)
-
The maximum width of the element. This corresponds to the max-width CSS property.
-
-
- - -
-
menu
-
Type: id
-
Alternate name for the popup attribute, but also has a corresponding script property 'menu'.
-
-
- - -
-
minheight
-
Type: string (representing an integer)
-
The minimum height of the element. This corresponds to the min-height CSS property.
-
-
- - -
-
minwidth
-
Type: string (representing an integer)
-
The minimum width of the element. This corresponds to the min-width CSS property.
-
-
- - -
-
mousethrough
-
Type: one of the values below
-
Determines whether mouse events are passed to the element or not. If this attribute is not specified, the value is inherited from the parent of the element. If no ancestor has the mousethrough attribute set, the default value is never. -
-
always
-
Mouse events are transparent to the element. This means that the element will not receive any mouse events due to either clicking or movement. Child elements may override this if they specify mousethrough="never".
-
never
-
Mouse events are passed to the element as normal.
-
-
-
- - -
- - -
-
observes
-
Type: id
-
Set to an id of a broadcaster element that is being observed by the element. If an attribute changes in the broadcaster it is also changed in the observer.
-
-
- - -
-
ordinal
-
Type: string (representing an integer)
-
An integer which specifies the position of the element within its parent. By default, elements appear in the order they appear in the XUL code. The ordinal attribute can be used to change the order. Note the default ordinal for elements is 1. You can retrieve the displayed order by using the properties of the boxObject of the container.
-
-
- - -
-
orient
-
Type: one of the values below
-
Used to specify whether the children of the element are oriented horizontally or vertically. The default value depends on the element. You can also use the -moz-box-orient style property. -
-
horizontal
-
Child elements of the element are placed next to each other in a row in the order that they appear in the XUL source.
-
vertical
-
Child elements of the element are placed under each other in a column in the order that they appear in the XUL source.
-
-
-
- - -
- - -
-
pack
-
Type: one of the values below
-
The pack attribute specifies where child elements of the box are placed when the box is larger that the size of the children. For boxes with horizontal orientation, it is used to indicate the position of children horizontally. For boxes with vertical orientation, it is used to indicate the position of children vertically. The align attribute is used to specify the position in the opposite direction. You can also specify the value of pack using the style property -moz-box-pack. -
-
start
-
Child elements are placed starting from the left or top edge of the box. If the box is larger than the total size of the children, the extra space is placed on the right or bottom side.
-
center
-
Extra space is split equally along each side of the child elements, resulting the children being placed in the center of the box.
-
end
-
Child elements are placed on the right or bottom edge of the box. If the box is larger than the total size of the children, the extra space is placed on the left or top side.
-
-
-
- - -
- - -
-
persist
-
Type: space-separated list of attribute names
-
A space-separated list of attributes that are maintained when the window is closed. When the window is re-opened, the values of persistent attributes are restored. In Mozilla, persistent attributes are stored in the per-profile file xulstore.json. Persistence can also be stored using the document.persist function. In order for persistence to work, the element must also have an id. Persistence will not remember the absence of an attribute, so for boolean attributes like checked where absence means false, you will need to explicitly set the attribute to false before the window closes (bug 15232).
-
-
- - -
-
popup
-
Type: id
-
Should be set to the value of the id of the popup element that should appear when the user clicks on the element.
-
- - -
- - -
-
position
-
Type: string (representing an integer)
-
When an element is in an overlay, the position is an index where the child is inserted. The position is one-based, so use a value of 1 to place the element at the beginning. This attribute is ignored if either an insertbefore or insertafter attribute matches an element.
-
-
- - -
-
preference-editable
-
Mozilla 1.8
-
Type: boolean
-
If true, the element may be used as one that modifies a preference in a prefwindow. The preference attribute may be used to connect to a preference element. This is useful for custom elements implemented in XBL. The element should fire change, command, or input event when the value is changed so that the preference will update accordingly.
-
- See the pref system documentation for more information.
-
-
- - -
-
querytype
-
Type: string
-
Indicates the type of datasource used in a template. Firefox 3 provides 3 built-in datasources: 'rdf', default, 'xml' and 'storage'. Extensions may provide support for additional datasources.
-
-
- - -
-
ref
-
Type: URI
-
For template-generated elements, this attribute is used to specify the root RDF node where content generation begins. This will correspond to the value of an about attribute on an RDF container. This attribute should be placed alongside the datasources attribute.
-
-
- - -
-
removeelement
-
Type: id
-
When placed on an element in an overlay, it indicates that the element in the base file should be removed from the window.
-
-
- - -
-
sortDirection
-
Type: one of the values below
-
Set this attribute to set the direction that template-generated content is sorted. Use the sortResource attribute to specify the sort key. -
-
ascending
-
The data is sorted in ascending order.
-
descending
-
The data is sorted in descending order.
-
natural
-
The data is sorted in natural order, which means the order that it is stored in.
-
-
-
-
- - -
-
sortResource
-
Type: URI
-
For template-generated content, this specifies the sort key, if you would like the content to be sorted. The key should be the full URI of the RDF resource to sort by, for example 'http://home.netscape.com/NC-rdf#Name'. Place this attribute on the same element as the datasources attribute. Use sortResource2 to specify a secondary sort key.
-
-
- - -
-
sortResource2
-
Type: URI
-
The value of this attribute is the URI of an RDF predicate that serves as a secondary key for sorted content.
-
-
- - -
-
statustext
-
Type: string
-
Used to set the text that appears on the status bar when the user moves the mouse over the element. Mozilla doesn't adjust the status bar automatically however. This attribute serves only as a place to keep the text. In Firefox, this text is automatically placed in the statusbar for menuitems on the menu bar.
-
- - -
- - -
-
style
-
Type: CSS inline style
-
CSS style rules to be applied to the element. Syntax is as in the HTML style attribute. It is preferred to put style rules in style sheets.
-
-
- - -
-
template
-
Type: id
-
For template generated elements, this attribute may optionally be placed on the root node (the element with the datasources attribute) to refer to a template that exists elsewhere in the XUL code. This template attribute should be set to the id of the template element. This might be used to share a single template between multiple trees or menus. If this attribute is not specified, there should be a template element directly inside the node.
-
-
- - -
-
tooltip
-
Type: id
-
Should be set to the value of the id of the tooltip or panel element that should be used as a tooltip window when the mouse hovers over the element for a moment. The tooltip will automatically disappear when the mouse is moved. If this attribute is set to '_child', the first tooltip child element inside the element is used.
-
-
- - -
-
tooltiptext
-
Type: string
-
Used to set the text which appears in the tooltip when the user moves the mouse over the element. This can be used instead of setting the tooltip to a popup for the common case where it contains only text. The tooltip is displayed in a default tooltip which displays only a label, however the default tooltip may be changed by setting the default attribute on a tooltip element.
-
-
- - -
-
top
-
Type: string (representing an integer)
-
For elements placed directly within a stack, specifies the pixel position of the top edge of the element relative to the top edge of the stack.
-
-
- - -
-
uri
-
Type: string
-
For template-generated content, the attribute should be placed on the element where content generation should begin. Thus, it should be placed on an element that is a descendant of a template. The value should be set to rdf:*.
-
- -
-
Elements that appear inside the element with the attribute will be repeated for each node in the RDF datasource. Elements outside will appear only once.
-
-
- - -
-
- wait-cursor
-
- Type: boolean
-
- Set this attribute to true to have the cursor switch to a waiting cursor while the mouse is hovering over the element. Usually, you would only use this on the window element or other top-level elements. In order to revert to the normal cursor state call the method removeAttribute("wait-cursor") when the process effectively has ended otherwise the wait cursor might never disappear.
-
- -
- - -
-
width
-
Type: string (representing an integer)
-
The preferred width of the element. The value should not include a unit as all values are in pixels. The actual displayed width may be different if the element or its contents have a minimum or maximum width, or the size is adjusted by the flexibility or alignment of its parent. The CSS width property may also be used.
-
- - -
diff --git a/files/es/archive/mozilla/xulrunner/componentes/index.html b/files/es/archive/mozilla/xulrunner/componentes/index.html deleted file mode 100644 index 43a9d08d67..0000000000 --- a/files/es/archive/mozilla/xulrunner/componentes/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Componentes -slug: Archive/Mozilla/XULRunner/Componentes -tags: - - Componentes - - Todas_las_Categorías -translation_of: Archive/Mozilla/XULRunner/Components ---- -

 

-

Componentes, Listado alfabético (Incompleto)

- -

categorías

diff --git a/files/es/archive/mozilla/xulrunner/index.html b/files/es/archive/mozilla/xulrunner/index.html deleted file mode 100644 index 74f6b6313a..0000000000 --- a/files/es/archive/mozilla/xulrunner/index.html +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: XULRunner -slug: Archive/Mozilla/XULRunner -tags: - - Todas_las_Categorías - - XUL - - 'XUL:Herramientas' - - XULRunner -translation_of: Archive/Mozilla/XULRunner ---- -
-
- Primeros pasos con XULRunner (en inglés)
- Una pequeña introducción a XULRunner.
-
- XULRunner es un paquete de ejecución de Mozilla que puede ser usado para crear aplicaciones XUL+XPCOM tan valiosas como Firefox y Thunderbird. Ofrecerá mecanismos para instalar, actualizar y desinstalar esas aplicaciones. XULRunner ofrecerá también libxul, una solución que permite la integración de las tecnologías de Mozilla en otros proyectos y productos.
- - - - - - - -
-

Versiones

-
-

XULRunner 20.0 ha sido liberado y puede ser descargado desde ftp.mozilla.org. Por favor leer las notas de versión (en inglés) para instalación, desinstalación, y otras informaciones.

-

Firefox 3 y posteriores son entregados con un paquete propio de XULRunner, el cual puede ejecutar cualquier aplicación compatible de XULRunner usando el interruptor -app.

-

Versiones anteriores (en inglés) que están también disponibles.

-
-

Generalidades

- -

Documentación

-
-
- Primeros pasos con XULRunner (en inglés)
-
- Un pequeño tutorial sobre como construir aplicaciones de escritorio con XULRunner.
-
- Tutorial de XUL
-
- Una vez que tenga trabajando una aplicación XULRunner, use el tutorial XUL para expandir capacidades y convertirla en una fantastica aplicación XUL.
-
- Consejos y trucos para XULRunner (en inglés)
-
- Una colección de consejos y trucos para trabajar con XULRunner.
-
- Implementar de XULRunner (en inglés)
-
- Una introducción de como empaquetar tus aplicaciones con XULRunner.
-
- Salón de la Fama XULRunner (en inglés)
-
- Lista todas las aplicaciones publicadas basadas en XULRunner.
-
- Documentación para la compilación
-
- Aprender como conseguir el código fuente y compilarlo.
-
- Documentación sobre depuración (en inglés)
-
- Pasos para configurar Venkman para depurar la aplicación
-
- Guía de XULRunner (en inglés)
-
- Un material bastante completo, pero desactualizado, introducción y tutorial para XULRunner que reúne gran parte de la documentación se encuentran aquí.
-
-

Ver todo...

-
-

Comunidad

- - - -

Ver también

- -
-
diff --git a/files/es/archive/mozilla/xulrunner/primeros_pasos_con_xulrunner/index.html b/files/es/archive/mozilla/xulrunner/primeros_pasos_con_xulrunner/index.html deleted file mode 100644 index f03a183d27..0000000000 --- a/files/es/archive/mozilla/xulrunner/primeros_pasos_con_xulrunner/index.html +++ /dev/null @@ -1,280 +0,0 @@ ---- -title: Primeros pasos con XULRunner -slug: Archive/Mozilla/XULRunner/Primeros_pasos_con_XULRunner -translation_of: Archive/Mozilla/XULRunner/Getting_started_with_XULRunner ---- -

-

Siguiente »

-

- -

Este artículo explora la plataforma Mozilla mediante la construcción de una aplicación de escritorio básico utilizando XULRunner. Dado que Firefox, Thunderbird y otras múltiples aplicaciones se escriben utilizando la plataforma, es una apuesta segura que se puede utilizar para crear una aplicación básica. Hay un artículo con un enfoque más complicado de construir aplicaciones XULRunner en Creación de aplicaciones XULRunner con el Sistema de Mozilla Build. Si necesita cambiar la propia XULRunner o integrarlo con código binario externo puede que tenga que leer este artículo.

- -

Paso 1: Descargar XULRunner

- -

Usted puede encontrar un enlace de descarga en la página principal XULRunner aquí en MDC. Dado que no estamos creando ningún componente XPCOM binarios, sólo tenemos que descargar e instalar el paquete de tiempo de ejecución XULRunner, no el SDK.

- -

La descarga de XULRunner para Windows es un archivo .zip, no un archivo ejecutable. Como desarrollador, me gusta la idea de que XULRunner sólo necesita ser descomprimido en mi máquina. Supongo que no es necesario conectar a mi sistema de Windows y eso es una buena cosa. También significa que el XULRunner es portátil, así que si usted desarrolla sus aplicaciones para ser portátil se puede llevar a todas partes en una unidad flash o sincronizarlos en la nube.

- -

La versión para Mac de XULRunner se distribuye como un archivo tar.bz2. Puede extraer este a cualquier lugar que quieras, pero hay muchos lugares en la documentación que se supone que tiene esta instalado en /Library/Frameworks.

- -

En el escritorio de Ubuntu y sus derivados (Xubuntu, Kubuntu, ...), a partir de la versión 11.10 (Ocelot onírico), XULRunner no está más cuidada y no existe en el repositorio de Ubuntu. Por lo tanto, ya sea que usted necesita para compilar XULRunner manual o descargar una versión binaria del servidor FTP de Mozilla. Una forma de archieve esto es ejecutar la siguiente secuencia de comandos cada vez que se desea instalar una nueva versión:

- -
FIREFOX_VERSION=`grep -Po  "\d{2}\.\d+" /usr/lib/firefox/platform.ini`
-ARCH=`uname -p`
-XURL=https://ftp.mozilla.org/pub/mozilla.org/xulrunner/releases/$FIREFOX_VERSION/runtimes/xulrunner-$FIREFOX_VERSION.en-US.linux-$ARCH.tar.bz2
-cd /opt
-sudo sh -c "wget -O- $XURL | tar -xj"
-sudo ln -s /opt/xulrunner/xulrunner /usr/bin/xulrunner
-sudo ln -s /opt/xulrunner/xpcshell /usr/bin/xpcshell
- -

You could also save this script to a file for convenience.  Note: If you are using Firefox build from Ubuntuzilla repository, replace /usr/lib/firefox/platform.ini with /opt/firefox/platform.ini.

- -

Step 2: Install XULRunner

- -

On Windows, unzip the archive someplace reasonable. I unzipped it to a new C:\program files\xulrunner folder.

- -

On the Mac, extract the tar.bz2 archive, which contains XULRunner as XUL.Framework.  Copy this to the /Library/Frameworks directory, or another location of your choice.

- -

On Linux, you only need to unpack the archive if you are using a pre-release XULRunner.

- -
-

Optionally, if you've downloaded the compressed archive of XULRunner and would like to install it on your system you can do so by running

- -

xulrunner --register-global

- -

as an administrator to register XULRunner for all users on the machine. To register XULRunner for a single user run

- -

xulrunner --register-user

- -

XULRunner will work whether you install it or not. This is purely for convenience.

-
- -
-

In all systems you should unzip the omni.ja file into some example directory and take a look at all the awesome! First change the file extension to zip and then use your normal filesystem's decompression tool to open it up. The contents of omni.ja are available to XULRunner applications and are what make it possible to build amazing applications easily!

-
- -

Step 3: Create the application folder structure

- -

Time to start a simple, bare bones application shell. Call it a XUL “Hello World” if you want. All of what you see below can be found in the XULRunner documentation here on MDC in much more detail.

- -
-

Hint: Skip ahead and download the sample application, you can experiment with it while following this tutorial. You can download the sample application from https://github.com/matthewkastor/XULRunner-Examples. Please continue reading to learn the "what", "why" and "how" parts of building a XULRunner application.

-
- -

On Windows, I created the root in a new c:\program files\myapp folder, but you can create it wherever you like, using whatever OS you like. The same application structure is used on Windows, Mac and Linux. Here is the subfolder structure:

- -
+ myapp/
-|
-+-+ chrome/
-| |
-| +-+ content/
-| | |
-| | +-- main.xul
-| | |
-| | +-- main.js
-| |
-| +-- chrome.manifest
-|
-+-+ defaults/
-| |
-| +-+ preferences/
-|   |
-|   +-- prefs.js
-|
-+-- application.ini
-|
-+-- chrome.manifest
-
- -

Notice that there are 5 files in the folder structure: application.ini, chrome.manifest (2), prefs.js, and main.xul. The /chrome/chrome.manifest file is optional, but might be useful for backward compatibility. See the note below.

- -
-

For more details on the structure of installable bundles in general see: Structure of an installable bundle.

-
- -
Note: In XULRunner 2.0, the chrome.manifest is now used to register XPCOM components in addition to its previous uses. Part of this change means the /chrome/chrome.manifest is no longer considered the "root" manifest. XULRunner will not check that folder location for a root-level chrome.manifest. You need to move your existing chrome.manifest to the application root folder, remembering to update the relative paths within the file. You could also just create a new application root-level manifest that includes the /chrome/chrome.manifest, which is what this tutorial will do.
- -

Step 4: Set up application.ini

- -

The application.ini file acts as the XULRunner entry point for your application. It specifies how your application intends to use the XULRunner platform as well as configure some information that XULRunner uses to run your application. Here is mine:

- -
[App]
-Vendor=XULTest
-Name=myapp
-Version=1.0
-BuildID=20100901
-ID=xulapp@xultest.org
-
-[Gecko]
-MinVersion=1.8
-MaxVersion=200.*
-
- -
Note: The MinVersion and MaxVersion fields indicate the range of Gecko versions your application is compatible with; make sure that you set them so that the version of XULRunner you're using is in that range, or your application won't work.
- -
Note: Make sure your application name is lowercase and longer than 3 characters
- -

Step 5: Set up the chrome manifest

- -

The chrome manifest file is used by XULRunner to define specific URIs which in turn are used to locate application resources. This will become clearer when we see how the “chrome://” URI is used. Application chrome can be in a single or a few JAR files or uncompressed as folders and files. I am using the uncompressed method for now. Here is the chrome/chrome.manifest:

- -
 content myapp content/
-
- -

As mentioned in Step 3, the default location of the chrome.manifest has changed in XULRunner 2.0, so we also need a simple chrome.manifest in the application root which will include the the manifest in our chrome root. Here is the application root chrome.manifest:

- -
manifest chrome/chrome.manifest
- -

Step 6: Set up preferences

- -

The prefs.js file tells XULRunner the name of the XUL file to use as the main window. Here is mine:

- -
pref("toolkit.defaultChromeURI", "chrome://myapp/content/main.xul");
-
-/* debugging prefs, disable these before you deploy your application! */
-pref("browser.dom.window.dump.enabled", true);
-pref("javascript.options.showInConsole", true);
-pref("javascript.options.strict", true);
-pref("nglayout.debug.disable_xul_cache", true);
-pref("nglayout.debug.disable_xul_fastload", true);
-
- -

XULRunner specific preferences include:

- -
-
toolkit.defaultChromeURI
-
Specifies the default window to open when the application is launched.
-
toolkit.defaultChromeFeatures
-
Specifies the features passed to window.open() when the main application window is opened.
-
toolkit.singletonWindowType
-
Allows configuring the application to allow only one instance at a time.
-
- -
-

The toolkit preferences are described in further detail in XULRunner:Specifying Startup Chrome Window.

- -

The debugging preferences are discussed in Debugging a XULRunner Application

-
- -

Step 7: Create some XUL

- -

Finally, we need to create a simple XUL window, which is described in the file main.xul. Nothing fancy here, just the minimum we need to make a window. No menus or anything.

- -

main.xul:

- -
<?xml version="1.0"?>
-
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<window id="main" title="My App" width="300" height="300" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript" src="chrome://myapp/content/main.js"/>
-
-  <caption label="Hello World"/>
-  <separator/>
-  <button label="More >>" oncommand="showMore();"/>
-  <separator/>
-  <description id="more-text" hidden="true">This is a simple XULRunner application. XUL is simple to use and quite powerful and can even be used on mobile devices.</description>
-
-</window>
-
- -
Note: Make sure there is no extra whitespace at the beginning of the XML/XUL file
- -

The application also has a JavaScript file. Most XUL applications will include some external JavaScript, so the sample application does too, just to show how to include it into the XUL file.

- -

main.js:

- -
function showMore() {
-  document.getElementById("more-text").hidden = false;
-}
-
- -
-

For more information about XUL see: XUL.

- -

For information about mixing HTML elements into your XUL read Adding HTML Elements.

-
- -

Step 8: Run the application

- -

The moment of truth. We need to get XULRunner to launch the bare-bones application.

- -

Windows

- -

From a Windows command prompt opened to the myapp folder, we should be able to execute this:

- -
 C:\path\to\xulrunner.exe application.ini
-
- -

Of course, if you opted to install xulrunner then you could simply do

- -
%ProgramFiles%\xulrunner.exe application.ini
- -

or on 64 bit systems

- -
%ProgramFiles(x86)%\xulrunner.exe application.ini
- -
-

Note: you can also install your application when you're finished debugging it. See XUL Application Packaging for details.

-
- -

Mac

- -

On the Mac, before you can run a XULRunner application with everything intact, you must install it using the --install-app xulrunner commandline flag. Installing the application creates an OS X application bundle:

- -
 /Library/Frameworks/XUL.framework/xulrunner-bin --install-app /<path>/<to>/myapp.zip
-
- -

Once installed, you can run the application:

- -
 /Library/Frameworks/XUL.framework/xulrunner-bin "/Applications/Finkle/TestApp.app/Contents/Resources/application.ini"
-
- -

You may run it without installing (but with the menu bar and dock icon missing) in OS X by typing:

- -
/Library/Frameworks/XUL.framework/xulrunner-bin "/<full path>/TestApp/application.ini"
-
- -
-

Note: The full path is required or a "Error: couldn't parse application.ini."-message will be returned.

-
- -

This might also be simplified using a very simple shell script (i call mine "run.sh"):

- -
#!/bin/sh
-/Library/Frameworks/XUL.framework/xulrunner-bin `pwd`/application.ini
-
- -

Linux

- -

On Ubuntu, you can run the application from a terminal. First change into the \myapp folder, then start the application by:

- -
 xulrunner application.ini
-
- -

You should now see a window that looks something like this. This particular screenshot is from Ubuntu 10.

- -

myapp-screenshot.png

- -

Alternative: Run XUL apps with Firefox

- -

With Firefox 3 and later, you can tell the Firefox executable to run a XUL application from the command line. The XUL application will run instead of the Firefox browser that normally starts. This is similar to starting a XUL app using XULRunner. See Using Firefox to run XULRunner applications. This does not work if Firefox itself was installed as a XUL app - you need to use the installed XULRunner directly.

- -

Further Reading:

- -

There are many things you can do with XULRunner. Before you get too far into things you might want to read the XULRunner tips article. Also, throughout this tutorial you've been introduced to various bits of the Toolkit API and it may help you to get familiar with it. Once you've got an application that's ready for the world you'll love our article titled Deploying XULRunner.

- -

For now, click the "next" link to learn about windows and menus in XULRunner!

- -

-

Siguiente »

-

- -
-

Original Document Information

- - -
diff --git a/files/es/archive/rss/index.html b/files/es/archive/rss/index.html deleted file mode 100644 index 9c9e5988eb..0000000000 --- a/files/es/archive/rss/index.html +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: RSS -slug: Archive/RSS -tags: - - RSS - - Todas_las_Categorías -translation_of: Archive/RSS ---- -

-

-
RSS:Primeros pasos
-Tutorial guiado que te ayudará en tu iniciación a RSS.
-

Sindicación Realmente Simple (RSS) es un formato de datos basado en el lenguaje XML creado para la sindicación de contenidos. RSS tiene una escabrosa historia con multitud de diferentes versiones incompatibles, algunas basadas en RDF, pero la mayoría basadas solamente en XML. A pesar de esto, RSS es un formato altamente popular, se usa para la distribución de noticias, artículos de blogs, radio y televisión por internet, con una increíble velocidad. -

-
-

Documentación

-
Guía fácil del RSS -
Una guía que da respuesta a las preguntas básicas: qué, cómo, para qué. -
-
Las Versiones de RSS -
Es tal la diversidad que resulta fácil liarse, diferentes grupos han creado especificaciones de forma unilateral que han llamado RSS. Intentaremos poner un poco de orden. -
-
Añadir lectores de canales a Firefox -
Firefox puede seleccionar diferentes lectores de RSS o canales Atom. Este artículo provee información acerca de como añadir soporte para lectores adicionales no soportados por defecto. -
-
API de acceso a canales -
Firefox 2 y Thunderbird 2 introducen una serie de interfaces que la hacen más sencillo que los autores de extensiones accedan a los canales RSS y Atom. -
-
RSS 2.0 Specification (en) -
This is version 2.0.8 of the RSS 2.0 specification, published by the RSS Advisory Board on Aug. 12, 2006. -
-

Ver más

-
-

Comunidad

-
  • Foros sobre XML en la comunidad Mozilla en inglés -
-

-

Ver más

-

Herramientas

- -

Ver más

-

Temas relacionados

-
RDF, XML -
-
-

Categorías -

Interwiki Language Links -


-

diff --git a/files/es/archive/rss/primeros_pasos/index.html b/files/es/archive/rss/primeros_pasos/index.html deleted file mode 100644 index 17441f6534..0000000000 --- a/files/es/archive/rss/primeros_pasos/index.html +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Primeros pasos -slug: Archive/RSS/Primeros_pasos -tags: - - RSS - - 'RSS:Primeros_pasos' - - Todas_las_Categorías -translation_of: Archive/RSS/Getting_Started ---- -

-

-

Introducción

-

Este tutorial es una introducción a la Sindicación Realmente simple (RSS). -

Le guiará, paso a paso por los fundamentos de RSS y le mostrará ejemplos funcionales. Este tutorial sigue el mantra que dice: el mejor modo de aprender es hacer. Por ello, usted creará sus propios archivos RSS a mano. -

-

¿Quién debería usar este tutorial?

-

En principio, este tutorial está destinado a los principiantes en RSS (es decir, aquellos con poca o ninguna experiencia previa en RSS). Sin embargo, los experimentados en RSS también pueden encontrarlo útil como guia de refresco. -

Este tutorial asume que usted tiene un mínimo de experiencia con HTML (o XML) y que usted conoce los fundamentos del marcado. En otras palabras, que un código como este no le asusta: -

-
  <p>Esto es un párrafo marcado con etiquetas</p>
-
-

Si usted entiende esto, no debería tener ningún problema aprendiendo RSS. -

-
-

NOTA: Si usted no es un desarrollador web y ni quiere serlo, entonces este tutorial no es para usted. Usted tiene que estár cómodo escribiendo código para poder usar con eficacia este tutorial. -

-
-

¿Qué necesita usted antes de empezar?

-

Para aprobechar al máximo este tutorial, usted necesitará un editor de textos y un lector RSS. Además, usted también necesitaría saber usarlos. -

-
-

NOTE: A word processor is not a text editor. If a word processor is used, you MUST make sure to save your RSS files in a (pure and plain) text format. -

-
-

Usted no está obligado a crear archivos RSS siguiendo este tutorial (usted puede leerlo sin más), pero este sería un método de aprendizaje poco eficaz. Entenderá las cosas y retendrá la información mucho mejor si crea los archivos RSS usted mismo. -


-

-

¿Cómo usar este manual?

-

Aunque cada página de este tutorial ha sido escrita de modo que pueda actuar como un tutorial independiente, cuando usted lee una página se asume que ya posee los conocimientos esplicados en las páginas anteriores. Usted puede consultar cualquier punto del tutorial cuando desee, pero sugerimos a los principiantes en RSS que lean este tutorial de manera ordenada. -

-

Tutorial

-
  1. ¿Qué es RSS? -
  2. ¿Por qué usar RSS? -
  3. ¿Cómo funciona RSS? -
  4. Hola mundo -
  5. Sindicación -
  6. Blogs -
  7. Broadcatching -
  8. Microformatos -
  9. Broadcatching avanzado -
-
-
diff --git a/files/es/archive/rss/versiones/index.html b/files/es/archive/rss/versiones/index.html deleted file mode 100644 index 5b3af37cf7..0000000000 --- a/files/es/archive/rss/versiones/index.html +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Versiones -slug: Archive/RSS/Versiones -tags: - - RSS -translation_of: Archive/RSS/Version ---- -

Versiones de RSS

- -

La historia de RSS ha sido agitada. Personas y grupos dispares han ido creado, prácticamente de modo independiente, especificaciones a las que llamaron RSS. Algunos formatos de RSS están basados en XML y otros lo están en RDF.

- -

La lista mostrada a continuación muestra todas las versiones de RSS conocidas. Están listadas cronológicamente según su fecha de publicación.

- -
-

NOTA: En la siguiente lista, aunque parezca que RSS 1.0 está fuera de lugar, cronológicamente está en el puesto que le corresponde.

-
- -
-

NOTA: Hay 3 versiones diferentes de RSS 0.91: RSS 0.91 (Revisión 1) de Netscape, RSS 0.91 (Revisión 3) de Netscape y RSS 0.91 de Userland. Estrictamente hablando, la versión de Userland RSS 0.91 es un subconjunto de la versión de Netscape RSS 0.91.

-
- -
-

NOTA: RSS 0.93 y RSS 0.94 sólo se publicaron como borrador (draft) y nunca vieron su versión final, aunque esto no significa que no se utilicen.

-
- -

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NombreEstadoFecha de publicaciónBasado enAutor
RSS 0.90 Marzo de 1999RDFNetscape
Netscape's RSS 0.91 (Revision 1) ?XMLNetscape
Netscape's RSS 0.91 Revision 3 10 de Julio de 1999XMLNetscape
Userland's RSS 0.91 4 de Junio de 2000XMLUserland
RSS 1.0Estándar9 de Diciembre de 2000RDFRSS-DEV Working Group
RSS 0.92 25 de Diciembre de 2000XMLUserland
RSS 0.93 20 de Abril de 2001XMLUserland
RSS 0.94 19 de Agosto de 2002XMLUserland
RSS 2.0 Septiembre de 2002XMLUserland
RSS 2.0 (post 2002-11-11) 11 de Noviembre de 2002XMLUserland
RSS 2.0 (post 2003-01-21)Estándar21 de Enero de 2003XMLUserland
diff --git "a/files/es/archive/security/encriptaci\303\263n_y_desencriptaci\303\263n/index.html" "b/files/es/archive/security/encriptaci\303\263n_y_desencriptaci\303\263n/index.html" deleted file mode 100644 index 960149aca3..0000000000 --- "a/files/es/archive/security/encriptaci\303\263n_y_desencriptaci\303\263n/index.html" +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Encriptación y Desencriptación -slug: Archive/Security/Encriptación_y_Desencriptación -tags: - - Seguridad - - Tutorial -translation_of: Archive/Security/Encryption_and_Decryption ---- -

La encriptación es el proceso de transformar información para hacerla ilegible a cualquiera excepto al receptor del mensaje. La desencriptación es el proceso de transformar información encriptada para que sea legible de nuevo. Un algoritmo criptográfico es una función matemática usada for encriptar o desencriptar. En la mayoría de los casos se utilizan dos funciones relacionadas, una para encriptar y otra para desencriptar.

- -

En la criptografía moderna, la habilidad para mantener secreta la información encriptada no está basada en el algoritmo criptográfico, si no que es ampliamente conocido, sino en un número llamado clave que debe ser usado con el algoritmo para producir un reultado encriptado o para desencriptar información previamente encriptada. La desencriptación con la clave correcta es sencilla. La desencriptación sin la clave correcta es muy compleja, y en algunos casos imposible para cualquier caso práctico.

- -

Las siguientes secciones introducen el uso de claves para encriptar y desencriptar.

- - - -

Encriptación de clave simétrica

- -

Con la encriptación de clave simétrica, la clave de encriptación puede ser calculada a partir de la clave de desencriptación y viceversa. En la mayoría de los algoritmos simétricos, se utiliza la misma clave para encriptar y para desencriptar, como se muestra en la Figura 1.

- -

Figure 1. Symmetric-Key Encryption

- -

Las implementaciones de la encriptación de clave simétrica pueden ser muy eficientes, con el fin de que los usuarios no tengan que esperar como resultado de una encriptación o una desencriptación. La encriptación de clave simétrica también provee cierto grado de autenticación, ya que la información encriptada no puede ser desencriptada con ninguna otra clave simétrica. Así, mientras que la clave simétrica se mantiene secreta entre las dos partes usándola para encriptar comunicaciones, cada parte puede estar segura que se está comunicando con la otra mientras que los mensajes desencriptados tengan sentido.

- -

La encriptación de clave simétrica sólo es efectiva si la clave simétrica se mantiene en secreto por ambas partes. Si cualquier otro descubre la clave, afecta tanto a la confidencialidad como a la autenticación. Una persona con una clave simétrica no autorizada puede no sólo desencriptar mensajes enviados con esa clave, sino que además puede encriptar nuevos mensajes y enviarlos como si viniese de una de las dos partes que orginalmente sabían la clave.

- -

La encriptación de clave simétrica juega un papel importante en el protocolo SSL, que es muy usado en autenticación y en encriptación sobre redes TCP/IP. SSL también usa técnicas de encriptación de clave pública, descrita en la siguiente sección.

- -

Encriptación de clave pública

- -

Las implementaciones más usadas de encriptación de clave pública están basadas en algoritmos patentados por Seguridad de datos RSA. Por lo tanto, esta sección describe el enfoque de RSA a la encriptación de clave pública.

- -

La encriptación de clave pública (también llamada encriptación asimétrica) involucra un par de claves --una clave pública y una clave privada-- asociadas a una entidad que necesita autenticar su identidad electrónicamente o firmar información encriptada. Cada clave pública es publicada, y la correspondiente clave privada se mantiene secreta. La información encriptada con la clave pública sólo puede ser desencriptada con la clave privada. La Figura 2 muestra un esquema simplificado de cómo funciona una encriptación de clave pública.

- -

Figure 2. Public-Key Encryption

- -

El esquema mostrado en la Figura 2 permite distribuir libremente una clave pública, y sólo tú serás capaz de leer información encriptada usando esta clave. En general, para enviar informació encriptada a alguien, encriptas la información con la clave pública de esa persona, y la persona que recibe la información encriptada la desencripta utilizando su correspondiente clave privada.

- -

Comparada con la encriptación de clave simétrica, la encriptación de clave pública requiere más tiempo de cómputo y por lo tanto no es apropiada para   grandes cantidades de datos. Sin embargo, es posible usar encriptación de clave pública para enviar una clave simétrica, que puede entonces ser usada para encriptar información adicional. Este el el enfoque utilizado por el protocolo SSL.

- -

Como es lógico, el inverso del esquema mostrado en la Figura 2 también funciona: la información encriptada con tu clave privada puede ser desecnriptada sólo con tu clave pública. Sin embargo, esta no sería una forma deseable de encriptar datos confidenciales, ya que significa que cualquier persona con tu clave pública, que por definición está publicada, podría descifrar los datos. A pesar de esto, la encriptación de clave privada es útil, porque significa que puedes usar tu clave privada para firmar datos con tu firma digital --un requisito importante para el comercio electrónico y otras aplicación comerciales de criptografía--. Clientes como Firefox pueden entonces usar tu clave pública para confirmar que el mensaje fue firmado con tu clave priivada y que no ha sido manipulado desde que se firmó. Las "Firmas Digitales" describen como funciona este proceso de confirmación.

- -

Longitud de la clave y resistencia del cifrado

- -

Romper un algoritmo de encriptación consiste básicamente en encontrar la clave para acceder a la información encriptada en texto plano. Para los algoritmos simétricos, romper el algoritmo normalmente significa intentar determinar la clave usada para encriptar el texto. Para un algoritmo de clave pública, romper el algoritmo normalmente significa obtener la información secreta compartida entre las dos partes.

- -

Un método para romper un algoritmo de clave simétrica es simplemente probar cada clave hasta que se encuentre la clave correcta.Para algoritmos de clave pública, ya que la mitad del par de claves es conocida públicamente, la otra mitad (clave privada) puede ser derivada utilizando la publicada a partir de complejos cálculos matemáticos. Encontrar la clave manualmente para romper un algoritmo se denomina ataque de fuerza bruta.

- -

Romper un algoritmo introduce el riesgo de interceptar, o incluso hacerse pasar por otra persona y ver fraudulentamente información privada.

- -

La fuerza de un algoritmo es determinada encontrando el método más rápido para romperlo y comparándolo con un ataque de fuerza bruta.

- -

Para claves simétricas, la fuerza de la encriptación es a menudo descrita en función del tamaño o longitud de las claves usadas para realizar la encriptación: en general, las claves más largas proporcionan una encriptación más fuerte. La longitud de la clave se mide en bits. Por ejemplo, las claves de 128 bits usadas con la clave simétrica de RC4 soportadas por SSL brindan una protección criptográfica significativamente mejor que las claves de 40 bits utilizadas con el mismo algoritmo. La encriptación RC4 de 128 bits es aproximadamente 3 x  102610^26veces más fuerte que la encriptación RC4 de 40 bits.2610^26

- -

Algoritmos criptográficos diferentes pueden requerir claves de diferente longitud para lograr la misma fuerza de encriptación. El algoritmo RSA usado para encriptación de clave pública, por ejemplo, puede únicamente utilizar un subconjunto de todos los posibles valores para una clave de una longitud específica, debido a la naturaleza del problema matemático en el que está basado. Otros algoritmos, como los usados para encriptación dde clave simétrica, puede utilizar todos los posibles valores para una clave de una longitud específica, en lugar de un subconjunto.

- -

Ya que es relativamente trivial romper un algoritmo RSA, un algoritmo de encriptación de clave pública RSA debe tener una clave muy larga, al menos de 1024 bits, para ser considerada criptográficamente fuerte. Por otro lado, los algoritmos de clave simétrica pueden lograr aproximadamente el mismo nivel de fuerza con una clave de 80 bits para la mayoría de los algoritmos.

- -

 

- -
-

Información del documento original

- - -
- -

 

- -

 

diff --git a/files/es/archive/security/index.html b/files/es/archive/security/index.html deleted file mode 100644 index 82879db250..0000000000 --- a/files/es/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/es/archive/themes/create_your_own_firefox_background_theme/index.html b/files/es/archive/themes/create_your_own_firefox_background_theme/index.html deleted file mode 100644 index 9f99e57df7..0000000000 --- a/files/es/archive/themes/create_your_own_firefox_background_theme/index.html +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Crea tu propio Tema de Fondo para Firefox -slug: Archive/Themes/Create_Your_Own_Firefox_Background_Theme -translation_of: Archive/Themes/Create_Your_Own_Firefox_Background_Theme ---- -

Como crear tu propio Tema de Fondo

- -
-

Los temas están basados en una imagen "encabezado", la cual adorna el fondo de la Interfaz Gráfica de Firefox.

- -

Acabaste tu diseño? Puedes Enviarlo ahora mismo!

- -

Creando una imagen de Encabezado para el Tema

- -

La imagen de encabezadp es mostrada como el fondo del título de la ventana de Firefox, anidándose tras las barras de herramientas, barra de direcciones, barra de búsqueda y la barra de pestañas. Será anclada a la esquina superior derecha de la ventana del explorador.

- -

- - - -

Requerimientos de la imagen

- - - -

Trucos

- - - -

Online Image Editor Resources

- - - - - -

In older versions of Firefox, or newer versions with certain add-ons installed, the footer image is displayed as the background of the bottom of the browser window, behind the add-on and find bars. It will be anchored to the bottom-left corner of the browser window. Footer images are optional.

- -

- - - -

Image Requirements

- - - -

Tips

- - - -

Submitting your Theme Images

- -

To get started submitting your images, go to the Theme Submission page:

- -
    -
  1. Name your theme — pick a unique name for your theme. Duplicate names are not allowed, so you may need to try a few times to find a unique name.
  2. -
  3. Pick a category and tags — select a category and enter some tags that best describe your theme. Keep in mind that a reviewer may reject your theme if it is obvious that your category and/or tags are unrelated to your theme.
  4. -
  5. Describe your theme — write a short description of your theme. Keep in mind that a reviewer may reject your theme if your description is not an accurate representation of your theme.
  6. -
  7. Select a license for your theme — decide on a copyright license for your work. Read more about the types of Creative Common licenses. -
      -
    • Important: Please be sure you have the rights to use the image in your theme!
    • -
    -
  8. -
  9. Upload your images — make sure they are under 300 KB in size and JPG or PNG format!
  10. -
  11. Select text and tab colors — you can choose the tab ("background") color and foreground text color that work best with your header image.
  12. -
  13. Preview your theme — you're ready to preview your theme! Simply mouse over the image above the Submit Theme button, and see how it looks instantly.
  14. -
  15. Submit your theme — if everything looks right, click the Submit Theme button, and you're done! You can see all the themes you've authored on your profile page. -
      -
    • Tip: to ensure that your theme is approved for the gallery, be sure it complies with the content guidelines and terms of service!
    • -
    -
  16. -
- -

- -

Submit Your Theme Now

- -

More Tutorials

- -

Mozilla Themes Focal Point on Sizing - A tutorial on theming with a focus on sizing, by VanillaOrchids.

-
diff --git a/files/es/archive/themes/index.html b/files/es/archive/themes/index.html deleted file mode 100644 index aff151946d..0000000000 --- a/files/es/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.

- -

diff --git a/files/es/archive/tutoriales-para-principiantes/index.html b/files/es/archive/tutoriales-para-principiantes/index.html deleted file mode 100644 index 45477336ba..0000000000 --- a/files/es/archive/tutoriales-para-principiantes/index.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Tutoriales para principiantes -slug: Archive/Tutoriales-para-principiantes -translation_of: Archive/Beginner_tutorials ---- -

Esta página incluye tutoriales archivados para principiantes, de diferentes sitios alrededor de MDN.

- -

diff --git a/files/es/archive/web/index.html b/files/es/archive/web/index.html deleted file mode 100644 index 8ca15839ca..0000000000 --- a/files/es/archive/web/index.html +++ /dev/null @@ -1,12 +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.

-

E4X
ECMAScript for XML (E4X) es una extensión del lenguaje de programación que añade la implementación de XML nativo a JavaScript. Esto proporciona el acceso al documento de XML de manera que sea natural para los programadores de ECMAScript. El objetivo es proporcionar una alternativa, una sintaxis más simple para tener acceso a documentos XML a través de las interfaces DOM.
LiveConnect

diff --git a/files/es/archive/web/javascript/index.html b/files/es/archive/web/javascript/index.html deleted file mode 100644 index 4687b7bf23..0000000000 --- a/files/es/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/es/archive/web/javascript/legacy_generator_function_statement/index.html b/files/es/archive/web/javascript/legacy_generator_function_statement/index.html deleted file mode 100644 index 75efe9f447..0000000000 --- a/files/es/archive/web/javascript/legacy_generator_function_statement/index.html +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: Función generadora de legado -slug: Archive/Web/JavaScript/Legacy_generator_function_statement -tags: - - Iterador Legado - - JavaScript - - Referencia -translation_of: Archive/Web/JavaScript/Legacy_generator_function_statement ---- -
La función generadora de legado es una característica específica de SpiderMonkey, y será eliminida en Firefox 58+. Para futuros usos, considera usar {{jsxref("Statements/function*", "function*")}}.
- -
{{jsSidebar("Statements")}}
- -

La sentencia de función generadora de legado declara funciones generadoras con unos parámetros específicos.

- -

También se pueden definir funciones usando el constructor {{jsxref("Function")}} con functionBody y al menos una expresión {{jsxref("Operadores/yield", "yield")}}, y una función {{jsxref("Operators/Legacy_generator_function", "legacy generator function expression", "", 1)}}.

- -

Sintaxis

- -
function nombre([parámetro,[, parámetro,[..., parámetro]]]) {
-   [sentencias]
-}
-
- -
-
nombre
-
Nombre de la función.
-
- -
-
parámetro
-
El nombre de un argumento pasado a la función. Una función puede tener hasta 255 argumentos.
-
- -
-
sentencias
-
Las sentencias que componen el cuerpo de la función. Debe contener al menos una expresion {{jsxref("Operadores/yield", "yield")}}.
-
- -

Descripción

- -

Una introducción de su uso está disponible en la página de Iteradores y Generadores.

- -

Compatibilidad de navegadores

- -

Supported nowhere.

- -

Vea también

- - diff --git a/files/es/archive/web/javascript/proximo_soporte_de_ecmascript_en_mozilla/index.html b/files/es/archive/web/javascript/proximo_soporte_de_ecmascript_en_mozilla/index.html deleted file mode 100644 index 763fb63dfa..0000000000 --- a/files/es/archive/web/javascript/proximo_soporte_de_ecmascript_en_mozilla/index.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Próximo soporte de ECMAScript en Mozilla -slug: Archive/Web/JavaScript/Proximo_soporte_de_ECMAScript_en_Mozilla -tags: - - ECMAScript - - JavaScript -translation_of: Archive/Web/JavaScript/ECMAScript_Next_support_in_Mozilla ---- -
{{jsSidebar("New_in_JS")}}
- -

Próximo ECMAScript hace referencia a las nuevas características del estándar ECMA-262 (comúnmente llamado JavaScript) introducido después de ECMAScript 2015. Las nuevas versiones de las especificaciones de ECMAScript serán liberadas anualmente. Este año, la especificación ES2016 será liberada y ES2017 es la actual especificación en borrador.

- -

Puedes ver la última propuesta en el repositorio de GitHub tc39/ecma262.

- -

Un canal de retroalimentación para los estándares de ECMAScript es es-discuss.

- -

ECMAScript 2016

- -

Estas características de ES2016 están implementadas:

- - - -

ECMAScript 2017

- -

Estas características de ES2017 están implementadas:

- - - -

Nuevas características experimentales

- -

Las siguientes características ya están implementadas, pero sólo disponibles en el Canal Firefox Nightly y aún no incluidas en la edición de borrador de alguna especificación ECMAScript.

- -

Adiciones al objeto ArrayBuffer

- - - -

Nuevos objetos TypedObject

- - - -

Nuevos objetos SIMD

- - - -

Nuevos objetos de Memoria Compartida

- - - -

Ver también

- - diff --git a/files/es/archive/web/liveconnect/index.html b/files/es/archive/web/liveconnect/index.html deleted file mode 100644 index 328b6d2678..0000000000 --- a/files/es/archive/web/liveconnect/index.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: LiveConnect -slug: Archive/Web/LiveConnect -tags: - - AJAX - - Guía_de_JavaScript_1.5 - - JavaScript - - Referencia_de_JavaScript_1.5 - - Todas_las_Categorías -translation_of: Archive/Web/LiveConnect/LiveConnect_Reference ---- -

-

This section documents the Java classes used for LiveConnect, along with their constructors and methods. These classes allow a Java object to access JavaScript code. -

JSException -

-
The public class JSException extends RuntimeException, and is thrown when JavaScript returns an error. -
-

JSObject -

-
The public class JSObject extends Object. JavaScript objects are wrapped in an instance of the class JSObject and passed to Java, allowing Java to manipulate JavaScript objects. -
-
-
diff --git a/files/es/archive/web/liveconnect/java/index.html b/files/es/archive/web/liveconnect/java/index.html deleted file mode 100644 index 46df56223d..0000000000 --- a/files/es/archive/web/liveconnect/java/index.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: java -slug: Archive/Web/LiveConnect/java -translation_of: Archive/Web/LiveConnect_Reference/java ---- -

Resumen

-

Objeto Global

-

Un objeto de alto nivel utilizado para acceder a cualquier clase Java del paquete java.*.

-

Creado por

-

El objeto java es un objeto Javascript predefinido de alto nivel. Puedes acceder a él de forma automática sin utilizar un constructor o sin llamar a un método.

-

Descripción

-

El objeto java es un buen sinónimo de la propiedad Packages.java.

-

Ver también

-

Paquetes, Packages.java

-

diff --git a/files/es/archive/web/liveconnect/javaarray/index.html b/files/es/archive/web/liveconnect/javaarray/index.html deleted file mode 100644 index 1ec785bfc5..0000000000 --- a/files/es/archive/web/liveconnect/javaarray/index.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: JavaArray -slug: Archive/Web/LiveConnect/JavaArray -translation_of: Archive/Web/LiveConnect_Reference/JavaArray ---- -

-

-

Summary

-

Core Object -

A wrapped Java array accessed from within JavaScript code is a member of the type JavaArray. -

-

Created by

-

Any Java method which returns an array. In addition, you can create a JavaArray with an arbitrary data type using the newInstance method of the Array class: -

-
public static Object newInstance(Class componentType,
-   int length)
-   throws NegativeArraySizeException
-
-

Description

-

The JavaArray object is an instance of a Java array that is created in or passed to JavaScript. JavaArray is a wrapper for the instance; all references to the array instance are made through the JavaArray. -

In JavaScript 1.4 and later, the componentType parameter is either a JavaClass object representing the type of the array or class object, such as one returned by java.lang.Class.forName. In JavaScript 1.3 and earlier, componentType must be a class object. -

Use zero-based indexes to access the elements in a JavaArray object, just as you do to access elements in an array in Java. For example: -

-
var javaString = new java.lang.String("Hello world!");
-var byteArray = javaString.getBytes();
-byteArray[0] // returns 72
-byteArray[1] // returns 101
-
-

Any Java data brought into JavaScript is converted to JavaScript data types. When the JavaArray is passed back to Java, the array is unwrapped and can be used by Java code. See the Core JavaScript 1.5 Guide for more information about data type conversions. -

In JavaScript 1.4 and later, the methods of java.lang.Object are inherited by JavaArray. -

-

Backward compatibility

-

JavaScript 1.3 and earlier

-

The methods of java.lang.Object are not inherited by JavaArray. In addition, the toString method is inherited from the Object object and returns the following value: -

-
[object JavaArray]
-
-

You must specify a class object, such as one returned by java.lang.Object.forName, for the componentType parameter of newInstance when you use this method to create an array. You cannot use a JavaClass object for the componentType parameter. -

-

Properties

-

length: The number of elements in the Java array represented by JavaArray. -

-

Methods

-

toString: In JavaScript 1.4, this method is overridden by the inherited method java.lang.Object.toString. in JavaScript 1.3 and earlier, this method returns a string identifying the object as a JavaArray. -

In JavaScript 1.4 and later, JavaArray also inherits methods from the Java array superclass, java.lang.Object. -

-

Examples

-

Example: Instantiating a JavaArray in JavaScript

-

In this example, the JavaArray byteArray is created by the java.lang.String.getBytes method, which returns an array. -

-
var javaString = new java.lang.String("Hello world!");
-var byteArray = javaString.getBytes();
-
-

Example: Instantiating a JavaArray in JavaScript with the newInstance method

-

In JavaScript 1.4, you can use a JavaClass object as the argument for the newInstance method which creates the array, as shown in the following code: -

-
var dogs = java.lang.reflect.Array.newInstance(java.lang.String, 5);
-
-

In JavaScript 1.1, use a class object returned by java.lang.Class.forName as the argument for the newInstance method, as shown in the following code: -

-
var dataType = java.lang.Class.forName("java.lang.String");
-var dogs = java.lang.reflect.Array.newInstance(dataType, 5);
-
-
-
diff --git a/files/es/archive/web/liveconnect/javaclass/index.html b/files/es/archive/web/liveconnect/javaclass/index.html deleted file mode 100644 index 75ebf01604..0000000000 --- a/files/es/archive/web/liveconnect/javaclass/index.html +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: JavaClass -slug: Archive/Web/LiveConnect/JavaClass -tags: - - páginas_a_traducir -translation_of: Archive/Web/LiveConnect_Reference/JavaClass ---- -

Resumen

- -

Objeto Global

- -

Una referencia JavaScript de una clase Java.

- -

Creado por

- -

Una referencia del nombre de clase utilizada en el objeto Packages:

- -
Packages.JavaClass
-
- -

JavaClass es el nombre completo de la clase Java. Los objetos LiveConnect java, sun, y netscape ofrecen accesos directos para los paquetes Java más utilizados, además de crear objetos JavaClass.

- -

Descripción

- -

Un objeto JavaClass es una referencia a una de las clases de un paquete Java, como netscape.javascript.JSObject. Un objeto JavaPackage es una referencia a un paquete Java, como netscape.javascript. En JavaScript, las jerarquías JavaPackage y JavaClass reflejan el paquete Java y la jeraquía de clases.

- -

Puedes pasar un objeto JavaClass a un método Java que requiera un argumento de tipo java.lang.Class.

- -

Compatibilidad hacia atrás

- -

JavaScript 1.3 y anteriores

- -

Debes crear un contenedor y meter dentro una instancia de java.lang.Class antes de pasarlo como parámetro a un método Java -- los objetos JavaClass no se convierten de forma automática a instancias de java.lang.Class.

- -

Propiedades

- -

Las propiedades de un objeto JavaClass son los campos estáticos de la clase Java.

- -

Métodos

- -

Los métodos de un objeto JavaClass son los métodos estáticos de la clase Java.

- -

Ejemplos

- -

Ejemplos: Utilizando JavaClass

- -

En el siguiente ejemplo, x es un objeto JavaClass que hace referencia a java.awt.Font. Debido a que BOLD es un campo estático de la clase Font, también es una propiedad del objeto JavaClass.

- -
x = java.awt.Font;
-myFont = x("helv", x.BOLD, 10); // crea un objeto Font
-
- -

El ejemplo anterior omite Packages y utiliza el sinónimo java debido a que la clase Font está en el paquete java.

- -

Ejemplos

- -

En el siguiente ejemplo, el objeto java.lang.String de JavaClass se pasa como un argumento al método newInstance creando un array:

- -
var cars = java.lang.reflect.Array.newInstance(java.lang.String, 15);
-
- -

Ver también

- -

JavaArray, Objeto Java, Empaquetado Java, Paquetes

diff --git a/files/es/archive/web/liveconnect/javaobject/index.html b/files/es/archive/web/liveconnect/javaobject/index.html deleted file mode 100644 index 7248cef567..0000000000 --- a/files/es/archive/web/liveconnect/javaobject/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: JavaObject -slug: Archive/Web/LiveConnect/JavaObject -translation_of: Archive/Web/LiveConnect_Reference/JavaObject ---- -

-

-

Summary

-

Core Object -

The type of a wrapped Java object accessed from within JavaScript code. -

-

Created by

-

Any Java method which returns an object type. In addition, you can explicitly construct a JavaObject using the object's Java constructor with the Packages keyword: -

-
new Packages.JavaClass(parameterList)
-
-

JavaClass is the fully-specified name of the object's Java class. -

-

Parameters

-
parameterList 
An optional list of parameters, specified by the constructor of the Java class. -
-

Description

-

The JavaObject object is an instance of a Java class that is created in or passed to JavaScript. JavaObject is a wrapper for the instance; all references to the class instance are made through the JavaObject. -

Any Java data brought into JavaScript is converted to JavaScript data types. When the JavaObject is passed back to Java, it is unwrapped and can be used by Java code. See the Core JavaScript 1.5 Guide for more information about data type conversions. -

-

Properties

-

Inherits public data members from the Java class of which it is an instance as properties. It also inherits public data members from any superclass as properties. -

-

Methods

-

Inherits public methods from the Java class of which it is an instance. The JavaObject also inherits methods from java.lang.Object and any other superclass. -

-

Examples

-

Example: Instantiating a Java Object in JavaScript

-

The following code creates the JavaObject theString, which is an instance of the class java.lang.String: -

-
var theString = new Packages.java.lang.String("Hello, world");
-
-

Because the String class is in the java package, you can also use the java synonym and omit the Packages keyword when you instantiate the class: -

-
var theString = new java.lang.String("Hello, world");
-
-

Example: Accessing methods of a Java object

-

Because the JavaObject theString is an instance of java.lang.String, it inherits all the public methods of java.lang.String. The following example uses the startsWith method to check whether theString begins with "Hello". -

-
var theString = new java.lang.String("Hello, world");
-theString.startsWith("Hello"); // returns true
-
-

Example: Accessing inherited methods

-

Because getClass is a method of Object, and java.lang.String extends Object, the String class inherits the getClass method. Consequently, getClass is also a method of the JavaObject which instantiates String in JavaScript. -

-
var theString = new java.lang.String("Hello, world");
-theString.getClass(); // returns java.lang.String
-
-

See also

-

JavaArray, -JavaClass, -JavaPackage, -Packages -

-
-
diff --git a/files/es/archive/web/liveconnect/javapackage/index.html b/files/es/archive/web/liveconnect/javapackage/index.html deleted file mode 100644 index 091300cd5e..0000000000 --- a/files/es/archive/web/liveconnect/javapackage/index.html +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: JavaPackage -slug: Archive/Web/LiveConnect/JavaPackage -translation_of: Archive/Web/LiveConnect_Reference/JavaPackage ---- -

-

-

Summary

-

Core Object -

A JavaScript reference to a Java package. -

-

Created by

-

A reference to the package name used with the Packages keyword: -

-
Packages.JavaPackage
-
-

JavaPackage is the name of the object's Java package. If the package is in the java, netscape, or sun packages, the Packages keyword is optional. -

-

Description

-

In Java, a package is a collection of Java classes or other Java packages. For example, the netscape package contains the package netscape.javascript; the netscape.javascript package contains the classes JSObject and JSException. -

In JavaScript, a JavaPackage is a reference to a Java package. For example, a reference to netscape is a JavaPackage. netscape.javascript is both a JavaPackage and a property of the netscape JavaPackage. -

A JavaClass object is a reference to one of the classes in a package, such as netscape.javascript.JSObject. The JavaPackage and JavaClass hierarchy reflect the Java package and class hierarchy. -

Although the packages and classes contained in a JavaPackage are its properties, you cannot use a for...in statement to enumerate them as you can enumerate the properties of other objects.

-

Properties

-

The properties of a JavaPackage are the JavaClass objects and any other JavaPackage objects it contains. -

-

Examples

-

Suppose the Redwood corporation uses the Java redwood package to contain various Java classes that it implements. The following code creates the JavaPackage red: -

-
var red = Packages.redwood;
-
-

See also

-

JavaArray, -JavaClass, -JavaObject, -Packages -

-
-
diff --git a/files/es/archive/web/liveconnect/netscape/index.html b/files/es/archive/web/liveconnect/netscape/index.html deleted file mode 100644 index 85d8eabb95..0000000000 --- a/files/es/archive/web/liveconnect/netscape/index.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: netscape -slug: Archive/Web/LiveConnect/netscape -translation_of: Archive/Web/LiveConnect_Reference/netscape ---- -

-

-

Summary

-

Core Object -

A top-level object used to access any Java class in the package netscape.*. -

-

Created by

-

The netscape object is a top-level, predefined JavaScript object. You can automatically access it without using a constructor or calling a method. -

-

Description

-

The netscape object is a convenient synonym for the property Packages.netscape. -

-

See Also

-

Packages, -Packages.netscape -

-
-
diff --git a/files/es/archive/web/liveconnect/packages/index.html b/files/es/archive/web/liveconnect/packages/index.html deleted file mode 100644 index c66265507d..0000000000 --- a/files/es/archive/web/liveconnect/packages/index.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Packages -slug: Archive/Web/LiveConnect/Packages -translation_of: Archive/Web/LiveConnect_Reference/Packages ---- -

-

-

Summary

-

Core Object -

A top-level object used to access Java classes from within JavaScript code. -

-

Created by

-

The Packages object is a top-level, predefined JavaScript object. You can automatically access it without using a constructor or calling a method. -

-

Description

-

The Packages object lets you access the public methods and fields of an arbitrary Java class from within JavaScript. The java, netscape, and sun properties represent the packages java.*, netscape.*, and sun.* respectively. Use standard Java dot notation to access the classes, methods, and fields in these packages. For example, you can access a constructor of the Frame class as follows: -

-
var theFrame = new Packages.java.awt.Frame();
-
-

For convenience, JavaScript provides the top-level netscape, sun, and java objects that are synonyms for the Packages properties with the same names. Consequently, you can access Java classes in these packages without the Packages keyword, as follows: -

-
var theFrame = new java.awt.Frame();
-
-

The className property represents the fully qualified path name of any other Java class that is available to JavaScript. You must use the Packages object to access classes outside the netscape, sun, and java packages. -

-

Properties

-

className: The fully qualified name of a Java class in a package other than netscape, java, or sun that is available to JavaScript.

java: Any class in the Java package java.*.

netscape: Any class in the Java package netscape.*.

sun: Any class in the Java package sun.*. -

-

Examples

-

Example: JavaScript function to create a Java dialog box

-

The following JavaScript function creates a Java dialog box: -

-
function createWindow() {
-   var theOwner = new Packages.java.awt.Frame();
-   var theWindow = new Packages.java.awt.Dialog(theOwner);
-   theWindow.setSize(350, 200);
-   theWindow.setTitle("Hello, World");
-   theWindow.setVisible(true);
-}
-
-

In the previous example, the function instantiates theWindow as a new Packages object. The setSize, setTitle, and setVisible methods are all available to JavaScript as public methods of java.awt.Dialog. -

-
-
diff --git a/files/es/archive/web/liveconnect/sun/index.html b/files/es/archive/web/liveconnect/sun/index.html deleted file mode 100644 index 2ded558161..0000000000 --- a/files/es/archive/web/liveconnect/sun/index.html +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: sun -slug: Archive/Web/LiveConnect/sun -translation_of: Archive/Web/LiveConnect_Reference/sun ---- -

 

-

Sumario

-

Objeto Core

-

Objeto de nivel superior usado para acceder a cualquier clase Java en el paquete sun.*.

-

Creado por

-

El objeto sun es un objeto Javascript predefinido de nivel superior. Puede acceder a él automáticamente sin necesidad de utilizar un constructor o llamar a un método.

-

Descripción

-

El objeto sun es un sinónimo de conveniencia de la propiedad Packages.sun.

-

Ver también

-

Packages, Packages.sun

- -

diff --git a/files/es/arrastrar_y_soltar/index.html b/files/es/arrastrar_y_soltar/index.html deleted file mode 100644 index 3a4ca84f63..0000000000 --- a/files/es/arrastrar_y_soltar/index.html +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Arrastrar y soltar -slug: Arrastrar_y_soltar -tags: - - Todas_las_Categorías - - XUL -translation_of: Archive/Mozilla/Drag_and_drop ---- -

-

-

Siguiente »

-
-Esta sección describe cómo implementar objetos que pueden ser arrastrados y soltados dentro de otros objetos. -

-

La interfaz de arrastrar y soltar

-

Muchas interfaces de usuario permiten arrastrar objetos particulares dentro de la interfaz. Por ejemplo, arrastrar archivos a otros directorios, o arrastrar un icono a otra ventana para abrir el documento que representa. Mozilla y XUL proporcionan varios eventos para gestionar los intentos del usuario de arrastrar y soltar objetos. -

El usuario puede empezar a arrastrar un objeto pulsando el botón del ratón y moviéndolo. Se termina de arrastrar cuando el usuario suelta el botón del ratón. Los gestores de eventos se llaman cuando el usuario empieza y termina de arrastrar, y también en varios puntos intermedios. -

Mozilla implementa el arrastre por medio de sesiones de arrastre. Cuando un usuario solicita arrastrar algo que puede ser arrastrado, se debería iniciar una sesión de arrastre. La sesión de arrastre gestiona la actualización del puntero del ratón y dónde debería ser soltado el objeto. Si no se puede arrastrar algo, no se debería iniciar una sesión de arrastre. Ya que el usuario general sólo tiene un ratón, sólo se utiliza una sesión de arrastre simultáneamente. -

Ten en cuenta que las sesiones de arrastre pueden ser creadas desde Mozilla o desde otras aplicaciones. Mozilla traducirá los datos que se arrastran si se necesita. -

La lista inferior describe los gestores de eventos que pueden ser llamados, y que pueden ser asociados cualquier elemento. Sólo necesitas fijar valores para los gestores cuando necesitas que pase algo al activarse el evento. -

-
ondrag
llamado periódicamente a lo largo de la operación de arrastrar y soltar. -
ondraggesture 
llamado cuando el usuario empieza a arrastrar el elemento, lo que ocurre normalmente cuando el usuario pulsa el botón del ratón y lo mueve. El script de este gestor debería iniciar y configurar una sesión de arrastre. -
ondragstart  
un alias de ondraggesture; es el nombre de la especificación HTML 5 para el evento y puede usarse en HTML y XUL; sin embargo, para mantener la compatibilidad con versiones más antiguas de Firefox, es posible que quieras continuar usando en XUL ondraggesture. -
ondragover 
este gestor de evento es llamado por un elemento cuando se está arrastrando algo sobre el elemento al cual se le aplica ondragover. Si el objeto puede ser soltado sobre el elemento, se debería notificar a la sesión de arrastre. -
ondragenter 
es llamado por un elemento cuando el puntero del ratón se mueve por primera vez sobre él mientras se está arrastrando algo. Se puede usar para cambiar la apariencia del elemento y así indicar al usuario que el objeto puede ser soltado en él. -
ondragexit 
es llamado por un elemento cuando el puntero del ratón abandona el elemento mientras se está arrastrando algo. También es llamado tras soltar el objeto, para que el elemento pueda eliminar cualquier resaltado u otra indicación. -
ondragdrop 
este gestor de evento es llamado por un elemento cuando se suelta algo en el elemento. En este punto, el usuario ya ha soltado el botón del ratón. El elemento puede simplemente ignorar el evento o gestionarlo de alguna manera, tal como pegar el objeto dentro de sí mismo. -
ondragend  
se llama cuando se suelta un objeto. -
-

Hay dos formas de gestionar eventos de arrastrar y soltar. La primera implica usar las interfaces de arrastrar y soltar de XPCOM directamente. La segunda consiste en usar un objeto adaptador JavaScript que gestione algunas de ellas por ti. Puedes encontrar el código de este adaptador en un archivo llamado nsDragAndDrop.js, que está contenido en el paquete (o global) widget-toolkit. -

-

Arrastrar y soltar XPCOM

-

Se utilizan dos interfaces para implementar arrastrar y soltar. La primera es un servicio de arrastre, -nsIDragService, y la segunda es una sesión de arrastre, nsIDragSession. -

El nsIDragService es responsable de crear sesiones de arrastre cuando se empieza a arrastrar, y de eliminar la sesión de arrastre cuando se haya acabado de arrastrar. Para iniciar un arrastre, se debería llamar a la función <tt>invokeDragSession</tt> dentro de un gestor de eventos <tt>ondraggesture</tt>. Cuando se llama a esta función, comienza el arrastre. -

La función invokeDragSession acepta cuatro parámetros, tal y como se describe debajo: -

-
invokeDragSession(element,transferableArray,region,actions)
-
-
element 
una referencia al elemento que se está arrastrando. Puede obtenerse a través de la propiedad <tt>event.target</tt> dentro del gestor de eventos. -
transferableArray 
un vector de objetos nsITransferable, uno por cada elemento que se está arrastrando. Se usa un vector para permitir arrastrar varios objetos a la vez, como por ejemplo un grupo de archivos. -
region 
una región usada para proporcionar información de la operación. Normalmente debe fijarse a null. -
actions 
las acciones que usa el arrastre. Suele fijarse como una de las siguientes constantes, o como varias de ellas juntas. La acción puede cambiarse a lo largo del arrastre dependiendo de sobre qué elemento se está arrastrando. -
-
nsIDragSession.DRAGDROP_ACTION_NONE 
se usa para indicar que el arrastre no es válido. -
nsIDragSession.DRAGDROP_ACTION_COPY 
el elemento arrastrado se debería copiar al lugar donde se soltó. -
nsIDragSession.DRAGDROP_ACTION_MOVE 
el elemento que se arrastra se debería mover al lugar donde se soltó. -
nsIDragSession.DRAGDROP_ACTION_LINK 
se debería crear un enlace (o un acceso directo, o un alias) al elemento que se está arrastrando en el lugar donde se soltó. -
-
-

La interfaz nsIDragService también proporciona la función <tt>getCurrentSession</tt>, que puede ser llamada desde los gestores de eventos para obtener y modificar el estado del arrastre. La función devuelve un objeto que implementa nsIDragSession. -

La interfaz nsIDragSession se usa para obtener y fijar propiedades del arrastre en curso. Están disponibles las siguientes propiedades y métodos: -

-
canDrop 
fija esta propiedad a <tt>true</tt> si el elemento sobre el que está el ratón permite que el objeto que se está arrastrando se suelte en él. Fija el valor a <tt>false</tt> si no tiene sentido soltar el objeto en él. Se debería cambiar en los gestores de eventos <tt>ondragover</tt> y <tt>ondragenter</tt>. -
dragAction 
fija la acción que debe ser ejecutada, la cual debería ser una o varias de las constantes descritas anteriormente. Se puede usar para proporcionar información adicional al usuario. -
numDropItems 
el número de elementos que se arrastran. Por ejemplo, se fijará a 5 si se están arrastrando cinco marcadores. -
getData(transfer,index) 
devuelve los datos que se arrastran. El primer argumento debe ser un objeto nsITransferable para albergar los datos. El segundo argumento, index, debe ser el índice del elemento que se debe devolver. -
sourceDocument 
el documento donde empezó el arrastre. -
sourceNode 
el nodo DOM donde empezó el arrastre. -
isDataFlavorSupported(flavor) 
devuelve <tt>true</tt> si los datos que se arrastran contienen datos del tipo (sabor) especificado. -
-

-

Siguiente »

-
-

-
-

Original Document Information

- -
-


-

-
-
diff --git "a/files/es/a\303\261adir_datos_para_la_protecci\303\263n_anti-phishing/index.html" "b/files/es/a\303\261adir_datos_para_la_protecci\303\263n_anti-phishing/index.html" deleted file mode 100644 index 4cc41b20b1..0000000000 --- "a/files/es/a\303\261adir_datos_para_la_protecci\303\263n_anti-phishing/index.html" +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Añadir datos para la protección anti-phishing -slug: Añadir_datos_para_la_protección_anti-phishing -translation_of: Mozilla/Adding_phishing_protection_data_providers ---- -

La tecnología de protección anti-phishing permite a Firefox proteger a los usuarios comparando las URLs que el usuario visita con una lista negra de sitios fraudulentos conocidos, y presentando una advertencia al usuario cuando visita el sitio listado. -

-

Instalar un nuevo proveedor de datos

-

Para instalar un proveedor de datos para la protección anti-phishing, es necesario establecer una serie de preferencias a fin de proporcionar detalles acerca del proveedor. -

Cada proveedor de datos posee un número de identificador único (ID). El proveedor de datos con el número de ID 0 es el instalado con Firefox por defecto. Cuando se instala un nuevo proveedor, debe utilizar el siguiente número disponible. -

Para encontrar un número de ID que utilizar, puedes construir un bucle que solicite el valor de browser.safebrowsing.provider.0.name, luego browser.safebrowsing.provider.1.name, y así sucesivamente hasta que no se devuelva ningún valor. Entonces puedes usar este valor. -

Puedes encontrar ejemplos de cómo leer y escribir preferencias en el artículo Añadir preferencias a una extensión. -

-

Preferencias requeridas

-
browser.safebrowsing.provider.idnum.name -
Un nombre legible por un humano del proveedor de datos. -
-
browser.safebrowsing.provider.idnum.keyURL -
Una URL que retorna una clave privada que será usada para cifrar las otras peticiones. -
-
browser.safebrowsing.provider.idnum.lookupURL -
La URL usada para buscar URLs y ver si se encuentran en la lista negra. Esta petición debe ser cifrada usando una clave privada devuelta por la petición KeyURL. -
-

Preferencias opcionales

-
browser.safebrowsing.provider.idnum.reportURL -
Una URL usada para informar cuándo los usuarios visitan páginas fraudulentas y si deciden atender la advertencia o ignorarla. -
-
browser.safebrowsing.provider.idnum.updateURL -
Una URL usada para solicitar una lista actualizada de sitios con contenido fraudulento. El servidor provee o una lista completa o actualizaciones crecientes para poner las tablas del usuario al día. -
-
browser.safebrowsing.provider.idnum.reportGenericURL -
No usado actualmente; su intención es reportar otros asuntos con el servicio de protección anti-phishing. -
-
browser.safebrowsing.provider.idnum.reportErrorURL -
Una URL a la cual el usuario es dirigido para informar de una página segura que está siendo identificada incorrectamente como un sitio fraudulento. -
-
browser.safebrowsing.provider.idnum.reportPhishURL -
Una URL a la cual el usuario es dirigido para reportar un sitio de contenido fraudulento que no ha sido detectado por el sistema de protección contra phishing. -
-

Determinar el proveedor de datos seleccionado actualmente

-

Si necesitas determinar el número de ID del proveedor de datos seleccionado actualmente, -puedes observar el valor actual de la preferencia browser.safebrowsing.dataProvider. -


-

-
-
-{{ languages( { "en": "en/Adding_phishing_protection_data_providers", "fr": "fr/Ajout_de_fournisseurs_de_donn\u00e9es_de_protection_anti-phishing", "it": "it/Aggiungere_fornitori_di_dati_anti-phishing", "ja": "ja/Adding_phishing_protection_data_providers", "pl": "pl/Dodawanie_dostawc\u00f3w_danych_ochrony_przed_phishingiem", "zh-tw": "zh_tw/\u65b0\u589e\u507d\u9020\u7db2\u7ad9\u6e05\u55ae\u4f86\u6e90" } ) }} diff --git "a/files/es/a\303\261adir_preferencias_a_una_extensi\303\263n/index.html" "b/files/es/a\303\261adir_preferencias_a_una_extensi\303\263n/index.html" deleted file mode 100644 index 2cd6581f80..0000000000 --- "a/files/es/a\303\261adir_preferencias_a_una_extensi\303\263n/index.html" +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: Añadir preferencias a una extensión -slug: Añadir_preferencias_a_una_extensión -tags: - - Complementos - - Sistema_de_preferencias - - Todas_las_Categorías - - XUL - - extensiones -translation_of: Archive/Adding_preferences_to_an_extension ---- -

-

« AnteriorSiguiente »

-

- -

Este artículo es una vuelta de tuerca más al ejemplo mostrado en Crear una extensión dinámica en la barra de estado que le añade un menú emergente que te permite alternar entre múltiples stocks para visualizar. También añade un diálogo de preferencias que te permite cambiar a un stock diferente a aquellos incluidos en el menú emergente.

- -

Como ya ocurrió antes, los conceptos cubiertos en los anteriores artículos de la serie no se volverán a tocar por lo que si todavía no los has visto, puedes hacerlo ahora:

- - - -

También, por motivos de referencia, puede que te interese echarle un vistazo al Sistema de preferencias.

- -

Descargar el ejemplo

- -

Puedes descargar una copia de este ejemplo para echarle un vistazo o para usarlo como base para tu propia extensión.

- -

Descargar el ejemplo

- -

Actualizar los manifiestos

- -

El manifiesto de instalación y el manifiesto chrome necesitan ser actualizados. A grandes rasgos, simplemente hay que cambiar el ID de la extensión. Sin embargo, necesitamos añadir una nueva línea al fichero install.rdf.

- -
 <em:optionsURL>chrome://stockwatcher2/content/options.xul</em:optionsURL>
-
- -

Esta línea establece la URL del fichero XUL que describe el diálogo de opciones.

- -

Establecer los valores predeterminados

- -

Para establecer una preferencia predeterminada para el stock a monitorizar, necesitamos añadir un nuevo directorio al paquete de nuestra extensión llamado "defaults", el cual contendrá otro directorio llamado "preferencias". Dentro de él, crearemos un fichero defaults.js que describirá los valores predeterminados de nuestras preferencias.

- -
 pref("stockwatcher2.symbol", "GOOG");
-
- -

Para aprender más sobre el sistemas de preferencias, lee la API de preferencias.

- -

El código JavaScript

- -

Para poder monitorizar los cambios en nuestras preferencias necesitamos instalar un observador utilizando la interfaz nsIPrefBranch2. Para hacer eso, necesitamos reimplementar nuestro código como un objeto.

- -

Eso implica convertir cada función en un miembro de la clase StockWatcher. Echemos un vistazo a cada función de la clase.

- -

startup()

- -

La función StockWatcher.startup() es llamada cuando nuestra extensión se carga por vez primera. Su función es iniciar el observador para controlar los cambios en nuestras preferencias, instanciando un objeto para usarlo para que administre nuestras preferencias e instalando una rutina de intervalo para actualizar la información del stock periódicamente.

- -
 var StockWatcher = {
-   prefs: null,
-   tickerSymbol: "",
-
-   // Initialize the extension
-
-   startup: function()
-   {
-     // Register to receive notifications of preference changes
-
-     this.prefs = Components.classes["@mozilla.org/preferences-service;1"]
-         .getService(Components.interfaces.nsIPrefService)
-         .getBranch("stockwatcher2.");
-     this.prefs.QueryInterface(Components.interfaces.nsIPrefBranch2);
-     this.prefs.addObserver("", this, false);
-
-     this.tickerSymbol = this.prefs.getCharPref("symbol").toUpperCase();
-
-     this.refreshInformation();
-     window.setInterval(this.refreshInformation, 10*60*1000);
-   },
-
- -

Nuestro objeto posee dos variables miembro. prefs está configurada por startup() para que referencie las preferencias de nuestra extensión mientras que tickerSymbol indica el símbolo de stock a monitorizar.

- -

La primera cosa que hace la función startup() es obtener una referencia de las preferencias para nuestra extensión. Esto se hace en dos pasos:

- - - - - -

Tras obtener la rama de preferencias para nuestra extensión, llamaremos al método QueryInterface() sobre ellas para poder usar los métodos de la interfaz nsIPrefBranch2.

- -

El siguiente paso es registrar un observador de preferencias llamando al método addObserver() para establecer que en el momento en el que cualquier evento se produzca sobre las preferencias, nuestro objeto (this) recibirá una notificación. Cuando ocurra un evento, tal como una preferencia que ha sido alterada, nuestro método observe() será llamado automáticamente.

- -

Ahora que estamos monitorizando las preferencias, podemos configurarlas para ver la información del stock y mostrarla en el panel de la barra de estado.

- -

Lo primero que necesitamos hacer es obtener el símbolo de stock configurado actualmente para ver desde las preferencias. Para hacerlo, llamamos al método nsIPrefBranch.getCharPref(), especificando que queremos la preferencia llamada "symbol", que es donde guardamos la elección del usuario para el stock a visualizar. Convertiremos por la fuerza el símbolo a mayúsculas ya que es el modo en el que los símbolos de stock son normalmente mostrados.

- -

Después, llamamos a nuestro método refreshInformation() para obtener y mostrar inmediatamente la información actual sobre el stock para el cual la extensión está configurada para monitorizar. Miraremos los detalles de cómo funciona este método más adelante.

- -

Lo último que hace el método startup() es llamar al método del DOM window.setInterval() para configurar un callback que automáticamente ejecute nuestro método refreshInformation() cada 10 minutos. La duración del intervalo está especificada en milisegundos.

- -

shutdown()

- -

El método StockWatcher.shutdown() desactiva el observador sobre nuestras preferencias. Aquí es también donde añadiríamos cualquier otra tarea de apagado que necesitásemos realizar.

- -
  shutdown: function()
-  {
-    this.prefs.removeObserver("", this);
-  },
-
- -

observe()

- -

La función StockWatcher.observe() es llamada siempre que ocurre un evento en la rama de preferencias que estamos siguiendo. Para más detalles sobre cómo funcionan los observadores, revisa la interfaz nsIObserver.

- -
   observe: function(subject, topic, data)
-   {
-     if (topic != "nsPref:changed")
-     {
-       return;
-     }
-
-     switch(data)
-     {
-       case "symbol":
-         this.tickerSymbol = this.prefs.getCharPref("symbol").toUpperCase();
-         this.refreshInformation();
-         break;
-     }
-   },
-
- -

El parámetro topic indica el tipo de evento ocurrido. Si no es nsPref:changed, simplemente ignoraremos el evento ya que lo único que nos interesa son los cambios de los valores de nuestras preferencias.

- -

Una vez hemos comprobado que el evento es de hecho un cambio en las preferencias, miramos el parámetro data el cual contiene el nombre de la preferencia que ha cambiado. En nuestro ejemplo sólo hay una preferencia pero puedes monitorizar tantas como quieras.

- -

Si la preferencia cambiada es "symbol", recuperamos el valor actualizado de la preferencia llamando al método nsIPrefBranch.getCharPref() y la copiamos en nuestra variable tickerSymbol.

- -

Una vez hemos obtenido la preferencia actualizada, llamamos a refreshInformation() para actualizar de inmediato el visor con la nueva información del stock.

- -

watchStock()

- -

Ahora vamos a añadir un método que establece el stock que queremos monitorizar, cambiando la preferencia e inmediatamente pidiendo una actualización del visor. Este método será usado cuando el usuario utilice el menú emergente que añadiremos para cambiar el stock que se está controlando.

- -
   watchStock: function(newSymbol)
-   {
-     this.prefs.setCharPref("symbol", newSymbol);
-   },
-
- -

La única nueva información para nosotros aquí es la llamada a la función setCharPref() del objeto de la preferencia, el cual establece el valor de la preferencia "symbol".

- -

Date cuenta de que el hacer esta llamada provocará que el método StockWatcher.observe() sea llamado y la información del stock sea actualizada.

- -

refreshInformation()

- -

Este método difiere ligeramente de las versiones anteriores en la forma en la que recupera la preferencia del stock a seguir y en la manera en que construye la URL a monitorizar, además de cómo construye la cadena que es mostrada en el panel de la barra de estado.

- -
   refreshInformation: function()
-   {
-     // Because we may be called as a callback, we can't rely on
-     // "this" referring to the right object, so we need to reference
-     // it by its full name
-
-     var symbol = StockWatcher.tickerSymbol;
-
-     var fullUrl = "http://quote.yahoo.com/d/quotes.csv?f=sl1d1t1c1ohgv&e=.csv&s="
-         + symbol;
-
-     function infoReceived()
-     {
-       var samplePanel = document.getElementById('stockwatcher2');
-       var output = httpRequest.responseText;
-
-       if (output.length)
-       {
-         // Remove any whitespace from the end of the string
-         output = output.replace(/\W*$/, "");
-
-         // Build the tooltip string
-         var fieldArray = output.split(",");
-         samplePanel.label = symbol + ": " + fieldArray[1];
-         samplePanel.tooltipText = "Chg: " + fieldArray[4] + " | " +
-             "Open: " + fieldArray[5] + " | " +
-             "Low: " + fieldArray[6] + " | " +
-             "High: " + fieldArray[7] + " | " +
-             "Vol: " + fieldArray[8];
-       }
-     }
-
-     var httpRequest = new XMLHttpRequest();
-
-     httpRequest.open("GET", fullUrl, true);
-     httpRequest.onload = infoReceived;
-     httpRequest.send(null);
-   }
- }
-
- -

Date cuenta de que aquí usamos StockWatcher.tickerSymbol en vez de this.tickerSymbol para conseguir el símbolo del stock a visualizar. Hacemos esto debido a que refreshInformation() es por lo general llamado como un callback desde setInterval. En tales casos, this no se refiere al objeto correcto. Lee Method binding para una información más detallada.

- -

Una vez tenemos el símbolo en la variable local symbol, la usaremos para construir la URL y la cadena a mostrar en el panel de la barra de estado.

- -

Instalando los escuchadores de eventos

- -

La única cosa que nos queda por hacer es instalar los escuchadores de eventos necesarios para ejecutar las rutinas startup() y shutdown() automáticamente cuando la ventana del navegadore es cargada o descargada.

- -
window.addEventListener("load", function(e) { StockWatcher.startup(); }, false);
-window.addEventListener("unload", function(e) { StockWatcher.shutdown(); }, false);
-
- -

Diseñar el diálogo de preferencias

- -

Ahora que hemos escrito todo el código, necesitamos construir el fichero XUL para el diálogo de opciones.

- -
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<prefwindow id="stockwatcher2-prefs"
-     title="StockWatcher 2 Options"
-     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-<prefpane id="sw2-stock-pane" label="Stock Settings">
-  <preferences>
-    <preference id="pref_symbol" name="stockwatcher2.symbol" type="string"/>
-  </preferences>
-
-  <hbox align="center">
-    <label control="symbol" value="Stock to watch: "/>
-    <textbox preference="pref_symbol" id="symbol" maxlength="4"/>
-  </hbox>
-</prefpane>
-
-</prefwindow>
-
- -

El bloque <preferences> establece todas las opciones que hemos implementado así como sus tipos. En nuestro caso, sólo tenemos una única preferencia, el símbolo de stock a monitorizar. Las preferencias se identifican a través del nombre (en este caso, el nombre es "stockwatcher2.symbol").

- -

La interfaz de usuario actual es descrita en el bloque <prefpane>. El elemento <hbox> indica que los controles contenidos dentro de él han de disponerse horizontalmente, uno al lado del otro en la ventana.

- -

Nuestro diálogo posee dos controles en él. El primero es una etiqueta que describe el cuadro de texto. El segundo es el propio cuadro de texto en el cual el usuario introduce el símbolo. La propiedad preference relacionada con el cuadro de texto hace referencia al elemento <preference> "pref_symbol" y a la preferencia "stockwatcher2.symbol". Esto hace que el valor de la preferencia se actualice automáticamente para reflejar el contenido del cuadro de texto.

- -

Añadir el menú contextual

- -

Añadir el menú contextual es fácil. Todo lo que hay que hacer se hace en el fichero stockwatcher2.xul. El primer paso es añadir el atributo context al panel de la barra de estado:

- -
 <statusbar id="status-bar">
-   <statusbarpanel id="stockwatcher2"
-     label="Loading..."
-     context="stockmenu"
-     onclick="StockWatcher.refreshInformation()"
-   />
- </statusbar>
-
- -

Ahora cuando el usuario pulse sobre el panel de la barra de estado se actualizará la información del stock pero cuando lo haga con el botón derecho aparecerá un menú emergente.

- -

Definir el menú es también sencillo. Todo lo que necesitamos hacer es añadir un popupset que describa el menú en statusbar, así:

- -
 <popupset>
-   <menupopup id="stockmenu">
-     <menuitem label="Refresh Now" default="true"
-               oncommand="StockWatcher.refreshInformation()"/>
-     <menuseparator/>
-     <menuitem label="Apple (AAPL)" oncommand="StockWatcher.watchStock('AAPL')"/>
-     <menuitem label="Google (GOOG)" oncommand="StockWatcher.watchStock('GOOG')"/>
-     <menuitem label="Microsoft (MSFT)" oncommand="StockWatcher.watchStock('MSFT')"/>
-     <menuitem label="Yahoo! (YHOO)" oncommand="StockWatcher.watchStock('YHOO')"/>
-   </menupopup>
- </popupset>
-
- -

Cada elemento en el menú posee una propiedad label que especifica el texto mostrado en el menú, además de una propiedad oncommand que indica el código JavaScript a ejecutar cuando el usuario elija dicho elemento.

- -

La opción Actualizar ahora llama a la función StockWatcher.refreshInformation() para actualizar el visor. El resto de las opciones llaman a la función StockWatcher.watchStock() para empezar a observar un stock diferente.

- -

Para un tutorial más detallado sobre la creación de menús emergentes, lee Tutorial XUL:Menús emergentes.

- -

-

« AnteriorSiguiente »

-

diff --git "a/files/es/browserid/configuraci\303\263n_r\303\241pida/index.html" "b/files/es/browserid/configuraci\303\263n_r\303\241pida/index.html" deleted file mode 100644 index 52fb1610e6..0000000000 --- "a/files/es/browserid/configuraci\303\263n_r\303\241pida/index.html" +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Configuración rápida -slug: BrowserID/Configuración_rápida -translation_of: Archive/Mozilla/Persona/Quick_Setup ---- -

Cargar la biblioteca BrowserID

-

Hay que incluir en tu sitio web la biblioteca BrowserID que se encuentra en https://browserid.org/include.js asegurándonos de que se carga antes de llamar a cualquier función navigator.id .

-

Por ejemplo:

-
<script src="https://browserid.org/include.js" type="text/javascript"></script>
-
-

La biblioteca está diseñada para ser neutral al navegador y funciona bien en todos los navegadores modernos.

-

Pedir al usuario que se autentifique

-

Agrega un botón sign-in a tu pagina. Aunque es completamente opcional, es posible que desees utilizar uno de los siguientes botones de BrowserID:

-

A red sign in button A blue sign in button A orange sign in button A green sign in button A grey sign in button

-

Por ejemplo:

-
<a href="#" id="browserid" title="Sign-in with BrowserID">
-  <img src="/images/sign_in_blue.png" alt="Sign in">
-</a>
-

Cuando el usuario hace clic en el botón sign-in (conectar), llama la función navigator.id.get(), pasando una función a la que devuelve la llamada:

-
$(function() {
-  $('#browserid').click(function() {
-    navigator.id.get(gotAssertion);
-    return false;
-  });
-});
-
-

En caso de éxito, la devolución de la llamada se realizará pasada la aserción: esto es una cadena que contiene una reclamación firmada de que el usuario posee una dirección de correo electrónico en particular.

-

Comprobar la aserción

-

Tendrás que enviar esta aserción para que tu servidor la compruebe, por ejemplo, mediante el uso de una petición AJAX. En este ejemplo tenemos un servicio que se ejecuta en /api/login que recibe y comprueba las aserciones. Si este servicio comprueba con éxito la aserción, actualizamos la interfaz de usuario llamando a loggedIn(), de lo contrario, controlamos los errores de inicio de sesión:

-
function gotAssertion(assertion) {
-  // got an assertion, now send it up to the server for verification
-  if (assertion !== null) {
-    $.ajax({
-      type: 'POST',
-      url: '/api/login',
-      data: { assertion: assertion },
-      success: function(res, status, xhr) {
-        if (res === null) {}//loggedOut();
-          else loggedIn(res);
-        },
-      error: function(res, status, xhr) {
-        alert("login failure" + res);
-      }
-    });
-  } else {
-    //loggedOut();
-  }
-}
-
-
Nota: es importante que la aserción se compruebe en el servidor y no en el navegador.
-

En el servidor, debes comprobar la aserción y extraer de ella la dirección de correo del usuario. La forma más sencilla de hacerlo es utilizar el servicio de verificación gratuito proporcionado por BrowserID. Envia una solicitud POST a   https://browserid.org/verify con dos parámetros:

- -

Nota: esta llamada era un GET, pero a partir del 13 de octure de 2011 debe ser un POST.

-

El verificador comprobará que la aserción es para tu sitio y que es válida. Responde con una estructura JSON que contiene los contenidos y el código de estado de la aserción.

-

Supón que tienes una aserción que pide a  https://mysite.com que acepte la dirección de correo lloyd@example.com.

-

Puedes enviarla a https://browserid.org/verify:

-
$ curl -d "assertion=<ASSERTION>&audience=https://mysite.com" "https://browserid.org/verify"
-
-

Aquí está la respuesta:

-
{
-    "status": "okay",
-    "email": "lloyd@example.com",
-    "audience": "https://mysite.com",
-    "expires": 1308859352261,
-    "issuer": "browserid.org"
-}
-
-

Simplemente tienes que comprobar que el estado es correcto y, si lo es, el usuario puede conectarse al sitio. Puedes crear una sesión para él y colocar una cookie en su navegador para identificar la sesión.

-

Implementa el cierre de sesión

-

Puedes implementar el cierre de sesión simplemente eliminando la cookie de la sesión de usuario.  Si has implementado la compatibilidad para inicio de sesión persistente, entonces solo tendrás que llamar a {{ domxref("navigator.id.logout()") }}.

-

En función del tiempo que haya trascurrido desde que el usuario inició sesión/ingresó con su proveedor de identidad, el usuario dispondrá aún de un certificado de usuario válido: si es así, entonces cuando el usuario inicie sesión/ingrese de nuevo, no se le solicitará de nuevo la contraseña para BrowserID. Sin embargo se le pedirá que seleccione la dirección de correo que va a usar y que confirme que desea iniciar sesión/ingresar.

-

{{ languages( { "en": "en/BrowserID/Quick_Setup", "es": "es/BrowserID/Configuración_rápida" } ) }}

diff --git a/files/es/browserid/funciones_avanzadas/index.html b/files/es/browserid/funciones_avanzadas/index.html deleted file mode 100644 index 05a955b37b..0000000000 --- a/files/es/browserid/funciones_avanzadas/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Funciones Avanzadas -slug: BrowserID/Funciones_Avanzadas ---- -
- In all example code in this page, gotAssertion is the callback argument to navigator.id.get().
-

Persistent Login

-

The navigator.id.get() API takes a set of options as an optional parameter. By using two of these options, allowPersistent and silent, you can enable the user to stay logged into your web site until the certificate signed by their identity provider expires.

-

allowPersistent

-

You use allowPersistent like this:

-
navigator.id.get(gotAssertion, {allowPersistent: true});
-

This option causes a new checkbox to appear in the BrowserID dialog asking the user if they want to stay signed in. If the user checks the box to stay signed in, then the browser creates an assertion and passes it to gotAssertion as normal, but remembers the user selection.

-

silent

-

You use silent like this:

-
navigator.id.get(gotAssertion, {silent: true});"}
-

With this option the browser will not display any dialog to the user, but will call gotAssertion without any user intervention. If the user had checked the box to stay signed in, and the user's certificate has not yet expired, then the browser will silently generate a new assertion and pass it into gotAssertion. Otherwise, the browser will pass null into gotAssertion.

-

Supporting Persistent Login

-

First, on page load, call navigator.id.get({silent: true}):

-
$(function() {\n  navigator.id.get(gotAssertion, {silent: true});\n});
-

Next, inside gotAssertion, if the assertion is not null and validates, log the user in, otherwise call loggedOut():

-
function gotAssertion(assertion) {
-  if (assertion !== null) {
-    // Send assertion to the server for validation
-    if (!validateAssertionOnServer(assertion) loggedOut();
-    else loggedIn();
-  }
-  else {
-    loggedOut();
-  }
-}
-

Finally, loggedOut() updates the page to indicate that the user is logged out. In particular, the page needs to display a "Sign In" button whose click handler will call navigator.id.get({allowPersistent: true}):

-
$('#browserid' }}).click(function() {
-  navigator.id.get(gotAssertion, {allowPersistent: true});
-  return false;
-});
-

Example Code

-

You can see a sample implementation of this at http://myfavoritebooze.org/, whose source code is available on GitHub.

-

Requiring a Specific Email

-

BrowserID enables a user to have multiple identities, and choose which one to sign in with. If a user has multiple email addresses which can be verified using BrowserID, then when a web site calls navigator.id.get(), the user will be presented with all their addresses, and asked which one to use.

-

Sometimes, though, a web site knows which email the user needs to choose. For example, if Alice shares a photo with Bob using a BrowserID-enabled photo-sharing site, the web site needs to authenticate Bob against the exact email address Alice used to invite him. If Bob chooses the wrong email from multiple choices the invitation will fail.

-

In this situation the web site can require that the user use a particular email address by setting the requiredEmail option as an argument to navigator.id.get(). For example:

-
navigator.id.get(gotAssertion, {requiredEmail: \"bob@example.com\"});
-

Even if Bob has multiple email addresses, he'll only be presented with "bob@example.com". The web site's gotAssertion() function is guaranteed to be called with either an assertion for "bob@example.com", or with a null assertion.

diff --git a/files/es/browserid/index.html b/files/es/browserid/index.html deleted file mode 100644 index 4bace2f516..0000000000 --- a/files/es/browserid/index.html +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: BrowserID -slug: BrowserID ---- -This page was auto-generated because a user created a sub-page to this page. diff --git a/files/es/bundles/index.html b/files/es/bundles/index.html deleted file mode 100644 index ebb971fcf0..0000000000 --- a/files/es/bundles/index.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Estructura de un paquete de instalación -slug: Bundles -tags: - - Herramientas_API -translation_of: Archive/Mozilla/Bundles ---- -

 

-

Las Aplicaciones XULRunner, extensiones, y temas comparten todos una estructura de directorios común, y en algunos casos el mismo paquete puede ser usado como una aplicación XULRunner independiente además de como una extensión instalable en otra aplicación. La estructura básica de un paquete (bundles) puede incluir cualquiera de los siguientes ficheros:

-
/install.rdfManifiesto de instalación de tema/extensión
-/application.iniManifiesto de lanzamiento de la aplicación
-/components/*Componentes y ficheros XPT       (>=1.7)
-/defaults/preferences/*.jsOpciones por defecto             (>=1.7)
-/plugins/*Plugins NPAPI                    (>=1.8)
-/chrome.manifestManifiesto de registro de Chrome (>=1.8)
-/chrome/icons/default/*Iconos de la ventana             (>=1.8)
-
-

Por supuesto, una extensión no necesita (y normalmente no tendrá) todos estos directorios. Los temas están limitados por razones de seguridad y normalmente no pueden proporcionar un chrome.manifest que registre un tema y un fichero JAR.

-

 

-

Subdirectorios específicos de una plataforma

-

En algunos casos una única extensión o aplicación puede necesitar incluir componentes binarios o plugins para múltiples plataformas, o los autores de temas pueden querer incluir varios ficheros JAR específicos a una plataforma. Para facilitar las cosas en el primer caso, el cargador de la extensión/aplicación tendrá unos subdirectorios especiales previstos específicamente para los ficheros concretos de una plataforma (a partir del Toolkit/Gecko 1.8, Firefox/Thunderbird 1.5). La cadena de texto de la plataforma es definida por el proceso de compilación del toolkit con un único valor para la combinación del sistema operativo, arquitectura del procesador y el compilador. El formato de la cadena de texto de la plataforma es:

-
{OS_TARGET}_{TARGET_XPCOM_ABI}
-
-

Todos los ficheros que son cargados desde el directorio principal de la extensión son cargados desde el subdirectorio

-
/platform/{cadena de texto de la plataforma}
-
-

si existe. Por ejemplo, si un vendedor de plugins que busque el dejarlo disponible para un usuario de ordenadores con Linux, Macintosh y Windows, este proporcionará los siguientes ficheros:

-
/platform/Linux_x86-gcc3/plugins/libMyPlugin.so
-/platform/WINNT_x86-msvc/plugins/MyPlugin.dll
-/platform/Darwin_ppc-gcc3/plugins/libMyPlugin.dylib
-
-

Dado que los ficheros XPT no dependen de la plataforma, cualquier fichero XPT asociado entraría en el directorio de componentes genérico:

-
/components/MyPlugin.xpt
-
-

Si una extensión tiene código específico a una plataforma no binaria (como el código que utiliza la base de registros de Windows desde un script), también puede utilizar el identificador del sistema operativo como subdirectorio de plataforma:

-
/platform/WINNT/components/registerDoctype.js
-
-

Cuando un fichero JAR específico a una plataforma es usado, cada directorio de plataforma debe tener su propio fichero chrome.manifest:

-
chrome.manifest
-chrome/mytheme-base.jar
-platform/Darwin/chrome.manifest
-platform/Darwin/chrome/mytheme-mac.jar
-platform/WINNT/chrome.manifest
-platform/WINNT/chrome/mytheme-win.jar
-
-

El proceso de arranque analiza en primer lugar el directorio base, después los directorios de plataforma aplicables (en primer lugar /{OS_TARGET}/, a continuación /{OS_TARGET}_{TARGET_XPCOM_ABI}/). Cuando las preferencias por defecto se definen en varios directorios, los que se cargan al final tienen prioridad sobre los que se cargan antes.

-

Ficheros de extensión específicos a una aplicación

-

Además de los ficheros de extensión listados más arriba, las aplicaciones pueden leer ficheros suplementarios desde extensiones. Por ejemplo, Firefox 1.5 y superiores pueden leer los plugins de búsqueda de Sherlock desde /searchplugins/*.src Firefox 2 y superiores además pueden leer Plugins MozSearch y OpenSearch desde

-
/searchplugins/*.xml
-
-

y los diccionarios Myspell desde

-
/dictionaries/*.{aff|dic}
-
-

Referencias oficiales de Herramienta API

-

-

-

diff --git a/files/es/cambios_del_tema_en_firefox_2/index.html b/files/es/cambios_del_tema_en_firefox_2/index.html deleted file mode 100644 index fdd74588bd..0000000000 --- a/files/es/cambios_del_tema_en_firefox_2/index.html +++ /dev/null @@ -1,883 +0,0 @@ ---- -title: Cambios del tema en Firefox 2 -slug: Cambios_del_tema_en_Firefox_2 -tags: - - Complementos - - Temas - - Todas_las_Categorías -translation_of: Archive/Themes/Theme_changes_in_Firefox_2 ---- -

Este artículo trata los cambios que deben hacerse para actualizar un tema de Firefox para que funcione correctamente en Firefox 2. - -

Cambios en el navegador que requieren actualizaciones en el tema

- -

Varios archivos del navegador han sido modificados o suprimidos, por lo que puede que tengas que hacer cambios en tu tema. Esta tabla lista los archivos XUL modificados y los correspondientes archivos CSS del tema que puede que tengas que actualizar.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Archivo XULArchivo CSSDetalles
feeds/addFeedReader.xulfeeds/addFeedReader.css Archivo nuevo que muestra una UI para añadir un nuevo agregador.
feeds/subscribe.xhtmlfeeds/subscribe.cssArchivo nuevo que muestra la UI para suscribirse a un feed RSS.
preferences/downloads.xul-Eliminado en Firefox 2.
preferences/general.xul-Eliminado en Firefox 2.
safebrowsing/warning-overlay.xulsafebrowsing/browser-protection.cssArchivo nuevo que contiene una capa externa que se muestra en la parte superior del navegador cuando visitamos un sitio sospechoso de phishing.
search/engineManager.xulengineManager.cssArchivo nuevo que contiene la UI de la ventana del administrador de motores de búsqueda.
- -

Cambios en el tema default (el que viene por defecto)

- -

La siguiente tabla lista todos los cambios hechos en el tema por defecto para Firefox 2. Puedes usar esta información como ejemplo para entender los cambios que necesitas hacer.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ArchivoDescripción de los cambios
browser/bookmarks/addBookmark.cssActualizado para incluir cambios en el CSS relacionados con los micro-resúmenes.
browser/bookmarks/bookmarksProperties.cssArchivo nuevo; incluye CSS para los micro-resúmenes.
browser/browser.cssNecesita ser actualizado para incluir CSS para los micro-resúmenes, áreas de búsqueda, items del memú marcadores con iconos, y más.
browser/dropmark-nav-small.pngArchivo nuevo; es la flecha del menú desplegable de los botones de navegación, cuando usamos iconos pequeños.
browser/dropmark-nav.pngArchivo nuevo; es la flecha del menú desplegable de los botones de navegación.
browser/engineManager.cssArchivo nuevo; CSS usado por el administrador de motores de búsqueda.
browser/feeds/addFeedReader.cssArchivo nuevo; CSS usado en la ventana para añadir un nuevo agregador.
browser/feeds/feedIcon.pngArchivo nuevo; el icono de feed RSS.
browser/feeds/feedIcon16.pngArchivo nuevo; la versión de 16x16 píxeles del icono de feed RSS.
browser/feeds/subscribe.cssArchivo nuevo; CSS usado en la ventana de subscripción a un feed RSS.
browser/Go-rtl.pngArchivo nuevo; icono "ir" para usarlo si es colocado a la izquierda del campo de direcciones.
browser/preferences/preferences.cssArchivo de skins de la ventana de preferencias.
browser/safebrowsing/browser-protection.cssArchivo nuevo; CSS para la ventana que aparece para advertir al usuario que un sitio puede ser fraudulento, así como el icono de la barra URL que indica que un sitio puede ser fraudulento.
browser/safebrowsing/close16x16.pngArchivo nuevo; este es el icono mostrado ventana de advertencia de "navegación segura " como una caja para cerrar la ventana.
browser/safebrowsing/dim.pngArchivo nuevo; este es un gráfico superpuesto en nivel superior del contenido de la ventana para "debilitarla" cuando se muestra la ventana de advertencia de navegación segura. Debe usar transparencia para permitir que el contenido de la ventana sea visible a través de él.
browser/safebrowsing/tail.pngArchivo nuevo; esta es la "cola" del estilo de la ventana que indica que un sitio puede ser fraudulento.
browser/safebrowsing/warning16x16.pngArchivo nuevo; esta es la versión en 16x16 píxeles del icono de advertencia mostrado en la barra de direcciones cuando aparece la ventana de advertencia de navegación segura.
browser/safebrowsing/warning24x24.pngArchivo nuevo; este es el icono de advertencia que se muestra dentro de la ventana de advertencia de navegación segura.
browser/search-bar-background-mid.pngArchivo nuevo; es el fondo para la parte central de la barra de búsqueda. Ahora los extremos de la barra son tratados por separado.
browser/search-bar-background.pngArchivo eliminado.
browser/Search-bar.pngArchivo eliminado.
browser/Search-go-rtl.pngArchivo nuevo; es el botón "ir" que se muestra en el extremo izquierdo de la caja de búsquedas.
browser/Search-go.pngArchivo nuevo; es el botón "ir" que se muestra en el extremo derecho de la caja de búsquedas.
browser/Search-provider-bkgnd-rtl.pngArchivo nuevo; el fondo dibujado detrás del proveedor de búsqueda cuando está localizado a la izquierda al final de la barra de búsqueda.
browser/Search-provider-bkgnd.pngArchivo nuevo; el fondo dibujado detrás del proveedor de búsqueda cuando está localizado a la derecha al final de la barra de búsqueda.
global/about.cssArchivo nuevo; CSS utilizado en el cuadro "acerca de" de la aplicación.
global/alltabs-box-bkgnd.pngArchivo nuevo; es el fondo del menú emergente "todas la pestañas" que está a la derecha de la barra de pestañas.
global/alltabs-box-overflow-bkgnd.pngArchivo nuevo; es el fondo del menú emergente "todas la pestañas" cuando hay suficientes etiquetas para activar la barra de desplazamiento de la barra de pestañas.
global/browser.cssRevisado para soportar nuevos estilos para la ventana principal del navegador
global/globalBindings.xmlActualizado para soportar los cambios en la barra de pestañas, incluido el botón para cerrar pestañas.
global/icons/alltabs.pngActualmente sin uso, resto de esbozos anteriores del tema.
global/inactivetab-left.pngArchivo eliminado.
global/inactivetab-right.pngArchivo eliminado.
global/menu.cssActualizado para incluir nuevos estilos.
global/notification.cssArchivo nuevo; define los estilos utilizados por la barra de notificación que aparece en la parte superior de las ventanas del navegador para presentar noticias com "se ha bloqueado un popup"
global/scrollbox/autorepeat-arrow-dn-dis.gifArchivo nuevo; icono desplegado para la flecha hacia abajo deshabilitada del auto-repeat en un a caja desplegable.
global/scrollbox/autorepeat-arrow-dn.gifArchivo nuevo; icono mostrado para la flecha hacia abajo de una caja desplegable.
global/scrollbox/autorepeat-arrow-up-dis.gifArchivo nuevo; icono mostrado para una flecha arriba deshabilitada en una caja desplegable.
global/scrollbox/autorepeat-arrow-up.gifArchivo nuevo; icono mostrado en la caja superior de la barra de desplazamiento auto-repetitiva.
global/scrollbox.cssNecesita ser actualizado para incluir nuevos estilos.
global/tab-arrow-end-bkgnd.pngArchivo nuevo; es el fondo para el cuadro de la barra de desplazamiento en la flecha del lado derecho.
global/tab-arrow-end.pngArchivo nuevo; the arrow drawn in the scrolling tab bar box at the right end of the tab bar.
global/tab-arrow-start-bkgnd.pngArchivo nuevo; es el fondo para el cuadro de la barra de desplazamiento en la flecha del lado izquierdo.
global/tab-arrow-start.pngArchivo nuevo; the arrow drawn in the scrolling tab bar box at the left end of the tab bar.
global/tab-left.pngArchivo nuevo; el lado izquierdo de las pestañas
global/tab-middle.pngArchivo nuevo; el centro de las pestañas
global/tab-right.pngArchivo nuevo; el lado derecho de las pestañas
global/tabbrowser-tabs-bkgnd.pngArchivo nuevo; es el fondo de la barra de las pestañas, mostrado detrás de las pestañas.
global/toolbar.cssNecesita ser actualizado para incluir nuevos estilos.
mozapps/extensions/about.cssActualizado para simplificar los nombres de los estilo, ya que varios estilos eran idénticos.
mozapps/extensions/extensions.cssCSS para la ventana del administrador de add-ons. Actualizado para soportar las nuevas caracteristicas del administrador de add-ons de Firefox 2.
mozapps/extensions/itemDisabledFader.pngArchivo nuevo; un PNG con transparencia usado como capa externa sobre los objetos deshabilitados en el add-on manager.
mozapps/extensions/itemEnabledFader.pngArchivo nuevo; un PNG con transparencia usado como capa externa sobre los objetos habilitados en el add-on manager.
mozapps/extensions/notifyBadges.pngArchivo nuevo; contiene los íconos que van a ser usados como capas sobre iconos de los add-ons en la ventana add-on manager, estos indicarán el estado de estos. Los siguientes iconos son usados en el tema por defecto: -

Image:NotifyBadges.png

- -
    -
  • El primer ícono (verde aquí) indica que ese add-on tiene una actualización disponible.
  • -
  • El segundo icono (amarillo aquí) el add-on en cuastión aparece como bloqueado en la lista; esto mientras se intenta confirmar.
  • -
  • El tercer icono (rojo aquí) indica que el add-on se encuentra desabilitado, por el usuario, o porque es incompatible con la aplicación.
  • -
  • El cuarto (azul aquí) (no estoy seguro de los que este significa).
  • -
-
mozapps/extensions/question.pngNew file; used in the Add-ons Manager when you check for updates. If no updates are found, this icon is displayed at the left side of the message strip that appears across the top of the window.
mozapps/extensions/update.cssThis file, which skins the Firefox update wizard, has fewer styles in it due to the redesigned update wizard.
mozapps/extensions/viewButtons.pngNew file; contains icons for each of the views that may be available in the add-ons manager. In the default theme, these look something like this: -

Image:ViewButtons.png
- The top row contains dimmed versions of the icons below them. The first icon is for the extensions view. The second is for themes. The third is for locales, the fourth is for plugins, the fifth is for updates, and the sixth is for installs.

-
mozapps/prefEste directorio ya no se usa en Firefox 2 y debería ser borrado.
- -

Cambios en browser

- -

bookmarks/addBookmark.css

- -

Deberías añadir las siguientes líneas al inicio del archivo addBookmarks.css:

- -
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
-@namespace html url("http://www.w3.org/1999/xhtml");
-
- -

También hay que añadir CSS en relación con los microresúmenes para proporcionar formato al recolector de microresúmenes. Se usa para que cuando no hay microresúmenes disponibles, el recolector parezca una caja de texto normal en vez de parecer una lista de menús editable.

- - - -

Este archivo da estilo a addBookmark2.xul.

- -

bookmarks/bookmarksProperties.css

- -

Este archivo es nuevo en Firefox 2, y debería contener el mismo código CSS añadido a addBookmark.css. Este archivo da estilo a bookmarksProperties.xul.

- -
Nota: se puede poner este CSS en un archivo separado que será referenciado por ambos archivos en el futuro
- -

browser.css

- -

Los siguientes estilos usados en temas para Firefox 1.5 ya no se usan en Firefox 2 y deberían ser borrados de tu tema:

- - - -

Tienes que añadir los siguientes estilos para que tu tema sea compatible con Firefox 2:

- - - -

Puede que también tengas que hacer cambios en otros estilos.

- -

searchbar.css

- -

El siguiente estilo ya no se usa en Firefox 2 y debería ser borrado de tu tema:

- - - -

Tienes que añadir los siguientes estilos para que tu tema sea compatible con Firefox 2:

- - - -

Por supuesto, también puedes desear hacer cambios en otros estilos.

- -

preferences/preferences.css

- -

Los estilos siguientes ya no se usan en Firefox 2 y deberían ser borrados de tu tema:

- - - -

Tienes que añadir los siguientes estilos a tu tema para hacerlo compatible con Firefox 2:

- - - -

Por supuesto, También puedes cambiar otros estilos.

- -

feeds/addFeedReader.css

- -

Este archivo es nuevo en Firefox 2. Se usa para el skin de la ventana que se muestra para añadir a un nuevo agregador, esta es definida en el archivo browser/feeds/addFeedReader.xul.

- - - -

feeds/subscribe.css

- -

Este archivo es nuevo en Firefox 2. Es el skin de la ventana mostrada al suscribirse a un feed RSS, está en browser/feeds/subscribe.xhtml.

- - - -

El tema default también incluye estilos para a[href] img, body, h1, h2, y html.

- -

safebrowser/browser-protection.css

- -

Este archivo, nuevo a Firefox 2, son las skins para las funciones de seguridad del navegador. Los siguientes estilos deben ser implementados para dar soporte a la ventana que aparece cuando el usuario visita a un sitio sospechoso de phishing:

- - - -

Los estilos siguientes se usan para mostrar, en la barra de URL, un indicador de si el sitio es seguro:

- - - -

engineManager.css

- -

El siguiente estilo tiene que ser implementado. Este archivo es nuevo en Firefox 2.

- - - -

Cambios en global

- -

about.css

- -

Este es un archivo nuevo para Firefox 2. Son los Skins de la caja about Firefox, es necesario proporcionar al menos los siguientes estilos:

- - - -

The default theme also skins the following styles: body, html, img, ul, and ul > li.

- -

browser.css

- -

Los siguientes estilos que fueron usados en Firefox 1.5 ya no se usan en Firefox 2 y han sido borrados:

- - - -

Los siguientes estilos son nuevos en Firefox 2:

- - - -

Si quieres tambien puedes hacer cambios en otros estilos.

- - - -

El siguiente estilo ya no se usa en Firefox 2 y a sido borrado:

- - - -

El tema de Firefox 2 también añade los siguientes estilos nuevos:

- - - -

Si lo deseas, también puedes cambiar la definición de otros estilos.

- -

notification.css

- -

Este archivo es nuevo en Firefox 2. Se usa para la barra de notificación que aparece a lo largo de la parte superior del navegador para mostrar al usuario mensajes como: popup bloqueado, se necesita plugin, etcétera. Hay tres niveles de gravedad para los mensajes, info, warning y critical. Deberías definir los siguientes estilos:

- - - -

scrollbox.css

- -

Para el tema de Firefox 2 en este archivo se han añadido los siguiente estilos:

- - - -

Puedes hacer cambios en otros estilos si quieres.

- - - -

Si lo deseas también puedes cambiar otros estilos.

- -

Cambios en mozapps

- -

extensions/about.css

- -

Los estilos siguientes para Firefox 1.5 ya no se usan en Firefox 2 y deberían ser borrados:

- - - -

Se añadieron los siguiente estilos:

- - - -

también puedes cambiar otros estilos, si quieres.

- -

extensions/update.css

- -

Los siguientes estilos ya no se usan en Firefox 2 y deberían ser borrados del tema:

- - - -

También se añadieron los siguientes estilos:

- - diff --git a/files/es/cambios_en_los_temas_de_firefox_3/index.html b/files/es/cambios_en_los_temas_de_firefox_3/index.html deleted file mode 100644 index 1b053b48f6..0000000000 --- a/files/es/cambios_en_los_temas_de_firefox_3/index.html +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Cambios en los temas de Firefox 3 -slug: Cambios_en_los_temas_de_Firefox_3 -tags: - - Themes - - páginas_a_traducir -translation_of: Archive/Themes/Theme_changes_in_Firefox_3 ---- - -
-
<noscript>

Some features of this site require JavaScript.

</noscript> -
-
-

Este artículo describe los cambios hechos al actualizar al tema de Firefox para trabajar en: Firefox 3.

-
Nota: Se puede utilizar el artículo Actualizar temas para Firefox 3 como guía para actualizar temas.
-Si alguien con experiencia en la creación de temas quisiera escribir algún artículo, adelante!
-
-

Los cambios del navegador requieren actualizar los temas

-

Existen diversos archivos que fueron cambiados o borrados del navegador que pueden requerir que realices cambios a tu tema. La siguiente tabla muestra tanto el archivo XUL cambiado como el archivos CSS correspondientes al tema que debes de actualizar.

- -
Filename CSS File Details
     
-
-
-

Cambios en el tema por defecto

-

La siguiente tabla muestra los cambios hechos en el tema por defecto de Firefox 3; puedes utilizar esta información como apoyo para tener una idea de los cambios que necesitas hacer.

-
-

Lista de todos los archivos

-
-

En todas las plataformas

- -
Archivo Descripción del cambio
browser/themes/*/browser/browser.css El ancho del indicador del 'drag and drop' ya no es calculado durante el arrastre (tabbrowser.xml). En vez de eso la propiedad '-moz-margin-start' debe ser agregada a .tab-drop-indicator-bar, con el valor de la mitad del ancho de la imagen indicadora. También, la visibilidad del indicador ahora es controlada is now controlled by setting collapsed in tabbrowser.xml. Como resultado, la propiedad 'display' debe ser eliminada de .tab-drop-indicator-bar (incluyendo for dragging="true").
-
-
-

En Mac OS X

- -
Archivo Descripción del cambio
browser/themes/pinstripe/browser/tabbrowser/tabDragIndicator.png Se removieron los pixeles blancos superfluos de los bordes, por lo tanto la imagen es más pequeña. Puede o no afectar a otros temas Mac que lo usen.
browser/themes/pinstripe/browser/browser.css .tabbrowser-tab[first-tab="true"] > .tab-image-left ya no tiene un margin-left. En vez de eso .tabs-left now displayed and given the same width as the former margin-left. It was already done this way in Winstripe.
-
-
-
-

Cambios en browser

-
-
-

Cambios en global

-
-

En todas las plataformas

-

El fondo amarillo para la barra de dirección es obsoleto; en lugar de ello, los temas deben darle formato al nuevo elemento #identity-box dependiendo de su clase verifiedDomain/verifiedIdentity.

-

El botón Ir ahora está localizado dentro de la barra de dirección, por lo tanto su imagen (chrome://browser/skin/Go-arrow.png) tiene que ser más pequeña. El código requerido para mostrar y ocultar el botón Ir y otros iconos de la barra de dirección es:

-
#urlbar[pageproxystate="invalid"] > #urlbar-icons > :not(#go-button) ,
-#urlbar[pageproxystate="valid"] > #urlbar-icons > #go-button {
-  visibility: collapse;
-}
-
-
-
Imágenes agregadas
-

Agrega las siguientes imágenes:

-
chrome://global/skin/icons/information-16.png
Utilizada cuando se presentan avisos de información.
chrome://global/skin/icons/warning-16.png
Utilizada cuando de muestran alertas.
-
-
Imágenes eliminadas
-

Las siguientes imágenes fueron eliminadas:

-
chrome://mozapps/skin/extensions/question.png
Ya no es utilizada.
-
-
-

En Mac OS X

-

Los temas de Mac OS X para Firefox 3 deben agregar estas dos clases al final del archivo chrome://global/skin/wizard.css:

-
.wizard-buttons-btm {
-  padding: Xpx;
-}
-
-.wizard-label-box {
-  display: none;
-}
-
-

El valor numérico de X, el número de pixeles de relleno (padding) en .wizard-buttons-btm, debe ser el mismo valor que el de el margen para .wizard-buttons-box-2.

- -
-
-
-

Cambios en mozapps

-
-
-

Vea también

-
-
-
-
- diff --git "a/files/es/cat\303\241logo/algoritmo_frecency/index.html" "b/files/es/cat\303\241logo/algoritmo_frecency/index.html" deleted file mode 100644 index d533b36402..0000000000 --- "a/files/es/cat\303\241logo/algoritmo_frecency/index.html" +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Algoritmo Frecency -slug: Catálogo/algoritmo_frecency -tags: - - Desarrollo Mozilla - - Lugares - - Places - - extensiones -translation_of: Mozilla/Tech/Places/Frecency_algorithm ---- -

-

Frecency es una puntuación dada a cada URI único en Places, comprendiendo marcadores, histórico y etiquetas. Esta puntuación está determinada por la cantidad de re-visitas, el tipo de esas visitas, cuanto de recientes han sido y si el URI se ha añadido como marcador o se le ha etiquetado.

-

La palabra "frecency" viene de la combinación de las palabras en inglés "frequency" (frecuencia) y "recency" (reciente).

- -

El proceso de cálculo de frecency

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Para las 10 visitas más recientes (donde 10 está determinado por places.frecency.numVisits):
.. Determinar el porcentaje de bonus por el tipo de visita (ej. el "tipo de transición"):
.... 0 (places.frecency.embedVisitBonus)
.... 120 (places.frecency.linkVisitBonus)
.... 200 (places.frecency.typedVisitBonus)
.... 140 (places.frecency.bookmarkVisitBonus)
.... 0 (places.frecency.downloadVisitBonus)
.... 0 (places.frecency.permRedirectVisitBonus)
.... 0 (places.frecency.tempRedirectVisitBonus)
.... 0 (places.frecency.defaultVisitBonus)
 
.. Determinar el peso, basado en cómo fueron de recientes las visitas:
.... 100 (places.frecency.firstBucketWeight, 4 días de tamaño de contenedor, en places.frecency.firstBucketCutoff)
.... 70 (places.frecency.secondBucketWeight, 14 días de tamaño de contenedor, en places.frecency.secondBucketCutoff)
.... 50 (places.frecency.thirdBucketWeight, 31 días de tamaño de contenedor, en places.frecency.thirdBucketCutoff)
.... 30 (places.frecency.fourthBucketWeight, 90 días de tamaño de contenedor, en places.frecency.fourthBucketCutoff)
.... 10 (places.frecency.defaultBucketWeight, tamaño de contenedor en places.frecency.defaultBucketCutoff)
 
.. Puntos para cada muestra de visita = (bonus / 100,0) * peso
 
La puntuación frecency final para URI visitadas = límite_máximo(contador total de visitas * suma de puntos para las visitas de la muestra / número de visitas de la muestra)
-

Ejemplo

-

Este ejemplo de cálculo de frecency de un URI que ha sido añadido a marcadores y recientemente ha sido visitado dos veces (una vez ayer, y otra vez la semana pasada haciendo clic en un enlace), y otras dos veces hace más de 90 días:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0Puntuación por defecto
+140100 * (140/100,0) - Primer contenedor por peso y bonus por marcador
+8470 * (120/100,0) - Segundo contenedor por peso y bonus por seguir el enlace
+1410 * (140/100,0) - Quinto contenedor por peso y bonus por marcador
+1410 * (140/100,0) - Quinto contenedor por peso y bonus por marcador
-- 
252(4 * 252 / 4) - Puntuación frecency final
-

Notas

- -

Notas para los desarrolladores

-

Aquí hay varias notas del desarrollo que puedes leer sobre Places y que pueden ofrecer perspectivas adicionales:

- -

Historia

- -

diff --git "a/files/es/cat\303\241logo/direcciones_web_consultas_places/index.html" "b/files/es/cat\303\241logo/direcciones_web_consultas_places/index.html" deleted file mode 100644 index e1f3cbb628..0000000000 --- "a/files/es/cat\303\241logo/direcciones_web_consultas_places/index.html" +++ /dev/null @@ -1,345 +0,0 @@ ---- -title: Direcciones web de consultas Places -slug: Catálogo/Direcciones_web_consultas_Places -tags: - - Firefox - - Firefox Desktop - - Guía - - Herramientas - - Intermedio -translation_of: Mozilla/Tech/Places/Places_query_URIs ---- -

- -

Este artículo describe los parámetros que se pueden usar al crear direcciones web del tipo place. Estas direcciones web ejecutan consultas Places.

- -

Se puede usar una dirección web del tipo place como marcador. Por ejemplo, desde la biblioteca de Firefox se puede ir a Otros marcadores, luego hacer clic en el botón Organizar y luego elegir Nuevo marcador… En el campo Dirección se puede ingresar una dirección web del tipo place para crear una consulta. Una vez creado esta carpeta de marcador inteligente, se puede arrastrar el mismo a la barra de direcciones y soltarlo allí, para que, al hacerle clic, aparezca un menú desplegable conteniendo los resultados de dicha consulta.

- -

La siguiente dirección web del tipo place es la que se usa en el marcador inteligente Más visitadas, el cual pertenece al conjunto de marcadores inteligentes creados al comenzar a usar Firefox 3:

- -
place:queryType=0&sort=8&maxResults=10
-
- -

Los parámetros usados en esta consulta son:

- -
-
queryType=0
-
Esto indica que la consulta debería tener en cuenta sólo el historial del usuario y no los marcadores.
-
sort=8
-
El parámetro sort indica que los resultados de la consulta deben ser mostrados en el orden numérico inverso, según la cantidad de visitas. En otras palabras, las páginas más visitadas deberían aparecer primero, y las páginas menos visitadas, últimas.
-
maxResults=10
-
Este parámetro especifica que se tiene que mostrar un máximo de 10 resultados en la consulta.
-
- -

Si se quiere cambiar esta consulta para que sólo se tenga en cuenta las visitas de hoy, entonces se puede cambiar a:

- -
place:queryType=0&sort=8&maxResults=10&beginTimeRef=1&beginTime=0
-
- -

Estos son los nuevos parámetros agregados acá:

- -
-
beginTimeRef=1
-
Indica que el parámetro beginTime que sigue se refiere a la medianoche de hoy.
-
beginTime
-
Especifica la cantidad de tiempo, en microsegundos, desde la medianoche en la que se comenzó a registrar las visitas. Al especificar 0 como valor, se indica que se quiere tener en cuenta todas las visitas ocurridas hoy.
-
- -

Parámetros de consulta

- -

Esta es una lista de los parámetros disponibles para usar.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParámetroTipoDescripción
beginTimeunsigned longEl tiempo, en microsegundos, del resultado más antiguo.
beginTimeRefunsigned longIndica el tiempo de referencia especificado en beginTime: -
-
0
-
El "Tiempo Unix", contando a partir del 1º de enero de 1970, con huso horario GMT/UTC. Este es el valor predeterminado.
-
1
-
Este tiempo es relativo a la última medianoche. Esto es útil para consultas relacionadas al día de hoy.
-
2
-
Este tiempo es relativo a ahora mismo.
-
-
endTimeunsigned longLa hora, en microsegundos, del último resultado.
endTimeRefunsigned longIndica el tipo de referencia especificado en endTime. Los valores son los mismos que para beginTime.
termscadenaEl término a consultar.
minVisitslongFiltra resultados basados en el mínimo número de visitas. Especificar -1 (el valor predeterminado) para mostrar todos los resultados, o cualquier otro número para incluir sólo los resultados con una cantidad mayor de visitas al valor ingresado.
maxVisitslongFiltra resultados basados en el máximo número de visitas. Sólo los elementos que hayan sido visitados menos veces que el número ingresado serán incluidos en los resultados. Especificar -1 (el valor predeterminado) para no filtrar.
onlyBookmarkedlógicoSi el valor es true, entonces sólo los elementos en marcadores serán incluidos en los resultados.
domainIsHostlógicoSi el valor es true, entonces el dominio domain debe ser una coincidencia exacta. De lo contrario, todo lo que termine en domain es considerado una coincidencia.
domaincadenaConsulta por elementos que coincidan con este servidor o nombre de dominio. Ver el parámetro domainIsHost para más información.
foldercadenaLa carpeta a consultar. Puede ser una de las siguientes: -
-
PLACES_ROOT
-
La carpeta raíz de Places.
-
BOOKMARKS_MENU
-
El menú Marcadores.
-
TOOLBAR
-
La barra de marcadores.
-
TAGS
-
Etiquetas
-
UNFILED_BOOKMARKS
-
Otros marcadores
-
-
!annotationlógicoIndica si incluir o rechazar elementos que coincidan la anotación especificada por annotation. Si el valor es true, entonces los elementos que no tengan la anotación especificada serán rechazados.
annotationcadenaLa anotación a coincidir al consultar.
uricadenaLa dirección web a consultar.
uriIsPrefixlógicoSi el valor es false, entonces la uri debe ser una coincidencia exacta; este es el valor predeterminado. Si el valor es true, entonces cualquier entrada que comience con la dirección web especificada, será considerada una coincidencia.
tag cadena.
!tags ..
- -

Operadores de consulta

- -

Los siguientes atributos permiten controlar los resultados con más precisión.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OperadorTipoDescripción
OR Este es el operador lógico OR ["O"].
applyOptionsToContainers  
excludeItemIfParentHasAnnotation Obsoleto Gecko 13.0cadenaLos elementos cuyas raíces tengan este valor como anotación, son rechazadas de los resultados de la consulta. Este parámetro es ignorado para consultas sobre el historial. Por ejemplo, se pueden rechazar entradas de marcadores dinámicos especificando livemark/[dirección de la fuente web] acá.
excludeItemslógicoSi el valor es true, entonces todas las direcciones web y separadores son rechazados de los resultados de la consulta de marcadores, así sólo se muestran las carpetas y las consultas. Si el valor es false, entonces se muestran todos los elementos; este es el valor predeterminado.
excludeQuerieslógicoSi el valor es true, entonces las consultas son rechazadas de los resultados; sin embargo, las consultas de carpetas individuales como la carpeta de marcadores symlinks todavía serán incluidas. El valor predeterminado false indica que las consultas deberían ser incluidas en los resultados.
excludeReadOnlyFolderslógicoSi el valor es true, entonces las carpetas de sólo lectura serán rechazadas de los resultados. Esto sólo afecta en los casos en los cuales el nodo de resultados de la carpeta actual aparece en su carpeta anterior. El valor predeterminado es false.
expandQuerieslógicoSi el valor es true, entonces las direcciones web place aparecerán como contenedores en los resultados, con los contenidos rellenados con la consulta guardada. Esto no hace nada si excludeQueries tiene como valor true. El valor predeterminado es false, lo cual provoca que las direcciones web place aparezcan como elementos normales.
group  
includeHiddenlógicoSi el valor es true, entonces los elementos que normalmente se ocultarían en una consulta del historial (como el contenido de iframes así también como imágenes) son incluidos en los resultados. El valor predeterminado es false.
maxResultsunsigned longEl número máximo de resultados para aparecer. Esto no funciona al ordernar por título. El resultado es 0, lo que significa que se muestran todos los resultados.
originalTitlecadenaRecupera el título original de la página.
queryTypeunsigned shortEl tipo de búsqueda para usar al consultar la base de datos. Este atributo se tiene en cuenta por nodos de consulta. Es ignorado para consultas de carpeta individual. -
-
0
-
Historial
-
1
-
Marcadores
-
2
-
Tanto historial como marcadores (No implementado aún -- ver error 378798)
-
-
resolveNullBookmarkTitleslógicoSi el valor es true, entonces los marcadores con títulos en blanco, recuperarán sus títulos desde el historial, de ser posible. Esto no aplica a marcadores con títulos vacíos. El valor predeterminado es false.
showSessionslógicoSi el valor es true, entonces la información de sesión es usada para agrupar elementos del historial. Esto sólo hace diferencia al ordenar por fecha. El valor predeterminado es false.
sortunsigned shortEl orden para usar en los resultados. -
-
0
-
Orden original del marcador
-
1
-
Ordenado por título, de la A a la Z
-
2
-
Ordenado por título, de la Z a la A
-
3
-
Ordenado por fecha de visita, lo más reciente a lo último
-
4
-
Ordenado por fecha de visita, lo más reciente primero
-
5
-
Ordenado por dirección web, de la A a la Z
-
6
-
Ordenado por dirección web, de la Z a la A
-
7
-
Ordenado por cantidad de visitas, ascendiente
-
8
-
Ordenado por cantidad de visitas, descendiente
-
9
-
Ordenado por palabra clave, de la A a la Z
-
10
-
Ordenado por palabra clave, de la Z a la A
-
11
-
Ordenado por fecha agregada, lo más reciente a lo último
-
12
-
Ordenado por fecha agregada, lo más reciente primero
-
13
-
Ordenado por última fecha modificada, lo más reciente a lo último
-
14
-
Ordenado por última fecha modificada, lo más reciente primero
-
17
-
Ordenado por etiquetas, ascendiente
-
18
-
Ordenado por etiquetas, descendiente
-
19
-
Ordenado por anotación, ascendiente
-
20
-
Ordenado por anotación, descendiente
-
-
sortingAnnotationcadenaLa anotación para usar al ordenar por anotación.
typeunsigned shortEl tipo de resultados a mostrar. -
-
0
-
Resultados como direcciones web (resultados "URI", uno por cada dirección web visitada en el rango)
-
1
-
Resultados como visitas (resultados "visita", con uno por cada vez que una página fue visitada - esto devolverá frecuentemente múltiples resultados para una misma dirección web)
-
2
-
Resultados como visitas totales (como en "visita", pero muestra todos los atributos para cada resultado)
-
3
-
Resultados como consulta de fecha (muestra resultados para un rango de fechas dado)
-
4
-
Resultados como consulta de sitio (muestra la última visita para cada dirección web en un servidor dado)
-
5
-
Resultados como consulta de fecha+sitio (muestra la lista de servidores visitados en un período dado)
-
6
-
Resultados como consulta de etiqueta (muestra una lista de marcadores con una etiqueta dada)
-
7
-
Resultados como contenedores de etiquetas (muestra marcadores con una etiqueta dada; para la misma dirección web usa la última modificada - el atributo folder=tag_folder_id tiene que estar presente en la consulta.)
-
-
- -

Ver también

- - - -

diff --git "a/files/es/cat\303\241logo/index.html" "b/files/es/cat\303\241logo/index.html" deleted file mode 100644 index c974d2f749..0000000000 --- "a/files/es/cat\303\241logo/index.html" +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Catálogo -slug: Catálogo -tags: - - Catálogo - - Complementos - - Todas_las_Categorías - - extensiones -translation_of: Mozilla/Tech/Places ---- -

 

-

-

Catálogo (Places) es el sistema de administración de Historial y de Marcadores introducido en Firefox 3. Ofrece mejoras en flexibilidad y consultas complejas para hacer el manejo de los lugares que el usuario visita, más fácil y cómodo. También incluye nuevas características como el almacenamiento de favicons y la capacidad de apuntar páginas con información arbitraria. También introduce un nuevo interfaz de usuario para manejar esa información; ver Places en el Mozilla wiki.

-

Places almacena sus datos en una base de datos SQLite usando el interfaz mozStorage.

- -

Documentación

Guía para la migración a catálogo
Migrando el código existente para usar el API catálogo.
Manipular marcadores usando el catálogo
Ejemplos de cómo trabajar con Marcadores usando el API Catálogo.
Usar el servicio de pestañas del catálogo
Cómo usar el servicio de pestañas.
Usar el servicio de historial del catálogo
Cómo acceder a la información de historia usando el API Catálogo.
Usar el servicio de favicon del catálogo
Cómo manipular favicons usando el API Catálogo.
Usar el servicio de marcadores dinámicos del catálogo
Cómo crear y manejar marcadores dinámicos.
Usar el servicio de anotaciones del catálogo
Cómo trabajar con el servicio de anotaciones.
Consultar el catálogo
Cómo hacer consultas de los marcadores y el historial con parámetros específicos.
Obtener parte del árbol de marcadores
Cómo buscar una sección del árbol de marcadores usando consultas.
Presentar información del catálogo utilizando vistas
Cómo usar las vistas Catálogo para presentar datos del catálogo en tu propia aplicación o extensión.
Utilidades JavaScript para el catálogo
Una librería de rutinas útiles que te harán más fácil trabajar con Catálogo.

Ver todo...

Documentos de diseño

La base de datos del catálogo
Una visión general del diseño de la base de datos del catálogo.
Diseño del servicio de historial
Diseño del Servicio de Historial.
Diseño del servicio de marcadores
Diseño del Servicio de Marcadores.
Diseño del servicio de anotaciones
Diseño del Servicio de Historial.
El algoritmo de frecuencia del catálogo
El algoritmo detrás de la barra de direcciones del catálogo (a veces llamada "awesomebar").
-

 

- -

diff --git a/files/es/como_crear_un_microresumen/index.html b/files/es/como_crear_un_microresumen/index.html deleted file mode 100644 index 0ff12e5cdc..0000000000 --- a/files/es/como_crear_un_microresumen/index.html +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: Como crear un Microresumen -slug: Como_crear_un_Microresumen -tags: - - Microresúmenes -translation_of: Archive/Mozilla/Creating_a_microsummary ---- -

Un generador de microresúmenes es un conjunto de instrucciones orientadas a crear un microresumen del contenido de una página. Una página web puede referenciar los generadores correspondientes mediante el uso de etiquetas <link rel="microsummary"> en la sección <head>. O también se pueden descargar e instalar independientemente, por iniciativa del usuario, si cada generador incluye una lista de páginas a las que sea aplicable.

-

En este tutorial vamos a crear un generador de microresumen para la página inicio de Spread Firefox que se encargue de mostrar el número actual de descargas, junto al texto "descargas de Fx". Por ejemplo: 174475447 descargas de Fx.

-

Para ello, ante todo, construiremos la hoja XSLT de transformación que convierte la página web en un microresumen; luego veremos cómo especificar que el generador sea aplicable a esa página, y por último aprenderemos cómo publicar el generador para su descarga e instalación.

-

Durante la construcción de la hoja XSLT, lo que se añade en cada paso se muestra en negrita, para facilitar el seguimiento del proceso.

-

Comienzo

-

Un generador se expresa como un documento XML cuyo nodo raíz es <generator> (en el namespace http://www.mozilla.org/microsummaries/0.1). Para construir un generador, hay que empezar por crear un fichero de texto vacío y añadir la declaración XML y un nodo <generator> vacío:

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1">
-</generator>
-
-

Poner nombres

-

Un generador debe tener atributos name con las descripciones arbitrarias de los microresúmenes creados. Un nombre debe ser lo bastante descriptivo para dar al usuario final una idea fiel de la información incluida en el microresumen.

-

Dado que nuestro generador va a crear microresúmenes que muestran el número de descargas de Firefox, le llamaremos "Conteo de descargas de Firefox":

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1"
-           name="Conteo de descargas de Firefox">
-</generator>
-
-

Incluir una hoja XSLT de transformación

-

Cada generador debe incluir una hoja XSLT de transformación (también llamadas hojas de estilo XSLT) que transforme el contenido de la página en un microresumen. XSLT es un potente lenguaje para transformar documentos: Sirve para producir diversas presentaciones de la misma información.

-

Para incluir la hoja XSLT en el generador hay que usar un elemento <template>:

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1"
-           name="Conteo de descargas de Firefox">
-  <template>
-    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
-    </transform>
-  </template>
-</generator>
-
-

Obsérvese que aunque el generador puede incluir código XSLT arbitrario (inclusive generación de texto enriquecido), por el momento Firefox sólo muestra el texto plano de la salida XSLT.

-

Especificar el formato de salida

-

Dado que la hoja XSLT va a generar un microresumen en formato texto plano, hay que indicarlo usando la etiqueta XSLT <output>:

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1"
-           name="Conteo de descargas de Firefox">
-  <template>
-    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
-      <output method="text"/>
-    </transform>
-  </template>
-</generator>
-
-

Usar un sólo nodo <template> en la hoja XSLT

-

El procesador XSLT (incluido en el navegador) transforma los documentos buscando en la hoja XSLT el nodo <template> que mejor se adapte a cada nodo del documento procesado. Cuando lo encuentra, realiza en el nodo procesado las transformaciones incluidas en el <template> elegido.

-

Este mecanismo es bastante potente, pues permite recorrer el árbol entero del documento procesado y generar salida (recursivamente) basándose en la estructura del documento. sin embargo, para la finalidad de generar un microresumen para la página Spread Firefox, se necesita tan sólo un nodo <template> que referencie el nodo raíz del documento (/) y lo procese de una sóla vez:

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1"
-           name="Conteo de descargas de Firefox">
-  <template>
-    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
-      <output method="text"/>
-      <template match="/">
-      </template>
-    </transform>
-  </template>
-</generator>
-
-

Incluir el conteo de descargas

-

Para incluir el conteo de descargas en la salida de la hoja XSLT, hay que usar la etiqueta XSLT <value-of>, especificando en el atributo select una ruta XPATH que apunte al nodo que contiene el conteo.

-

XPATH es un lenguage de identificación de nodos en documentos XML/HTML. También contiene algunas funciones básicas para manipular los nodos y sus contenidos. La forma más sencilla de formular una expresión XPATH que apunte al nodo en cuestión es usando la Extensión de chequeo de XPATH, de esta manera:

-
    -
  1. Instalar la extensión de chequeo de XPATH (si no está ya instalada), reiniciando después Firefox para completar la instalación.
  2. -
  3. Visitar la página Spread Firefox.
  4. -
  5. Buscar el conteo de descargas (a fecha actual está casi abajo del todo, a la derecha, bajo el título "Firefox downloads").
  6. -
  7. Pulsar con el botón derecho sobre el número.
  8. -
  9. Y seleccionar View XPath en el menú contextual.
  10. -
-

El chequeador de XPATH abre entonces una nueva ventana con un campo XPath que contiene la ruta XPATH que apunta al nodo seleccionado, y que a la fecha de hoy es: id('download-count').

-

Bien, pues basta con añadir a nuestro <template> una etiqueta <value-of> con un atributo select con la ruta XPATH encontrada:

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1"
-           name="Conteo de descargas de Firefox">
-  <template>
-    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
-      <output method="text"/>
-      <template match="/">
-        <value-of select="id('download-count')"/>
-      </template>
-    </transform>
-  </template>
-</generator>
-
-

Incluir texto

-

Para incluir en el microresumen el texto "Descargas de Fx", hay que usar una etiqueta XSLT <text> que contenga el texto deseado.

-

Añadir al <template> un nodo <text> que contenga el texto "Descargas de Fx":

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1"
-           name="Conteo de descargas de Firefox">
-  <template>
-    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
-      <output method="text"/>
-      <template match="/">
-        <value-of select="id('download-count')"/>
-        <text>Descargas de Fx</text>
-      </template>
-    </transform>
-  </template>
-</generator>
-
-

Obsérvese que el espacio blanco (espacios, tabuladores, saltos de línea) entre etiquetas XSLT no se transmite a la salida de la transformación XSLT (al contrario que en HTML, en que todo el espacio blanco adyacente se traduce a un sólo espacio), así es que si se desea que aparezca algún espacio en blanco, para que el texto quede separado del conteo, hay que incluirlo dentro de la etiqueta <text>.

-

Y con esta pequeña adición, ya hemos terminado de escribir la hoja de transformación XSLT necesaria para convertir la página de inicio de Spread Firefox en un microresumen.

-

Especificar la página de aplicación del microresumen

-

Una vez completa la hoja de transformación, hay que especificar a qué página se aplica. Si fuéramos los administradores del sitio Srpead Firefox, nos bastaría con editar la página inicial e incluir en la sección head una etiqueta <link> para referenciar a nuestro generador:

-
<head>
-  ...
-  <link rel="microsummary" href="ruta/de/nuestro/generador.xml">
-</head>
-
-

Pero como no somos administradores de ese sitio web, tenemos que especificar la página de aplicación dentro del propio generador, y luego publicarlo para que se pueda descargar e instalar. Para especificar la página de aplicación hay que usar una etiqueta <pages> dentro del nodo <generator>:

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1"
-           name="Conteo de descargas de Firefox">
-  <template>
-    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
-      <output method="text"/>
-      <template match="/">
-        <value-of select="id('download-count')"/>
-        <text> descargas de Fx</text>
-      </template>
-    </transform>
-  </template>
-  <pages>
-  </pages>
-</generator>
-
-

La etiqueta <pages> puede contener tantos nodos <include> y <exclude> como páginas a las cuales el generador se puede aplicar o no, respectivamente.

-

Para permitir que el generador se pueda aplicar a una página, hay que añadir un nodo <include> cuyo contenido sea una expresión regular que defina las páginas deseadas. Y para impedir que el generador se pueda aplicar a una página, hay que añadir un nodo <exclude> con una expresión regular que defina las páginas no deseadas.

-

El comportamiento por defecto de un generador es que no es aplicable a ninguna página, de modo que hay que listar explícitamente las páginas deseadas, y no es necesario listar las páginas no deseadas (a menos que se hayan incluido previamente).

-

Añadamos, pues, una etiqueta <include> para referenciar la página de Spread Firefox:

-
<?xml version="1.0" encoding="ISO-8859-1"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1" name="Conteo de descargas de Firefox">
-  <template>
-    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
-      <output method="text"/>
-      <template match="/">
-        <value-of select="id('download-count')"/>
-        <text> descargas de Fx</text>
-      </template>
-    </transform>
-  </template>
-  <pages>
-    <include>http://(www\.)?spreadfirefox\.com/(index\.php)?</include>
-  </pages>
-</generator>
-
-

Nótese que la dirección incluida ha de estar escrita como expresión regular.

-

Publicar el generador para ser descargado

-

Ahora que el generador está definido y tiene una dirección de aplicación especificada, lo único que queda por hacer es publicarlo para su descarga: Para ello, hay que subirlo a la web y crear en algún lado un enlace de JavaScript que llame al método de FireFox window.sidebar.addMicrosummaryGenerator(), que se encarga de descargar e instalar el generador.

-

Por ejemplo: Si publicamos el generador en la web en http://people.mozilla.com/~myk/micro...-generator.xml, y queremos que los usuarios lo puedan descargar desde http://people.mozilla.com/~myk/micro...ial/index.html, tendremos que añadir el siguiente código a dicha página index.html:

-
<a href="javascript:window.sidebar.addMicrosummaryGenerator('http://people.mozilla.com/~myk/microsummaries/tutorial/sfx-generator.xml')">Instalar el microresumen de Spread Firefox</a>
-
-

Al pinchar en tal link se producirá un error JavaScript en los navegadores que no soporten microresúmenes, así es que para evitarlo lo mejor es comprobar a priori si el navegador actual soporta microresúmenes, y mostrar un mensaje aclaratorio en caso contrario:

-
<script>
-  const warning = "Se siente: Para descargar e instalar generadores de microresúmenes se necesita un navegador ad hoc, como Firefox 2.0.";
-  function addGenerator(url) {
-    if (typeof window.sidebar == "object" &&
-        typeof window.sidebar.addMicrosummaryGenerator == "function")
-      window.sidebar.addMicrosummaryGenerator(url);
-    else
-     alert(warning);
-  }
-</script>
-<a href="javascript:window.sidebar.addMicrosummaryGenerator('http://people.mozilla.com/~myk/microsummaries/tutorial/sfx-generator.xml')">Instalar el microresumen de Spread Firefox</a>
-
-

Conclusión

-

Ya debemos tener un generador de microresúmenes que muestra el nùmero actual de descargas de Firefox. Tras instalarlo, añadir a los Marcadores la página Spread Firefox, y seleccionar el microresumen del menú Summary en el cuadro de diálogo de "Añadir marcador".

-

Para más información sobre microresúmenes, ver la página de Microresúmenes

diff --git a/files/es/components.utils.import/index.html b/files/es/components.utils.import/index.html deleted file mode 100644 index 66f32f06e1..0000000000 --- a/files/es/components.utils.import/index.html +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Components.utils.import -slug: Components.utils.import -tags: - - NeedsContent - - XPConnect - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Language_Bindings/Components.utils.import ---- -

- -

Este método fue introducido en Firefox 3 y es usado para compartir código entre diferentes alcances(scopes) de forma sencilla. Por ejemplo, puedes importar XPCOMUtils.jsm para evitar copiar y pegar grandes porciones comunes de código de registración de componentes XPCOM en tus archivos de compomentes.

- -
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
- -

Para documentación mira Usando módulos de código JavaScript.

- -

Diferencias con mozIJSSubScriptLoader

- -

Las diferencias con mozIJSSubScriptLoader son:

- - - -

Recursos Adicionales

- - diff --git a/files/es/consola_de_errores/index.html b/files/es/consola_de_errores/index.html deleted file mode 100644 index 24db971c23..0000000000 --- a/files/es/consola_de_errores/index.html +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Consola de errores -slug: Consola_de_errores -tags: - - Desarrollo web - - 'Desarrollo_Web:Herramientas' - - 'Extensiones:Herramientas' - - Herramientas - - JavaScript - - 'JavaScript:Herramientas' - - extensiones - - para_revisar -translation_of: Archive/Mozilla/Error_console ---- -

 

-

La Consola de errores es una herramienta disponible en la mayoría de las aplicaciones basadas en Mozilla que se utiliza para informar de errores en el chrome de la aplicación y en las páginas web que abre el usuario. En ella se informa sobre errores y avisos relacionados con JavaScript, errores de CSS y mensajes arbitrarios procedentes del código de chrome.  En Firefox, la Consola de errores se puede abrir desde el menú Herramientas o presionando Ctrl-Shift-J.

-
-

-Gecko 2.0 note -
(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)
-

-

La Consola de errores está deshabilitada de manera predeterminada en Firefox 4. Puedes volver a habilitarla cambiando la preferencia devtools.errorconsole.enabled a true y reiniciando el navegador.

-
-

Para obtener información sobre qué excepciones JavaScript se registran en la Consola de errores y cómo hacer que todas las excepciones se registren también, lee el artículo Excepción al iniciar sesión en JavaScript . Consulta Configuración del entorno de desarrollo de extensiones#Preferencias de desarrollo para conocer las preferencias que se deben establecer si se desea ver los errores de Firefox y las extensiones de la Consola de errores.

-

Antes de Gecko 1.8.1 (Firefox 2), se llamaba Consola JavaScript (ver error 265.871).

- - - - - - - -
-

Tipos de errores

-
-
- Error
-
- suele ser un error de sintaxis que evita que el programa se compile.
-
-
-
- Advertencia
-
- por lo general permite que el programa se compile, pero advierte sobre una mala codificación y sugiere fallas de diseño.
-
-
-
- Mensaje
-
- muy similar a la advertencia, se utiliza muy poco.
-
-

Manipulación de los datos mostrados en la Consola de errores

-

A través del servicio de la Consola se puede acceder a la información que se muestra en la Consola de errores y manipularla.

-

Las extensiones pueden escribir en la Consola de errores desde JavaScript utilizando Components.utils.reportError, o si te sientes cómodo con el registro en la consola que proporciona el sistema operativo, dump().

-

Para abrir la Consola de errores dentro de una ventana del navegador o del correo, utiliza la función toJavaScriptConsole() .

-
-

Alternativas

-
-
- Consola 2
-
- Esta extensión proporciona un sustituto para la Consola de errores, corrigiendo muchos de sus errores e implementando solicitudes de mejora que se pedían desde hacía tiempo.
-
-
-
- Firebug
-
- La extensión para Firefox también integra la Consola de errores con varias mejoras .
-
- -
-
- JavaScript , CSS , Desarrollo we
-
-
-

 

diff --git "a/files/es/creaci\303\263n_de_componentes_xpcom/index.html" "b/files/es/creaci\303\263n_de_componentes_xpcom/index.html" deleted file mode 100644 index 036df7b989..0000000000 --- "a/files/es/creaci\303\263n_de_componentes_xpcom/index.html" +++ /dev/null @@ -1,274 +0,0 @@ ---- -title: Creación de Componentes XPCOM -slug: Creación_de_Componentes_XPCOM -tags: - - Todas_las_Categorías - - XPCOM - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Guide/Creating_components ---- -

-

Siguiente »

-

- -

Prefacio

- -
-
Quién debe leer este libro
-
Organización del tutorial
-
Continuando con los ejemplos
-
Convenciones
-
Agradecimientos
-
- -

Un vistazo a XPCOM

- -
-
La Solución XPCOM
-
Gecko
-
Componentes
-
Interfaces -
-
Interfaces y encapsulamiento
-
La interfaz base nsISupports
-
-
-
Identificadores XPCOM -
-
CID
-
Contract ID
-
-
-
Factorías -
-
XPIDL y bibliotecas de tipos
-
-
-
Servicios de XPCOM
-
Tipos de XPCOM -
-
Tipos de métodos
-
Cuenta de referencias
-
Códigos de estatus
-
Correlaciones variables
-
Códigos de errores comunes de XPCOM
-
-
-
- -

Uso de componentes XPCOM

- -
-
Ejemplos de componentes - -
-
Manejador de cookies
-
El componente WebBrowserFind
-
El componente WebLock
-
-
-
Uso de componentes en Mozilla -
-
Localizar los componentes de Mozilla
-
Usar componentes XPCOM en tu CPP
-
XPConnect: Usar componentes XPCOM desde un Script
-
-
-
- -

Interior del Componente

- -
-
Creación de componentes en C++
-
Inicio de XPCOM -
-
Registro de manifiestos de XPCOM
-
Métodos de registro en XPCOM
-
Autoregistro
-
El proceso de paro
-
Tres partes de una biblioteca de componentes XPCOM
-
-
-
XPCOM Glue -
-
La biblioteca Glue
-
Clases de cadenas de XPCOM
-
-
-
- -

Creación del código del componente

- -
-
En lo que trabajaremos
-
Registro de componentes -
-
El Programa regxpcom
-
Alternativas de registro
-
-
-
Vistazo del código fuente del módulo WebLock
-
Adentrándonos: inclusiones y constantes requeridas -
-
Identificadores en XPCOM
-
Programando el proceso de registro
-
Métodos de Registro
-
Creación de una instancia del componente
-
-
-
webLock1.cpp
-
- -

Usar utilidades de XPCOM para facilitar el proceso

- -
-
Macros XPCOM - -
-
Macros de módulos XPCOM genéricos
-
Macros comunes de implementación
-
Macros de declaración
-
-
-
webLock2.cpp
-
Clases de cadenas en XPCOM -
-
Implementando cadenas
-
nsEmbedString y nsEmbedCString
-
-
-
Punteros inteligentes
-
- -

Iniciando WebLock

- -
-
Llamado al arrancar - -
-
Registro para notificaciones
-
Obtener acceso al manejador de categorías
-
-
-
Suministro de acceso a WebLock
-
Crear la interfaz de programación WebLock
-
Definir la interfaz WebLock en XPIDL -
-
Sintaxis XPIDL
-
Interfaces programables
-
Subclasificar nsISupports
-
Interfaz Web Locking
-
-
-
Implementación de WebLock -
-
Macros de Declaración
-
Representación de Valores Devueltos en XPCOM
-
Generación del Código XPIDL
-
Obtención del Servicio WebLock Service desde un Cliente
-
Implementación de la Interfaz iWebLock
-
El Servicio Directorios
-
Modificar Rutas con nsIFile
-
Manipulación de Archivos con nsIFile
-
Usar nsILocalFile para leer información
-
Processing the White List Data
-
-
-
iWebLock método por método -
-
Lock y Unlock
-
AddSite
-
RemoveSite
-
SetSites
-
GetNext
-
GetSites
-
HasMoreElements
-
-
-
- -

Finishing the Component

- -
-
Using Frozen Interfaces - -
-
Copying Interfaces Into Your Build Environment
-
Implementing the nsIContentPolicy Interface
-
Receiving Notifications
-
-
-
Implementing the nsIContentPolicy -
-
Uniform Resource Locators
-
Checking the White List
-
Creating nsIURI Objects
-
-
-
- -

Building the WebLock UI

- -
-
User Interface Package List
-
Client Code Overview
-
XUL -
-
The XUL Document
-
The Locking UI
-
Site Adding UI
-
weblock.xul
-
-
-
Overlaying New User Interface Into Mozilla -
-
webLockOverlay.xul
-
-
-
Other Resources -
-
weblock.css
-
Image Resources
-
-
-
- -

Packaging WebLock

- -
-
Component Installation Overview
-
Archiving Resources
-
The WebLock Installation Script
-
The WebLock Trigger Script
-
Distributing Your Component
-
- -

Appendix A - Setting up the Gecko SDK

- -
-
Downloading and Setting the SDK
-
Building a Microsoft Visual Cpp Project -
-
Creating a New Project
-
Adding the Gecko SDK to the Project Settings
-
-
-
A Makefile for Unix
-
- -

Appendix B - Resources

- -
-
WebLock Resources
-
Gecko Resources
-
XPCOM Resources
-
General Development Resources
-
- -

-

Siguiente »

-

- -
-

Copyright (c) 2003 by Doug Turner and Ian Oeschger. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.02 or later. Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder. Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.

-
diff --git "a/files/es/creaci\303\263n_de_componentes_xpcom/un_vistazo_de_xpcom/index.html" "b/files/es/creaci\303\263n_de_componentes_xpcom/un_vistazo_de_xpcom/index.html" deleted file mode 100644 index 49896dabc1..0000000000 --- "a/files/es/creaci\303\263n_de_componentes_xpcom/un_vistazo_de_xpcom/index.html" +++ /dev/null @@ -1,281 +0,0 @@ ---- -title: Un vistazo de XPCOM -slug: Creación_de_Componentes_XPCOM/Un_vistazo_de_XPCOM -tags: - - Todas_las_Categorías - - XPCOM -translation_of: Mozilla/Tech/XPCOM/Guide/Creating_components/An_Overview_of_XPCOM ---- -

Este es un libro acerca de XPCOM. Esta escrito en forma de un tutorial acerca de la creación de componentes XPCOM, pero cubre la mayoría de los aspectos, conceptos y terminología del modelo de componentes XPCOM en el camino.

-

Este capítulo empieza con un tour rápido de XPCOM - una introducción a los conceptos básicos y tecnologías en XPCOM y el desarrollo de componentes. Las secciones principales en este capítulo introducen los conceptos a un nivel muy superficial, así que podremos discutirlos y usarlos con más familiaridad en el tutorial que describe la creación del componente Mozilla llamado Weblock.

-

La Solución XPCOM

-

El Modelo Componente Objeto Multiplataforma (XPCOM) es una plataforma que permite a los desarrolladores romper proyectos de software monolíticos en piezas modulares más pequeñas. Estas piezas, conocidas como componentes son ensamblados juntos nuevamente en tiempo de ejecución.

-

El objetivo de XPCOM es permitir a diferentes piezas de software ser desarrolladas y construidas independientes unas de otras. Para permitir interoperabilidad entre componentes dentro de una aplicación, XPCOM separa la implementación de un componente de la interfaz, lo cual discutimos en Interfases. Pero XPCOM también provee muchas herramientas y bibliotecas que habilitan la carga y manipulación de estos componentes, servicios que ayudan al desarrollador a escribir código modular multiplataforma, y soporte para versiones, así que los componentes pueden ser reemplazados o actualizados sin tener que romper o volver a crear la aplicación. Usando XPCOM, los desarrolladores crean componentes que pueden ser reutilizados en diferentes aplicaciones o pueden ser reemplazados para cambiar la funcionalidad de aplicaciones existentes.

-

XPCOM no solamente soporta el desarrollo de componetes de software, también provee gran parte de la funcionalidad de una plataforma de desarrollo, como:

- -

Discutiremos los puntos de arriba a detalle en los siguientes capítulos, pero por ahora, puede ser útil pensar en XPCOM como una plataforma para desarrollo de componentes, en la que la que se incluyen características como las listadas arriba.

-

Gecko

-

Aunque en algunos aspectos es similar a Microsoft COM, XPCOM está diseñado para ser usado primordialmente a nivel de aplicación. El uso más importante de XPCOM es dentro de Gecko, un buscador web embebido de código abierto, que cumple con estándares y un conjunto de herramientas para crear buscadores web y otras aplicaciones.

-

XPCOM se encarga de accesar la funcionalidad de las bibliotecas de Gecko y embeber o extender Gecko. Este libro se enfoca en lo último - extender Gecko - pero las ideas fundamentales en el libro también serán importantes para los desarrolladores que embeban Gecko.

-

Gecko es usado en muchas aplicaciones de internet, la mayoría buscadores. La lista incluye dispositivos como el Gateway/AOL, el Instant AOL y la Nokia Media Terminal. Gecko también se usa en el último cliente Compuserve, AOL para Mac OS X, Netscape 7 y por supuesto el cliente de Mozilla. En este momento, Gecko es el web browser de código abierto predominante.

-

Componentes

-

XPCOM te permite construir un sistema en el que grandes proyectos de software pueden ser fragmentados en piezas más pequeñas. Estas piezas, conocidas como componentes, son normalmente diseñadas en pequeñas y reutilizables bibliotecas binarias(una DLL en Windows, por ejemplo, o una DSO en Unix), que pueden incluir uno o más componentes. Cuando hay dos o más componentes relacionados juntos en una biblioteca binaria, llamamos a la biblioteca módulo.

-

Fragmentar el software en distintos componentes puede ayudar a hacerlo menos difícil de desarrollar y mantener. Más allá de esto, la programación modular basada en componentes tiene ciertas ventajas bien conocidas:

- -
Beneficio Descripción
Reutlizable El código modular puede ser reutilizado en otras aplicaciones y en otros contextos.
Actualizaciones Puedes actualizar componentes sin tener que recompilar toda la aplicación.
Rendimiento Cuando el código es modular, los módulos que no serán usados en seguida pueden ser "cargados durmiendo", o no ser cargados del todo, lo que puede mejorar el rendimiento de tu aplicación.
Mantenimiento Aún cuando no estés actualizando un componente, diseñar tu aplicación de forma modular puede hacerte más fácil encontrar e mantener las partes de la aplicación en que estás interesado.
-

Mozilla tiene más de cuatro millones de líneas de código, y ningún individuo por sí solo entiende el código fuente entero. La mejor forma de afrontar un proyecto de este tamaño es dividirlo en piezas más pequeñas y manejables, usar un modelo de programación basado en componentes y organizar ciertos grupos de componentes en módulos. La biblioteca de red, por ejemplo, consiste en componentes para cada uno de los protocolos, HTTP, FTP y otros, los cuales son armados juntos y enlazados en una sola biblioteca. Esta biblioteca es el módulo de trabajo en red, conocida también como "necko".

-

El componente HTTP en Gecko no expone las clases privadas que usa como componentes separados. El "stuff"

-

The HTTP component in Gecko doesn't expose private classes it uses as separate components. The "stuff" that's internal to the component stays internal, and isn't exposed to XPCOM. In the haste of early Mozilla development, components were created where they were inappropriate, but there's been an ongoing effort to remove XPCOM from places like this.

-

Pero no siempre es buena idea dividir las cosas. Hay algunas cosas en el mundo que sólo trabajan si están juntas y otras que deberían estar separadas. Por ejemplo, el hijo de un autor no se comerá un sandwich de crema de cacahuate si no tiene jamón, porque en este mundo, la crema de cachuate y el jamón forman una unión inseparable (guácala, en México como en muchos lugares no opinamos lo mismo creo que fue un mal ejemplo, pero en fin esto es parte de la traducción y espero se entienda la idea). Con el software es similar. En áreas de código que están estrechamente acopladas en clases que son usadas sólo internamente, por ejemplo, el duro trabajo de dividir las cosas tal vez no sea un esfuerzo vano.

-

El componente HTTP en Gecko no expone las clases privadas que usa como componentes separados. El "material" que es interno del componente permanece interno y no es visible para XPCOM. Por la prisa al inicio del desarrollo de Mozilla, fueron creados componentes donde era inadecuado, pero se ha estado haciendo un grán esfuerzo para quitar XPCOM de estos lugares.

-

Interfaces

-

Generalmente es buena idea dividir el software en componentes, pero ¿Cómo hacer esto exactamente? La idea básica es identificar piezas de funcionalidad que esten relacionadas entre sí y entender cómo se comunican entre ellas. Cuando son definidos los canales de comunicación entre los distintos delimitadores de forma que se encuentran entre componentes y dichos delimitadores son formalizados se llaman interfaces.

-

Las interfaces no son una idea nueva en programación. Todos hemos usado interfaces desde nuestro primer programa "Hola Mundo", donde la interface estaba entre el código que escribimos-el código de la aplicación-y el código de impresión. El código de aplicación usó una interfaz de una biblioteca, stdio para pintar la cadena "Hola Mundo" en la pantalla. La diferencia aquí es que una aplicación "Hola Mundo" en XPCOM encuentra esta pantalla pintando funcionalidad en tiempo de ejecución y nunca tiene que saber acerca de stdio cuando es compilado.

-

Las interfaces permiten a los desarrolladores encapsular la implementación y la lógica interna de su programa y permitir a los clientes ignorar cómo se hacen las cosas y sólo usar el software.

-
-

Interfaces y programación por contrato

-

Una interfaz forma un acuerdo contractual entre componentes y clientes. No hay código que obligue estos acuerdos, pero ignorarlos puede ser fatal. En la programación basada en componentes, un componente garantiza que las interfaces que provee serán inmutables, es decir, proveerán el mismo acceso a los mismos métodos en diferentes versiones del componente, estableciendo un contrato con los clientes que usan el software. A este respecto, la programación basada en interfaces también es llamada programación por contrato.

-
-

Interfaces y Encapsulación

-

Entre delimitadores de componentes, la abstracción es crucial para el mantenimiento y la reutilización del software. Considera, por ejemplo, una clase que no está bien encapsulada; usar un método público de inicialización disponible libremente, como sugiere el ejemplo de abajo puede causar problemas.

-

Inicializacion de AlgunaClase

-
class AlgunaClase
-{
-  public:
-    // Constructor
-    AlgunaClase();
-
-    // Virtual Destructor
-    virtual ~AlgunaClase();
-
-    // init method
-    void Init();
-
-    void HazAlgoUtil();
-};
-
-

Para que este sistema funcione correctamente, el programador del cliente debe prestar mucha atención a todas las reglas que el programador del componente estableció. Este es el acuerdo contractual de esta clase clase no encapsulada: un conjunto de reglas que definen cuando cada método puede ser llamado y cuando se espera que se haga. Una regla puede especificar que HazAlgoUtil puede ser llamado sólo después de una llamada a Init(). El método HazAlgoUtil puede hacer algún tipo de validación para asegurar que la condición de que Init() ha sido llamado, ha sido cumplida.

-

Además de escribir código bien comentado que le diga al desarrollador del cliente las reglas acerca de Init(), el desarrollador puede seguir un par de pasos para hacer este contrato más claro. Primero, la construcción de un objeto puede ser encapsulada y proveer una clase virtual que defina el método HazAlgoUtil. De esta forma, construcción e inicialización pueden ser completamente ocultos de los clientes de la clase. En esta situación "semiencapsulada", la única parte de la clase que se ve esuna bien definida lista de métodos llamables (la interfaz). Una vez que la clase es encapsulada, la única interfaz que verá el cliente es esta:

-

Encapsulación de AlgunaInterfaz

-
class AlgunaInterfaz
-{
-  public:
-    virtual void HazAlgoUtil() = 0;
-};
-
-

La implementación puede entonces derivar de esta clase e implementar el método virtual. Los clientes de este código pueden usar después un patrón de diseño factoría para crear el objeto (ve Factorías) y después encapsular la implementación. En XPCOM, los clientes se escudan de la lógica interna de los componentes de esta forma y confiar en la interfaz para proveer acceso a la funcionalidad requerida.

-

La Interfaz Base nsISupports

-

Dos aspectos fundamentales en la programación basada en componentes e interfaces son: la Vida del componente, también llamada posesión del objeto y las llamadas de interfaz, o poder identificar que interfaces soporta un componente al momento de ejecución. Esta sección introduce la interfaz base, que es la madre de todas las interfaces en XPCOM, nsISupports, la cual proporciona soluciones a estos dos aspectos para los desarrolladores de XPCOM.

-
Posesión de Objetos
-

Como los componentes en XPCOM pueden implementar cualquier número de interfaces, dichas interfaces deben ser "contadas por referencia". Los componentes deben tener control de cuántas referencias a él tienen activas los clientes y borrarse ellos mismos cuando ese número llega a cero.

-

Cuando un componente se crea, un entero dentro del componente almacena esta cuenta de referencias. La cuenta de referencias se incrementa automáticamente cuando el cliente hace una instancia del componente; durante el transcurso de vida del componente. En algún punto, todos los clientes pierden interés en el componente, en ese momento la cuenta llega a cero y el componente se borra a sí mismo.

-

Cuando los clientes usan interfaces responsablemente, esto puede ser un proceso muy serio. XPCOM tiene herramientas para hacer esto más sencillo, como describiremos después. Podemos tener serios problemas cuando por ejemplo, un cliente usa una interfaz y olvida decrementar la cuenta de referencia. Cuando esto pasa, las interfaces tal vez nunca puedan ser liberadas y se desbordará la memoria. El sistema de cuenta de referencias es, como muchas otras cosas en XPCOM, un contrato entre clientes e implementaciones. Trabaja cuando la gente se pone de acuerdo con él, pero si no, las cosas pueden ir mal. Es responsabilidad de la funcion que crea el puntero a la interfaz añadir la referencia inicial o posesión de referencia a la cuenta.

-
-

Punteros en XPCOM

-

En XPCOM, "punteros" se refiere a los punteros de interfaz. La diferencia es muy sutil ya que los punteros de interfaz y los punteros comunes son sólo direcciones en memoria. Pero un puntero de interfaz debe poder implementar la interfaz base nsISupports, que también puede ser usada para llamar métodos como AddRef, Release, o QueryInterface.

-
-

nsISupports, mostrado abajo, proporciona la funcionalidad básica para lidiar con el descubrimiento de la interfaz y la cuenta de referencias. Los miembros de esta interfaz, QueryInterface, AddRef, and Release, proporcionan los medios básicos para conseguir el interfaz correcto de un objeto, incrementando la cuenta de referencias y liberando objetos una vez que dejan de ser usados respectivamente. La interfaz nsISupports se muestra a continuación:

-

La Interfaz nsISupports

-
class Sample: public nsISupports
-{
-  private:
-    nsrefcnt mRefCnt;
-  public:
-    Sample();
-    virtual ~Sample();
-
-    NS_IMETHOD QueryInterface(const nsIID &aIID, void **aResult);
-    NS_IMETHOD_(nsrefcnt) AddRef(void);
-    NS_IMETHOD_(nsrefcnt) Release(void);
-};
-
-

Los distintos tipos usados en la interfaz son descritos en la sección Tipos XPCOM más adelante. Una implementación completa de la interfaz nsISupports se muestra abajo. Vea A Reference Implementation of QueryInterface para información más detallada.

-

Implementación de la interfaz nsISupports

-
// inicializa la cuenta de referencias a 0
-Sample::Sample() : mRefCnt(0)
-{
-}
-Sample::~Sample()
-{
-}
-
-// típica implementación genérica de QI
-NS_IMETHODIMP Sample::QueryInterface(const nsIID &aIID,
-                                  void **aResult)
-{
-  if (!aResult) {
-    return NS_ERROR_NULL_POINTER;
-  }
-  *aResult = NULL;
-  if (aIID.Equals(kISupportsIID)) {
-    *aResult = (void *) this;
-  }
-  if (!*aResult) {
-    return NS_ERROR_NO_INTERFACE;
-  }
-  // añade una referencia
-  AddRef();
-  return NS_OK;
-}
-
-NS_IMETHODIMP_(nsrefcnt) Sample::AddRef()
-{
-  return ++mRefCnt;
-}
-
-NS_IMETHODIMP_(nsrefcnt) Sample::Release()
-{
-  if (--mRefCnt == 0) {
-    delete this;
-    return 0;
-  }
-  // opcional: regresa la cuenta de referencias
-  return mRefCnt;
-}
-
-
Descubrimiento de Objetos de Interfaz
-

Herencia es otro tópico muy importante en la programación orientada a objetos. Herencia es el medio por el que una clase es derivada de otra. Cuando una clase hereda de otra clase, le clase hija puede sobreescribir los comportamientos originales de la clase base sin tener que copiar todo el código de esa clase, en efecto creando una clase más específica, como en el ejemplo siguiente:

-


-Herencia de la Clase Simple

-
class Figura
-{
-  private:
-    int m_x;
-    int m_y;
-
-  public:
-    virtual void Pintar() = 0;
-    Shape();
-    virtual ~Shape();
-};
-
-class Circulo : public Figura
-{
-  private:
-    int m_radio;
-  public:
-    virtual Pintar();
-    Circulo(int x, int y, int radio);
-    virtual ~Circulo();
-};
-
-

Circulo es una clase derivada de Figura. En otras palabras un Circulo es una Figura, pero una Figura no es necesariamente un Circulo. En este caso, Figura es la clase base y Circulo es una subclase de Figura.

-

En XPCOM, todas las clases derivan de la interfaz nsISupports, así que todos los objetos son nsISupports pero también son otras clases más específicas que necesitas para poder encontrarlas en tiempo de ejecución. En Herencia de la Clase Simple, por ejemplo, ¿te gustaría poder preguntarle a la Figura si es un Circulo y poder usarlo como circulo si lo es? En XPCOM, esto es para lo que está la caracteríztica QueryInterface de la interfaz nsISupports: permite a los clientes encontrar y accesar diferentes interfaces de acuerdo a sus necesidades.

-

En C++, puedes usar un aspecto verdaderamente avanzado conocido como refernecia_dinámica<>, que da una excepción si el objeto Figura no puede hacer referencia a Circulo. Pero habilitar las excepciones y RTTI puede no ser una opción por la mejora del rendimiento y la compatibilidad en varias plataformas, así que XPCOM hace las cosas diferente.

-
-

Excepciones en XPCOM

-

Las excepciones de C++ no son soportadas directamente en XPCOM. Todas las excepciones deben ser gestionadas dentro de un componente dado, antes de cruzar los límites de las interfaces. En XPCOM, todos métodos de interfaz deben regresar un valor de error nsresult (Vea la Referencia del API de XPCOM para ver la lista de códigos de error). Esos resultados de códigos de error se vuelven "excepciones" que gestiona XPCOM.

-
-

En vez de utilizar el RTTI de C++, XPCOM usa el método especial QueryInterface que referencía el objeto a la interfaz correcta si esa interfaz es soportada.

-

A cada interfaz se le asigna un identificador que se genera de una herramienta comunmente llamada "uuidgen". Este identificador universal único es un número único de 128 bits. Usado en el contexto de una interfaz (similar a un componente, donde el contract ID(ID de contrato) hace esta función), a este número se le conoce como IID.

-

Cuando un cliente quiere saber si un objeto soporta una interfaz dada, el cliente pasa el IID asignado a esa interfaz al método QueryInterface de ese objeto. Si el objeto soporta la interfaz requerida, añade una referencia a sí mismo y regresa un puntero a esa interfaz. Si el objeto no soporta la interfaz, regresa un error.

-
class nsISupports {
-  public:
-    long QueryInterface(const nsIID & uuid,
-                        void **result) = 0;
-    long AddRef(void) = 0;
-    long Release(void) = 0;
-};
-
-

El primer parámetro de QueryInterface es una referencia a la clase llamada nsIID, que es una encapsulación básica del IID. De los tres métodos en la clase nsIID, Equals, Parse, and ToString, Equals es por mucho el más importante, porque se usa para comparar dos nsIIDs en el proceso de requerimiento de esta interfaz.

-

Cuando implementas la clase nsISupports (y verás en el capítulo Uso de Utilidades XPCOM para hacer las cosas más fáciles como las macros pueden hacer este proceso mucho más sencillo), debes asegurarte que los métodos de la clase regresan un resultado válido cuando el cliente llama QueryInterface con el IID de nsISupports. QueryInterface debe soportar todas las interfaces que el componente soporta.

-

En las implementaciones de QueryInterface, el parámetro IID es comparado con el nsIID de la clase. Si coinciden, el puntero this del objeto es referenciado a void, la cuenta de referencias se incrementa y la interfaz es devuelta al llamador. Si no coinciden, la clase regeresa un error y pone el valor de salida a null.

-

En el ejemplo de arriba, es muy fácil usar referencias al estilo de C. Pero referenciar puede volverse más complicado donde debes primero referenciar a void y luego al tipo requerido porque debes regresar el puntero a la interfaz en el vtable correspondiente a la interfaz requerida. Referenciar puede volverse un problema cuando hay un orden ambiguo de herencia.

-

Identificadores XPCOM

-

Además del identificador de interfaz IID discutido en la sección anterior, XPCOM usa otros dos identificadores muy importantes para distinguir las clases y los componentes.

-
-

Clases Identificadoras de XPCOM

-

La clase nsIID es es un tupo definido para la clase nsID. Los otros tipos definidos de nsID, CID e IID, se refieren a implementaciones específicas de una clase en concreto y a una iterfaz específica, respectivamente.

-

La clase nsID proporciona métodos como Equals para comparar identificadores en el código. Ve Identificadores en XPCOM para mayor información de la clase nsID.

-
-

CID

-

Un CID es un número de 128 bits que identifica como únicos a una clase o un componente de manera muy parecida a la forma en que un IID identifica una interfaz. El CID para nsISupports se ve como este:

-

00000000-0000-0000-c000-000000000046

-

El largo de un CID puede hacer incómodo manejarlo en el código, así que muy a menudo verás #defines para los CIDs y otros identificadores usados, como en el siguiente ejemplo:

-
#define CID_EJEMPLO \
-{ 0x777f7150, 0x4a2b, 0x4301, \
-{ 0xad, 0x10, 0x5e, 0xab, 0x25, 0xb3, 0x22, 0xaa}}
-
-

También verás que NS_DEFINE_CID es muy usado. Esta simple macro declara una constante con el valor del CID:

-
static NS_DEFINE_CID(kWebShellCID, NS_WEB_SHELL_CID);
-
-

Un CID es algunas veces llamado identificador de clase. Si la clase a la que se refiere un CID implementa más de una interfaz, ese CID garantiza que la clase implementa todo ese conjunto de interfaces cuando se publica como congelado.

-

Contract ID

-

Un contract ID es una cadena leible humanamente usada para accesar un componente. Un CID o un contract ID puede ser usado para obtener un componente desde el gestor de componentes. Este es el contract ID para el componente de Operación LDAP:

-
"@mozilla.org/network/ldap-operation;1"
-
-

El formato del contract ID es el dominio del componente, el módulo, el nombre del componente y el número de versión separados por diagonales.

-

Como un CID, el contract ID se refiere a una implementación más que a una interfaz, como lo hace un IID. Pero un contract ID no está relacionado a ninguna implementación en específico, como el CID, por lo cual es más general. Más bien, un contract ID especifica un conjunto de interfaces dadas que requiere implementadas y cualquier número de CIDs diferentes pueden estar presentes y llenar ese requerimiento. Esta diferencia entre un contract ID y un CID es lo que hace posible sobreescribir componentes.

-

Factorías

-

Una vez que el código es dividido en componentes, el código cliente típicamente usa el operador new para instanciar los objetos a usar:

-
SomeClass* component = new SomeClass();
-
-

Este patrón requiere que el cliente sepa algo acerca del componente, al menos qué tan grande es. El patrón de diseño factoría puede usarse para encapsular la construcción de objetos. El objetivo principal de una factoría es crear un objeto sin mostrar a los clientes la implementación e inicialización de este objeto. En el ejemplo SomeClass la construcción e inicialización de SomeClass que implementa la clase abstracta SomeInterface, es contenida dentro de la función New_SomeInterface que sigue el patrón de diseño factoría:

-

Encapsulación del Constructor

-
int New_SomeInterface(SomeInterface** ret)
-{
-  // crea el objeto
-  SomeClass* out = new SomeClass();
-  if (!out) return -1;
-
-  // inicializa el objeto
-  if (out->Init() == FALSE)
-  {
-    delete out;
-    return -1;
-  }
-
-  // referencia de la interfaz
-  *ret = static_cast<SomeInterface*>(out);
-  return 0;
-}
-
-

La factoría es la clase que gestiona la creación de instancias separadas de un componente para su uso. En XPCOM, las factorías son implementaciones de la interfaz nsIFactory y usan un patrón de diseño factoría como el ejemplo de arriba para abstraer y encapsular la construcción e inicialización del objeto.

-

El ejemplo en Encapsulación del Constructor es una versión simple sin estado de las factorías, pero programarlo en el mundo real usualmente no es tan simple y en general las factorías necesitan guardar un estado. La factoría necesita, por lo menos preservar información de qué objetos ha creado. Cuando una factoría gestiona instancias de una clase contenida en un biblioteca dinámica compartida, por ejemplo, necesita saber cuando puede descargar la biblioteca. Cuando la factoría preserva un estado, puedes preguntarle si hay referencias esperando y saber si la factoría creó objetos.

-

Otro estado que puede guardar una factoría es si un objeto es o no singleton. Por ejemplo, si una factoría crea un objeto que se supone debe ser singleton, entonces las llamadas subsecuentes a la factoría por el objeto deben regresar el mismo objeto. Aunque que hay herramientas y mejores formas de gestionar un singleton (lo que discutiremos cuando hablemos del nsIServiceManager), un desarrollador tal vez quiera usar esta información para asegurarse de que sólo puede existir un objeto singleton sin importar lo que hagan los clientes.

-

Los requerimientos de una clase factoría pueden gestionarse de una manera estrictamente funcional con el estado guardado en variables globales, pero hay beneficios de usar clases para las factorías. Cuando usas una clase para implementar la funcionalidad de una factoría, por ejemplo, derivas de la interfaz nsISupports, que te permite manejar el tiempo de vida de los objetos de la factoría por sí mismos. Esto es importante cuando quieres agrupar conjuntos de factorías y determinar si pueden ser descargados. Otro beneficio de usar la interfaz nsISupports es que puedes soportar otras interfaces al momento en que sean introducidas. Como mostraremos al discutir nsIClassInfo, algunas factorías permiten pedir información acerca de la implementación que tienen debajo, como el lenguaje en el está escrito el objeto, las interfaces que soporta, etc. Este tipo de "comprobación futura" es una ventaja clave que se obtiene al derivar de nsISupports.

-

XPIDL y Bibliotecas de Tipos

-

Una manera fácil y potente de definir una interfaz es - en efecto, un requerimiento para definir interfaces en un ambiente multiplataforma, independiente del lenguaje- es usar un lenguaje de definición de interfaces (IDL). XPCOM usa su propia variante del Lenguaje de Definición de Interfaces (IDL) de CORBA OMG llamado XPIDL, que te permite especificar métodos, atributos y contantes de una interfaz dada y también definir herencia de interfaz.

-

Hay algunas desventajas de definir tu interfaz usando XPIDL. No hay soporte para herencia múltiple de una sola cosa; si defines una interfaz nueva, no puede derivar de más de una interfaz; otra limitante de las intertfaces en XPIDL es que los nombres de los métodos deben ser únicos, no puedes tener dos métodos con el mismo nombre aunque tomen distintos parámetros, es decir no se permite la sobrecarga de funciones, y el trabajo que implica tener múltiples nombres de funciones no es agradable:

-
void AlgoConInt(in int x);
-void AlgoConString(in string x);
-void AlgoConURI(in nsIURI x);
-
-

De cualquier modo, estos pequeños inconvenientes palidecen en comparación con la funcionalidad ganada usando XPIDL. XPIDL te permite generar bibliotecas de tipos, o typelibs, que son archivos con la extensión .xpt. La biblioteca de tipo es una representación binaria de una interfaz o interfaces, permite el control programático y acceso de la interfaz, lo que es crucial para las interfaces que no son usadas en el mundo de C++. Cuando los componentes son accesados desde otros lenguajes,como puede hacerse en XPCOM, usan la biblioteca binaria de tipo para accesar a la interfaz, ver qué métodos soporta y llamar esos métodos. Este aspecto de XPCOM se llama XPConnect. XPConnect es la capa de XPCOm que permite el acceso a los componentes de XPCOM desde lenguajes como JavaScript. Ve Conexión a Componentes desde la Interfaz para más información de XPConnect.

-

Cuando un componente es accesible desde un lenguaje distinto a C++, como JavaScript, se le ordena a su interfaz "reflejarse" en ese lenguaje. Cada interfaz reflejada debe tener una biblioteca de tipos correspondiente. Actualmente puedes escribir componentes en C, C++, Javascript (y algunas veces Python o Java, dependiendo del estado de las etiquetas respectivas) y hay esfuerzos tratando de construir etiquetas XPCOm para Ruby y Perl también.

-
-

Escribir Componentes en Otros Lenguajes

-

Tal vez no tengas acceso a algunas de las herramientas que XPCOM da para los desarrolladores en C++ (como macros, plantillas, punteros inteligentes y otros) cuando creas componentes en otros lenguajes, tal vez te tengas que conformar con el lenguaje en sí mismo prescindir de C++ y construir, por ejemplo, un componente XPCOm basado en Python que pueden ser usados desde JavaScript o vice versa.

-

Ve Resources Para más información de Python y otros lenguajes para los que se ha añadido soporte en XPCOM.

-
-

Todas las interfaces públicas en XPCOM sin definidas usando la sintaxis XPIDL. Las Bibliotecas de tipos y los archivos de cabecera de C++ son generados a partir de estos archivos IDL y la herramienta que genera esos archivos se llama compilador xpidl. La sección Definición de la Interfaz WebLock en XPIDL describe la sintaxis XPIDL a detalle.

-

Servicios de XPCOM

-

Cuando los clientes usan los componentes, normalmente instancían un nuevo objeto cada vez que necesitan la funcionalidad que da un componente. Este es el caso cuando, por ejemplo, los clientes lidian con archivos: cada archivo distinto es representado por un objeto diferente y muchos objetos de archivo pueden ser usados al mismo tiempo en cualquier momento.

-

Pero también hay un tipo de objeto conocido como servicio, del cual siempre hay sólo una copia (aunque puede haber varios servicios corriendo al mismo tiempo). Cada vez que un cliente quiere accesar la funcionalidad de un servicio, se comunican con la misma instancia de ese servicio. Cuando un usuario busca un número telefónico en la base de datos de una compañía , por ejemplo, probablemente esa base de datos está representada por un "objeto" que es el mismo para todos los trabajadores. Si no lo fuera, la aplicación necesitaría varias copias de una gran base de datos en memoria, para una misma cosa y tal vez habría inconsistencias entre los datos grabados porque las copias serían diferentes.

-

Dar este único punto de acceso a la funcionalidad es para lo que está el patrón de diseño singleton y es lo que los servicios hacen en una aplicación (y en un ambiente de desarrollo como XPCOM).

-

En XPCOM, además del soporte y gestión de componentes, hay un número de servicios que ayudan al desarrollador a escribir componentes multiplataforma. Estos servicios incluyen una abstracción de archivos multiplataforma que da un acceso a archivos uniforme y potente, los servicios de directorio que mantienen la locación de la aplicación y locaciones específicas del sistema, manejo de memoria para asegurar que todos usen el mismo localizador de memoria y el sistema de notificación de eventos que permite el paso de mensajes simples. El tutorial mostrará cada uno de estos componentes y servicios en uso, y la XPCOM API Reference tiene una lista completa de las interfaces en éstas áreas.

-

Tipos de XPCOM

-

Hay muchos tipos XPCOM declarados y macros simples que usaremos en los siguientes ejemplos, la mayoría de esos tipos son simples correlaciones. Los tipos más comunes son descritos en las siguientes secciones.

-

Tipos de Métodos

-

Los siguientes son un conjunto de tipos para asegurar la convención correcta de llamadas y tipos regresados de los métodos XPCOM.

- -
NS_IMETHOD Tipo regresado en la declaración del método. Las declaraciones de métodos XPCOM deben usar este como su tipo de regreso.
NS_IMETHODIMP Tipo de regreso de implementación del método. Las implementaciones de métodos XPCOM deben usar este como su tipo de regreso.
NS_IMETHODIMP_(tipo) Tipo de regreso de implementaciones de casos especiales. Algunos métodos como AddRef y Release no regresan el tipo por defecto. Esta excepción es regrettable, pero requerida para cumplir la compatibilidad con COM.
NS_IMPORT Forza el método a ser resuelto internamente por la biblioteca compartida.
NS_EXPORT Forza el método a ser exportado por la biblioteca compartida.
-

Cuenta de Referencias

-

Estas Macros manejan la cuenta de referencias.

- -
NS_ADDREF Llama a AddRef en un objeto nsISupports.
NS_IF_ADDREF Lo mismo que el anterior pero valida null antes de llamar a AddRef.
NS_RELEASE Llama a Release en un objeto nsISupports.
NS_IF_RELEASE Lo mismo que el anterior pero valida null antes de llamar a Release.
-

Códigos de Estatus

-

Estas macros prueban códigos de estatus.

- -
NS_FAILED Regresa verdadero si el código de estatus pasado fue fallo.
NS_SUCCEEDED Regresa verdadero si el código de estatus pasado fue éxito.
-

Correlaciones Variables

- -
nsrefcnt Tipo de cuenta de referencias por defecto. Correlaciona un entero de 32-bits.
nsresult Tipo de error por defecto. Correlaciona un entero de 32-bits.
nsnull Valor nulo por defecto.
-

Códigos de Error Comunes de XPCOM

- -
NS_ERROR_NOT_INITIALIZED Regresado cuando una instancia no está inicializada.
NS_ERROR_ALREADY_INITIALIZED Regresado cuando una instancia ya fue inicializada.
NS_ERROR_NOT_IMPLEMENTED Regresado por un método no implementado.
NS_ERROR_NO_INTERFACE Regresado cuando una interfaz dada no es soportada.
NS_ERROR_NULL_POINTER Regresado cuando un puntero válido es nsnull.
NS_ERROR_FAILURE Regresado cuando un método falla. Caso de error genérico.
NS_ERROR_UNEXPECTED Regresado cuando ocurre un error inesperado.
NS_ERROR_OUT_OF_MEMORY Regresado cuando una localización de memoria falla.
NS_ERROR_FACTORY_NOT_REGISTERED Regresado cuando una clase requerida no está registrada.
-

-

« AnteriorSiguiente »

-

-

diff --git "a/files/es/creaci\303\263n_de_componentes_xpcom/uso_de_componentes_xpcom/index.html" "b/files/es/creaci\303\263n_de_componentes_xpcom/uso_de_componentes_xpcom/index.html" deleted file mode 100644 index b250d637c1..0000000000 --- "a/files/es/creaci\303\263n_de_componentes_xpcom/uso_de_componentes_xpcom/index.html" +++ /dev/null @@ -1,318 +0,0 @@ ---- -title: Uso de Componentes XPCOM -slug: Creación_de_Componentes_XPCOM/Uso_de_Componentes_XPCOM -tags: - - Todas_las_Categorías - - XPCOM -translation_of: Mozilla/Tech/XPCOM/Guide/Creating_components/Using_XPCOM_Components ---- -

-

« AnteriorSiguiente »

-

- -

Una de las mejores formas de empezar a trabajar con XPCOM - especialmente cuando estás diseñando la interfaz de un componente que será usado por otros, como lo hacemos en Iniciando WebLock - es observar como están usando los componentes XPCOM los clientes.

- -

Aplicaciones como el buscador Mozilla son clientes sofísticados y modularizados de Componentes XPCOM. De hecho, virtualmente toda la funcionalidad que asocias al buscador - navegación, manejo de ventanas, manejo de cookies, marcadores, seguridad, búsqueda, renderizado y otros aspectos - es definida en componentes XPCOM uy accesada por medio de las interfaces de esos componentes. Mozilla estáhecho de componentes XPCOM.

- -

Este capítulo demuestra como Mozilla usa algunos de esos objetos XPCOM, como el CookieManager y muestra como se definirá el acceso al componente Weblock.

- -

Ejemplos de Componentes

- -

Puedes encontrar más sobre como puedes usar en particular los componentes descritos aquí en la XPCOM API Reference. Por ahora, lo importante es ver como componentes como los que están en esta sección son obtenidos usando el buscador Mozilla.

- -

Manejador de Cookies

- -

La gestión de Cookies es uno de los muchos conjuntos de funcionalidad que están disponibles en el buscador en la forma de componente XPCOM y puede ser reutilizado por los desarrolladores que quieran una funcionalidad similar en sus aplicaciones. Siempre que un usuario accesa el Cookie Manager para ver, organizar o borrar cookies que han sido guardadas en el sistema, están usando el componente CookieManager detrás de las pantallas. El Diálogo Cookie Manager muestra la interfaz de usuario [cookie-manager-ui] que se presenta al usuario en Mozilla para trabajar con el componente CookieManager.

- -

El Diálogo Cookie Manager

- -

Image:cookie_mgr_dlog.png

- -

Este Diálogo está escrito en XUL y JavaScript, usa una parte de XPCOM llamadaXPConnect para conectarse sin parches al componente CookieManager (Ve Conexión a Componentes desde la interfaz abajo). XUL es sólo una forma de mostrar la funcionalidad del componente CookieManager, pero es particularmente útil en el mundo de Mozilla.

- -

La funcionalidad del componente CookieManager está disponeble atravéz de la interfaz nsICookieManager, que es comprendido dentro de los métodos públicos en la tabla de abajo.

- -

La Interfaz nsICookieManager

- - - - - - - - - - - - - - - - -
removeAllElimina todas las cookies de la lista de cookies.
enumeratorEnumera la lista de cookies.
removeElimina una cookie en particular de la lista.
- -

En XPCOM se garantiza que la interfaz permanece igual aún cuando la implementación debajo de ella cambie. Las interfaces sonpúblicas en otras palabras y las implementaciones son privadas[private-xpcom-interfaces]. Cuando un usuario selecciona una de las cookies mostradas en la lista y luego presiona el botón Eliminar, el método Remove de la interfaz nsICookieManager es llamado. La función es llevada a cabo poir el componente CookieManager y la cookie seleccionada es borrada del disco y eliminada de la lista.

- -

El trozo de código en Obtener el Componente CookieManager en JavaScript muestra como el método Remove() del componente XPCOM CookieManager puede ser llamado desde JavaScript:

- -

Obtener el Componente CookieManager en JavaScript

- -
// xpconnect al cookiemanager
-// obtener el componente cookie manager en JavaScript
-var cmgr = Components.classes["@mozilla.org/cookiemanager;1"]
-                     .getService();
-cmgr = cmgr.QueryInterface(Components.interfaces.nsICookieManager);
-
-// llamado como parte de la función largerDeleteAllCookies()
-function FinalizeCookieDeletions() {
-  for (var c=0; c<deletedCookies.length; c++) {
-    cmgr.remove(deletedCookies[c].host,
-                deletedCookies[c].name,
-                deletedCookies[c].path);
-  }
-  deletedCookies.length = 0;
-}
-
- -
-

Conexión a Componentes desde la Interfaz

- -

La interfaz de usuario de Mozilla usa un JavaScript al que se le ha dado acceso a los componentes XPCOM en el código de la aplicación con una tecnología llamadaXPConnect.

- -

XPConnect permite a los métodos de la interfaz definidos via XPIDL ser llamados desde JavaScript como parte de los objetos JavaScript que representan instancias de componentes como el CookieManager.

- -

XPConnect es lo que enlaza el código de la aplicación a la interfaz de usuario del buscador Mozilla, a otros ambientes basados en Gecko XUL y JavaScript como xpcshell, que es un intérprete JavaScript de línea de comandos y una herramienta incluida en Mozilla.

- -

Ve http://www.mozilla.org/scriptable/ para más información sobre XPConnect y JavaScript.

-
- -

Esto no es todo los que hay acerca del tema, desde luego, pero muestra un aspecto importante de XPCOM. Los arreglos contractuales que XPCOM forza abren una forma deinteroperabilidad binaria -para poder accesar, usar y reutilizar componentes XPCOM en tiempo de ejecución. Y ellos hacen posible usar componentes escritos en otros lenguajes - como JavaScript, Python y otros - y usar componentes XPCOM basados en C++desde esos otros lenguajes también.

- -

En el buscador Mozilla, los componentes son usados desde JavaScript en la interfaz como en C++ o cualquier otro lenguaje. De hecho, una búsqueda en el código fuente de Mozilla revela que este componente CookieManager es llamadosólo desde JavaScript. Usaremos este componente desde JavaScript nosotros mismos como parte de este tutorial[cookie-manager-in-tutorial].

- -
-

JavaScript y Mozilla

- -

JavaScript es lalingua franca de la interfaz del buscador Mozilla y las etiquetas entre él y XPCOM están muy bien definidos.Scriptabilidad, esta habilidad de obtener y usar componentes desde JavaScript y otros lenguajes para los que han sido creadas etiquetas XPConnect, es un aspecto del código XPCOM.

-
- -

El Componente WebBrowserFind

- -

Todos los componentes son usados en funcionalidad de alto nivel del buscador como nsWebBrowserFind que contiene los métodos find() y findNext() para encontrar el contenido en páginas web y tareas de bajo nivel como manipulación de información. No todas las APIs de Mozilla deben ser integradas en XPCOM, mucha de la funcionalidad está disponible en componentes que pueden ser reutilizados por las extensiones del buscador y/o embebedores de Gecko.

- -

Además del componente CookieManager, por ejemplo, el componente WebBrowserFind es otra parte de una larga lista de interfaces de búsqueda web que puedes usar. Su interfaz nsIWebBrowserFind se muestra en La Interfaz nsIWebBrowserFind. Para usar este componente, los accesas mediante la interfaz nsIWebBrowserFind y llamas sus métodos.

- -

La Interfaz nsIWebBrowserFind

- - - - - - - - - - - - - - - - - - - - - - - - -
findNextEncuentra la siguiente ocurrencia de la cadena buscada.
findBackwardsAtributo booleano que ajusta findNext() para buscar hacia arriba del documento.
searchFramesAtributo booleano que indica si se busca o no en subframes del documento actual.
matchCaseAtributo booleano que indica si coincide o no el caso en la búsqueda.
entireWordAtributo booleano que especifica si debe coincidir toda la palabra o no.
- -

Una vez que usas la interfaz para obtener el componente, puedes preguntarle al componente que otras interfaces soporta. Este servicio, que es definido en la interfaz básica nsISupports e implementado por todos los componentes XPCOM, te permite requerir y cambiar interfaces en un componente como parte de las capacidades demecanografía de objeto de tiempo de ejecución de XPCOM. Es gestionada por el método QueryInterface que fue visto en el capítulo ¿Qué es XPCOM?. La XPCOM API Reference es una referencia de todos los componentes disponibles en Mozilla.

- -

El Componente WebLock

- -

Es hora de ver el componente WebLock como otro ejemplo de componentes XPCOM (ya que lo estarás creando muy pronto). En la programación orientada a objetos, es común diseñar primero la interfaz para definir la funcionalidad que tendrá la abstracción sin tener en cuenta como será hecha esta funcionalidad. Así que dejaremos del lado los detalles la implementación hasta el siguiente capítulo y veremos el componente desde afuera, desde la interfaz del componente WebLock.

- -

La Interfaz IWebLock

- - - - - - - - - - - - - - - - - - - - - - - - -
lockBloquea el buscador al sitio actual(o a la lista blanca de sitios aprobados leída del disco).
unlockDesbloquea el buscador para uso irrestricto.
addSiteAñade un nuevo sitio a la lista blanca.
removeSiteElimina un sitio dado de la lista blanca.
sitesEnumerador para la lista de sitios aprobados leída de la lista blanca.
- -

El componente WebLock es un programa que implementa todos los métodos descritos en la definición de la interfaz. Se registra a sí mismo para su uso al iniciar el buscador y tiene una factoría que crea una instancia de él para ser usada cuando el usuario o el administrador presionan el icono en la interfaz gráfica del buscador.

- -

Uso de Componentes en Mozilla

- -

Entonces ¿Cómo se obtienen los componentes en Mozilla?. Has visto algunos pedazos de JavaScript en secciones anteriores de este capítulo, pero no hemos explicado como XPCOM hace los componentes disponibles en general.

- -

Esta sección aborda el uso práctico de componentes en Mozilla. Está dividido en tres subsecciones: una acerca de como encontrar todos esos componentes binarios en Mozilla y otras dos que corresponden a cada una de las dos formas en las que los clientes accesan normalmente los componentes XPCOM:

- - - -

Localizar los Componentes de Mozilla

- -

Este libro trata de dar información de referencia para los componentes XPCOM y sus interfaces que están congeladas al momento de hacer este escrito. El Mozilla embedding project alberga las interfaces congeladas actuales.

- -

Mozilla también tiene algunas herramientas que pueden encontrar y desplegar información de las interfaces disponibles en Gecko como elVisor de Componentes XPCOM descrito abajo, y LXR, que es una herramienta basada en web para ver el código fuente.

- -

El reto de hacer disponible buena información acerca de los componentes XPCOM para los posibles clientes, el proceso de congelar las interfaces que son implementadas por esos componentes aún está en progreso. El Visor de Componentes no distingue los componentes que ya están congelados de los que no. En el código fuente que ves en LXR, las interfaces que han sido congeladas han sido marcadas hasta arriba con @status frozen.

- -
El Visor de Componentes XPCOM
- -

El Visor de Componentes es una extensión que puedes instalar en tu buscador (en sandbox, no está disponible por ahora):

- -

Visor de Componentes XPCOM Image:using-component-viewer.png

- -

La columna de la izquierda muestra los componentes, en este caso un subconjunto resultado de la búsqueda de "gfx" como parte del contract ID y en la columna de la derecha una lista de las interfaces. Cuando abres un componente en la izquierda, puedes ver las interfaces que implementa y una lista con los métodos que tiene cada interfaz.

- -

El Visor de Componentes XPCOM puede ser extremadamente útil para esta fuente de grandes interrogantes, pero otra vez: despliegatodos los componentes e interfaces contenidas dentro, muchas de las cuales no son prácticas para reutilizarse actualmente o lo suficientemente estables para ser usados viablemente en el desarrollo de tu propia aplicación. Usa estas listas con precaución.

- -

XXX mediawiki is t3h suxx0r XXX give me my C++

- -

Usar Componentes XPCOM en tu Cpp

- -

XPConnect hace fácil accesar los componentes XPCOM como objetos JavaScript, pero usar componentes XPCOM en C++ no es mucho más difícil.

- -

Gestionar Cookies desde Cpp duplica el código de Obtener el Componente CookieManager en JavaScript, pero en C++ en vez de JavaScript.

- -

 

- -

Gestionar Cookies desde Cpp

- -
nsCOMPtr<nsIServiceManager> servMan;
-nsresult rv = NS_GetServiceManager(getter_AddRefs(servMan));
-if (NS_FAILED(rv))
-  return -1;
-
-nsCOMPtr<nsICookieManager> cookieManager;
-rv = servMan->GetServiceByContractID("@mozilla.org/cookiemanager",
-                                     NS_GET_IID(nsICookieManager),
-                                     getter_AddRefs(cookieManager));
-
-if (NS_FAILED(rv))
-  return -1;
-
-PRUint32 len;
-deletedCookies->GetLength(&len);
-
-for (int c=0; c<len; c++)
-    cookieManager->Remove(deletedCookies[c].host,
-                          deletedCookies[c].name,
-                          deletedCookies[c].path,
-                          PR_FALSE);
-
- -

XXX: In the original document, there were only the first three parameters to the |Remove| call. I added |PR_FALSE| as a fourth parameter because the interface seems to require it: http://lxr.mozilla.org/mozilla/sourc...Manager.idl#64 This problem also appears in the JavaScript version below, and I've added |false| as a fourth parameter there as well.

- -

Si tu aplicación está escrita en C++, entonces Gestionar Cookies desde Cpp te muestra los pasos que debes seguir para obtener un componente XPCOM, especifica la interfaz en el componente que quieres usar y llama los métodos en esa interfaz.

- -

XPConnect: Usar Componentes XPCOM desde un Script

- -

El componente CookieManager que discutimos al principio del capítulo nos da una buena oportunidad para hablar después acerca de usar componentes desde JavaScript. En el siguiente fragmento de código del diálogo Gestor de Cookies en Mozilla, puedes ver un singletón del componente CookieManager siendo creado con el método getService() y usado para dar la funcionalidad que deja a los usuarios cargar y eliminar cookies desde la interfaz de usuario.

- -

Gestionar Cookies desde JavaScript

- -
var cmgr = Components.classes["@mozilla.org/cookiemanager;1"]
-                     .getService();
-cmgr = cmgr.QueryInterface(Components.interfaces.nsICookieManager);
-
-function loadCookies() {
-  // load cookies into a table
-  var enumerator = cmgr.enumerator;
-  var count = 0;
-  var showPolicyField = false;
-  while (enumerator.hasMoreElements()) {
-    var nextCookie = enumerator.getNext();
-    nextCookie = nextCookie.QueryInterface(Components.interfaces.nsICookie);
-    /* .... */
-}
-function FinalizeCookieDeletions() {
-  for (var c=0; c<deletedCookies.length; c++) {
-    cmgr.remove(deletedCookies[c].host,
-                deletedCookies[c].name,
-                deletedCookies[c].path,
-                false);
-  }
-  deletedCookies.length = 0;
-}
-
- -

XXX: In the original document, there were only the first three parameters to the |remove| call. I added |false| as a fourth parameter because the interface seems to require it: http://lxr.mozilla.org/mozilla/sourc...Manager.idl#64 This problem also appears in the C++ version above, and I've added |PR_FALSE| as a fourth parameter there as well.

- -

Después los métodos estan siendo llamados en el mismo CookieManager (ejm; cookiemanager.remove, que apunta a la función remove() en La Interfaz nsICookieManager), nota los objetos y métodos especiales XPConnect que reflejan el componente XPCOM en JavaScript.

- -

Components es el objeto JavaScript que controla la conexión a componentes y classes es un array de todas las clases por las que puedes preguntar mediante el contract ID. Para instanciar un componente XPCOM en JavaScript, creas un nuevo objeto del componente y pasas el contract ID para el componente que quieres y preguntas si será un singleton o una instancia del componente el resultado regresado:

- -
var cmgr = Components.classes["@mozilla.org/cookiemanager;1"]
-                     .getService();
-
- -

El objeto resultante cookiemanager nos da acceso a todos los métodos de ese componente que sido definidos en IDL y compilados en una biblioteca de tipos. Usando el componente CookieManager puedes escribir código como este para borrar todas las cookies del sistema:

- -
cmgr = Components.classes["@mozilla.org/cookiemanager;1"]
-                 .getService();
-cmgr = cmgr.QueryInterface(Components.interfaces.nsICookieManager);
-
-// delete all cookies
-function trashEm() {
-   cmgr.removeAll();
-}
-
- -

Otro aspecto vital del pegamento de XPConnect que muestra este ejemplo es la disponibilidad del método QueryInterface en todos los objetos que son reflejados en JavaScript desde XPCOM. Como en C++, puedes usar este método para preguntar por otras interfaces que esten disponibles en el objeto dado.

- -
-

Servicios Frente a Instancias Regulares

- -

Si los clientes usarán tu componente como una instancia o un servicio es una pregunta de diseño, realmente y algo debes ser claro acerca ello en la documentación de tu componente. Ahora, el método getService() en este ejemplo llama mediante el método createInstance() que también está disponible para el objeto del Componente y cacha el resultado, haciéndolo un singleton en vez de una instancia normal.

- -

El patrón de diseño singleton que es usado para crear servicios es descrito en Servicios de XPCOM

-
- -

Recuerda, QueryInterface te permite requerir a un objeto las interfaces que soporta. En el caso del trozo en La Interfaz nsICookieManager, el método QueryInterface es usado para obtener la interfaz nsICookie del enumerador, así que, para instanciar, el código JavaScript puede accesar los atributos value y name para cada cookie.

- -
    -
  1. Nota: cookie-manager-ui
    Nota que la interfaz no es parte del componente en sí mismo. XPCOM hace fácil usar componentes como CookieManager desde Mozilla's Cross Platform Front End (XPFE) y otras interfaces de usuario, pero el componente no tiene por sí mismo una IU(Interfaz de Usuario).
  2. -
- -
    -
  1. Nota: private-xpcom-interfaces
    Hay excepciones a esto. Algunas interfaces XPCOM también son privadas y no estan hechas para uso general. Las interfaces privadas no tienen los mismos requerimientos que las que son hechas públicas en IDL.
  2. -
  3. Nota: cookie-manager-in-tutorial
    El componente CookieManager es usado para proveer para la funcionalidad de bloqueo web descrita en este tutorial.
  4. -
- -

-

« AnteriorSiguiente »

-

-

Copyright (c) 2003 by Doug Turner and Ian Oeschger. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.02 or later. Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder. Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.

-

- -
 
- -

diff --git "a/files/es/creaci\303\263n_de_plugins_mozsearch/index.html" "b/files/es/creaci\303\263n_de_plugins_mozsearch/index.html" deleted file mode 100644 index 3cb56bd3d9..0000000000 --- "a/files/es/creaci\303\263n_de_plugins_mozsearch/index.html" +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: Creación de plugins MozSearch -slug: Creación_de_plugins_MozSearch -tags: - - Plugins_de_búsqueda -translation_of: Mozilla/Creating_MozSearch_plugins ---- -

Firefox 2 admite MozSearch, una forma simplificada del formato OpenSearch de Amazon A9 para crear plugins de búsqueda. Los plugins OpenSearch también son admitidos; visite la web de OpenSearch para más detalles. -

UN plugin de búsqueda MozSearch es un archivo XML que describe el motor de búsqueda, su URL, y los parámetros que se necesitan pasar a esa URL. -

-
Nota: Tenga en cuenta que MozSearch es específico para Firefox; si desea escribir plugins que sean compatibles con otros navegadores, deberá usar el sistema estándar de OpenSearch. Afortunadamente, los dos formatos son muy parecidos y es fácil cambiar de uno a otro dependiendo de tus necesidades.
-

El archivo del plugin

-

El archivo XML que describe el motor de búsqueda es realmente sencillo siguiendo la plantilla básica de abajo. Las secciones en cursiva necesitan ser personalizadas dependiendo de las necesidades del motor de búsqueda del plugin que estés escribiendo. -

-
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
-<ShortName>NombreDelMotor</ShortName>
-<Description>Descripcion</Description>
-<InputEncoding>CodificacionDeEntrada</InputEncoding>
-<Image width="16" height="16">data:image/x-icon;base64,DatosDeLaImagen</Image>
-<Url type="text/html" method="metodo" template="URLdeLaBusqueda">
-  <Param name="parametro1" value="parametro1"/>
-  ...
-  <Param name="parametroN" value="parametroN"/>
-</Url>
-<Url type="application/x-suggestions+json" template="URLdeSugerencias"/>
-<SearchForm>URLdelFormularioDeBusqueda</SearchForm>
-</SearchPlugin>
-
-
ShortName -
Un nombre breve para el motor de búsqueda. -
-
Description -
Una pequeña descripción del motor de búsqueda. -
-
InputEncoding -
La codificación a usar para los datos de entrada al motor de búsqueda. -
-
Image -
Icono codificado en Base-64 de 16x16 que represente el motor de búsqueda. Una herramienta útil que puedes usar para construir estos la puedes encontrar aquí: The data: URI kitchen. -
-
Url -
Describe la URL o URLs a usar en la búsqueda. El atributo method indica si se usará una petición GET o POST para devolver el resultado. El atributo template indica la URL base para la consulta. -
-
Hay dos tipos de URL que puedes especificar: -
- -
Para ambos tipos de URL, puedes usar {searchTerms} para sustituir los términos introducidos por el usuario en la barra de búsqueda. -
-
Para la consulta de sugerencias de búsqueda, la plantilla de la URL especificada se usa para devolver una lista de sugerencias en formato JavaScript Object Notation (JSON) format. Para más detalles de como implementar soporte para sugerencias de búsqueda en un servidor, lea Permitir sugerencias en los plugins de búsqueda. -
-

Imagen:SearchSuggestionSample.png -

-
Param -
Los parámetros que necesitan ser enviados por la búsqueda, como parejas clave/valor. Cuando se especifican valores, puedes usar {searchTerms} para insertar los términos introducidos por el usuario en la barra de búsqueda. -
-
SearchForm -
La URL a la que ir para abrir la pagina de búsqueda en el sitio para el que el plugin fue diseñado. Esto da a Firefox una vía que permite que el usuario visite la web directamente. -
-

Autodetección de plugins de búsqueda

-

Una web que ofrezca un plugin de búsqueda pueden anunciarlo para que los usuarios de Firefox puedan descargar e instalar fácilmente el plugin. -

Para permitir la autodetección, simplemente debes añadir una línea a la sección <HEAD> de tu web: -

-
<link rel="search" type="application/opensearchdescription+xml" title="TituloDeLaBusqueda" href="URLdelPlugin">
-
-

Remplaza los puntos en cursiva como se explica aquí: -

-
TituloDeLaBusqueda -
El nombre de la búsqueda a realizar, como "Buscar en MDC" o "Búsqueda Yahoo!". -
-
URLdelPlugin -
La URL a el XML del plugin de búsqueda, desde el que el navegador puede descargarlo. -
-

Si tu sitio ofrece varios plugins de búsqueda, puedes habilitar la autodetección de todos. Por ejemplos: -

-
<link rel="search" type="application/opensearchdescription+xml" title="Miweb: Buscar por autor" href="http://www.mysite.com/mysiteauthor.xml">
-<link rel="search" type="application/opensearchdescription+xml" title="Miweb: Buscar por título" href="http://www.mysite.com/mysitetitle.xml">
-
-

De esta forma, tu sitio puede ofrecer plugins tanto para buscar por autor como por titulo de forma separada. -

-

Ejemplo: buscando en Yahoo!

-

El siguiente XML es el plugin de búsqueda de Firefox 2 para Yahoo! en inglés: -

-
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
-<ShortName>Yahoo</ShortName>
-<Description>Yahoo Search</Description>
-<InputEncoding>UTF-8</InputEncoding>
-<SuggestionUrl>http://ff.search.yahoo.com/gossip?output=fxjson&command=</SuggestionUrl>
-<Image width="16" height="16">data:image/x-icon;base64,R0lGODlhEAAQAJECAP8AAAAAAP///wAAACH5BAEAAAIALAAAAAAQABAAAAIplI+py+0NogQuyBDEnEd2kHkfFWUamEzmpZSfmaIHPHrRguUm/fT+UwAAOw==</Image>
-<Url type="text/html" method="GET" template="http://search.yahoo.com/search">
-  <Param name="p" value="{searchTerms}"/>
-  <Param name="ei" value="UTF-8"/>
-  <Param name="fr" value="moz2"/>
-</Url>
-<SearchForm>http://search.yahoo.com/</SearchForm>
-</SearchPlugin>
-
-

Pongamos que el usuario elige usar el plugin de búsqueda de Yahoo! e introduce "mozilla" en la barra de búsqueda y pulsa la tecla enter. Firefox usará el motor de búsqueda anterior para construir la siguiente URL: -

-
http://search.yahoo.com/search?p=mozilla&ei=UTF-8&fr=moz2
-
-

Si el usuario pulsa sobre el icono de la lupa en la barra de búsqueda, o elige la opción Búsqueda web en el menú Herramientas cuando la barra de búsqueda no está visible, el navegador le enviará a <tt>http://search.yahoo.com/</tt>, el valor del elemento <SearchForm>. -

-

Ejemplo: buscando en el MDC

-

Este plugin te permitirá buscar fácilmente en la web del Mozilla Developer Center. -

-
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
-<ShortName>MDC</ShortName>
-<Description>Mozilla Developer Center search</Description>
-<InputEncoding>UTF-8</InputEncoding>
-<Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz%2F%2Fz8DJQAggJiQOe%2Ffv2fv7Oz8rays%2FN%2BVkfG%2FiYnJfyD%2F1%2BrVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw%2F8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi%2FG%2BQKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo%2BMXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia%2BCuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq%2FvLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg%2FkdypqCg4H8lUIACnQ%2FSOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD%2BaDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg%3D%3D</Image>
-<Url type="text/html" method="GET" template="http://developer.mozilla.org/en/docs/Special:Search?search={searchTerms}"/>
-<SearchForm>http://developer.mozilla.org/en/docs/Special:Search</SearchForm>
-</SearchPlugin>
-
-

Date cuenta que en este caso en vez de usar <Param> para definir los parámetros del motor de búsqueda, simplemente se incrustó dentro de la URL de la plantilla. Es la forma recomendada de hacerlo cuando usamos como metodo GET. <Param> se usaría para POST. -


-

-

Consejos ante cualquier problema

-

Si hay alguna errata en el XML del plugin de búsqueda, puede que te encuentres con errores al añadir un plugin en Firefox (Bon Echo) Alpha 3. Los mensajes de error quizás no te ayuden completamente, sin embargo, los consejos siguientes pueden ayudarte a encontrar el problema. -

- -

Además, el servicio de plugin de búsqueda proporciona un mecanismo de registros que puede ser usado por los desarrolladores del mismo. Usa about:config para fijar la preferencia 'browser.search.log' a true. La información aparecerá en la Consola de error de Firefox (Herramientas->Consola de error) cuando se añada el plugin de búsqueda. -

-

OpenSearch

-

Firefox 2 también admite el formato OpenSearch de Amazon A9 para compartir resultados de búsqueda. Si escribes un plugin XML usando la Sintaxis OpenSearch, puedes meterlo en el directorio <tt>searchengines</tt> dentro del perfil de usuario, en el directorio de la aplicación, o en el paquete de instalación para añadir soporte a dicho motor de búsqueda. -

El formato OpenSearch es similar al formato SearchPlugin de Mozilla. La principal diferencia es el elemento inicial y los espacios de los nombres del XML. -

-
<?xml version="1.0" encoding="UTF-8"?>
-<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
-...
-</OpenSearchDescription>
-
-

Material de referencia

- -
-
-{{ languages( { "ca": "ca/Creaci\u00f3_de_connectors_MozSearch", "en": "en/Creating_MozSearch_plugins", "fr": "fr/Cr\u00e9ation_de_plugins_MozSearch", "it": "it/Creare_Plugin_MozSearch", "ja": "ja/Creating_MozSearch_plugins", "pl": "pl/Tworzenie_wtyczek_MozSearch", "zh-tw": "zh_tw/\u88fd\u4f5c_MozSearch_\u641c\u5c0b\u6a21\u7d44" } ) }} diff --git a/files/es/creando_un_skin_para_firefox/como_empezar/index.html b/files/es/creando_un_skin_para_firefox/como_empezar/index.html deleted file mode 100644 index d4ef1f553f..0000000000 --- a/files/es/creando_un_skin_para_firefox/como_empezar/index.html +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Como empezar -slug: Creando_un_skin_para_Firefox/Como_empezar -tags: - - Complementos - - Temas - - Todas_las_Categorías -translation_of: Archive/Mozilla/Creating_a_sking_for_Firefox_Getting_Started ---- -

-

-

Setup

-

Descargue la última versión de Firefox e instalela. Asegúrese de instalar también el módulo DOM Inspector. -

-

Extraer el tema

-

Aunque en teoría puede comenzar con cualquier tema diseñado para Firefox, por motivos de consistencia, vamos a editar Winstripe, el tema por defecto de Firefox. Se encuentra ubicado en el archivo "classic.jar" dentro del directorio de instalación de Firefox. Un archivo .jar es en realidad un archivo zip renombrado que puede abrir con su programa de compresión favorito de la misma forma que abre un archivo zip. Sin embargo, si su aplicación cree que no es el formato correcto, puede simplemente renombrar el archivo a "classic.zip" y continuar la extracción. -

-
Ubicaciones del archivo Classic.jar
-

Linux: /usr/lib/MozillaFirefox/chrome/classic.jar -

Windows: \Program Files\Mozilla Firefox\chrome\classic.jar -

Mac OS X: -

- -

Copie el archivo classic.jar a una carpeta de fácil acceso ("Clasic" es una ubicación recomendable). Ahora extraiga el contenido a esta carpeta, manteniendo la estructura de directorios. -

-

Directorios

-

Dentro del archivo classic.jar encontrará un directorio, skin, así como dos archivos preview.png e icon.png. -

-
skin 
Skin simplemente contiene otro directorio, classic. -
- -

Instalar el nuevo tema

-

Antes de que uno pueda ver los cambios que hace a un tema de Firefox (las ediciones sin reiniciar son difíciles de configurar), debe aprender como empaquetar el tema classic para hacerlo instalable. Para el propósito de esta discusión le llamaremos a su tema "My_Theme",aunque puede reemplazarlo con cualquier otro nombre. -

-
Copiando los archivos necesarios
-

El primer paso es mover los archivos a su directorio correspondiente. Cree un nuevo directorio llamado My_Theme. En este directorio cree los directorios browser, global, communicator, help, y mozapps así como los archivos icon.png y preview.png. -

-
Creando los archivos de instalación
-
Contents.rdf
-

Haga una copia de contents.rdf,colóquelo en \My_Theme y ábralo en su editor de texto. Este archivo es una pequeña base de datos en formato XML que se utiliza para describir el skin. -

En el código busque todas las coincidencias de My_Theme y reemplácelas con el nombre de su tema. -

La sección packages lista que componentes del explorador está modificando. Si también tenemos skins para Chatzilla, debemos añadir otra línea similar a las anteriores y modificarla para que apunte a Chatzilla. Esta lista incluye todo lo que hemos cambiado, así que simplemente modifique el texto azul para que apunte al nombre/versión que ha utilizado en las secciones anteriores a esta. -


-

-
<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"/>
-
-

Guarde el archivo y salga de su editor de texto. -

-
install.rdf
-

Haga una copia de install.rdf, colóquelo en \My_Theme y ábralo con su editor de texto favorito. Este archivo es una pequeña base de datos en formato XML que se utiliza para describir el skin. -

-
  <Description about="urn:mozilla:install-manifest">
-  <em:id>{Themes_UUID}</em:id>
-  <em:version>Themes_Version</em:version>
-
-

La primera sección requiere a) Buscar un UUID para el skin y b) Darle un número de versión al tema. Una vez hecho esto, inserte la información como se muestra en el recuadro anterior y desplácese hacia abajo en el texto. -

-

Archivos CSS

-

Los archivos CSS que se encuentran en estos directorios le indican al navegador como visualizar los botones y otros controles, donde poner las imágenes, que borde y que relleno debería colocar alrededor de ellos, etc. Para la siguiente parte, vamos a modificar el botón estándar. -

Entre en \global\ y abra button.css en su editor de texto favorito. Desplácese hacia abajo hasta button {. Esta sección define el botón normal y su estado básico (Sin el puntero del ratón sobre él, sin estar deshabilitado y sin estar seleccionado). -

Cambie background-color: a DarkBlue y el color: a White, y guarde el archivo. -

-

Empaquetando el archivo JAR

-

Ahora todo lo que necesita hacer es empaquetar el archivo JAR utilizando su gestor de archivos con la siguiente estructura de directorios: -

-
browser -
communicator -
global -
help -
mozapps -
-

contents.rdf -install.rdf -icon.png -preview.png -

-

Ejecutar la instalación desde la Web

-

Para instalar su archivo jar directamente desde la Web, necesita ejecutar algo de código Javascript. -

-
<a href='javascript:InstallTrigger.installChrome(InstallTrigger.SKIN,
- "myskin.jar", "My Skin Theme")'>install My Skin</a>
-
-


-Si tiene los archivos jar en su disco duro y quiere instalarlos, entonces descargue o utilice este formulario. -

O puede simplemente abrir la ventana de temas en Mozilla y arrastrar y soltar su archivo .jar en ella. -


-categorías -

enlaces interwikis -


-

-
-
-{{ languages( { "de": "de/Theme_erstellen/Einf\u00fchrung", "en": "en/Creating_a_Skin_for_Firefox//Getting_Started", "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/es/creando_un_skin_para_firefox/uuid/index.html b/files/es/creando_un_skin_para_firefox/uuid/index.html deleted file mode 100644 index bcaaedb1dc..0000000000 --- a/files/es/creando_un_skin_para_firefox/uuid/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: UUID -slug: Creando_un_skin_para_Firefox/UUID -translation_of: Archive/Themes/Creating_a_Skin_for_Firefox/UUID ---- -

-

-

UUID: Identificador único universal

-

El UUID (Universal Unique Identifier) se puede obtener visitando http://www.famkruithof.net/uuid/uuidgen o escribiendo "firebot: uuid?" en irc.mozilla.org. -

-

Vea también

-

Generando_GUIDs -

-
-
-{{ languages( { "en": "en/Creating_a_Skin_for_Firefox/UUID", "fr": "fr/Cr\u00e9er_un_th\u00e8me_pour_Firefox/UUID", "ja": "ja/Creating_a_Skin_for_Firefox/UUID", "pl": "pl/Tworzenie_sk\u00f3rek_dla_Firefoksa/UUID", "pt": "pt/Criando_um_visual_para_o_Firefox/UUID", "zh-tw": "zh_tw/\u88fd\u4f5c_Firefox_\u4f48\u666f\u4e3b\u984c/UUID" } ) }} diff --git a/files/es/creando_un_tema_para_firefox/index.html b/files/es/creando_un_tema_para_firefox/index.html deleted file mode 100644 index f97da06e15..0000000000 --- a/files/es/creando_un_tema_para_firefox/index.html +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Creando un tema para Firefox -slug: Creando_un_tema_para_Firefox -tags: - - Complementos - - Temas - - Todas_las_Categorías -translation_of: Archive/Themes/Creating_a_Skin_for_Firefox ---- -

 

-

Introducción

-

Para crear un skin para Firefox, primero necesitara conocer tres cosas. Como editar imágenes, como extraer archivos comprimidos, y como modificar hojas de estilo CSS. Firefox utiliza los formatos gráficos estándar gif, png y jpg para los botones y las hojas de estilo para embellecer los demás elementos del interfaz de usuario.

-

¿Que es un skin?

-

Un skin no modifica totalmente el interface, simplemente define como se muestra. No puede cambiar que ocurre cuando el usuario hace clic con el botón derecho del ratón sobre una imagen, pero puede cambiar el aspecto del menú contextual (Haciéndolo azul con puntos rosas, por ejemplo). Si quiere cambiar la funcionalidad de Firefox, tendra que ver más detenidamente la modificación de chrome. Lo cual va más allá del propósito de este documento.

-

Contenidos

- -
-
-

Información sobre el documento original

- -
-

categorías

-

enlaces interwikis

-
-  
-

{{ languages( { "de": "de/Theme_erstellen", "en": "en/Creating_a_Skin_for_Firefox", "fr": "fr/Cr\u00e9er_un_th\u00e8me_pour_Firefox", "ja": "ja/Creating_a_Skin_for_Firefox", "pl": "pl/Tworzenie_sk\u00f3rek_dla_Firefoksa", "zh-tw": "zh_tw/\u88fd\u4f5c_Firefox_\u4f48\u666f\u4e3b\u984c" } ) }}

-

 

-

 

diff --git "a/files/es/crear_un_m\303\263dulo_de_administrador_de_cuentas_almacenadas/index.html" "b/files/es/crear_un_m\303\263dulo_de_administrador_de_cuentas_almacenadas/index.html" deleted file mode 100644 index 480f8db420..0000000000 --- "a/files/es/crear_un_m\303\263dulo_de_administrador_de_cuentas_almacenadas/index.html" +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Crear un módulo de Administrador de Cuentas almacenadas -slug: Crear_un_módulo_de_Administrador_de_Cuentas_almacenadas -tags: - - Firefox 3 - - páginas_a_traducir -translation_of: Mozilla/Creating_a_login_manager_storage_module ---- -

{{ Fx_minversion_header(3) }} The Login Manager manages and stores user passwords. Extensions can replace the built-in password storage with their own implementation. This can be useful if you want to integrate Firefox password management with an existing password management system, or use your own password storage format or database.

- -

If you just want to use the Login Manager in your extensions, refer to the article Using nsILoginManager.

- -

Overriding the built-in Login Manager storage consists of two tasks:

- -
    -
  1. Implement the {{ Interface("nsILoginManagerStorage") }} interface.
  2. -
  3. Register that interface in a specific category.
  4. -
- -
Some work has already been done to integrate the Login Manager with the Mac OS X keychain ({{ Bug(106400) }}) and Gnome Keyring Manager ({{ Bug(309807) }}). You should start with the existing code if you want to implement that in your extension.
- -

Sample JavaScript implementation

- -

The following code snippet is a JavaScript component that implements a dummy {{ Interface("nsILoginManagerStorage") }} interface. See How_to_Build_an_XPCOM_Component_in_Javascript for more details about JavaScript components.

- -
const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-function SampleLoginManagerStorage() {}
-SampleLoginManagerStorage.prototype = {
-  classDescription: "Sample nsILoginManagerStorage implementation",
-  contractID: "@example.com/login-manager/storage/sample;1",
-  classID: Components.ID("{364a118c-747a-4f6d-ac63-2d2998e5a5c1}"),
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsILoginManagerStorage]),
-
-  // This registers the category for overriding the built-in nsILoginManagerStorage
-  _xpcom_categories: [
-    {
-      category: "login-manager-storage",
-      entry: "nsILoginManagerStorage"
-    }
-  ],
-
-
- // Console logging service, used for debugging.
-  __logService : null,
-  get _logService() {
-    if (!this.__logService)
-      this.__logService = Cc["@mozilla.org/consoleservice;1"].
-                            getService(Ci.nsIConsoleService);
-    return this.__logService;
-  },
-  log: function (message) {
-    dump("SampleLoginManager: " + message + "\n");
-    this._logService.logStringMessage("SampleLoginManager: " + message);
-  },
-  // Logs function name and arguments for debugging
-  stub: function(arguments) {
-    var args = [];
-    for (let i = 0; i < arguments.length; i++)
-      args.push(arguments[i])
-    this.log("Called " + arguments.callee.name + "(" + args.join(",") + ")");
-  },
-
-  init: function SLMS_init() {
-    this.stub(arguments);
-  },
-  initWithFile: function SLMS_initWithFile(aInputFile, aOutputFile) {
-    this.stub(arguments);
-  },
-  addLogin: function SLMS_addLogin(login) {
-    this.stub(arguments);
-  },
-  removeLogin: function SLMS_removeLogin(login) {
-    this.stub(arguments);
-  },
-  modifyLogin: function SLMS_modifyLogin(oldLogin, newLogin) {
-    this.stub(arguments);
-  },
-  getAllLogins: function SLMS_getAllLogins(count) {
-    this.stub(arguments);
-  },
-  removeAllLogins: function SLMS_removeAllLogins() {
-    this.stub(arguments);
-  },
-  getAllDisabledHosts: function SLMS_getAllDisabledHosts(count) {
-    this.stub(arguments);
-  },
-  getLoginSavingEnabled: function SLMS_getLoginSavingEnabled(hostname) {
-    this.stub(arguments);
-  },
-  setLoginSavingEnabled: function SLMS_setLoginSavingEnabled(hostname, enabled) {
-    this.stub(arguments);
-  },
-  findLogins: function SLMS_findLogins(count, hostname, formSubmitURL, httpRealm) {
-    this.stub(arguments);
-  },
-  countLogins: function SLMS_countLogins(aHostname, aFormSubmitURL, aHttpRealm) {
-    this.stub(arguments);
-  }
-};
-
-function NSGetModule(compMgr, fileSpec)
-  XPCOMUtils.generateModule([SampleLoginManagerStorage]);
-
-
- -

Sample C++ Implementation

- -

{{ Bug(309807) }} contains a complete example. The category registration looks like this:

- -
  nsCOMPtr<nsICategoryManager> cat =
-      do_GetService(NS_CATEGORYMANAGER_CONTRACTID);
-  NS_ENSURE_STATE(cat);
-
-  cat->AddCategoryEntry("login-manager-storage", "nsILoginManagerStorage",
-                        kYourContractID, PR_TRUE, PR_TRUE, nsnull);
-
- -

Don't forget to unregister the category on unload.

diff --git a/files/es/crear_un_panel_lateral_en_firefox/index.html b/files/es/crear_un_panel_lateral_en_firefox/index.html deleted file mode 100644 index 07e7834c0b..0000000000 --- a/files/es/crear_un_panel_lateral_en_firefox/index.html +++ /dev/null @@ -1,163 +0,0 @@ ---- -title: Crear un panel lateral en Firefox -slug: Crear_un_panel_lateral_en_Firefox -tags: - - Complementos - - Todas_las_Categorías - - extensiones -translation_of: Mozilla/Creating_a_Firefox_sidebar ---- -

-

Este artículo muestra cómo crear un panel lateral registrado para Firefox 2 o superior. Véase la sección de referencias para más información sobre cómo crear una extensión para versiones anteriores. -

-

Introducción

-

Este artículo es un punto de partida para la creación de un nuevo panel lateral para Firefox. Lo que haremos será crear un panel lateral y registrarlo para que esté disponible en el menú. La meta es crear un panel vacío que pueda ser usado como inicio para nuevas aplicaciones. -

La creación de un panel lateral precisa de algo de creación de interfaz y de registro en la aplicación destino. Primero se creará una simple página XUL. Luego se crearán los ficheros de registro y finalmente el panel lateral será empaquetado dentro de un fichero instalable XPI. -

-

Pre-requisitos

-

Este artículo es una forma rápida de empezar pero, no explica todos los elementos de XUL ni el empaquetado de los XPI. Es recomendable que tengas algunos conocimientos básicos del funcionamiento de XUL y cómo maneja Firefox las extensiones. Véase Creando una extensión para información más detallada sobre la estructura, empaquetado y publicación de extensiones.

Paquetes

-

Las extensiones para Firefox son instaladas en paquetes ("Bundles"). Un paquete de extensión contiene generalmente un apartado "content", el cual contiene el código XUL y la lógica de la aplicación. Opcionalmente, se pueden incluir configuraciones regionales y temas. La mayoría de los añadidos vienen en una estructura de árbol predeterminada, y aunque no es requerido, es recomendable utilizar dicha estructura. Aquí se crea el paquete para el panel lateral y los ficheros incluìdos se muestran a continuación.

-
-

Ejemplo 1. Estructura del paquete

-
emptysidebar
-\- chrome
-   |- content
-   |- locale
-   | \- en-US
-   \- skin
-
-
-

Crea todos los directorios, excepto skin. No se usa en este tutorial.

-

locale alberga la configuración regional, sólo la configuración en-US será creada. Está listada en el ejemplo 2. La configuración regional incluye el nombre y los atajos de teclado para el panel lateral.

-
-

Ejemplo 2. chrome/locale/en-US/emptysidebar.dtd

-
<!ENTITY emptysidebar.title "EmptySidebar">
-<!ENTITY openEmptySidebar.commandkey "E">
-<!ENTITY openEmptySidebar.modifierskey "shift accel">
-
-

El directorio content incluye nuestro panel lateral, el emptysidebar.xul es mostrado en Example 3 y crea una página para albergar una etiqueta. Se pueden incluir otros elementos. Por favor, léase los tutoriales XUL para más información.

-

 

-
-

Ejemplo 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>
-
-
-

Las nuevas extensiones pueden ser registradas en los menús o en los menús emergentes. Firefox utiliza overlays para ampliar menús. Éste es un fichero XUL separado que especifica la ubicación de los elementos del menú. El panel lateral es añadido aquí al menú Ver > Panel lateral. El fichero overlay es listado en el ejemplo 4.

-
-

Ejemplo 4. chrome/contents/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>
-
-
-

El fichero overlay consta de tres entradas: la definición del menú, los atajos de teclado y el manejador de eventos para los elementos de la interfaz. El propagador es enlazado a un elemento de la IU con el atributo observes. El propagador viewEmptySidebar define cómo se maneja el evento clic en el menú o cuando el atajo de teclado es usado.

-

La extensión necesita suministrar algunos ficheros especiales de manifiesto que controlan cómo se instala y dónde están guardados sus recursos chrome. El primero es install.rdf, el manifiesto de instalación. Véase Install Manifests para un listado completo de las propiedades requeridas y opcionales. El manifiesto de instalación se lista en el ejemplo 5.

-
-

Ejemplo 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>
-
-
-

El otro fichero de manifiesto es chrome.manifest, el fichero de manifiesto chrome. El manifiesto chrome crea una lista con todos los tipos de recurso usados por la extensión. El manifiesto también le dice a Firefox que la extensión tiene un overlay que necesita ser mezclado en el navegador. Para más información sobre manifiestos chrome y las propiedades que soportan, véase la referencia del Manifiesto Chrome. El manifiesto usado en esta extensión se muestra en el ejemplo 6.

-
-

Ejemplo 6. chrome.manifest

-
content	emptysidebar	chrome/content/
-locale	emptysidebar	en-US	locale/en-US/
-skin	emptysidebar	classic/1.0	skin/
-overlay	chrome://browser/content/browser.xul	chrome://emptysidebar/content/firefoxOverlay.xul
-
-
-

Prueba

-

Durante el proceso de desarrollo del panel lateral, será necesario ir probándolo con Firefox. Hay un modo simple de hacer esto. Primero, necesitamos darle a conocer a Firefox la extensión.

-
  1. Abre el directorio de tu perfil
  2. Abre el directorio de las extensiones (créalo si no existe)
  3. Crea un nuevo fichero de texto y escribe en él la ruta al directorio de la extensión, p.e. C:\extensiones\miExtension o ~/extensiones/miExtension. Guarda el fichero con el id de la extensión como nombre, p.e. emptysidebar@yourdomain.com
  4. -
-

¡Ahora estás preparado para probar la extensión! Reinicia Firefox y el panel lateral estará incluido en el menú.

-

Imagen:Sidebar-test.png

-

Después podrás volver y hacer cambios en el fichero XUL. Cerrando y reiniciando Firefox deberían verse reflejados.

-

Publicación

-

Ahora que tenemos el panel lateral es hora de hacerlo disponible al mundo. La instalación necesita la creación de un fichero XPI identificado como extensión de Firefox. El XPI es un fichero ZIP que contiene los ficheros de contenido, de configuración regional y de manifiesto.

-

Los directorios content, locale y skin están empaquetados en emptysidebar.jar, los cuales deberían  ser creados en el directorio chrome. En los sistemas unix:

-
~/src/emptysidebar$ cd chrome
-~/src/emptysidebar/chrome$ zip -r emptysidebar.jar content/ locale/
-
-

En sistemas Windows, utiliza una herramienta ZIP para crear emptysidebar.zip y luego renómbralo como emptysidebar.jar.

-

Dado que estamos empaquetando una extensión con un fichero JAR, necesitamos actualizar el fichero chrome.manifest para incluir dicho fichero:

-
-

Ejemplo 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
-
-
-

Por último, creamos el fichero XPI. Éste es un fichero ZIP que contiene el fichero JAR en el directorio chrome y los ficheros de manifiesto. En sistemas unix:

-
~/src/emptysidebar/chrome$ cd ..
-~/src/emptysidebar$ zip emptysidebar.xpi install.rdf chrome.manifest chrome/emptysidebar.jar
-
-

Abre Firefox y navega hasta el directorio que contiene emptysidebar.xpi. Haz clic en el fichero y la ventana de instalación de la extensión aparecerá. Tras reiniciar Firefox, el panel lateral estará instalado.

-

Puedes descargar el proyecto vacío del panel lateral para usarlo como base de tus propios paneles laterales.

-
-

Imagen:Sidebar-installed.png
-The EmptySidebar extension

-
-

Recursos

- -
-

Información del documento original

-
  • Autor: J.C. Wesdorp <jcwesdorp . at . occidopagus.nl> - May 30, 2005.
  • Actualizado para Firefox 2 - 12 diciembre 2006.
  • Permiso concedido para migrarlo en enero de 2006 incluyendo el permiso para cambiarle la licencia bajo CC:By-SA.
  • Fuente original: http://occidopagus.nl/firefox/emptysidebar/
  • -
-
-
-

{{ languages( { "en": "en/Creating_a_Firefox_sidebar" } ) }}

diff --git "a/files/es/crear_una_extensi\303\263n_din\303\241mica_en_la_barra_de_estado/index.html" "b/files/es/crear_una_extensi\303\263n_din\303\241mica_en_la_barra_de_estado/index.html" deleted file mode 100644 index 607b81c5fc..0000000000 --- "a/files/es/crear_una_extensi\303\263n_din\303\241mica_en_la_barra_de_estado/index.html" +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: Crear una extensión dinámica en la barra de estado -slug: Crear_una_extensión_dinámica_en_la_barra_de_estado -tags: - - Complementos - - Todas_las_Categorías - - extensiones -translation_of: Archive/Creating_a_dynamic_status_bar_extension ---- -

-

« AnteriorSiguiente »

-

- -


- Este artículo está basado en el artículo Crear una extensión en la barra de estado, el cual crea un panel estático en la barra de estado de Firefox, mejorándolo con la actualización dinámica de su contenido con información traída de la web cada pocos minutos. Concretamente, el ejemplo muestra un stock quote en la barra de estado y, cuando el ratón se mueve sobre él, muestra una ayuda emergente que contiene información más detallada sobre el stock.

- -

Los conceptos tratados en el ejemplo anterior no se explicarán de nuevo aquí. En vez de eso, descarga el código de ejemplo o ve al anterior ejemplo para más detalles.

- -

Descargar el ejemplo

- -

Puedes descargar una copia de este ejemplo para echarle un vistazo o para utilizarlo como base para tu propia extensión. O si ya tienes el código del artículo [[Crear una extensión en la barra de estado] puedes seguir este tutorial para actualizar dicho código existente con nuevas características.

- -

Descargar el ejemplo

- -

Actualizar el manifiesto de instalación

- -

Reemplaza todas las ocurrencias del ID del primer ejemplo ("status-bar-sample-1") con el ID del nuevo ejemplo ("stockwatcher") y actualiza los metadatos para describir nuestra nueva extensión.

- -

Véase Manifiestos de instalación para más detalles.

- -

Actualizar el manifiesto chrome

- -

El manifiesto chrome sólo necesita una pequeña modificación desde el ejemplo anterior. Simplemente reemplaza el ID del primer ejemplo ("status-bar-sample-1") con el nombre del nuevo ejemplo ("stockwatcher").

- -

Si necesitas un repaso, visita la sección Manifiesto Chrome.

- -

Escribir el fichero XUL

- -

Ahora necesitaremos complicar un poquito el fichero XUL para poder añadir una referencia al código Javascript que hará el trabajo real:

- -
 <?xml version="1.0" encoding="UTF-8"?>
-
- <!DOCTYPE overlay >
- <overlay id="stockwatcher-overlay"
-   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <script type="application/x-javascript"
-   src="chrome://stockwatcher/content/stockwatcher.js"/>
-
- <!-- Firefox -->
- <statusbar id="status-bar">
-   <statusbarpanel id="stockwatcher"
-     label="Loading..."
-     tooltiptext="Current value"
-     onclick="StockWatcher.refreshInformation()"
-   />
- </statusbar>
-
- </overlay>
-
- -

También has de percatarte de que la definición del panel de la barra de estado incluye ahora una nueva propiedad, onclick que referencia a la función Javascript que será ejecutada en el momento en el que el usuario pinche sobre el panel de la barra de estado. Nuestra extensión actualizará la información de stock cuando el usuario pinche en el panel.

- -

Escribir el código JavaScript

- -

La tarea de obtener el stock quote y actualizar el visor del panel de la barra de estado es manejado por el código JavaScript en el fichero stockwatcher.js

- -

A diferencia de nuestro anterior ejemplo, éste está implementado como un objeto. Lo hacemos así porque en futuros ejemplos de esta serie haremos cosas que son más fáciles de hacer si nuestra extensión está implementada así.

- -

Usamos la función del DOM window.addEventListener() para decirle a Firefox que llame a la función StockWatcher.startup() cuando se abra una nueva ventana del navegador:

- -
 window.addEventListener("load", function(e) { StockWatcher.startup(); }, false);
-
- -

Nuestra nueva extensión posee dos funciones principales: startup() y refreshInformation(). La función refreshInformation() contiene otra función llamada infoReceived(). Las siguientes secciones las diseccionarán una a una.

- -

startup()

- -

La función startup() es llamada cuando se abre una nueva ventana del navegador. We end up reloading data from each of the windows once in 10 minutes - fixing this by creating a JS component responsible for communication with the server is a good idea for one of the future articles

- -
   startup: function()
-   {
-     this.refreshInformation();
-     window.setInterval(this.refreshInformation, 10*60*1000);
-   },
-
- -

Esta función comienza llamando a nuestra función refreshInformation() la cual es responsable de recuperar y mostrar la información del stock ticker en el panel de la barra de estado. Hacemos esto ya que una vez cargada la información del stock es mostrada tan pronto como sea posible.

- -

Tras hacer esto, instalamos una rutina de intervalo en la ventana del navegador llamando a window.setInterval(). Esto configura nuestra rutina para que sea llamada cada 10 minutos (el intervalo de tiempo se especifica en milisegundos).

- -

refreshInformation()

- -

La función refreshInformation() es llamada siempre que queramos actualizar la información del stock. Es llamada cuando el usuario hace clic sobre el panel de la barra de estado, cuando nuestra extensión es añadida a la ventana del navegador y periódicamente por el manejador del intervalo para actualizar la información.

- -
   refreshInformation: function()
-   {
-     var httpRequest = null;
-     var fullUrl = "http://quote.yahoo.com/d/quotes.csv?...&e=.csv&s=GOOG";
-
-     ...
-
-     httpRequest = new XMLHttpRequest();
-
-     httpRequest.open("GET", fullUrl, true);
-     httpRequest.onload = infoReceived;
-     httpRequest.send(null);
-   }
- }
-
- -

La variable httpRequest contendrá un objeto XMLHttpRequest. Este objeto es usado para configurar y ejecutar una petición HTTP en un servidor web el cual usaremos para conseguir los datos del stock quote.

- -

La variable fullUrl es la URL completa que se usa cuando se pide un stock quote. En este caso, utilizamos los valores separados por comas devueltos por Yahoo para analizar fácilmente los datos de stock quote para Google (símbolo de ticker GOOG).

- -

refreshInformation() incrusta otra función, infoReceived(), que explicaremos en breve y de modo separado.

- -

Lo primero que hacemos es crear un nuevo objeto XMLHttpRequest para poder procesar nuestra petición. Abrimos la petición, especificando que deseamos realizar un comando HTTP "GET" con la URL fullUrl. El valor booleano true como tercer parámetro indica que queremos realizar la petición asíncronamente.

- -

Al establecer la propiedad httpRequest.onload a nuestra función infoReceived() hacemos que la petición llame a infoReceived() cuando se reciba una respuesta desde el servidor. Finalmente, enviamos la petición al servidor y volvemos.

- -

infoReceived()

- -

Cuando el servidor responda nuestra petición, nuestra función infoReceived() que está incrustada dentro de refreshInformation() será llamada automáticamente.

- -

Incrustamos esta función dentro de refreshInformation() para que el ámbito de su variable incluya a las variables usadas por dicha función. Debido a la forma en la que funciona JavaScript, si infoReceived() estuviese fuera de refreshInformation() entonces no tendría acceso al mismo ámbito de variable. De hecho, incluso el valor this no coincidiría por lo que no podemos obtener las mismas variables y funciones de ese modo.

- -
     function infoReceived()
-     {
-       var samplePanel = document.getElementById('stockwatcher');
-       var output = httpRequest.responseText;
-
-       if (output.length)
-       {
-         // Remove whitespace from the end of the string;
-         // this gets rid of the end-of-line characters
-
-         output = output.replace(/\W*$/, "");
-
-         // Build the tooltip string
-
-         var fieldArray = output.split(","); assert that fieldArray[0] == "GOOG"
-         samplePanel.label = "GOOG: " + fieldArray[1];
-         samplePanel.tooltipText = "Chg: " + fieldArray[4] + " | " +
-             "Open: " + fieldArray[5] + " | " +
-             "Low: " + fieldArray[6] + " | " +
-             "High: " + fieldArray[7] + " | " +
-             "Vol: " + fieldArray[8];
-       }
-     }
-
- -

Lo primero que hacemos aquí es asignar el panel de la barra de estado a la variable samplePanel llamando a la función del DOM document.getElementById(). Necesitamos esto para poder hacer cambios en el mismo panel de la barra de estado.

- -

Luego recuperaremos el resultado devuelto por el servidor web en la variable output desde la propiedad XMLHttpRequest.responseText property.

- -

El texto recibido del servidor tendrá este aspecto:

- -
 "GOOG",414.20,"5/1/2006","1:36pm",-3.74,417.85,419.44,412.19,4760215
-
- -

Luego analizaremos el texto. Usaremos la función split() para dividir los valores separados por comas en partes individuales, con cada campo en un elemento separado en el array fieldArray. En el índice 0 estará el símbolo del mismo ticker el cual no necesitamos debido a que sabemos el stock que estamos utilizando.

- -

La etiqueta del panel de la barra de estado se establece para que indique el valor actual del stock, el cual está almacenado en fieldArray[1], estableciendo la propiedad samplePanel.label.

- -

Luego estableceremos la ayuda emergente para el panel de la barra de estado asignándole una cadena apropiada a la propiedad samplePanel.tooltipText. La cadena se construye a partir de una combinación de cadenas estáticas y varios elementos del array fieldArray.

- -

Verlo en acción

- -

Ahora puedes instalar y probar la extensión. Deberías ver algo parecido a esto:

- -

Image:stockwatcher.png

- -

En este pantallazo tenemos también el anterior ejemplo ejecutándose, mostrando el texto "Hello World".

- -

-

« AnteriorSiguiente »

-

diff --git "a/files/es/crear_una_extensi\303\263n_en_la_barra_de_estado/index.html" "b/files/es/crear_una_extensi\303\263n_en_la_barra_de_estado/index.html" deleted file mode 100644 index 5d6b9b78c0..0000000000 --- "a/files/es/crear_una_extensi\303\263n_en_la_barra_de_estado/index.html" +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: Crear una extensión en la barra de estado -slug: Crear_una_extensión_en_la_barra_de_estado -tags: - - Complementos - - Todas_las_Categorías - - extensiones -translation_of: Archive/Creating_a_status_bar_extention ---- -

-

Siguiente »

-
Este es el primero de una serie de artículos que mostrarán cómo crear extensiones progresivamente complejas para el navegador Firefox. Aunque puede que algunos de los ejemplos de esta serie se parezcan a los ejemplos vistos en otro lugar, el objetivo de estos artículos es ayudar a reunir información en un único lugar para nuevos desarrolladores de extensiones simplificando la tarea de iniciarse.

- -

Muchos de los conceptos introducidos aquí se aplican a cualquier aplicación basada en XUL. Sin embargo, nosotros nos centraremos específicamente en Firefox.

- -

Este ejemplo añadirá una cadena de texto estática a la barra de estado situada en la parte inferior de las ventanas del navegador Firefox. Es posible que esto te recuerde al artículo Creando una extensión. No obstante este ejemplo será ampliado en los artículos siguientes.

- -

Descargar el ejemplo

- -

Puedes descargar una copia de este ejemplo para echarle un vistazo o para usarlo como base para tu propia extensión.

- -

Descargar el ejemplo

- -

El manifiesto de instalación

- -

El manifiesto de instalación, install.rdf es un fichero de texto que contiene información importante sobre la extensión para la aplicación anfitrión.

- -
 <?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>status-bar-sample-1@example.com</em:id>
-   <em:version>1.0</em:version>
-   <em:type>2</em:type>
-
-   <!-- Front End Metadata -->
-
-   <em:name>Status Bar Sample 1</em:name>
-   <em:description>Sample static status bar panel</em:name>
-   <em:creator>My Name</em:creator>"
-   <em:homepageURL>http://developer.mozilla.org/en/docs/Creating_a_status_bar_extension</em:homepageURL>
-
-   <!-- Describe the Firefox versions we support -->
-
-   <em:targetApplication>
-     <Description>
-     <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-     <em:minVersion>1.5</em:minVersion>
-     <em:maxVersion>2.0.0.*</em:maxVersion>
-     </Description>
-   </em:targetApplication>
-
-   </Description>
-
- </RDF>
-
- -

Veamos con detalle algunas partes clave del manifiesto.

- -

Información de identificación de la extensión

- -

Se necesita cierta información para que Firefox pueda identificar unívocamente tu extensión. En este ejemplo, estos campos son:

- - - - - - - - - - - - - - - - - - - - -
PropiedadDescripción
idUna cadena de identificación unívoca. Antes de Firefox 1.5, esto era un GUID. A partir de Firefox 1.5 deberías de usar una cadena de la formanombre-de-la-extensión@dominio-del-creador.
versionEl número de versión de la extensión.
typeEl tipo de complemento. Para las extensiones es 2.
- -

Información legible

- -

En este ejemplo, tenemos cuatro partes de información legible, es decir, información que es mostrada al usuario dentro de la interfaz de Firefox. Y son:

- - - - - - - - - - - - - - - - - - - - - - - - -
PropiedadDescripción
em:nameNombre de la extensión. Este nombre se muestra en la ventana de extensiones.
em:descriptionUna descripción breve sobre la extensión. Este texto se muestra además en la ventana de extensiones.
em:creatorEl nombre del autor.
homepageURLLa URL del sitio web que debe visitar el usuario para conseguir información sobre la extensión o para buscar actualizaciones. No es un campo obligatorio pero incluirlo es una buena idea.
- -

Información de la aplicación destino

- -

También es necesario incluir información que identifique la aplicación o aplicaciones en las que la extensión puede funcionar. Aunque esta extensión de ejemplo sólo funciona en Firefox, es completamente posible crear extensiones que funcionen en múltiples aplicaciones basadas en XUL.

- -

Además se necesita indicar qué versiones de la aplicación o aplicaciones destino soporta tu extensión. Si no va a funcionar en versiones antiguas de Firefox o aún no ha sido probada en nuevas versiones puedes restringir la extensión para que sólo las versiones soportadas de las aplicaciones destino intenten usarla.

- -

La información de la aplicación destino está contenida dentro del bloque em:targetApplication Description.

- - - - - - - - - - - - - - - - - - - - -
PropiedadDescripción
idUn ID que indica la aplicación destino. "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}" es un GUID que identifica unívocamente a Firefox como destino.
minVersionLa versión más antigua de la aplicación destino para la que está soportada la extensión.
maxVersionLa versión más reciente de la aplicación destino sobre la cual se conoce que funciona la extensión.
- -

Para más información sobre el formado del manifiesto de instalación, lee la sección Manifiestos de instalación.

- -

El manifiesto chrome

- -

El manifiesto chrome es un fichero que le dice a la aplicación destino dónde buscar el paquete chrome de tu extensión. El chrome es un conjunto de elementos de interfaz de usuario externos al área de contenidos de la ventana de la aplicación, tales como barras de herramientas, de estado, de menú, etc...

- -

El fichero de manifiesto chrome, chrome.manifest, es para el ejemplo este:

- -
 content status-bar-sample-1 chrome/content/
-
- # Firefox
- overlay	chrome://browser/content/browser.xul chrome://status-bar-sample-1/content/status-bar-sample-1.xul
-
- -

La primera línea indica la ubicación en disco de los contenidos de la extensión cuyo ID es "status-bar-sample-1". Dicha ruta es relativa al directorio raíz de la extensión en este caso aunque puede ser absoluta si así se quiere.

- -

La segunda línea indica un overlay. Un overlay permite añadir nuevo contenido a un documento existente. En este caso queremos ampliar la interfaz del navegador Firefox, por lo que necesitamos especificar el URI del fichero XUL de la ventana principal de Firefox, "chrome://browser/content/browser.xul" como interfaz que servirá de base y el URI de nuestro propio fichero XUL "chrome://status-bar-sample-1/content...r-sample-1.xul" como interfaz que se mezclará en el navegador.

- -

Véase XUL Overlays para más detalles sobre cómo funcionan los overlays. Además puedes encontrar más detalles sobre el formato de los manifiestos chrome en la sección Manifiestos Chrome.

- -

El overlay XUL

- -

El fichero overlay XUL contiene la descripción XUL de la interfaz de usuario que queremos añadir a Firefox. Nuestro fichero overlay status-bar-sample-1.xul tendrá este aspecto:

- -
 <?xml version="1.0" encoding="UTF-8"?>
-
- <!DOCTYPE overlay >
- <overlay id="status-bar-sample-1-overlay"
-          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- <!-- Firefox -->
- <statusbar id="status-bar">
-   <statusbarpanel id="status-bar-sample-1"
-     label="Hello World"
-     tooltiptext="Sample status bar item"
-   />
- </statusbar>
-
- </overlay>
-
- -

Lo primero a tratar en el fichero status-bar-sample-1.xul es establecer que este es de hecho un fichero XUL para configurar después un único ID para el overlay. Esto es llevado a cabo por la siguiente línea de XML:

- -
<overlay id="status-bar-sample-1-overlay"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
- -

Una vez hecho esto, podemos describir nuestra interfaz de usuario. En este caso, simplemente insertaremos un nuevo panel en la barra de estado situada en la parte inferior de las ventanas del navegador Firefox. Haremos esto incrustando dentro de statusbar llamado "status-bar" (el cual es la barra de estado de la ventana del navegador Firefox) un nuevo objeto statusbarpanel al que llamaremos "status-bar-sample-1".

- -

Incluiremos propiedades para configurar nuestro nuevo panel de barra de estado de la forma que queramos, configurando su etiqueta de texto a "Hello World" y estableciendo un título emergente con el mensaje "Sample status bar item" en él.

- -

Ponerlo a prueba

- -

Para probar tu extensión, copia el directorio en el directorio de extensiones en tu directorio hogar. Luego reinicia Firefox. Al volver deberías de ver la extensión en la barra de estado.

- -

Image:status bar sample 1.png

- -

-

Siguiente »

-

diff --git "a/files/es/c\303\263mo_crear_un_componente_xpcom_en_javascript/index.html" "b/files/es/c\303\263mo_crear_un_componente_xpcom_en_javascript/index.html" deleted file mode 100644 index 3bd03b504c..0000000000 --- "a/files/es/c\303\263mo_crear_un_componente_xpcom_en_javascript/index.html" +++ /dev/null @@ -1,191 +0,0 @@ ---- -title: Cómo crear un componente XPCOM en JavaScript -slug: Cómo_crear_un_componente_XPCOM_en_JavaScript -tags: - - Complementos - - Todas_las_Categorías - - XPCOM - - extensiones -translation_of: Mozilla/Tech/XPCOM/Guide/Building_components_in_JavaScript ---- -

 

-

Introducción

-

Éste es un tutorial del tipo "Hola Mundo" para crear un componente XPCOM en JavaScript. No se describe cómo funciona XPCOM ni se explica lo que hace cada línea de código. Todo ello se detalla en otras páginas.

-

En este tutorial mostraremos qué es lo que debes hacer para conseguir un componente funcional en pocos pasos y de forma sencilla.

-

Advertencia: lo expuesto aquí ha sido desarrollado en un Mac. El comportamiento puede variar en otros sistemas operativos.

-

Implementación

-

Éste es un componente de ejemplo, con un único método que devuelve la cadena "Hola MozDev!".

-

Definir la interfaz

-

Si quieres usar tu componente desde JavaScript, o en otros componentes XPCOM, debes definir las interfaces que quieres mostrar (si quieres usar tu componente sólo desde Javascript, puedes usar el truco wrappedJSObject para que no necesites definir interfaces como se explica aquí. Mira un ejemplo aquí (en)).

-

Hay muchas interfaces ya definidas en las aplicaciones Mozilla, así que tal vez no necesites definir una nueva. Puedes mirar las interfaces XPCOM existentes de varias formas, en el código fuente Mozilla, o usando XPCOMViewer, un GUI para ver los componentes e interfaces registradas. Puedes descargar una versión que trabaje con Firefox 2 desde MozDev.

-

Si existe una interfaz que cumpla tus necesidades, no necesitas escribir un IDL, o compilar un typelib, y puedes saltar a la siguiente sección.

-

Si no encuentras una interfaz pre-existente que te satisfaga, debes definirla. XPCOM usa un dialecto de IDL para definir interfaces, llamado XPIDL. A continuación tienes la definición XPIDL para nuestro componente HolaMozDev:

-

HolaMozDev.idl

-
#include "nsISupports.idl"
-
-[scriptable, uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx)]
-interface nsIHolaMozDev : nsISupports
-{
-  string hola();
-};
-
-

Ten en cuenta que tienes que generar un UUID para cada componente XPCOM que crees. Mira Generating GUIDs para más información.

-
- Los UUID no pueden ser escritos puesto que se debe garantizar su unicidad. Deben ser generados empleando un algoritmo que la garantice.
-

Compilar la biblioteca de tipos

-

La definición de tu interfaz debe compilarse a forma binaria (XPT) para poder ser registrada y usada dentro de las aplicaciones Mozilla. La compilación puede hacerse usando el SDK de Gecko. Puedes averiguar cómo obtener versiones Mac, Linux, y Windows del SDK de Gecko leyendo el artículo Gecko SDK.

-
- Nota: la versión Mac del SDK proporcionado para su descarga es sólo para PowerPC. Si necesitas una versión Intel, tendrás que compilarlo tú mismo como se describe en esa página.
-

Ejecuta esta orden para compilar la biblioteca de tipos. Aquí, {sdk_dir} es el directorio del SDK de Gecko descomprimido.

-
{sdk_dir}/bin/xpidl -m typelib -w -v -I {sdk_dir}/idl -e HolaMozDev.xpt HolaMozDev.idl
-
-

(El modificador -I es una i mayúscula, no una L minúscula) Esta orden creará el archivo de la bilioteca de tipos HelloWorld.xpt en el directorio de trabajo actual.

-

Crear el componente

-

HolaMozDev.js

-
/***********************************************************
-constantes
-***********************************************************/
-
-// referencia a la interfaz definida en nsIHolaMozDev.idl
-const nsIHolaMozDev = Components.interfaces.nsIHolaMozDev;
-
-// referencia requerida a la interfaz base que todos los componentes deben implementar
-const nsISupports = Components.interfaces.nsISupports;
-
-// UUID único identificando nuestro componente
-// puedes obtener el tuyo desde : http://kruithof.xs4all.nl/uuid/uuidgen
-const CLASS_ID = Components.ID("{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}");
-
-// descripción
-const CLASS_NAME = "Un Componente XPCOM de muestra";
-
-// identificador único textual
-const CONTRACT_ID = "@ejemplo.evelio.net/holamozdev;1";
-
-/***********************************************************
-definición de la clase
-***********************************************************/
-
-// el constructor de clase
-function HolaMozDev() {
-};
-
-// definición de la clase
-HolaMozDev.prototype = {
-
-  // define la función que declaramos en la interfaz
-  hola: function() {
-      return "Hola MozDev!";
-  },
-  //Desde nsISupports
-  QueryInterface: function(aIID)
-  {
-    if (!aIID.equals(nsIHolaMozDev) &&
-        !aIID.equals(nsISupports))
-      throw Components.results.NS_ERROR_NO_INTERFACE;
-    return this;
-  }
-};
-
-/***********************************************************
-la factoría de la clase
-
-Este objeto es miembro del objeto global Components.classes.
-Se deriva del ID de contrato, p.e.:
-
-miHolaMozDev = Components.classes["@ejemplo.evelio.net/holamozdev;1"].
-                          createInstance(Components.interfaces.nsIHolaMozDev);
-
-***********************************************************/
-var FabricaHolaMozDev = {
-  createInstance: function (aOuter, aIID)
-  {
-    if (aOuter != null)
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-    return (new HolaMozDev()).QueryInterface(aIID);
-  }
-};
-
-/***********************************************************
-definición del módulo (registro xpcom)
-***********************************************************/
-var HolaMozDevModulo = {
-  _firstTime: true,
-  registerSelf: function(aCompMgr, aFileSpec, aLocation, aType)
-  {
-    aCompMgr = aCompMgr.
-        QueryInterface(Components.interfaces.nsIComponentRegistrar);
-    aCompMgr.registerFactoryLocation(CLASS_ID, CLASS_NAME,
-        CONTRACT_ID, aFileSpec, aLocation, aType);
-  },
-
-  unregisterSelf: function(aCompMgr, aLocation, aType)
-  {
-    aCompMgr = aCompMgr.
-        QueryInterface(Components.interfaces.nsIComponentRegistrar);
-    aCompMgr.unregisterFactoryLocation(CLASS_ID, aLocation);
-  },
-
-  getClassObject: function(aCompMgr, aCID, aIID)
-  {
-    if (!aIID.equals(Components.interfaces.nsIFactory))
-      throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-    if (aCID.equals(CLASS_ID))
-      return FabricaHolaMozDev;
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-
-  canUnload: function(aCompMgr) { return true; }
-};
-
-/***********************************************************
-Inicialización del módulo
-
-Cuando la aplicación registra el componente, se llama a esta función.
-
-***********************************************************/
-function NSGetModule(aCompMgr, aFileSpec) { return HolaMozDevModulo; }
-
-
-

Instalación

-

Para extensiones:

-
    -
  1. Copia HolaMozDev.js y HolaMozDev.xpt al directorio {extensiondir}/components/.
  2. -
  3. Elimina compreg.dat y xpti.dat del directorio de tu perfil de usuario.
  4. -
  5. Reinicia la aplicación.
  6. -
-

Para Firefox:

-
    -
  1. Copia HolaMozDev.js y HolaMozDev.xpt al directorio {objdir}/dist/bin/components, si está corriendo desde el código fuente.
  2. -
  3. Elimina compreg.dat y xpti.dat del directorio components.
  4. -
  5. Elimina compreg.dat y xpti.dat del directorio de tu perfil de usuario.
  6. -
  7. Reinicia la aplicación.
  8. -
-

Usar tu componente

-
try {
-        // Esto es necesario para permitir el uso generalizado de componentes en JavaScript
-        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-
-        var miComponente = Components.classes['@ejemplo.evelio.net/holamozdev;1']
-                                    .createInstance(Components.interfaces.nsIHolaMozDev);
-
-        alert(miComponente.hola());
-} catch (unError) {
-        alert("ERROR: " + unError);
-}
-
-

Otros recursos

- diff --git "a/files/es/c\303\263mo_incrustar_el_motor_javascript/index.html" "b/files/es/c\303\263mo_incrustar_el_motor_javascript/index.html" deleted file mode 100644 index d938b252b8..0000000000 --- "a/files/es/c\303\263mo_incrustar_el_motor_javascript/index.html" +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Cómo incrustar el motor Javascript -slug: Cómo_incrustar_el_motor_Javascript -tags: - - páginas_a_traducir -translation_of: Mozilla/Projects/SpiderMonkey/How_to_embed_the_JavaScript_engine ---- -

Ver tambien JSAPI User Guide. En particular, tiene mas y mejores ejemplos de codigo.

-

Un esqueleto de Tutorial

-

Comprobación para iniciar una maquina virtual y ejecutar un script sin ningún error:

- -

(los errores son convencionalmente guardados en una variable JSBool llamada ok).

-
JSRuntime *rt;
-JSContext *cx;
-JSObject *global;
-JSClass global_class = {
-	"global",0,
-	JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,
-	JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub
-};
-
-/*
- * Siempre necesitará:
- *        un runtime por proceso,
- *        un contexto por hilo,
- *        un objeto global por contexto,
- *        clases estandard (ej. fecha).
- */
-rt = JS_NewRuntime(0x100000);
-cx = JS_NewContext(rt, 0x1000);
-global = JS_NewObject(cx, &global_class, NULL, NULL);
-JS_InitStandardClasses(cx, global);
-
-/*
- * Ahora suponga que el script contiene algún JS para evaluar, por decir "22/7" como una
- * mala aproximación para la función matematica Math.PI, o algo mas largo, como esto:
-* "(function fact(n){if (n <= 1) return 1; return n * fact(n-1)})(5)"
- * para calcular 5!
- */
-char *script = "...";
-jsval rval;
-JSString *str;
-JSBool ok;
-
-ok = JS_EvaluateScript(cx, global, script, strlen(script),
-					   filename, lineno, &rval);
-str = JS_ValueToString(cx, rval);
-printf("script result: %s\n", JS_GetStringBytes(str));
-
-

Como llamar funciones de C desde JavaScript

-

Suponga que la función en C sea llamada doit y le gustaria que al menos 2 parametros sean llamados (si el llamado suministra menos, el motor JS deberia asegurar que lo indefinido sea pasado por lo faltante): 

-
#define DOIT_MINARGS 2
-
-static JSBool
-doit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
-{
-    /*
-     * Look in argv for argc actual parameters, set *rval to return a
-     * value to the caller.
-     */
-    ...
-}
-
-

Entonces para la conexión con JS, debe escribir:

-
ok = JS_DefineFunction(cx, global, "doit", doit, DOIT_MINARGS, 0);
-
-

O, si tenia una serie de funciones nativas para definir, las pondria probablemente en una tabla:

-
static JSFunctionSpec my_functions[] = {
-    {"doit", doit, DOIT_MINARGS, 0, 0},
-    etc...
-    {0,0,0,0,0},
-};
-
-

(Al final, todos los ceros especificados en la función terminan la tabla), y decir:

-
ok = JS_DefineFunctions(cx, global, my_functions);
-
-

Como llamar funciones de JavaScript  desde C

-

Say the click event is for the top-most or focused UI element at position (x, y):

-
JSObject *target, *event;
-jsval argv[1], rval;
-
-/*
- * Find event target and make event object to represent this click.
- * Pass cx to NewEventObject so JS_NewObject can be called.
- */
-target = FindEventTargetAt(cx, global, x, y);
-event = NewEventObject(cx, "click", x, y);
-argv[0] = OBJECT_TO_JSVAL(event);
-
-/* To emulate the DOM, you might want to try "onclick" too. */
-ok = JS_CallFunctionName(cx, target, "onClick", 1, argv, &rval);
-
-/* Now test rval to see whether we should cancel the event. */
-if (JSVAL_IS_BOOLEAN(rval) && !JSVAL_TO_BOOLEAN(rval))
-    CancelEvent(event);
-
-

Again, I've elided error checking (such as testing for !ok after the call), and I've faked up some C event management routines that emulate the DOM's convention of canceling an event if its handler returns false.

-
-

Original Document Information

- -
-

 

diff --git a/files/es/desarrollo_web/web_adaptable/index.html b/files/es/desarrollo_web/web_adaptable/index.html deleted file mode 100644 index b2efc70e34..0000000000 --- a/files/es/desarrollo_web/web_adaptable/index.html +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Diseño web adaptable -slug: Desarrollo_Web/Web_adaptable -translation_of: Web/Progressive_web_apps ---- -

Con los usuarios de la web usando cada vez más dispositivos móviles para navegar sitios web y aplicaciones, los diseñadores y desarrolladores web necesitan asegurarse que sus creaciones se vean y funcionen bien tanto en dispositivos móviles como en equipos tradicionales de escritorio. El prominente diseñador Luke Wroblewski recomienda diseñar "primero para móviles", en lugar de hacerlo como idea tardía al diseño para escritorio. Ya sea que el diseño para móviles sea el objetivo primario o un bonito extra, puede usar el poder de CSS para asegurarse que el mismo contenido puede accederse a través de todas las plataformas de hardware, desde teléfonos móviles a pantallas panorámicas de alta resolución.

-

Este enfoque es conocido como "diseño web adaptable". Algunas de sus estrategias incluyen:

- -

Recursos

-

Overviews

- -

Técnicas

- -

Herramientas

- -

Ejemplos

- diff --git a/files/es/descripcion_general_sobre_nss/index.html b/files/es/descripcion_general_sobre_nss/index.html deleted file mode 100644 index 438437ad34..0000000000 --- a/files/es/descripcion_general_sobre_nss/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Descripcion general sobre NSS -slug: Descripcion_general_sobre_NSS -translation_of: Mozilla/Projects/NSS/Overview ---- -

Proven Application Security Architecture

-

Si usted busca incluir soporte para SSL, S/MIME, u otro estándar de seguridad en internet en su aplicación, puede hacer uso de los servicios de seguridad en red (NSS) para implementar los aspectos referidos a seguridad que necesite. NSS provee una implementación de código abierto completa de librerías criptogŕáficas usadas por AOL, Red Hat, Sun, y otras compañías en una gran variedad de productos, incluidos los siguientes:

- -

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.

diff --git "a/files/es/detecci\303\263n_del_navegador_y_cobertura_a_m\303\272ltiples_navegadores/index.html" "b/files/es/detecci\303\263n_del_navegador_y_cobertura_a_m\303\272ltiples_navegadores/index.html" deleted file mode 100644 index f52610dc6b..0000000000 --- "a/files/es/detecci\303\263n_del_navegador_y_cobertura_a_m\303\272ltiples_navegadores/index.html" +++ /dev/null @@ -1,504 +0,0 @@ ---- -title: Detección del navegador y cobertura a múltiples navegadores -slug: Detección_del_navegador_y_cobertura_a_múltiples_navegadores -tags: - - Desarrollo_Web - - Todas_las_Categorías -translation_of: Archive/Web/Browser_Detection_and_Cross_Browser_Support ---- -

La detección inapropiada de navegador puede ser la pesadilla del mantenimiento de la web. Re-evaluar los puntos básicos de cuándo y cómo detectar los agentes de usuario (user agents) es crucial para crear un contenido web mantenible y aceptable para múltiples navegadores. Este artículo revisa varias aproximaciones a la detección de navegadores y su utilidad en circunstancias específicas para llegar a una aproximación a la detección de navegadores basada en el sentido común.

-

Consejo rápido

-

Para determinar si el usuario visitante está utilizando un navegador basado en Gecko, basta con probar con:

-

navigator.product == 'Gecko'

-

o buscar la secuencia:

-

'Gecko/' en el navigator.userAgent. Debe tenerse en cuenta que algunos otros navegadores como Safari incluyen (like Gecko) en su cadena de agente de usuario y pueden confundir algunas comprobaciones simples.

-

Introducción

-

En un mundo ideal se podría escribir HTML, XML, CSS y JavaScript y preocuparse sólo por los estándares de W3C y ECMA. Sin embargo, no vivimos en tal mundo por el momento. Debido a fallos, implementaciones incompletas de los estándares y navegadores anticuados, los desarrolladores web deben ser capaces de determinar qué navegador está usando un visitante y proporcionar el contenido y código script apropiado.

-

Aunque la detección del navegador es quizás la tarea de script más común que aborda cualquier desarrollador web, parece que la variedad de diferentes estrategias en uso para detectar navegador es ilimitada. Como miembro del equipo de evangelismo de Netscape que ha pasado más de un año investigando el contenido web, puedo decir sin duda que la mayoría de los problemas de compatibilidad encontrados en la web hoy en día se deben a una falta de comprensión de los estándares combinada con estrategias de detección de navegadores inadecuada e inapropiada.

-

Este artículo intenta proporcionar una visión superficial de las estrategias y buenas prácticas de detección de navegadores. Para recomendaciones más específicas, puede leer el Manual de Compatibilidad de Gecko.

-

Gecko

-

Aunque muchos desarrolladores web conocen Firefox, los navegadores de Mozilla y Netscape 6/7, muchos menos son conscientes de que estos navegadores son miembros de una familia completa de agentes de usuario basados en Gecko layout engine que incluyen el navegador comercial CompuServe 7, y navegadores de código abierto como Epiphany, Galeon, Camino, y Kmeleon.

-

Gecko se diseñó desde el principio para cumplir con los estándares del W3C HTML, W3C CSS, W3C XML, W3C DOM, y ECMAScript (JavaScript). También incluye características de compatibilidad que permiten gestionar razonablemente el contenido heredado que se desarrolló para generaciones anteriores de navegadores como Nescape Navigator 4 así como características que proporcionan compatibilidad con Internet Explorer 5 y 6. A diferencia de otros navegadores, Gecko es realmente un navegador para múltiples plataformas y proporciona idéntica cobertura en todos los sistemas operativos donde está admitido.

-

La manera más fácil de tratar correctamente Gecko es crear contenido que sólo use los estándares. Desafortunadamente, ningún otro navegador implementa los estándares de una manera tan completa como Gecko, lo que quiere decir que los autores y desarrolladores web se ven forzados a continuar proporcionando cobertura a otros navegadores que no admiten los estándares tan bien. Afortunadamente, otros navegadores como Opera 7/8, y en menor medida Internet Explorer 5 y 6 para Windows e Internet Explorer 5 para Macintosh también implementan los estándares hasta cierto punto. Estos otros navegadores también parecen estar avanzando hacia una implementación más completa y rigurosa de los estándares y se espera que, en el futuro, los autores y desarrolladores web podrán olvidarse de la detección de navegadores al menos en lo relativo a las características gobernadas por estándares.

-

Aún se debe resolver cómo desarrollar contenido basado en estándares sin dejar de aprovechar las diferentes implementaciones de los navegadores modernos y, al mismo tiempo, admitir (en menor grado) los navegadores más antiguos y capaces. La detección de navegadores es clave para cumplir esta tarea.

-

Resumen de la historia de la detección de navegadores

-

Para entender por qué muchas estrategias comunes de detección de navegadores son inapropiadas, hay que referirse primero a cómo surgieron estas estrategias.

-

En los primeros días de la web, HTML era muy simple, no estandarizado y no incluía ninguna capacidad para scripts del lado cliente. HTML en sí mismo no se estandarizó hasta que se presentó HTML 2.0 a finales de 1995 y ni siquiera incluía tablas. Los suministradores de navegadores como Netscape y Microsoft competían para añadir características atractivas al HTML que implementaban en sus navegadores para proporcionar el contenido más atractivo y rico a sus usuarios e inducir a los autores web a hacer uso de ello. Las capacidades de los navegadores para incluir lo último y mejor en contenidos cambiaban casi diariamente.

-

Los autores web se encontraron desde el principio con una variedad de navegadores, algunos de los cuales implementaban la mejor y última versión de HTML y algunos que no lo hacían. La solución era o bien proporcionar el mínimo común denominador de HTML o usar técnicas de detección de navegadores en el servidor web para enviar contenido personalizado a cada navegador dependiendo del grado de implementación que proporcionaba éste. Acababa de nacer la detección de navegadores en el lado del servidor usando las cadenas de agente de usuario.

-

Las cadenas de agente de usuario se definen en el protocolo HTTP y están disponibles para los servidores web (refiérete al RFC 1945 - Hypertext Transfer Protocol 1.0 and RFC 2068 - Hypertext Transfer Protocol 1.1).

-

La aproximación más común en este momento era distinguir los agentes de usuario por vendor (suministrador) y version (versión) usando la cadena de agente de usuario recibida. Aunque esta aproximación se consideraba razonable en aquel momento, causó problemas a los suministradores de navegadores desde el principio. Los navegadores Netscape originales usaban una cadena de usuario que comenzaba con el nombre en clave del navegador Netscape seguido por su número de versión, p.e. Mozilla/version seguido por un token de comentario que daba información adicional relativa al sistema operativo usado, etc. Puesto que las primeras técnicas de detección de navegadores se basaban en buscar un navegador basado en Netscape y sólo proporcionaban contenido personalizado a los navegadores que usaban la cadena de usuario Mozilla/version, otros suministradores hicieron norma el uso de Mozilla/version para indicar que eran compatibles con una versión en concreto de Netscape. Ya que otros navegadores fingían ser navegadores Netscape y codificaban su información de versión de una manera no estándar en el área de comentarios del agente de usuario, la tarea de determinar qué navegador se estaba usando se convirtió en más complicada de lo que debía haber sido.

-

Netscape Navigator 2 introdujo la capacidad de ejecutar JavaScript en los navegadores web. A medida que la evolución de los navegadores continuó, aparecieron las diferencias en la implementación del script y los objetos admitidos por el navegador. Los autores web ya no debían sólo detectar los navegadores web en sus servidores web, sino que podían ahora ejecutar scripts en el lado cliente (en el mismo navegador) que podían usarse para distinguir navegadores. Una de las primeras aproximaciones a la detección de navegadores en el lado cliente incluía probar si el navegador implementaba determinados objetos. Un ejemplo de esta aproximación era probar la existencia del objeto document.images.

-

Aunque la detección basada en objetos se usó en algunas circunstancias, muchos autores web continuaron usando la aproximación vendor/version para distinguir navegadores web en sus scripts del lado cliente. Puesto que la cadena de agente de usuario era accesible como una propiedad del objeto navigator (p.e. navigator.userAgent), muchos autores web usaron la misma lógica en sus scripts del lado cliente que ya habían usado anteriormente en el lado del servidor. Además de navigator.userAgent estaban disponibles otras propiedades como appName y appVersion en el objeto navigator que podían usarse en las estrategias de detección de navegadores vendor/version.

-

El ejemplo clásico de esta estrategia de detección vendor/version en el lado cliente puede encontrarse en el Ultimate Browser Sniffer. Este script y variantes del mismo pueden encontrarse hoy en día en muchos sitios web, donde es una fuente común de problemas de detección.

-

Netscape Navigator 4 e Internet Explorer 4 introdujeron la capacidad de manipular el contenido HTML en un navegador (Dynamic HTML o DHTML) en lugar de en el servidor web y comenzaron la introducción de las implementaciones de CSS para proporcionar estilos al contenido. Esta generación de navegadores, además de compartir varias características que no estaban disponibles en versiones previas, implementaban cada una su propias (e incompatibles) capacidades competidoras para manipular contenido en una página web.

-

Dado que los navegadores de cada suministrador implementaban diferentes objetos para ejecutar DHTML, los autores web comenzaron a usar la detección de objetos para distinguir vendor/version a través de la existencia de objetos JavaScript concretos. La existencia de document.layers era suficiente para estar seguro de que el navegador era Netscape Navigator 4 mientras que la existencia de document.all era suficiente para estar seguro de que el navegador era Microsoft Internet Explorer 4. Una suposición implícita que muchos autores web de esa época hacían era que sólo había dos tipos de navegadores disponibles... Netscape Navigator y Microsoft Internet Explorer.

-

Estas estrategias de clasificar los navegadores por vendor/version, asumiendo que los únicos navegadores en uso eran Netscape Navigator 4 o Internet Explorer 4 falló cuando aparecieron navegadores alternativos como los basados en Gecko. Muchos de los problemas informados en la prensa sobre la incapacidad de Gecko de mostrar contenido estaban directamente relacionados con estrategias de detección de navegadores inadecuadas e inapropiadas.

-

Una nota final en las estrategias vendor/version. Un desarrollador web que use completamente la detección y distinciones de navegador en el Ultimate Browser Sniffer producirá código que usa bifurcaciones de código para muchos navegadores y versiones. Imagine intentar mantener un sitio web que use muchas de las variables disponibles de Ultimate Browser Sniffer.

- -
suministrador del navegador is_nav, is_ie, is_opera, is_hotjava, is_webtv, is_TVNavigator, is_AOLTV
número de versión del navegador is_major (integer que indica el número de versión mayor: 2, 3, 4 ...), is_minor (float que indica el número de versión completo: 2.02, 3.01, 4.04 ...)
suministrador Y número de version mayor del navegador is_nav2, is_nav3, is_nav4, is_nav4up, is_nav6, is_nav6up, is_gecko, is_ie3, is_ie4, is_ie4up, is_ie5, is_ie5up, is_ie5_5, is_ie5_5up, is_ie6, is_ie6up, is_hotjava3, is_hotjava3up, is_opera2, is_opera3, is_opera4, is_opera5, is_opera5up
número de versión de JavaScript is_js (float que indica el número completo de versión de JavaScript: 1, 1.1, 1.2 ...)
plataforma y versión de SO is_win, is_win16, is_win32, is_win31, is_win95, is_winnt, is_win98, is_winme, is_win2k, is_os2, is_mac, is_mac68k, is_macppc, is_unix, is_sun, is_sun4, is_sun5, is_suni86, is_irix, is_irix5, is_irix6, is_hpux, is_hpux9, is_hpux10, is_aix, is_aix1, is_aix2, is_aix3, is_aix4, is_linux, is_sco, is_unixware, is_mpras, is_reliant, is_dec, is_sinix, is_freebsd, is_bsd, is_vms
-

¡Detectar navegadores usando este nivel de detalle es inmanejable, inmantenible y viola los principios básicos de la autoría web! Se recomienda profundamente a todo el mundo que evite esta trampa.

-

Problemas causados por una detección inapropiada del navegador

-

Exclusión de navegadores desconocidos

-

Si en su lógica de detección sólo proporciona pruebas para navegadores específicos, su sitio no será utilizable en caso de que un visitante use un navegador diferente. Considere el siguiente ejemplo:

-

-
// PROCEDIMIENTO ERRÓNEO - no usar!
-if (document.all)
-{
-// Internet Explorer 4+
-document.write('<link rel="stylesheet" type="text/css" src="style-ie.css">');
-}
-else if (document.layers)
-{
-// Navigator 4
-document.write('<link rel="stylesheet" type="text/css" src="style-nn.css">');
-}
-
-

Observe cómo el ejemplo anterior sólo proporcionaba hojas de estilo para Internet Explorer y Navigator 4, e incluso así sólo si el visitante tiene JavaScript activado en su navegador. Los usuarios de Netscape 6, Netscape 7, CompuServe 7, Mozilla, Opera no podrán ver el sitio correctamente.

-

Interpretación errónea de los navegadores

-

Un error común que hacen los autores web es asumir que si un navegador no es Netscape Navigator 4, ha de ser Internet Explorer y viceversa. Por ejemplo:

-
// PROCEDIMIENTO ERRÓNEO - no usar!
-if (document.all)
-{
-  // Internet Explorer 4+
-  elm = document.all['menu'];
-}
-else
-{
-  // Se asume Navigator 4
-  elm = document.layers['menu'];
-}
-
-

Observe cómo el ejemplo anterior asumía que cualquier navegador que no sea Internet Explorer ha de ser Navigator 4 e intentaba usar Layers. Éste es un origen común de problemas al usar navegadores basados en Gecko así como Opera. Un error similar puede verse en el siguiente ejemplo:

-
// PROCEDIMIENTO ERRÓNEO - no usar!
-if (document.layers)
-{
-  // Navigator 4
-  elm = document.layers['menu'];
-}
-else
-{
-  // Se asume Internet Explorer 4+
-  elm = document.all['menu'];
-}
-
-

Netscape 6 fue el primer navegador comercial publicado basado en Gecko. Debido a una falta de comunicación y comprensión, muchos sitios han creado estrategias de detección inapropiadas basadas en la cadena de agente de usuario de Netscape 6. La cadena de agente de usuario de Netscape 6 sigue los estándares HTTP para especificar la versión del agente de usuario (véase Mozilla user-agent strings y Cadenas de agente de usuario de Gecko).

-
Mozilla/5.0 (...) Gecko/20001108 Netscape6/6.0
-
-

El primer par suministrador/versión (Mozilla/5.0) indica que Netscape 6 es un navegador de quinta generación y que no es idéntico a los navegadores anteriores. Todos los navegadores basados en Gecko devuelven actualmente Mozilla/5.0 como su versión primaria aunque ningún otro navegador lo hace así en este momento. Se confía en que, cuando otros suministradores de navegadores alcancen el mismo nivel de cumplimiento de estándares que Gecko y comiencen a eliminar la compatibilidad con navegadores antiguos, ellos también comenzarán a informar que su versión es 5. Asumir que únicamente Gecko usa Mozilla/5.0 hará que su lógica de detección de navegadores falle tan pronto como otro suministrador publique un navegador que devuelva Mozilla/5.0.

-

El segundo par suministrador/versión (Gecko/20001108) identifica Netscape 6 como una versión concreta de Gecko que se compiló el 8 de noviembre de 2000. Si debe detectar Gecko usando la cadena de agente de usuario, Gecko/CCYYMMDD es la cadena más adecuada a buscar.

-

El tercer par suministrador/versión (Netscape6/6.0) identifica esta instancia en particular de un navegador Gecko como Netscape 6.0. Muchos sitios se centraron en la existencia de la cadena Netscape6 en el agente de usuario y usaron comprobaciones similares a:

-
if (navigator.userAgent.indexOf('Netscape6') != -1)
-{
-  // Netscape 6 code
-}
-
-

Observe cómo este tipo de detección obvia cualquier otro navegador basado en Gecko. Desafortunadamente, la cadena de agente de usuario de Netscape 6 no era suficientemente generalizable debido a su uso de la cadena Netscape6 como descripción del suministrador. Netscape 7 corrige este error e introduce otra posibilidad de que falle la detección basada en la cadena de agente de usuario.

-
Mozilla/5.0 (...) Gecko/200207XX Netscape/7.0
-
-

Observe cómo Netscape 7 ya no usa la cadena Netscape6 como suministrador. Cualquier estrategia de detección de cadena de usuario para Gecko basada en la existencia de la cadena Netscape6 fallará si el navegador es Netscape 7.

-

Utilización de objetos JavaScript para determinar el suministrador/versión (vendor/version)

-

Como ya se ha discutido, una aproximación común en el pasado fue usar objetos para clasificar los navegador por suministrador/versión. Un tipo común de detección que originalmente se escribió para identificar únicamente Netscape Navigator 4 e Internet Explorer 4 podría tener este aspecto:

-
// PROCEDIMIENTO ERRÓNEO - no usar!
-if (document.all)
-{
-  // IE4
-  height = document.body.offsetHeight;
-}
-else if (document.layers)
-{
-  // NN4
-  height = window.innerHeight;
-}
-else
-{
-  // other
-  height = 0;
-}
-
-

Con la introducción de DOM de W3C, el método estándar document.getElementById pasó a estar disponible en Internet Explorer 5 y más tarde en Netscape 6 (Gecko). Muchos autores web decidieron que la manera más fácil de identificar Netscape Gecko era añadir otra bifurcación de código como sigue:

-
// PROCEDIMIENTO ERRÓNEO - no usar!
-if (document.all)
-{
-  // IE4
-  height = document.body.offsetHeight;
-}
-else if (document.layers)
-{
-  // NN4
-  height = window.innerHeight;
-}
-else if (document.getElementById)
-{
-  // Creen que esto es Gecko
-  // ¡pero podrían estar equivocados!
-  height = window.innerHeight;
-}
-else
-{
-  // Otros
-  height = 0;
-}
-
-

La aproximación es incorrecta ya que asumen que el único otro navegador además de Internet Explorer 5+ que implementa document.getElementById es Gecko. Esto no es cierto hoy en día y será cada vez menos cierto a medida que aparezcan más navegadores en el futuro que implementen los estándares DOM de W3C.

-

Recomendaciones

-

Centrarse en los estándares y no en navegadores concretos

-

Si bien el período de 1994 a 2000 estuvo dominado por navegadores incompatibles y no estándares de Netscape y Microsoft, ahora el factor dominante en el desarrollo web son los estándares propuestos por el World Wide Web Consortium (W3C). Los estándares son importantes para los desarrolladores web debido al incremento de la flexibilidad, potencia de presentación y ayudas a los usuarios con alguna discapacidad, por citar sólo algunas razones.

-

Orientar el contenido de una web a suministradores concretos ignora la posibilidad de que puedan aparecer otros navegadores que implementen los mismos estándares en el futuro. Un problema común en la web hoy en día es la suposición de que los únicos navegadores en el mundo son Netscape Navigator y Microsoft Internet Explorer. Esto ignora la existencia de Opera así como los dispositivos de mano más modernos que se están usando para acceder a la web ahora y en el futuro.

-

Los navegadores basados en Mozilla (como Firefox), Internet Explorer 6 en Windows, e Internet Explorer 5 para Macintosh implementan todos ellos DOCTYPE switching. Ésta es una técnica por la cual estos navegadores pueden cambiar de un modo con "veriecuetos" ("Quirks" mode) (que emula las implementaciones con errores de los navegadores de generaciones anteriores) a un modo de estándares (que se adhiere más estrictamente a los estándares). Para los contenidos nuevos, se recomienda el uso de un DOCTYPE que invoque el modo de estándares en Gecko e Internet Explorer 6. Esto asegurará que sus diseños funcionen de manera similar en estos navegadores así como en otros navegadores que implementen los estándares.

-

Proporcionar una alternativa a los navegadores desconocidos

-

Proporcione siempre contenido y bifurcaciones de código para los navegadores desconocidos. La aproximación recomendada es asumir que cualquier navegador no conocido implementa los estándares básicos de HTML y CSS y hasta cierto nivel JavaScript y DOM de W3C. Esto garantizará que su contenido será admitido hoy y en el futuro por cualquier navegador que implemente los estándares.

-

Limitar el uso de características específicas de un suministrador/versión

-

Crear contenido que sea conforme a los estándares es la manera más fácil de dar cobertura al rango más amplio posible de agentes de usuario y decrementar sus costes de mantenimiento. Aunque no siempre es posible evitar las diferencias entre valores específicos de suministrador/versión de varios navegadores, el uso de tales características y la distinción entre navegadores basada en valores de suministrador/versión debería estar estrictamente limitada a aquellas áreas donde aún se requiera.

-

Limitar el uso de detección basada en la cadena de agente de usuario

-

La detección de navegadores en el lado del servidor requiere el uso de cadenas de agente de usuario. Recomendamos que el uso de la detección basada en cadenas de agente de usuario se limite a situaciones en el lado del servidor y únicamente a aquellas circunstancias donde es absolutamente necesario, como cuando es preciso obtener detalles de la rama de Gecko.

-

Hay razones legítimas para usar la cadena de agente de usuario (o el objeto navigator) para determinar exactamente qué suministrador, versión o sistema operativo se está usando. Muchos sitios financieros (bancos, firmas que operan en bolsa online, etc.) tienen políticas muy estrictas con respecto a qué navegadores prestan asistencia. Esto se debe al historial de problemas de seguridad que se han descubierto en navegadores antiguos. Si tiene la necesidad de permitir sólo a algunas versiones concretas de navegadores que usen su sitio seguro, entonces la cadena de agente de usuario y la información relacionada del objeto navigator pueden resultar muy útiles.

-

También puede usar información detallada con respecto a la versión de un navegador para solventar fallos en versiones específicas de un navegador. Sin embargo, esto puede derivar rápidamente en una pesadilla para el mantenimiento si no es cuidadoso. Se recomienda que tome estas medidas sólo con carácter temporal y, tan pronto como se corrijan en versiones más modernas del navegador, que requiera a sus visitantes que actualicen éste.

-

Proporcionar páginas básicas para los navegadores más antiguos

-

Ningún sitio web comercial de hoy en día considera un requisito que se visualice correctamente en Netscape Navigator versiones 1, 2 o 3, o Microsoft Internet Explorer 3. Las razones son que las capacidades de esos navegadores son demasiado limitadas comparadas con los navegadores más modernos, los requerimientos añadidos de desarrollo y control de calidad incrementan demasiado el coste de desarrollo de los sitios web y la cuota de mercado de tales navegadores no justifica el coste de tenerlos en cuenta.

-

Una de las decisiones más importantes que puede tomar de cara a mejorar la calidad de su sitio y reducir los costes de desarrollo, mantenimiento y control de calidad es proporcionar sólo una atención limitada a los navegadores más antiguos tales como Netscape Navigator 4 e Internet Explorer 4. Una de las aproximaciones más comunes en los sitios web más importantes es proporcionar una versión de bajo nivel de una página web a los navegadores más antiguos a la vez que proporciona una página más rica que usa CSS y JavaScript avanzados a los navegadores más modernos. Esto puede conseguirse mediante la detección del navegador en el lado del servidor, ya sea como parte de una solución basada en scripts o como parte de la capacidad nativa del servidor web de proporcionar diferente contenido a diferentes agentes de usuario. Esta aproximación no requiere necesariamente que prepare páginas separadas para los navegadores modernos y los más simples. Una solución común es escribir el contenido en un formato neutral como XML y usar transformaciones XSLT para generar el HTML necesario para cada clase de navegador.

-

El que un navegador en concreto debe recibir la versión de bajo nivel depende hasta cierto punto de qué características de JavaScript o CSS se estén usando en el contenido avanzado. Netscape Navigator e Internet Explorer 4 deberían considerarse ambos navegadores de bajo nivel para la mayoría de las páginas debido a su limitada implementación de los estándares basados en CSS y el más reciente DOM. Si sus páginas hacen uso de JavaScript avanzado que manipula o crea nuevo contenido usando la especificación DOM Core de W3C, entonces Opera 5 y 6 también deben considerarse de bajo nivel debido a su limitada implementación de DOM de W3C.

-

El futuro pertenece a los desarrolladores y navegadores que implementen los estándares. Si deja de sacar partido a los cambios que se avecinan en los navegadores, los competidores se comeran su comida. Cuando eso suceda, el único lugar en el que se podrá encontrar su sitio web es en el archivo web.

-

Usar detección no basada en script cuando sea posible

-

Los navegadores más antiguos tienen muchas limitaciones que hacen que ignoren las características más avanzadas. El uso juicioso de estas limitaciones en los navegadores más antiguos le permitirá incluir contenido moderno sin dejar de prestar asistencia a los navegadores antiguos.

-

HTML proporciona varios métodos para detectar si una implementación incluye diversas características como scripts y marcos. Use estas capacidades naturales de HTML para extender el abanico de navegadores admitido por el contenido de su web.

-

Usar NOFRAMES para dar cobertura a los navegadores que no implementan marcos

-
<HTML>
-  <HEAD>
-    <TITLE>Marcos</TITLE>
-  </HEAD>
-  <FRAMESET ROWS="30,*">
-    <FRAME SRC="foo.html">
-    <FRAME SRC="bar.html">
-    <NOFRAMES>
-      <BODY>
-        <P>
-          Esta página requiere marcos. Vea el mapa de sitio:  <a href="noframes.html"></a>.
-        </P>
-      </BODY>
-    </NOFRAMES>
-  </FRAMESET>
-</HTML>
-
-

Usar NOSCRIPT para dar cobertura a los navegadores que no permiten el uso de scripts

-

Algunos navegadores pueden no implementar scripting, y algunos usuarios pueden tener los scripts desactivados en sus navegadores. Use la etiqueta NOSCRIPT para proporcionar a esos usuarios versiones alternativas de sus páginas que no usen scripts, o al menos notificarles de la necesidad de permitir la ejecución de scripts para poder visualizar su contenido correctamente.

-

Dado que navegadores tales como Netscape Navigator 4 e Internet Explorer 4 no implementan algunas de las adiciones más recientes al estándar JavaScript (ECMAScript), a menudo es necesario limitar el uso las características avanzadas de JavaScript tales como el procesamiento de excepciones. Una aproximación es requerir que los usuarios de navegadores que no admitan el nivel de JavaScript usado en su contenido desactiven JavaScript para poder usar su contenido. Puede hacer esto proporcionando un mensaje de error a los usuarios de navegadores más antiguos así como un contenido alternativo incluido en las etiquetas NOSCRIPT.

-
<HTML>
-  <HEAD>
-    <TITLE>Sin script ('noscript')</TITLE>
-  </HEAD>
-  <BODY>
-    <SCRIPT LANGUAGE="JavaScript">
-      window.onerror = function ()
-      {
-        // Envía al usuario a una página describiendo las limitaciones
-        // del navegador y le indica que tiene que desactivar
-        // JavaScript para poder ver su sitio.
-      }
-
-      // Netscape Navigator 4 generará un error en cualquier
-      // JavaScript que intente usar procesamiento de excepciones
-      // con bloques try ... catch.
-      try
-      {
-        // Código para implementar un menú bonito
-      }
-      catch (errores)
-      {
-        // Manejo de excepciones
-      }
-    </SCRIPT>
-    <NOSCRIPT>
-      <!--
-      Si JavaScript no está activado, entonces el navegador
-      mostrará los contenidos de la etiqueta NOSCRIPT
-      que, en este caso, es un simple menú implementado
-      como una lista no ordenada.
-      -->
-      <UL>
-        <LI><A HREF="choice1.html">Elección 1</A></LI>
-        <LI><A HREF="choice2.html">Elección 2</A></LI>
-      </UL>
-    </NOSCRIPT>
-  </BODY>
-</HTML>
-
-

Usar SCRIPT LANGUAGE para elegir el navegador en el que se ejecuta

-

La elección del lenguaje de scripting viene determinada por el atributo LANGUAGE de la etiqueta script. Internet Explorer 4 y superiores pueden admitir una variedad de lenguajes de script. Los más comunes son VBSCRIPT y JavaScript. Internet Explorer también usa JSCRIPT como un sinónimo de JavaScript. Puesto que otros navegadores no admiten los valores VBSCRIPT o JSCRIPT como atributo de lenguaje, puede usar éstos cuando desee que ciertos scripts se ejecuten únicamente por Internet Explorer 4 y superior.

-
<HTML>
-  <HEAD>
-    <TITLE>Lenguajes Script</TITLE>
-  </HEAD>
-  <BODY>
-    <SCRIPT LANGUAGE="JavaScript">
-      // Código JavaScript para implementar un menú vistoso
-      // Visible a todos los navegadores que admitan JavaScript
-    </SCRIPT>
-    <SCRIPT LANGUAGE="JScript">
-      // Código JavaScript que usa características propietarias de
-      // Internet Explorer no disponibles en otros navegadores
-    </SCRIPT>
-    <SCRIPT LANGUAGE="VBScript">
-      // Codigo VBScript que usa características propietarias de
-      // Internet Explorer no disponibles en otros navegadores
-    </SCRIPT>
-  </BODY>
-</HTML>
-
-

Usar las limitaciones CSS de Netscape Navigator 4

-

Es posible usar las limitaciones de Netscape Navigator 4 en su implementación CSS para excluir automáticamente ciertas reglas CSS de su interpretación por Navigator 4.

-

Por ejemplo, Navigator 4 no comprende la directiva @import en CSS y no cargará ninguna hoja de estilo CSS externa especificada vía @import. Esta técnica puede usarse para proporcionar reglas CSS básicas comunes para todos los navegadores (incluyendo Navigator 4) y, al mismo tiempo, proporcionar reglas más avanzadas en un archivo CSS externo para los navegadores más modernos con mejor cumplimiento CSS.

-
<STYLE type="text/css">
-/* Reglas CSS para Navigator 4 */
-</STYLE>
-
-<STYLE type="text/css">
-/* Reglas CSS avanzadas ignoradas por Navigator 4 */
-@import "advanced.css";
-</STYLE>
-
-

Hay disponible una técnica similar para ocultar las reglas CSS de Navigator 4 aprovechando el hecho de que Navigator 4 ignorará las reglas CSS que aparezcan tras la secuencia /*/*/ en una hoja de estilos.

-
<STYLE type="text/css">
-/* Reglas para Navigator 4 */
-
-/*/*/
-/* Reglas CSS avanzadas ignoradas por Navigator 4 */
-</STYLE>
-
-

DevEdge usa esta técnica para ocultar el CSS avanzado de Navigator 4.

-

Usar detección de objetos orientada a características

-

La detección de objetos es un poderoso método para proporcionar cobertua a múltiples navegadores en su contenido web. Aunque puede usar la detección de objetos como un medio más para distinguir entre distintos suministradores y versiones, la técnica muestra su verdadero potencial cuando se usa para detectar características en lugar de navegadores.

-

La detección de objetos orientada a características consiste en comprobar la existencia de objetos específicos antes de intentar usarlos en un script. El ejemplo clásico es:

-
if (document.images)
-{
-  // código que procesa las imágenes
-}
-
-

La ventaja de la detección de características es que funcionará con independencia del suministrador y versión. Podemos reescribir el ejemplo anterior que ilustraba los problemas de usar objetos para determinar el suministrador y versión para que use en su lugar detección de características.

-
if (document.body && typeof(document.body.offsetHeight) == 'number')
-{
-  height = document.body.offsetHeight;
-}
-else if (typeof(window.innerHeight) == 'number')
-{
-  height = window.innerHeight;
-}
-else
-{
-  height = 0;
-}
-
-

Observe cómo el ejemplo anterior no hace suposiciones sobre qué navegador se está usando. En su lugar, sólo comprueba los objetos que desea usar. Puesto que los valores numéricos podrían ser cero, el script prueba el tipo de los objetos para asegurarse de que son números.

-

Gecko y Navigator 4

-

Gecko es el reemplazo para el motor de dibujado de Navigator 4 y, como tal, retiene muchas características de Navigator 4. Las diferencias básicas entre Navigator 4 y Gecko pueden resumirse rápidamente en:

- -

Gecko e Internet Explorer

-

Gecko implementa cierto número de características propietarias de Internet Explorer, especialmente con respecto a su modelo de objetos DHTML. La implementación en Gecko de las características de IE se ha ido incrementando paulatinamente desde la presentación de Netscape 6 en noviembre de 2000. La mejor aproximación para sacar partido de estas características de compatibilidad con IE en Gecko es usar la detección de características basada en objetos. Esto usará automáticamente esas características en Gecko si están disponibles en la versión de Gecko usada. Vea la DOM Client Object Cross-Reference:navigator para más detalles sobre qué objetos y propiedades de Internet Explorer están implementadas en qué versiones de Gecko.

-

Ciertas características de Internet Explorer no están implementadas en Gecko. Entre éstas se incluyen el objeto window.event, behaviors, filtros, transiciones y ActiveX.

-

Cómo (y cuándo) usar el objeto navigator al detectar Gecko

-

A menos que necesite específicamente detectar si se está usando Gecko, no use estos métodos. Sólo deberían usarse en circunstancias que no puedan ser resueltas usando la detección de características mediante objetos como, por ejemplo, cuando deben excluirse versiones específicas de Gecko por razones de seguridad.

-

Nota: para la detección en el lado cliente, recomendamos usar el objeto navigator y sus propiedades. Toda la información devuelta en el objeto navigator también está disponible en la cadena de agente de usuario que puede usarse en el lado del servidor.

-

Producto (product)

-

navigator.product es específico de los navegadores Gecko y siempre devolverá 'Gecko'. Ésta es una manera rápida y sencilla de determinar que un navegador está basado en Gecko.

-

Etiqueta de la rama CVS (CVS Branch Tag)

-

A partir de Gecko 0.9.0 (Netscape 6.1 en Gecko 0.9.2), navigator.userAgent contiene la etiqueta de la rama CVS del código fuente usado para crear la versión de Gecko usada en el navegador. La etiqueta de la rama está incluida en el área de comentario de la cadena de agente de usuario y está precedida de la secuencia 'rv:'. En el ejemplo siguiente, la etiqueta de la rama es a.b.c.

-
Mozilla/5.0 (...; rv:a.b.c) Gecko/CCYYMMDD Suministrador/versión
-
-

Los navegadores Gecko compilados desde la misma rama comparten la misma versión básica de Gecko y pueden tratarse de manera similar en lo relativo a HTML, CSS, JavaScript, etc. Por ejemplo, Netscape 6.2, 6.2.1, 6.2.2, 6.2.3 y CompuServe 7 están, todos ellos, compilados a partir de la rama 0.9.4 y, por tanto, tienen el mismo comportamiento en muchos aspectos.

- -
Etiquetas de ramas Gecko
Navegador Etiqueta de rama
Netscape 6.0 contenía M18 en lugar del valor rv
Netscape 6.1 0.9.2
Netscape 6.2 0.9.4
Netscape 6.2.1 0.9.4
Netscape 6.2.2 0.9.4.1
Netscape 6.2.3 0.9.4.1
CompuServe 7 0.9.4.2
Netscape 7.0 1.0.1
Netscape 7.01 1.0.2
-

Como puede ver, todas las versiones de Netscape 6.2 y CompuServe 7 fueron creadas de la rama 0.9.4. La distinción entre 0.9.4, 0.9.4.1, 0.9.4.2 es menor.

-

Nota: la etiqueta de la rama es una cadena y puede contener más cosas que dígitos sueltos en un nivel concreto. Por ejemplo, es concebible que algún día existan etiquetas de ramas similares a 2.2.0 y 2.12.36. Puesto que estos valores son cadenas, no es posible realizar comparaciones entre cadenas para determinar qué rama es posterior. En nuestro ejemplo, la rama 2.2.0 se creó antes que la 2.12.36, pero una comparación de esos valores entre cadenas mostrará que '2.2.0' > '2.12.36'. La función JavaScript geckoGetRv() proporciona una solución a este problema convirtiendo la etiqueta de la rama en la cadena de agente de usuario en un número de coma flotante donde cada nivel de la etiqueta de la rama es considerado un número entre 0-99.

- -
Ejemplo de geckoGetRv()
Etiqueta de rama geckoGetRv()
0.9.2 0.0902
0.9.4 0.0904
0.9.4.1 0.090401
0.9.4.2 0.090402
1.0.1 1.0001
1.0.2 1.0002
2.2.0 2.02
2.12.36 2.1236
-

geckoGetRv() devuelve valores que pueden compararse usando mayor que, menor que, etc. geckoGetRv() no es parte oficial de Gecko; sin embargo, se proporciona como un ejemplo de aproximaciones que pueden tomarse para comparar las diferentes etiquetas de rama hoy y en el futuro.

-

Fecha de compilación

-

navigator.productSub es específico de los navegadores Gecko y devolverá una cadena que contiene la fecha en que se compiló el navegador en el formato CCYYMMDD (p.e. '20020801' para el 1 de agosto de 2002). Si le preocupa un problema de seguridad concreto en Gecko y sabe, por ejemplo, que todos los navegadores Gecko contienen una corrección para el problema a partir de una cierta fecha, puede comprobar que el valor de navigator.productSub es posterior a esa fecha.

-

También puede distinguir entre versiones "punto algo" usando una combinación de la etiqueta de la rama y la fecha de compilación. Por ejemplo, Netscape 6.2.2 y Netscape 6.2.3 tienen ambos la etiqueta de la rama 0.9.4.1, pero Netscape 6.2.2 tiene navigator.productSub == '20020314' mientras que Netscape 6.2.3 tiene navigator.productSub == '20020508'.

-

El suministrador y la versión (vendor/version)

-

Todos los navegadores Gecko devuelven el suministrador y la versión tanto en el objeto navigator como en la cadena de agente de usuario. La información de suministrador y versión, no obstante, no es tan útil como la etiqueta de la rama y la fecha de compilación y no recomendamos su uso. Sin embargo, si lo desea, puede distinguir los diferentes tipos de navegador Gecko usando estos valores. Como vimos previamente, el suministrador/versión aparece en la cadena de agente de usuario a continuación de la versión de Gecko.

-
Mozilla/5.0 (...; rv:a.b.c) Gecko/CCYYMMDD Suministrador/versión
-
-

El suministrador está disponible en el objeto navigator como navigator.vendor mientras que la versión del suministrador está disponible como navigator.vendorSub.

- -
Valores de suministrador/versión de Gecko
Navegador Suministrador Versión
Netscape 6.0 Netscape6 6.0
Netscape 6.01 Netscape6 6.01
Netscape 6.1 Netscape6 6.1
Netscape 6.2 Netscape6 6.2
Netscape 6.2.1 Netscape6 6.2.1
Netscape 6.2.2 Netscape6 6.2.2
Netscape 6.2.3 Netscape6 6.2.3
CompuServe 7.0 CS 2000 7.0 7.0
Netscape 7 Versión preliminar 1 Netscape 7.0b1
Netscape 7.0 Netscape 7.0
Netscape 7.01 Netscape 7.01
-

Ejemplos

-

Si es como yo, aprende mejor de ejemplos. Estudiar cómo usan otros autores la detección de navegador y las técnicas de codificación para múltiples navegadores es la mejor forma de aprender.

-

Ejemplo 1 - detección de características basada en objetos

-

Este ejemplo ilustra el uso de la detección de características. Observe que Gecko 1.0 (Netscape 7) y posteriores implementan la característica propietaria de Internet Explorer clientWidth mientras que Netscape 6 no lo hacía. En este ejemplo, Netscape 7 e Internet Explorer 5+ usarán automáticamente clientWidth mientras que Netscape Navigator 4, Netscape 6, CompuServe 7 y Opera usarán innerWidth.

-

Compare cómo habría tenido que codificar esto mismo usando aproximaciones de detección basadas en suministrador/versión.

-
if (windowRef.document.body && typeof(windowRef.document.body.clientWidth) == 'number')
-{
-  // Gecko 1.0 (Netscape 7) e Internet Explorer 5+
-  width = windowRef.document.body.clientWidth;
-}
-else if (typeof(windowRef.innerWidth) == 'number')
-{
-  // Navigator 4.x, Netscape 6.x, CompuServe 7 y Opera
-  width = windowRef.innerWidth;
-}
-
-

Ejemplo 2 - detección de características basada en objetos

-
Cobertura a múltiples navegadores
-

Este ejemplo también ilustra el uso de la detección de características y muestra las complicaciones que pueden surgir de las implementaciones no estándar en otros navegadores.

-
function moveElement(id, x, y)
-{
-  // mueve el elemento id a x,y
-  // donde x,y son la posición horizontal
-  // y vertical en píxeles
-
-  var elm = null;
-  if (document.getElementById)
-  {
-    // el navegador implementa parte de W3C DOM HTML
-    // Gecko, Internet Explorer 5+, Opera 5+
-    elm = document.getElementById(id);
-  }
-  else if (document.all)
-  {
-    // Internet Explorer 4 u Opera con el agente de usuario IE
-    elm = document.all[id];
-  }
-  else if (document.layers)
-  {
-    // Navigator 4
-    elm = document.layers[id];
-  }
-
-  if (!elm)
-  {
-    // navegador no admitido o elemento no encontrado
-  }
-  else if (elm.style)
-  {
-    // el navegador implementa parte de W3C DOM Style
-    // Gecko, Internet Explorer 4+, Opera 5+
-
-    if (typeof(elm.style.left) == 'number')
-    {
-      // Opera 5/6 no implementa el estándar correctamente
-      // y asume que elm.style.left y propiedades similares
-      // son números.
-      elm.style.left = x;
-      elm.style.top  = y;
-    }
-    else
-    {
-      // Gecko/Internet Explorer 4+
-      // W3C DOM Style establece que elm.style.left es una cadena
-      // que contiene la longitud seguida de la unidad, p.e. 10px
-      // Gecko le permitirá omitir la unidad sólo en el modo con
-      // vericuetos (Quirks mode).
-      // Gecko REQUIERE la unidad si opera en el modo de estándares.
-      elm.style.left = x + 'px';
-      elm.style.top  = y + 'px';
-    }
-  }
-  else if (typeof(elm.left) == 'number')
-  {
-    // Navigator 4
-    elm.left = x;
-    elm.top  = y;
-  }
-}
-
-
Sólo con estándares
-

Considere lo sencilla que es esta función si la codifica de acuerdo a los estándares del W3C.

-
function moveElement(id, x, y)
-{
-  // mueve el elemento id a x,y
-  // donde x,y son la posición horizontal
-  // y vertical en píxeles
-
-  var elm = document.getElementById(id);
-
-  if (elm)
-  {
-    elm.style.left = x + 'px';
-    elm.style.top  = y + 'px';
-  }
-}
-
-

Pregúntese a sí mismo esto: "¿Dar cobertura a los navegadores no estándar compensa los costes de desarrollo y mantenimiento?"

-

Ejemplo 3 - Detectar ramas específicas de Gecko

-
// devuelve el valor rv de un agente de usuario Gecko
-// como un número de coma flotante.
-// devuelve -1 para navegadores no Gecko.
-//          0 para navegadores previos a Netscape 6.1/Gecko 0.9.1
-//          número > 0 donde cada porción del valor rv
-//          delimitado por . se tratará como un valor
-//          entre 0-99.
-//          p.e. para rv: 3.12.42,
-//          getGeckoRv() devuelve 3.1242
-//
-function geckoGetRv()
-{
-  if (navigator.product != 'Gecko')
-  {
-    return -1;
-  }
-  var rvValue = 0;
-  var ua      = navigator.userAgent.toLowerCase();
-  var rvStart = ua.indexOf('rv:');
-  var rvEnd   = ua.indexOf(')', rvStart);
-  var rv      = ua.substring(rvStart+3, rvEnd);
-  var rvParts = rv.split('.');
-  var exp     = 1;
-
-  for (var i = 0; i < rvParts.length; i++)
-  {
-    var val = parseInt(rvParts[i]);
-    rvValue += val / exp;
-    exp *= 100;
-  }
-
-  return rvValue;
-}
-
-
-// determina si el navegador es cualquier Gecko de la
-// rama >= 1.0.1 o Netscape 6.2.x/CompuServe 7
-// compilado tras el 1 de agosto de 2002
-
-var rv    = geckoGetRv();
-var found = false;
-
-if (rv >= 0)
-{
-  // Navegador Gecko
-  if (navigator.productSub > '20020801')
-  {
-    if (rv >= 1.0001)
-    {
-      found = true;
-    }
-    else if (rv >= 0.0904 && rv < 0.0905)
-    {
-      if (navigator.vendor == 'Netscape6' || navigator.vendor == 'CS 2000 7.0')
-      {
-        found = true;
-      }
-    }
-  }
-}
-
-

Ejemplo 4 - The International Herald-Tribune

-

Este sitio ilustra muchas de las técnicas descritas en este artículo. Usan páginas básicas para los navegadores menos capaces combinadas con la detección de características basada en objetos para producir un sitio atractivo e interesante.

-

Ejemplos de DevEdge

-
   * xbDOM
-   * xbMarquee
-   * xbPositionableElement
-   * xbAnimatedElement
-
-

Conclusión

-

Como hemos visto en este artículo, la historia de detección de navegadores es aún bastante complicada debido a las diferencias entre los navegadores modernos tales como Gecko/Internet Explorer 6 y los navegadores más antiguos o no estándares tales como Netscape Navigator 4. Puede decirse a sí mismo "¡Si todos los navegadores fueran tan buenos como Gecko e Internet Explorer 6, entonces mi trabajo sería mucho más fácil!".

-

Me gustaría dejarle con esta idea. En el pasado, los usuarios no tenían la posibilidad de escoger un navegador que implementara los estándares; sin embargo hoy tienen esa elección. No hay razón convincente para que nadie en el mundo continúe usando un navegador que no implemente los estándares. Sin embargo, en la medida en que los desarrolladores web continúen codificando arreglos para estos navegadores antiguos, los usuarios no tendrán una motivación para actualizar. Al cesar de dar cobertura a los navegadores antiguos, puede proporcionar una razón a los usuarios para actualizar. Esto no sólo les beneficiará a ellos, sino también a usted. Tener en cuenta sólo a navegadores basados en estándares puede reducir los costes de desarrollo y mantenimiento así como incrementar el contenido dinámico y atractivo que atraerá visitantes e incrementará su beneficio. La elección es suya... ¡Decida apoyar a los estándares hoy!

-

Enlaces

- -
-

Información del documento original

- -
-

diff --git a/files/es/e4x/index.html b/files/es/e4x/index.html deleted file mode 100644 index f8e51bfe3d..0000000000 --- a/files/es/e4x/index.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: E4X -slug: E4X -tags: - - E4X - - JavaScript -translation_of: Archive/Web/E4X ---- -

ECMAScript for XML (E4X) es una extensión del lenguaje de programación que añade la implementación de XML nativo a JavaScript. Esto proporciona el acceso al documento de XML de manera que sea natural para los programadores de ECMAScript. El objetivo es proporcionar una alternativa, una sintaxis más simple para tener acceso a documentos XML a través de las interfaces DOM.

-

E4X está regulado por Ecma International dentro del estándar ECMA-357 (actualmente en su segunda edición, diciembre 2005).

-

E4X se implementa (al menos parcialmente) en SpiderMonkey (Gecko con motor de JavaScript ) y dentro de Rhino (JavaScript con motor escrito en Java).

-

Nota: en navegadores basados del Gecko 1.8, como Firefox 1.5, E4X ya puede usarse parcialmente por los autores de páginas web. Para disponer completamente de E4X, el elemento <script> necesita tener el tipo del MIME "text/javascript;e4x=1" (ej. tener un atributo en el formulario type="text/javascript;e4x=1"). La diferencia entre los dos modos es que sin el tipo MIME "e4x=1", cualquiera de los literales de comentario (<!--...-->) en instrucciones XML/HTML son ignorados por compatibilidad hacia atrás con el truco de ocultar el comentario, y las secciones CDATA (<![CDATA[...]]>) no son procesadas como literales CDATA (que conduce a un error de sintaxis JS en el HTML ya que el elemento <script> de HTML produce una sección CDATA implícita, y por lo tanto no puede contener explícitamente secciones CDATA).

-
-

Errores conocidos y limitaciones

- -

Solución:

-
var response = xmlhttprequest.responseText; // bug 270553
-response = response.replace(/^<\?xml\s+version\s*=\s*(["'])[^\1]+\1[^?]*\?>/, ""); // bug 336551
-var e4x = new XML(response);
-
-

Recursos

- -

diff --git a/files/es/empaquetado_de_extensiones/index.html b/files/es/empaquetado_de_extensiones/index.html deleted file mode 100644 index a908921f26..0000000000 --- a/files/es/empaquetado_de_extensiones/index.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Empaquetado de extensiones -slug: Empaquetado_de_extensiones -tags: - - Complementos - - Todas_las_Categorías - - Toolkit API - - extensiones -translation_of: Archive/Add-ons/Extension_Packaging ---- -

Las extensiones son paquetes instalables que pueden ser descargados e instalados por un usuario,  provistos de manera pre-empaquetada dentro de una aplicación,o por un programa externo. Las extensiones usan una estructura de directorio que alberga el chrome, los componentes y otros archivos para extender la funcionalidad de un programa XUL.

-

Cada extensión debe facilitar un archivo install.rdf que contenga metadatos acerca de la extension, así como su ID único, versión, autor e información de compatibilidad.

-

Luego de ser preparados los archivos de la extensión y el install.rdf, existen diversas maneras de preparar una extensión para su instalación: Comprime a un archivo ZIP el directorio de la extensiòn a un archivo instalable XPI (xpinstall), desempaqueta la extensión directamente en la aplicación del usuario o la carpeta de perfil, o inscribe la extensión en el registro de Windows.

-

Creando una extensión XPI

-

Un archivo XPI (XPInstall) es sencillamente un archivo ZIP que contiene los archivos de la extensión, con el archivo install.rdf en la carpeta raíz del archivo ZIP. Los usuarios pueden descargar e instalar los archivos XPI de un sitio web o de un archivo local, abriéndolos o arrastrándolos a la ventana del Administrador de extensiones.

-

El tipo de MIME reconocido por Firefox para los archivos XPI es application/x-xpinstall. Ya que la mayoría de los servidores HTTP no están configurados para devolver este tipo de MIME para la extensión .xpi por defecto, probablemente tendrás que configurar tu servidor HTTP. En el servidor HTTP de Apache, se puede realizar al añadir la siguiente instrucción al archivo de configuración o .htaccess:

-
AddType application/x-xpinstall .xpi
-
-

Instalar archivos de extensiones directamente

-

Si conoces la localización de la aplicación (si instala una extensión como parte de un instalador de la aplicación, por ejemplo), puedes instalar los archivos de la extensión directamente en <appdir>/extensions/<extensionID>. La extensión será encontrada automáticamente por el Administrador de extensiones la próxima vez que la aplicación se ejecute.

-

Cuando uses este método debes verificar que estén establecidos correctamente los permisos de sistema del archivo para la carpeta. De otra manera, el administrador de extensiones puede no funcionar correctamente con la extensión o la extensión misma no lo harà correctamente.

-

Registrar una localización de extensión usando el Registro de Windows

-

Los instaladores externos (tales como el Java runtime) pueden tratar de instalar puntos de integración con la aplicación como una extensión aún cuando la aplicación no está instalada. Se puede lograr esto en Windows usando el registro.

-

Extensiones XPIs de varios elementos

-

En algunos casos un solo archivo XPI puede tratar de instalar múltiples extensiones/temas. Un tipo especial de extensión llamado el Paquete de Múltiples artículos explica cómo crear este tipo de paquete. (se requiere Firefox 1.5/XULRunner 1.8)

- -

Referencias oficiales para Toolkit API

- -
{{page("/es/docs/Toolkit_API/Official_References")}}
diff --git a/files/es/empaquetar_un_tema/index.html b/files/es/empaquetar_un_tema/index.html deleted file mode 100644 index 1eadf7c5fc..0000000000 --- a/files/es/empaquetar_un_tema/index.html +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Empaquetar un Tema -slug: Empaquetar_un_Tema -tags: - - Complementos - - Herramientas_API - - Temas - - Todas_las_Categorías -translation_of: Mozilla/Thunderbird/Thunderbird_extensions/Theme_Packaging ---- -

 

-

Este documento describe cómo empaquetar temas para Firefox y Thunderbird.

-

Pre-requisitos

-

Hacer un tema para Firefox o Thunderbird requiere conocimientos de hojas de estilo en cascada (CSS), probablemente XBL, y un poco de habilidad para diseño gráfico y estética (...o quizá no). Este documento describe solamente cómo se empaquetan los temas para ser mostrados en la ventana de los temas de Firefox.

-

Estructura de los ficheros del tema

-

Los temas Firefox/Thunderbird son empaquetados en un archivo JAR con la siguiente estructura:

-
theme.jar:
-  install.rdf
-  contents.rdf
-  preview.png
-  icon.png
-  browser/files
-  global/files
-  mozapps/files
-  communicator/files
-  ...
-
-
- - - -

install.rdf

-

El fichero install.rdf debe de tener este aspecto:

-
<?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:type>4</em:type>otras propiedades
-  </Description>
-</RDF>
-
-

Propiedades de install.rdf requeridas

-

El fichero install.rdf debe contener las siguientes propiedades. Véase Referencia install.rdf para más información:

- -

Propiedades de install.rdf opcionales

- -

Nótese que si el tema va a ser publicado en el sitio web http://addons.mozilla.org, no debe incluir la parte updateURL.

-

Fichero install.rdf de ejemplo

-
<?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>{18b64b56-d42f-428d-a88c-baa413bc413f}</em:id>
-    <em:version>1.0</em:version>
-    <em:type>4</em:type>
-
-    <!-- Aplicación para la cual esta extensión puede ser instaladainto,
-         indicando la mínima y máxima versión soportada. -->
-    <em:targetApplication>
-      <Description>
-        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-        <em:minVersion>0.8</em:minVersion>
-        <em:maxVersion>0.9</em:maxVersion>
-      </Description>
-    </em:targetApplication>
-
-    <!-- Front End MetaData -->
-    <em:name>New Theme 1</em:name>
-    <em:description>A test theme for Firefox</em:description>
-    <em:creator>Ben Goodger</em:creator>
-    <em:contributor>John Doe</em:contributor>
-    <em:homepageURL>http://www.bengoodger.com/</em:homepageURL>
-
-    <!-- Front End Integration Hooks (used by Theme Manager)-->
-    <em:internalName>newtheme1</em:internalName>
-  </Description>
-</RDF>
-
-

Los siguientes son algunos GUIDs de aplicaciones comunes que puedes usar en la propiedad targetApplication:

-
Firefox      {ec8030f7-c20a-464f-9b0e-13a3a9e97384}
-Thunderbird  {3550f703-e582-4d05-9a08-453d09bdfdc6}
-Sunbird      {718e30fb-e89b-41dd-9da7-e25a45638b28}
-
-

Referencia oficial para Toolkit API

-
- {{page("/es/docs/Toolkit_API/Official_References")}}
diff --git "a/files/es/escribir_c\303\263digo_localizable/index.html" "b/files/es/escribir_c\303\263digo_localizable/index.html" deleted file mode 100644 index dc9f1579a5..0000000000 --- "a/files/es/escribir_c\303\263digo_localizable/index.html" +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Escribir código localizable -slug: Escribir_código_localizable -tags: - - Localización -translation_of: Mozilla/Localization/Writing_localizable_code ---- -

Escribir código localizable

-

Esta página explica las buenas prácticas y directrices al tratar con código de interfaces de usuario en relación a la localización. Está dirigido a desarrolladores de Mozilla y de sus extensiones.

-

Para más detalles técnicos, por favor, revisa el Tutorial de XUL:Localización.

-

{{ draft }}

-

Acerca de los traductores

-

Un par de apuntes sobre los traductores para desarrolladores que raramente trabajan con ellos.

- -

Directrices

-

Por tanto, hay algunas directrices que se deberían seguir para facilitar la localización de tu código.

-
Elegir nombres de claves apropiados
Los nombres elegidos para las claves (sin importar que estén en un DTD o en un fichero properties) deberían ser descriptivos. Piensa en ellos como nombres de variable largos. Si la semántica de una cadena traducible cambia, entonces la clave también debería cambiar. Esto mejorará el nombre de la clave y las herramientas podrán detectar que lo que se ha cambiado es algo más que una simple corrección ortográfica o gramatical.
No asumir el uso de gramática en la cadenas compuestas
Si se dividen frases en varias claves se presupone el uso de una gramática, una estructura de frase y tales cadenas compuestas son con frecuencia muy difíciles de traducir. Cuando se necesite una cadena compuesta, es aconsejable darles a los traductores espacio para moverse. Un buen ejemplo de cadena compuesta es la configuración de páginas visitadas en Firefox: el traductor puede (implícitamente) poner el campo de texto como él crea conveniente.
No usar macros de preprocesador
El uso de #if #else #endif o #expand está profundamente desaconsejado. Existen unas pocas excepciones a esta regla, pero en general el fichero traducido debería cumplir los estándares y no debería necesitar herramientas de compilación para ser transformado. Si se quiere añadir procesamiento durante la compilación a ficheros de localización, habría que asegurarse de pedir opinión a l10n@. En la mayoría de los casos, las instrucciones de proceso también se pueden poner en el código de contenido y referenciar diferentes pares clave/valor en l10n.
Utilizar una buena estructura de directorios
Asegúrate de poner los ficheros de localización en el lugar apropiado. La inclusión de nuevos directorios superiores es un compromiso entre la propiedad del módulo en el repositorio cvsroot y la facilidad de la traducción.
Utilizar una buena estructura de directorios chrome
Para un módulo mod en particular, la ruta jar:ab-CD.jar!/locale/ab-CD/mod/foo.dtd ha sido ampliamente probada y es un buen lugar para referenciar los ficheros como chrome://mod/locale/foo.dtd. Utilizar una estructura de directorios como ésta facilita el proceso de traducción sin el código fuente y es especialmente recomendada para desarrolladores de extensiones. JAR Manifests puede hacer esto de forma fácil.
-

El impacto l10n

-

En árboles congelados, existe la regla de no aplicar cambios que supongan impacto l10n. ¿Pero qué significa esto? El impacto l10n es

- - -

{{ languages( { "en": "en/Writing_localizable_code", "fr": "fr/\u00c9criture_de_code_localisable" } ) }}

diff --git a/files/es/esquema_del_administrador_de_descargas/index.html b/files/es/esquema_del_administrador_de_descargas/index.html deleted file mode 100644 index a58908da5f..0000000000 --- a/files/es/esquema_del_administrador_de_descargas/index.html +++ /dev/null @@ -1,108 +0,0 @@ ---- -title: Esquema del Administrador de descargas -slug: Esquema_del_Administrador_de_descargas -tags: - - Firefox 3 -translation_of: Archive/Mozilla/The_Download_Manager_schema ---- -

-

El Administrador de Descargas utiliza una tabla SQLite para hacer seguimiento de las descargas en progreso así como las descargas en cola y las terminadas. -

La tabla se mantiene en un archivo de base de datos llamado "downloads.sqlite", en una tabla llamada "moz_downloads". La versión actual del esquema de la base de datos es 8. -

Esta información está disponible usando el método nsIDownloadManager para leer los objetos nsIDownload para cada entrada de descargas. Sin embargo, si crees que que prefieres ir directamente a la tabla, puedes hacerlo usando el API Storage. -

-

El esquema de la tabla

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Nombre del campo -Tipo -Descripción -
id -INTEGER -Un ID único para la descarga. Este campo es la clave primaria para la tabla. -
nombre -TEXT -El nombre del archivo de la descarga. -
origen -TEXT -La URI origen de la descarga. -
destino -TEXT -La URI destino final de la descarga. -
tempPath -TEXT -El path del archivo temporal usado para la descarga. -
startTime -INTEGER -La hora de comienzo de la descarga. -
endTime -INTEGER -La hora de final de la descarga. -
state -INTEGER -El estado actual de la descarga. Ver the constants list in the nsIDownloadManager documentation. -
referrer -TEXT -El que refiere la descarga (página de donde proviene). -
entityID -TEXT -El ID identificador de nsIResumableChannel usado para implementar el canal de descarga. Esta información es usada para reanudar la descarga cuando ha sido pausada. -
currBytes -INTEGER -La cantidad actual de bytes que han sido descargados. Por defecto es 0, no puede ser nulo. -
maxBytes -INTEGER -El número total de bytes que hay que descargar. Por defecto es -1, no puede ser nulo. -
mimeType -TEXT -El tipo MIME del archivo. -
preferredApplication -TEXT -La aplicación preferida para abrir el archivo una vez finalizada la descarga. -
preferredAction -INTEGER -La constante de acción servida por nsIMIMEInfo que representa la acción a tomar al terminar la descarga. Por defecto es 0 (guardar en disco), no puede ser nulo. -
autoResume -INTEGER -0 si la descarga del archivo no debe ser automáticamente reanudada, 1 si debe serlo. Por defecto es 0, no puede ser nulo. -
-

Ver también

- -


-

-
-
diff --git a/files/es/eventos_arrastrar_y_soltar/index.html b/files/es/eventos_arrastrar_y_soltar/index.html deleted file mode 100644 index e0d66d46ff..0000000000 --- a/files/es/eventos_arrastrar_y_soltar/index.html +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Eventos arrastrar y soltar -slug: Eventos_arrastrar_y_soltar -tags: - - Firefox 3 -translation_of: Archive/Mozilla/Drag_and_drop/Drag_and_drop_events ---- -

-

Firefox 3 añade dos nuevos eventos que te permiten determinar cuándo comienzan y terminan las operaciones de arrastrar y soltar. Estos eventos son nuevos en el borrador de trabajo actual de la especificación de HTML 5. -

-
drag -
Enviado cuando comienza una operación de arrastre. -
dragend -
Enviado cuando acaba una operación de arrastre. -
-

Puedes leer más información sobre arrastrar y soltar en el artículo Arrastrar y soltar. -

Puedes ver un ejemplo de estos eventos en acción en: -

- -

Véase también

- -


-


-

-
-
diff --git a/files/es/extensions/bootstrapped_extensions/index.html b/files/es/extensions/bootstrapped_extensions/index.html deleted file mode 100644 index da7cdec4db..0000000000 --- a/files/es/extensions/bootstrapped_extensions/index.html +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: Bootstrapped extensions -slug: Extensions/Bootstrapped_extensions -translation_of: Archive/Add-ons/Bootstrapped_extensions ---- -

{{ gecko_minversion_header("2.0") }}

-

Habitualmente los complementos incluyen overlays, en donde la aplicación puede montar el XUL del paquete del complemento y automaticamente aplicarlo en la interfaz de usuario. Mientras creas complementos puedes agregarlos a la interfaz de usuario facilmente, esto se refiere a la actualizaciones, instalaciones, o a deshabilitar el complemento que requiere de un reinicio.

-

Gecko 2.0 {{ geckoRelease("2.0") }} introduce bootstrapped extensions. These are special extensions that, instead of using overlays to apply their user interface to the application, programmatically insert themselves into the application. This is done using a special script file that's included in the extension that contains functions the browser calls to command the extension to install, uninstall, start up, and shut down.

-

All the application does is call into this script file; the extension is responsible for adding and removing its user interface and handling any other setup and shutdown tasks it requires.

-

This article discusses how bootstrapped extensions work.

-

As an aside, all extensions created using the Add-on SDK or Add-on Builder are bootstrapped; however, because all the bootstrapping code is generated for you, you don't really need to think about it.

-

The startup and shutdown process

-

A key feature of bootstrapped extensions is that they must be able to be started 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 it's 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:

-
    -
  1. make your add-on's content available via a chrome:// URL (using the content, locale, and skin instructions in the manifest);
  2. -
  3. replace existing chrome:// URIs with your content (using the override instruction).
  4. -
-

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 or 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.

-
- Note: This method is never called if the extension has never been started; for example, if an extension is installed but isn't compatible with the current version of the application, install() never gets called if it is uninstalled before becoming compatible. However, if the extension gets upgraded to a version that's compatible with the application, its install() function will be called at that time, before the first startup() call.
-
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. This will not be called if install() was never called.

-
- Note: It's important to keep in mind that uninstall() can be called even on extensions that are currently disabled, or are not compatible with the current application. Because of this, it's crucial that the function be implemented to gracefully handle APIs that may not be present in the application. This function will also not be called if a third-party application removes the extension while Firefox isn't running.
-
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.

-
-

Further reading

- diff --git a/files/es/extensions/community/index.html b/files/es/extensions/community/index.html deleted file mode 100644 index 699927cb7a..0000000000 --- a/files/es/extensions/community/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Community -slug: Extensions/Community -translation_of: Extensions/Community ---- -
-
Si usted sabe de listas de correo, grupos de noticias útiles, foros u otras comunidades relacionadas con el desarrollo de extensión, por favor enlace a ellos aquí.
-
- - diff --git a/files/es/extensions/index.html b/files/es/extensions/index.html deleted file mode 100644 index 40e31c78b3..0000000000 --- a/files/es/extensions/index.html +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: Extensiones -slug: Extensions -tags: - - Complementos - - Todas_las_Categorías - - extensiones - - para_revisar -translation_of: Mozilla/Add-ons ---- -
- Construir una extensión
- Explica paso a paso cómo crear una extensión para Firefox.
-
- Las Extensiones son pequeños add-ons (complementos, agregados) que añaden nuevas funcionalidades a las aplicaciones Mozilla, tales como Firefox y Thunderbird. Las extensiones permiten añadir a dichas aplicaciones cualquier cosa, desde un botón para una barra de herramientas hasta características totalmente nuevas. Permiten personalizar completamente la aplicación para ajustarla a las necesidades de cada usuario, sin aumentar de forma significativa el tamaño de la misma.
-

Las extensiones son distintas de los Plugins, que ayudan al navegador a mostrar contenidos específicos como la reproducción de archivos multimedia. Las extensiones también son diferentes de los plugins de búsqueda, que añaden buscadores adicionales a la barra de búsquedas.

- - - - - - - -
-

Documentación

-
General (aplicable para todas las aplicaciones Mozilla)
-
-
- Creando una extensión
-
- Este tutorial indica los pasos necesarios para desarrollar una extensión muy básica, la cual añadirá un texto que diga "Hello, World!" en el panel de la barra de estado de Firefox.
-
-
-
- Preguntas frecuentes sobre Extensiones
-
- Esta es una recopilación de respuestas breves a los problemas más frecuentes en el desarrollo de extensiones.
-
-
-
- Construye tu propia extensión
-
- Pequeño tutorial de introducción a XUL y a la creación de una extensión para Firefox en el wiki de Mundogeek.
-
-
-
- Empaquetado de extensiones
-
- Las extensiones son una forma de paquete instalable que pueden descargarse e instalarse por el usuario, o proporcionarse pre-empaquetadas con una aplicación o por un programa externo.
-
-
-
- Crear un panel lateral en Firefox
-
- Este artículo es un punto de partida para la creación de nuevos paneles laterales para Firefox. El objetivo es la creación de un panel lateral vacío que pueda ser utilizado como inicio para nuevas aplicaciones que se ubiquen en dichos paneles laterales.
-
-
-
- Crear una extensión en la barra de estado
-
- Éste es el primero de una serie de artículos que demostrarán cómo crear progresivamente extensiones cada vez más complejas para el navegador Firefox.
-
-
-
- Crear una extensión personalizada de Firefox con el Mozilla Build System
-
- Cómo configurar el espacio de trabajo para una extensión que usa componentes binarios.
-
-
Aplicación Específica
-

Firefox

-

Thunderbird

-

SeaMonkey Soporte de Extensiones en SeaMonkey 2

-

Firefox en Android

-

Fennec (navegador movíl)

-

Ver todos

-
-
-
-

Comunidad

- -
    -
  • Foros sobre extensiones en comunidad Mozilla... en inglés.
  • -
-

{{ DiscussionList("dev-extensions", "mozilla.dev.extensions") }}

-

Ver todo

-

Herramientas

- -

Ver todo

-

Temas relacionados

-
-
- XUL, JavaScript, XPCOM, Temas
-
-
-

Categorías

-

Interwiki Language Links

diff --git "a/files/es/extensions/m\303\263vil_clone/index.html" "b/files/es/extensions/m\303\263vil_clone/index.html" deleted file mode 100644 index 37294a9df9..0000000000 --- "a/files/es/extensions/m\303\263vil_clone/index.html" +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Extensiones de Firefox para Android -slug: Extensions/Móvil_clone -tags: - - API - - Browser - - Desarrolladores - - Developer - - Español - - Extensions - - Interfáz de Usuario - - Mobile - - Mozilla - - Móvil - - Spanish - - Tutoriales - - Tutorials - - UI - - desarrollo - - movil(2) ---- -

Los siguientes artículos proporcionan ayuda con el desarrollo de extensiones para Firefox en Android. Además, por favor, consulte la documentación general de las extensiones que se aplica a todas las aplicaciones de Mozilla.

- - - - - - - - -
-

Documentación

- -
Tutoriales
- -
-
Tutorial
-
El desarrollo, el envasado y la instalación de un sencillo complemento para Firefox para Android.
-
Inicialización y Limpieza
-
Cómo inicializar el complemento cuando se inicia y limpiar cuando está apagado.
-
Creación de una interfaz de usuario
-
Una guía rápida para el uso de la API NativeWindow para crear componentes de interfaz de usuario.
-
Interación con el navegador
-
Una guía rápida para el uso de la API BrowserApp para acceder a las pestañas del navegador y el contenido web que alojan.
-
- -

Consultas a la API y ejemplos de código

- -
-
NativeWindow
-
Crea widgets nativos para la interfaz de Android.
-
BrowserApp
-
Acceso a las pestañas del navegador y al contenido que éste aloja.
-
Fragmentos de código
-
Ejemplos de códigos para tareas comunes.
-
-
-

Comunidad

- -
    -
  • -

    Ver foros de desarrollo de extensiones de Mozilla.

    -
  • -
- -

{{ DiscussionList("dev-extensions", "mozilla.dev.extensions") }}

- - - -

Herramientas

- - - -

Ver todas...

-
- -

Temas Relacionados

- -
-
XUL, JavaScript, XPCOM, Temas, Desarrollo de Mozilla
-
- -

Ver todas las páginas con el tag "Extensiones"...

diff --git a/files/es/faq_de_mercurial/index.html b/files/es/faq_de_mercurial/index.html deleted file mode 100644 index 0b4b1ff536..0000000000 --- a/files/es/faq_de_mercurial/index.html +++ /dev/null @@ -1,237 +0,0 @@ ---- -title: FAQ de Mercurial -slug: FAQ_de_Mercurial -tags: - - Desarrollando_Mozilla - - Mercurial - - Todas_las_Categorías -translation_of: Mercurial/Using_Mercurial ---- -

¿En qué se diferencia Mercurial de CVS?

- - - - - - - - - - -

¿Cómo instalo Mercurial?

-

Si usas apt-get, emerge, port, o yum para instalar software, limítate a hacer lo normal. Si obtienes como resultado una versión antigua (pre-1.0 -- compruébalo con hg version), puedes actualizarlo usando easy_install como sigue (usando apt-get en este ejemplo):

-
sudo apt-get install python-setuptools python-dev build-essential
-sudo easy_install -U mercurial
-
-

En caso contrario, los paquetes binarios de Mercurial (inglés) están hechos para ti. Revisa también {{ interwiki('wikimo', 'Mercurial_on_Windows', 'wikimo:Mercurial on Windows') }} (inglés).

-

Programa de fusión

-

Tras instalar, elige un programa de fusión (inglés). En serio. Hazlo ahora. Si no lo haces, Mercurial elegirá uno por ti y te lo plantará en tus narices cuando menos lo esperes.

-

Algo razonable para hacer es configurar ui.merge=internal:merge en el archivo de configuración de Mercurial (ver más abajo), lo que hace que Mercurial intente fusionar los cambios y añadir los marcadores de conflicto (al estilo CVS) a los archivos que no pueda fusionar.

-

Puedes ver la lista de conflictos de fusión buscando "merging ... failed!" en la salida de update.

-

Configuración

-

Deberías configurar Mercurial antes de descargar el código. Tu archivo de configuración de Mercurial (~/.hgrc) debería tener al menos la siguiente configuración:

-
[ui]
-username = Tu Nombre Real <user@example.com>
-merge = tu-programa-de-fusión
-
-[diff]
-git = 1
-
-[defaults]
-diff=-p -U 8
-
-

En Windows, estos valores se pueden añadir a C:\Archivos de Programa\Mercurial\Mercurial.ini. En los sistemas tipo Unix, debería estar en tu archivo $HOME/.hgrc.

-

Puedes configurar el editor a usar para los mensajes de fusión usando la opción editor en la sección {{ mediawiki.external('ui') }} o estableciendo la variable de entorno EDITOR.

-

¿Cómo gestiona Mercurial los finales de línea?

-

La versión Windows de Mercurial no convierte automáticamente los finales de línea entre los estilos de Windows y Unix. Todos nuestros repositorios usan finales de línea Unix. Necesitamos una manera de solucionar esto en Windows, pero de momento no sabemos cómo.

-

(¿Qué tal si insertamos un control previo al commit que rechace los cambios que contienen CR con un mensaje de error informativo apropiado? Posiblemente querremos hacer excepciones para ciertos tipos de archivo (como poco, archivos binarios, por supuesto), pero podemos ajustar el control según consideremos necesario. Mercurial 1.0 añade un control estándar para esto en la extensión win32text que podríamos usar/adaptar --jwatt).

-

¿Cómo puedo...?

-

¿Cómo puedo descargar Mozilla?

-

El desarrollo principal (trunk) de Mozilla 2 está ubicado en http://hg.mozilla.org/mozilla-central/ . Revisa Código fuente de Mozilla (Mercurial) para instrucciones sobre cómo descargar el código fuente de Mozilla 2 de Mercurial.

-

¿Cómo puedo editar y actualizar archivos?

-

Puedes editar archivos a voluntad en el directorio de trabajo, exactamente igual que con CVS.

-

La orden común para actualizar un árbol es:

-
hg pull -u
-
-

No es posible actualizar sólo un directorio; tienes que actualizar el árbol entero.

-

¿Cómo detecto cambios y aplico parches en archivos?

- - - - -

Las opciones de diff preferidas son hg diff -p -U 8 que incluye 8 líneas de contexto y muestra la función relevante del bloque. Puedes convertir estas opciones en predeterminadas en el archivo de configuración de Mercurial.

-

¿Cómo aplico cambios?

-

Configuración necesaria

-

Antes de aplicar ningún cambio, añade estas líneas a tu archivo ~/.hgrc:

-
[ui]
-username = Tu nombre <tu.email@example.com>
-
-

Para subir los cambios a mozilla-central y otros repositorios alojados en mozilla tienes que tener acceso de escritura (committer), y debes editar el archivo (tu-raíz-hg-local)/.hg/hgrc (observa que éste NO es tu ~/.hgrc) para añadir esta línea:

-
[paths]
-default = http://hg.mozilla.org/mozilla-central/
-default-push = ssh://hg.mozilla.org/mozilla-central/
-
-

También tienes que decirle a SSH qué nombre de usuario utilizar al conectar con hg.mozilla.org. Éste debería ser el nombre de usuario asociado a tu cuenta LDAP en Mozilla. Puedes hacer esto bien complicando ligeramente la ruta de aplicación por defecto, o default-push, (convirtiéndola en user@host.name@hg.mozilla.org) o bien añadiendo líneas a tu ~/.ssh/config:

-
Host hg.mozilla.org
-User usuario@host.dominio
-
-

Comprueba lo que vas a aplicar

-

A continuación, para comprobar si realmente vas a aplicar los cambios que quieres aplicar (especialmente importante al hacer fusiones y otros cambios complejos):

-
hg status
-hg diff
-
-

status muestra los archivos que han cambiado en tu directorio de trabajo comparado con lo que hay en tu repositorio (las revisiones padre, que puedes ver usando hg parents). hg diff muestra los cambios reales en esos archivos, como diffs unificados. Puedes añadir la opción -U8 para ver más contexto.

-

Aplica al repositorio local

-

Como siguiente paso, aplicarás tus cambios a tu repositorio local:

-
hg commit
-
-

Esto aplica los cambios informado por hg status. Puedes limitar la aplicación a archivos o directorios específicos usando hg commit nombres_de_archivo. Puedes aplicar los cambios en nombre de alguna otra persona usando hg commit -u "Algún otro <algun_otro@example.com>". Revisa hg help commit para obtener más detalles.

-

Comprueba lo que vas a subir

-

Antes de que subas (push), probablemente quieras comprobar qué conjuntos de cambios se subirán. Puedes hacer esto usando la orden outgoing:

-
hg outgoing
-
-

Esto te dará una lista de conjuntos de cambio que se subirán al repositorio remoto predeterminado. Añade un argumento de repositorio para ver los cambios salientes (outgoing) en ese otro repositorio.

-

Subir al repositorio central

-

Para subir esos cambios hasta el repositorio central:

-
hg push
-
-

Obtendrás un mensaje de error sin importancia cada vez que subas:

-
remote: Could not chdir to home directory : No such file or directory
-
-

Ignóralo sin más.

-

¿Cómo actúo ante "abort: push creates new remote heads!"?

-

Hagas lo que hagas, no hagas 'push -f' como sugiere el mensaje (probablemente falle de todas formas, pero ni lo intentes).

-

Alguien ha subido nuevos cambios desde tu última descarga. A continuación has aplicado tu parche localmente y estás intentando subir ese cambio al repositorio principal, el cual tiene un último cambio distinto de aquél desde el que comenzaste.

-

Hay dos cosas que puedes hacer. La más sencilla es fusionar tus cambios: ejecuta hg pull, luego hg merge. Resuelve cualquier conflicto que surja, y luego aplica la fusión resultante: hg commit -m "Merge commit for bug 123456". Luego haz hg push normalmente. Esto tiene el desafortunado efecto colateral de dejar un feo cambio por fusión en el historial de revisiones y, lo que es peor, hará tu parche más difícil de retrotraer si tuviste que resolver conflictos.

-

Sin embargo, es lo más sencillo, y es muy seguro. Hay otra manera de afrontar el problema, pero es considerablemente más arcana -- hay un arreglo/reemplazo en progreso.

-

{{ Warning("Esta aproximación funciona casi bien, pero hay algunos informes de parches que han sido tragados en varias ocasiones. Toma precauciones para hacer copias de tus parches (quizá obteniendo un diff: hg log -p -r 12345 para mostrar el parche de la revisión 12345) hasta que estés seguro de que las cosas funcionan como esperas.") }}

-

Lo más avanzado que puedes hacer es importar el cambio en mq, extraerlo de la cola, actualizar, y volver a aplicarlo de nuevo antes de subirlo:

-
% hg log -l 5
-415[tip]   d1accb6ee840   2008-04-30 09:57 -0700   vladimir
-  b=430873; fast path drawImage with a canvas as source
-414   3a3ecbb4873e   2008-04-30 09:55 -0700   vladimir
-  cvs sync
-% hg qimport -r 415
-% hg qtop
-415.diff
-% hg qpop
-Patch queue now empty
-% hg pull -u
-... varios mensajes de descarga/actualización ...
-% hg qpush
-applying 415.diff
-Now at: 415.diff
-Corrige los conflictos según sea necesario; si has corregido alguno, ejecuta hg qrefresh primero
-% hg qrm -r 415.diff
-qrm -r significa "elimina este parche de mi cola, pero conserva la revisión"
-% hg log -l 5
-verifica que el registro tiene buena pinta, con tu cambio arriba del todo
-% hg push
-
-

Si ya has usado mq para gestionar tus parches, asegúrate de que descargas/actualizas justo antes de aplicar y subir tu parche. Si tienes problemas con lo anterior, no hay nada malo en hacer una fusión simple como se ha descrito anteriormente.

-

¿Cómo veo lo que harán estas órdenes antes de ejecutarlas?

-

Si quieres ver lo que hará hg commit, ejecuta hg diff primero.

-

Si quieres ver lo que subirá hg push, ejecuta hg outgoing primero.

-

Si quieres ver lo que descargará hg pull, ejecuta hg incoming primero.

-

Estos pares de órdenes aceptan todos argumentos parecidos, y hay buenos motivos para ello. Es buena idea usarlos siempre mientras estás aprendiendo a usar Mercurial. E incluso una vez ya eres un experto, ejecutar siempre outgoing antes de push es una buena idea.

-

¿Cómo puedo personalizar el formato de los parches que crea Mercurial?

-

Edita tu archivo ~/.hgrc y añade unas líneas como éstas:

-
[defaults]
-diff=-U 8 -p
-qdiff=-U 8
-
-[diff]
-git=true
-
-

La sección {{ mediawiki.external('defaults') }} afecta a la salida predeterminada de las órdenes hg diff y hg qdiff. Las opciones se comportan igual que si estuvieran en la línea de órdenes. Prueba hg help diff para más información.

-

La sección {{ mediawiki.external('diff') }} afecta a todos los parches generados por Mercurial, incluso aquellos generados para el uso interno de Mercurial. Necesitas llevar mucho más cuidado con esto, pero se recomienda git=true. Sin él, Mercurial no puede comparar (diff) archivos binarios y no lleva un registro del bit de modo de ejecución.

-

Revertir cambios

-

Revertir todo el árbol a una revisión buena conocida

-

Es fácil, tan fácil como usar un mazo. Pero normalmente es matar moscas a cañonazos.

-
$ hg pull -u
-$ hg revert --all -r a0193d83c208       # usa aquí la id de tu revisión buena conocida
-$ hg commit                             # Sé educado, incluye la id de revisión en tu mensaje acompañando al cambio
-$ hg push
-
-

Hay una alternativa más precisa:

-

Revertir un único conjunto de cambios

-

Supón que el conjunto de cambios f8f4360bf155 ha estropeado algo.

-
$ hg pull -u
-$ hg backout f8f4360bf155               # usa la id de revisión del cambio erróneo aquí
-
-

Esto crea y aplica un nuevo conjunto de cambios que revierte todos los cambios en la revisión.

-

Si ves este mensaje:

-
the backout changeset is a new head - do not forget to merge
-
-

Esto significa que necesitas fusionar, porque tu historial ahora tiene este aspecto:

-
    ---> o  9123b7791b52 - Kaitlin Jones <kaitlin@example.net> - Backed out changeset f8f4360bf155
-           |
-TRUNK ---> | o  4e5bfb83643f - Simon Montagu <smontagu@example.org> - imported patch 435856
-           | |
-           | o  6ee23de41631 - Phil Ringnalda <philringnalda@example.com> - Bug 438526 - Opening links w
-           | |
-           | o  22baa05d0e8a - Robert O'Callahan <robert@example.org> - Remove DOM testcase from exclusi
-           | |
-           | o  c1aec2094f7e - Robert Longson <longsonr@example.com> - Bug 437448. New-style nsSVGString
-           | |
-           | o  306726089e22 - Robert Longson <longsonr@example.com> - Bug 437448. New-style nsSVGString
-           | |
-           | o  ba9b9a7c52a5 - Robert Longson <longsonr@example.com> - Bug 437448. New-style nsSVGString
-           |/
-           o  f8f4360bf155 - Robert O'Callahan <robert@example.org> - Bug 421436. Remove hack that gives
-           |
-           ⋮ (the past)
-
-

Tu conjunto de cambios de reversión está basado en una revisión antigua. No tiene los cambios más recientes.

-

Maneja esto como cualquier otra fusión. Si nunca has hecho antes una fusión, consigue ayuda (podría ser trivial o convertirse en un dolor de cabeza mayúsculo. Hay más información sobre cómo fusionar en otras partes de esta FAQ).

-

Ayuda

-

¡Ayuda, no puedo subir los cambios!

-

Si estás intentando subir los cambios y no puedes, prueba esto primero:

-
$ ssh hg.mozilla.org
-
-

Si ves un resultado como:

-
Permission denied (publickey,gssapi-with-mic).
-
-

puede deberse a las siguientes razones:

- -

Si ves un resultado como:

-
You are not allowed to use this system, go away!
-
-

entonces necesitas cursar un bug en mozilla.org:Server Operations.

-

Debes esperar que la orden SSH te desconecte inmediatamente, ya que no se supone que debas tener acceso a ninguna shell. Puede que te devuelva como resultado:

-
Could not chdir to home directory : No such file or directory
-
-

lo que no tiene consecuencias (aunque algunas personas lo verán y otras no).

-

Si ves un resultado como:

-
ssl required
-
-

entonces necesitas configurar el valor de tu default-push correctamente.

-

Cosas que han cambiado

- -

bonsai blame == hg annotate
-bonsai log == hg revisions
-también puedes visualizar el repositorio usando el enlace "manifest".

- - - - -

{{ languages( { "en": "en/Mercurial_FAQ" } ) }}

diff --git a/files/es/fuel/annotations/index.html b/files/es/fuel/annotations/index.html deleted file mode 100644 index ce27c39271..0000000000 --- a/files/es/fuel/annotations/index.html +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: Annotations -slug: FUEL/Annotations -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/FUEL/fuelIAnnotations ---- -

Resumen de métodos

- - - - - - - - - - - - - - - - -
boolean has(en AString aName)
nsIVariant get(en AString aName)
void set(en AString aName, en nsIVariant aValue, en PRInt32 aExpiration)
void remove(en AString aName)
- -

Atributos

- - - - - - - - - - - - - - -
AttributoTipoDescripción
nombresatributo de solo-lectura nsIVariantArray de nombre de anotación con el sujeto propietario
- -

Métodos

- -

has()

- -

Determina si una anotación con un nombre determinado existe.

- -
boolean has(en AString aName)
-
- -
Parámetros
- -
-
aName
-
El nombre de la Anotación
-
- -
Valor devuelto
- -

"true" si existe la Anotación con el nombre especificado, o "false" en caso contrario.

- -

get()

- -

Recoge el valor de una Anotación con el nombre especificado.

- -
nsIVariant get(en AString aName)
-
- -
Parámetros
- -
-
aName
-
El nombre de la Anotación.
-
- -
Valor devuelto
- -

Una variable que contiene el valor de la Anotación. Puede ser boleano, una cadena o un número.

- -

set()

- -

Da valor a la Anotación con el nombre especificado.

- -
void set(in AString aName, in nsIVariant aValue, in PRInt32 aExpiration)
-
- -
Parámetros
- -
-
aName
-
El nombre de la anotación
-
aValue
-
El nuevo valor de la anotación. Puede ser boleano, una cadena o un número.
-
aExpiration
-
La política de caducidad de la anotación. Véase nsIAnnotationService.
-
- -
Valor devuelto
- -

 

- -

remove()

- -

Borra la anotación especificada de su elemento propietario.

- -
void remove(in AString aName)
-
- -
Parámetros
- -
-
aName
-
El nombre de la anotación
-
- -
Valor devuelto
diff --git a/files/es/fuel/application/index.html b/files/es/fuel/application/index.html deleted file mode 100644 index 1e6ef7b05f..0000000000 --- a/files/es/fuel/application/index.html +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Application -slug: FUEL/Application -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/extIApplication ---- -

Resumen del método

- - -
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
idatributo de cadena de solo-lecturaLa identificación de la aplicación.
nameatributo de solo-lectura AStringEl nombre de la aplicación.
versionatributo de solo-lectura AStringLa versión de la aplicación.
consoleatributo de solo-lectura fuelIConsoleEl objeto consola de la aplicación.
extensionsatributo de solo-lectura fuelIExtensionsEl objeto extensiones para la aplicación. Contiene una lista de todas las aplicaciones instaladas.
prefsatributo de solo-lectura fuelIPreferenceBranchEl objeto preferencias de la aplicación.Por defecto es un árbol vacío.
storageatributo de solo-lectura fuelISessionStorageEl objeto storage de la aplicación.
eventsatributo de solo-lectura fuelIEventsEl objeto eventos de la aplicación. Los eventos válidos son: "load", "ready", "quit", "unload"
bookmarksatributo de solo-lectura fuelIBookmarkFolderEl elemento raíz de los marcadores de la aplicación.
windowsatributo de solo-lectura nsIVariantUn array con las ventanas del navegador dentro de la aplicación.
activeWindowatributo de solo-lectura fuelIWindowLa ventana activa del navegador.
diff --git a/files/es/fuel/bookmark/index.html b/files/es/fuel/bookmark/index.html deleted file mode 100644 index 5265d92ce2..0000000000 --- a/files/es/fuel/bookmark/index.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Bookmark -slug: FUEL/Bookmark -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/FUEL/fuelIBookmark ---- -

Resumen del método

- - - - - - - -
void remove()
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
idatributo de solo-lectura long longEL id del marcador.
titleatributo de solo-lectura AStringEl título del marcador.
uriatributo nsIURILa URI del marcador.
descriptionatributo AStringLa descripción del marcador.
keywordatributo AStringLa palabra clave asociada al marcador.
typeatributo de solo-lectura AStringEl tipo de marcador. Los valores posibles son: "bookmark", "separator"
parentatributo fuelIBookmarkFolderLa carpeta padre del marcador.
annotationsatributo de solo-lectura fuelIAnnotationsEl objeto Anotaciones del marcador.
eventsatributo de solo-lectura fuelIEventsEl objeto eventos del marcador. Los valores posibles son: "remove", "change", "visit", "move"
- -

Métodos

- -

remove()

- -

Borra el objeto de la carpeta padre. Se usa para quitar tanto un marcador como un separador.

- -
void remove()
-
- -
Parámetros
- -
Valor devuelto
diff --git a/files/es/fuel/bookmarkfolder/index.html b/files/es/fuel/bookmarkfolder/index.html deleted file mode 100644 index 08535501a9..0000000000 --- a/files/es/fuel/bookmarkfolder/index.html +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: BookmarkFolder -slug: FUEL/BookmarkFolder -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/FUEL/fuelIBookmarkFolder ---- -

Resument de métodos

- - - - - - - - - - - - - - - - -
fuelIBookmark addBookmark(en AString aTitle, en nsIURI aURI)
fuelIBookmark addSeparator()
fuelIBookmarkFolder addFolder(en AString aTitle)
void remove()
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
idatributo de solo-lectura long longEl id de la carpeta.
titleatributo AStringEl título de la carpeta.
descriptionatributo AStringLa descripción de la carpeta.
typeatributo de solo-lectura AStringEl tipo de carpeta. Los valores posibles son: "folder"
parentatributo fuelIBookmarkFolderLa carpeta padre de la carpeta.
annotationsatributo de solo-lectura fuelIAnnotationsEl objeto Anotaciones de la carpeta.
eventsatributo de solo-lectura fuelIEventsEl objeto eventos de la carpeta. Los valores posibles son: "add", "addchild", "remove", "removechild", "change", "move"
childrenatributo de solo-lectura nsIVariantArray conteniendo todos los marcadores, separadores y carpetas que contiene esta carpeta.
- -

Métodos

- -

addBookmark()

- -

Añade un nuevo marcador hijo a esta carpeta.

- -
fuelIBookmark addBookmark(en AString aTitle, en nsIURI aURI)
-
- -
Parámetros
- -
-
aTitle
-
El título del marcador.
-
- -
Valor devuelto
- -

 

- -

addSeparator()

- -

Añade un nuevo separador hijo a esta carpeta.

- -
fuelIBookmark addSeparator()
-
- -
Parámetros
- -
Valor devuelto
- -

 

- -

addFolder()

- -

Añade una nueva carpeta hijo a esta carpeta.

- -
fuelIBookmarkFolder addFolder(in AString aTitle)
-
- -
Parámetros
- -
-
aTitle
-
El título de la carpeta.
-
- -
Valor devuelto
- -

 

- -

remove()

- -

Borra la carpeta de la carpeta padre.

- -
void remove()
-
- -
Parámetros
- -
Valor devuelto
- -

 

diff --git a/files/es/fuel/browsertab/index.html b/files/es/fuel/browsertab/index.html deleted file mode 100644 index d8f22da029..0000000000 --- a/files/es/fuel/browsertab/index.html +++ /dev/null @@ -1,158 +0,0 @@ ---- -title: BrowserTab -slug: FUEL/BrowserTab -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/FUEL/fuelIBrowserTab ---- -

 

- -

Resumen de métodos

- - - - - - - - - - - - - - - - - - - -
void load(in nsIURI aURI)
void focus()
void close()
void moveBefore(in fuelIBrowserTab aBefore)
void moveToEnd()
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
uriatributo de solo-lectura nsIURILa URI de la pestaña actual.
indexatributo de solo-lectura RInt32El número de índice de la pestaña en la ventana del navegador.
windowatributo de solo-lectura fuelIWindowLa ventana del navegador en que se encuentra la pestaña.
documentatributo de solo-lectura nsIDOMHTMLDocumentTEl documento que contiene la pestaña.
eventsatributo de solo-lectura fuelIEventsEl objeto eventos de la pestaña. Valor posible: "load"
- -

Métodos

- -

load()

- -

Carga una nueva URI en la pestaña del navegador.

- -
void load(in nsIURI aURI)
-
- -
Parámetros
- -
-
aURI
-
La URI a cargar en la pestaña.
-
- -
Valor devuelto
- -

 

- -

focus()

- -

Pone el foco en esa pestaña del navegador y la trae a primer plano.

- -
void focus()
-
- -
Parámetros
- -
Valor devuelto
- -

 

- -

close()

- -

Cierra la pestaña. Es posible realmente no la cierre, ya que un script puede evitar esta operación.

- -
void close()
-
- -
Parámetros
- -
Valor devuelto
- -

 

- -

moveBefore()

- -

Cambia la posición de la pestaña en la ventana del navegador, hasta ponerla antes que otra pestaña.

- -
void moveBefore(in fuelIBrowserTab aBefore)
-
- -
Parámetros
- -
-
aBefore
-
La pestaña antes de la cual la situaremos.
-
- -
Valor devuelto
- -

 

- -

moveToEnd()

- -

Mueve esta pestaña, a la última posición en la ventana.

- -
void moveToEnd()
-
- -
Parámetros
- -
Valor devuelto
- -

Ejemplos

- -
var activeWin = Application.activeWindow;
-
-// buscamos en cada pestaña abierta en  la ventana del navegador
-activeWin.tabs.forEach( function(tab) {
-  alert(tab.uri.spec);
-});
-
-// accedemos al contenido del documento de la pestaña activa
-alert(activeWin.activeTab.document.body.innerHTML);
-
diff --git a/files/es/fuel/console/index.html b/files/es/fuel/console/index.html deleted file mode 100644 index 730d16b759..0000000000 --- a/files/es/fuel/console/index.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Console -slug: FUEL/Console -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/extIConsole ---- -

Resumen de métodos

- - - - - - - - - - -
void log(in AString aMsg)
void open()
- -

Atributos

- - - - - - - - - -
AtributoTipoDescripción
- -

Métodos

- -

log()

- -

Envía ena cadena determinada a la consola.

- -
void log(in AString aMsg)
-
- -
Parámetros
- -
-
aMsg
-
El texto a enviar a la consola.
-
- -
Valor devuelto
- -

 

- -

open()

- -

Abre la ventana de la consola de errores. Se pone el foco en la ventana de la consola si ya está abierta:

- -
void open()
-
- -
Parámetros
- -
Valor devuelto
diff --git a/files/es/fuel/eventitem/index.html b/files/es/fuel/eventitem/index.html deleted file mode 100644 index f740ef7af2..0000000000 --- a/files/es/fuel/eventitem/index.html +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: EventItem -slug: FUEL/EventItem -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/extIEventItem ---- -

 

- -

Resumen de métodos

- - - - - - - -
void preventDefault()
- -

Atributos

- - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
typeatributo de solo-lectura AStringEl nombre del evento
dataatributo de solo-lectura AStringPuede contener detalles adicionales y datos asociados con el evento. Es opcional y específico del evento. Si el evento no usa detalles adicionales, este valor es nulo.
- -

Métodos

- -

preventDefault()

- -

Cancela el evento si éste es cancelable.

- -
void preventDefault()
-
- -
Parámetros
- -
Valor devuelto
diff --git a/files/es/fuel/eventlistener/index.html b/files/es/fuel/eventlistener/index.html deleted file mode 100644 index 58c61c8fc8..0000000000 --- a/files/es/fuel/eventlistener/index.html +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: EventListener -slug: FUEL/EventListener -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/extIEventListener ---- -

Resumen de método

- - - - - - - -
void handleEvent(in fuelIEventItem aEvent)
- -

Atributos

- - - - - - - - - -
AtributoTipoDescripción
- -

Métodos

- -

handleEvent()

- -

Este método se llama cuando ocurre un evento del tipo por el que se ha registrado fuelIEventListener.

- -
void handleEvent(in fuelIEventItem aEvent)
-
- -
Parámetros
- -
-
aEvent
-
El (evento) fuelIEventItem asociado con el evento.
-
- -
Valor devuelto
diff --git a/files/es/fuel/events/index.html b/files/es/fuel/events/index.html deleted file mode 100644 index 8470203fb7..0000000000 --- a/files/es/fuel/events/index.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Events -slug: FUEL/Events -tags: - - Evento - - Todas_las_Categorías -translation_of: Mozilla/Tech/Toolkit_API/extIEvents ---- -

Resumen de métodos

- - - - - - - - - - -
void addListener(in AString aEvent, in fuelIEventListener aListener)
void removeListener(in AString aEvent, in fuelIEventListener aListener)
- -

Atributos

- - - - - - - - - -
AtributoTipoDescripción
- -

Métodos

- -

addListener()

- -

Añade un evento a la lista. Si se añaden múltiples escuchas (event listener) idénticas en el mismo evento, con los mismos parámetros y con el mismo objetivo, la copia será descartada, por lo que no causarán que se llame a la escucha 2 veces y no será necesario borrar las adicionales.

- -
void addListener(in AString aEvent, in extIEventListener aListener)
-
- -
Parámetros
- -
-
aEvent
-
El nombre del evento
-
aListener
-
La escucha que queremos añadir al evento
-
- -
Valor devuelto
- -

 

- -

removeListener()

- -

Quita una escucha de la lista. Si pasamos un argumento que no corresponde a ningún evento registrado, el efecto es nulo.

- -
void removeListener(in AString aEvent, in extIEventListener aListener)
-
- -
Parámetros
- -
-
aEvent
-
El nombre del evento
-
aListener
-
La escucha del evento que queremos quitar
-
- -
Valor devuelto
diff --git a/files/es/fuel/extension/index.html b/files/es/fuel/extension/index.html deleted file mode 100644 index 9ffb8ff096..0000000000 --- a/files/es/fuel/extension/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Extension -slug: FUEL/Extension -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/extIExtension ---- -

Resumen de método

- - -
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
idatributo de solo-lectura AStringLa identidad de la extensión.
nameatributo de solo-lectura AStringEl nombre de la extensión.
versionatributo de solo-lectura AStringEl número de versión de la extensión.
firstRunatributo boleano de solo-lecturaIndica si esta es la primera ejecución después de la instalación.
prefsatributo de solo-lectura fuelIPreferenceBranchEl objeto preferencias de la extensión. El valor por defecto es la rama "extensions.<extensionid>.".
storageatributo de solo-lectura fuelISessionStorageEl objeto storage de la extensión
eventsatributo de solo-lectura fuelIEventsEl objeto eventos de la extensión. Valor posible: "uninstall"
diff --git a/files/es/fuel/extensions/index.html b/files/es/fuel/extensions/index.html deleted file mode 100644 index 231329fe91..0000000000 --- a/files/es/fuel/extensions/index.html +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Extensions -slug: FUEL/Extensions -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/extIExtensions ---- -

Resumen de métodos

- - - - - - - - - - -
Expresión booleana has(en AString aId)
fuelIExtension get(en AString aId)
- -

Atributos

- - - - - - - - - - - - - - -
AtributoTipoDescripción
allatributo de solo-lectura nsIVariantEs un arreglo de fuelIExtension que contiene todas las extensiones en la aplicación.
- -

Métodos

- -

has()

- -

Determina si existe una extensión con un nombre "id" determinado.

- -
boolean has(in AString aId)
-
- -
Parámetros
- -
-
aId
-
La id de una extensión.
-
- -
Valor devuelto
- -

es "true" (verdadero) si existe una extensión con ese "id", y "false" (falso) en caso contrario.

- -

get()

- -

Recoge un objeto de la extensión con una determinada id.

- -
fuelIExtension get(in AString aId)
-
- -
Parámetros
- -
-
aId
-
El id de una extensión.
-
- -
Valor devuelto
- -

Un objeto de la extensión o null si no hay una extensión con el id especificado.

diff --git a/files/es/fuel/index.html b/files/es/fuel/index.html deleted file mode 100644 index 51c16b0424..0000000000 --- a/files/es/fuel/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: FUEL -slug: FUEL -tags: - - FUEL - - Interfaces - - Todas_las_Categorías -translation_of: Mozilla/Tech/Toolkit_API/FUEL ---- -

FUEL es una librería de JavaScript diseñada para ayudar a los desarrolladores a construir extensiones usando una terminología y un interfaz familiares. FUEL es nuevo en Firefox 3 y podrá ser usado también para Firefox 2. -

La intención es que FUEL permita a los desarrolladores ser productivos reduciendo las formalidades del XPCOM mientras añade algunas ideas "modernas" de JavaScript. Queremos empezar con áreas a las que podemos sacar el mayor beneficio.

-

Objetos

- -


-


-

-
-
diff --git a/files/es/fuel/preference/index.html b/files/es/fuel/preference/index.html deleted file mode 100644 index 77ad8ebc1b..0000000000 --- a/files/es/fuel/preference/index.html +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Preference -slug: FUEL/Preference -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/SMILE/smileIWindow ---- -

Resumen de método

- - - - - - - -
void reset()
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
nameatributo de solo-lectura AStringEl nombre de la preferencia.
typeatributo de solo-lectura AStringUna cadena conteniendo el tipo de preferencia. Valores posibles: "String", "Boolean", o "Number".
valueatributo nsIVariantLee o pone el vaslor de la preferencia.
lockedatributo boleanoLee el estado de bloqueo de la preferencia. Para des/bloquear, ajustar a un valor boleano.
modifiedatributo boleano de solo-lecturaComprueba si una preferencia a sido cambiada por el usuario o no.
branchatributo de solo-lectura fuelIPreferenceBranchLa rama de preferencia a la que corresponde la preferencia.
eventsatributo de solo-lectura fuelIEventsEl objeto de eventos para esta preferencia. Admite: "change"
- -

Métodos

- -

reset()

- -

Devuelve las preferencias a sus valores originales.

- -
void reset()
-
- -
Parámetros
- -
Valor devuelto
- -

 

diff --git a/files/es/fuel/preferencebranch/index.html b/files/es/fuel/preferencebranch/index.html deleted file mode 100644 index eb3adf22be..0000000000 --- a/files/es/fuel/preferencebranch/index.html +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: PreferenceBranch -slug: FUEL/PreferenceBranch -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/extIPreferenceBranch ---- -

Resumen de métodos

- - - - - - - - - - - - - - - - - - - -
boolean has(in AString aName)
fuelIPreference get(in AString aName)
nsIVariant getValue(in AString aName, in nsIVariant aDefaultValue)
void setValue(in AString aName, in nsIVariant aValue)
void reset()
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - -
AtributosTipoDescripción
rootatributo de solo-lectura AStringEl nombre de la rama raíz.
allatributo de solo-lectura nsIVariantArray de fuelIPreference conteniendo todas las preferencias en esta rama.
eventsatributo de solo-lectura fuelIEventsEl objeto de eventos para las preferencias. Admite: "change"
- -

Métodos

- -

has()

- -

Comprueba si existe una preferencia.

- -
boolean has(in AString aName)
-
- -
Parámetros
- -
-
aName
-
El nombre de la preferencia
-
- -
Valor devuelto
- -

"true" si la preferencia existe o "false" en caso contrario.

- -

get()

- -

Recoje un objeto que representa una preferencia.

- -
fuelIPreference get(in AString aName)
-
- -
Parámetros
- -
-
aName
-
El nombre de la preferencia.
-
- -
Valor devuelto
- -

un objeto de tipo preferencia o "null" si la preferencia no existe.

- -

getValue()

- -

Recoje el valor de una preferencia. Devuelve el valor por defecto si la preferencia no existe.

- -
nsIVariant getValue(in AString aName, in nsIVariant aDefaultValue)
-
- -
Parámetros
- -
-
aName
-
El nombre de la preferencia
-
aDefaultValue
-
El valor por defecto de la preferencia
-
- -
Valor devuelto
- -

valor de la preferencia o el valor por defecto predeterminado, si la preferencia no existe.

- -

setValue()

- -

Pone el valor a una preferencia con un nombre determinado.

- -
void setValue(in AString aName, in nsIVariant aValue)
-
- -
Parámetros
- -
-
aName
-
El nombre de la preferencia
-
aValue
-
El valor de la preferencia
-
- -
Valor devuelto
- -

 

- -

reset()

- -

Vuelve todas las preferencias en una rama, a su valor por defecto.

- -
void reset()
-
- -
Parámetros
- -
Valor devuelto
diff --git a/files/es/fuel/sessionstorage/index.html b/files/es/fuel/sessionstorage/index.html deleted file mode 100644 index f7a7655d6b..0000000000 --- a/files/es/fuel/sessionstorage/index.html +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: SessionStorage -slug: FUEL/SessionStorage -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/extISessionStorage ---- -

Resumen de métodos

- - - - - - - - - - - - - -
boolean has(in AString aName)
void set(in AString aName, in nsIVariant aValue)
nsIVariant get(in AString aName, in nsIVariant aDefaultValue)
- -

Atributos

- - - - - - - - - - - - - - -
AtributoTipoDescripciónn
eventsatributo de solo-lectura fuelIEventsEl objeto eventos para el almacenamiento. Admite: "change"
- -

Métodos

- -

has()

- -

Determina si un elemnto de almacenamiento existe con el nombre determinado.

- -
boolean has(in AString aName)
-
- -
Parámetros
- -
-
aName
-
El nombre del objeto.
-
- -
Valor devuelto
- -

"true" si existe un objeto con el nombre dado o "false" en caso contrario.

- -

set()

- -

Ajusta el valor de un objeto de almacenamiento con en determinado nombre.

- -
void set(in AString aName, in nsIVariant aValue)
-
- -
Parámetros
- -
-
El nombre del objeto.
-
- -
Valor devuelto
- -

 

- -

get()

- -

Recoge el valor de almacenamiento de un objeto con un nombre determinado. Si el nombre no existe, se devuelve un valor por defecto.

- -
nsIVariant get(in AString aName, in nsIVariant aDefaultValue)
-
- -
Parámetros
- -
-
aName
-
El nombre del objeto.
-
- -
Valor devuelto
- -

el valor del objeto o el valor por defecto si no existe un objeto con el nombre dado.

diff --git a/files/es/fuel/window/index.html b/files/es/fuel/window/index.html deleted file mode 100644 index 3420126809..0000000000 --- a/files/es/fuel/window/index.html +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Window -slug: FUEL/Window -tags: - - FUEL - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/Toolkit_API/FUEL/fuelIWindow ---- -

 

- - -

 

- -

Resumen de método

- - - - - - - -
fuelIBrowserTab open(in nsIURI aURI)
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
tabsatributo de solo-lectura nsIVariantUna colección de pestañas dentro de la ventana del navegador.
activeTabatributo de solo-lectura fuelIBrowserTabLa pestaña actualmente activa en la ventana del navegador.
eventsatributo de solo-lectura fuelIEventsEl objeto eventos de la ventana del navegador. Valores posibles: "TabOpen", "TabClose", "TabMove", "TabSelect"
- -

Métodos

- -

open()

- -

Abre una nueva pestaña en el navegador, apuntando a la URI especificada.

- -
fuelIBrowserTab open(in nsIURI aURI)
-
- -
Parámetros
- -
-
aURI
-
La dirección URI a la que apuntará la pestaña.
-
- -
Valor devuelto
- -

Ejemplos

- -
// Helper for making nsURI from string
-function url(spec) {
-  var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
-  return ios.newURI(spec, null, null);
-}
-
-function onTabOpen(event) {
-  alert("abierta");
-}
-
-var activeWin = Application.activeWindow;
-activeWin.events.addListener("TabOpen", onTabOpen);
-
-var browserTab = activeWin.open(url("http://mozilla.org"));
-
diff --git a/files/es/gecko/index.html b/files/es/gecko/index.html deleted file mode 100644 index b6ef98f950..0000000000 --- a/files/es/gecko/index.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Gecko -slug: Gecko -tags: - - Gecko -translation_of: Mozilla/Gecko ---- -

Gecko es el nombre del motor de presentación desarrollado por la Fundación Mozilla. En un principio se llamó NGLayout.

-

La función de Gecko es leer el contenido de la web, tanto HTML, CSS, XUL, como JavaScript, y presentarlo en pantalla o imprimirlo.

-

Gecko es usado en varias aplicaciones, incluyendo unos pocos navegadores, como Firefox, Seamonkey(ex Mozilla Suite), Camino, etc. (Para una lista completa, por favor diríjase al artículo en Wikipedia sobre Gecko.) Los productos que usan la misma versión de Gecko tienen el mismo soporte de estándares.

-

Versiones de Gecko

-

we should make a table here

- -

Recursos

- -

{{ languages( { "de": "de/Gecko", "en": "en/Gecko", "fr": "fr/Gecko", "it": "it/Gecko", "ja": "ja/Gecko", "ko": "ko/Gecko", "pl": "pl/Gecko", "pt": "pt/Gecko", "zh-cn": "cn/Gecko" } ) }}

diff --git a/files/es/gecko_sdk/index.html b/files/es/gecko_sdk/index.html deleted file mode 100644 index ec633e890a..0000000000 --- a/files/es/gecko_sdk/index.html +++ /dev/null @@ -1,117 +0,0 @@ ---- -title: Gecko SDK -slug: Gecko_SDK -translation_of: Mozilla/Gecko/Gecko_SDK ---- -
-

El Gecko SDK, también conocido como el XULRunner SDK, es un conjunto de archivos XPIDL, cabeceras y herramientas para desarrollar componentes XPCOM que a su vez pueden por ejemplo ser accedidos desde XUL usando JavaScript.

-

Debe tenerse en cuenta que para desarrollar estos componentes, no es necesario todo el codigo fuente de por ejemplo Firefox, puesto que no es requerido el acceso a los elementos de la capa visual creando un componente. Por otra parte, ya que un componente solo contiene funcionalidades básicas, debería poder ejecutarse en cualquier producto  de la plataforma Mozilla. Por tanto no es necesario contar con un producto particular para construir las funcionalidades generales. Esta es la premisa sobre la que el Gecko SDK fue ideado.

-

No debe confundirse el Gecko/XULRunner SDK con el XULRunner en sí mismo. El Gecko SDK es una colección de archivos de cabeceras (headers) y herramientas usadas para el desarrollo general de componentes XPCOM que agregan funcionalidades a la plataforma existente, mientras que el XULRunner es un esquema de funcionalidades (framework) donde puede ser utilizado para ejecutarse independientemente (standalone) o embebido en aplicaciones basadas en el framework Mozilla.

-

El Gecko SDK contiene todas las herramientas y cabeceras necesarias para crear plugins scripts NPAPI incluyendo el compilador/enlazador xpidl y el último npapi.h.

-

Obteniendo el SDK

-

Actualizaciones

-

No es necesario descargar o recompilar el Gecko SDK por las actualizaciones de seguridad de Mozilla (por ejemplo, Mozilla 1.7.3) ya que las cabeceras y las librerías enlazadas en el Gecko SDK usualmente no sufren cambios como resultados de las actualizaciones de seguridad. Sin embargo, uno debe obtener y distribuir siempre los más nuevos componentes Gecko (como: gklayout.dll, etc.).

-

Descargas

-

Para versiones de Gecko anteriores a 2.0, deberá elegir la versión del Gecko SDK para la versión de Mozilla más cercana al utilizado. Para versiones de Gecko 2.0 o superior, deberá recompilar el componente para cada versión pues ya no está soportada la compatibilidad entre versiones.

-

Además de la continuidad de las versiones, aquí se pueden encontrar otras versiones (incluyendo Beta): Versiones de Xulrunner (archivos incluyen "sdk" en el nombre). El SDK sigue el mismo calendario de liberaciones que Firefox/Thunderbird. Una vez que el SDK se vuelve Beta, está listo para la construir las extensiones, tu componente debe trabajar con las versiones de lanzamiento del SDK sin ninguna modificación. Debido al proceso de Liberación Rapida lanzamiento rápido, puede ser una buena idea agregar el SDK en los Beta.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Enlace de DescargaGecko 20.0 (Firefox 20.0)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)
WindowsDescargarDescargarDescargarDescargarDescargar
Mac x86_64DescargarN/AN/AN/AN/A
Mac i386DescargarDescargarDescargarDescargarN/A
Mac ppcN/ADescargarDescargarDescargarDescargar
Linux x86_64DescargarN/AN/AN/AN/A
Linux i686DescargarDescargarDescargarDescargarDescargar
-

El SDK no está oficialmente lanzado para otras plataformas; si lo necesitas, probablemente deberás adaptarlo para la tuya.

-
-

Nota: Puedes subscribirte a un calendario de fechas de lanzamiento de Firefox. Como también, puedes ver las fechas en la Web.

-
-

Desempaquetar el tarball del SDK en algún directorio adecuado.

-

Situaciones con el OS X SDK

-

Si tu necesitas usar la utilidad xpidl para compilar archivos IDL en OS X, y lo más probable es que observes cuando ejecutes la herramienta un extraño error similar al de las siguientes líneas:

-
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
-
-

Desafortunadamente, esto es causado pro un problema con el proceso de construcción del SDK que aún no se logró resolver (ver Bugzilla bug #430274). Para solucionarlo, necesitarás instalar primero MacPorts como se indica en los Prerequisitos de Construcción de Mac OS X e instalar con él libidl. En versiones 64-bit de Mac OS X, necesitarás instalar libidl con la opción +universal.

-

Una vez concluido, deberás ejecutar el siguiente comando:

-
ln -s /opt/local/lib/libintl.8.dylib /opt/local/lib/libintl.3.dylib
-

Esto debería corregir el problema.

-

Construyendo el SDK

-

Para construstruir el SDK, deberías construir el XULRunner (el Gecko SDK se forma como parte del proceso de contrucción del, por lo que suele llamarse también XULRunner SDK). Ver la  Documentación para la Compilación para mayores detalles. Después la contrucción del XULRunner se concluye corriendo make sdk desde el directorio objeto se creará un paquete del sdk en dist.

-

Contenidos del SDK

-

El SDK contiene lo siguiente:

- -

Para más información sobre enlazado seguro de componentes XPCOM usando la librería XPCOM "glue", ver XPCOM Glue.

-

Utilizando el Sistema de Compilación Mozilla con el SDK

-

Es posible usar el Sistema de Compilación Mozilla con el SDK. Se puede hacer descargando el código fuente para Firefox y usando --with-libxul-sdk como opcion para el configure.

-

Recursos

- -

{{ languages( { "zh-cn": "cn/Gecko_SDK", "en": "en/SDK_Gecko", "fr": "fr/SDK_Gecko", "ja": "ja/Gecko_SDK" } ) }}

-
-  
-
-

 

diff --git "a/files/es/gr\303\241ficos_png_animados/index.html" "b/files/es/gr\303\241ficos_png_animados/index.html" deleted file mode 100644 index e392dc7c70..0000000000 --- "a/files/es/gr\303\241ficos_png_animados/index.html" +++ /dev/null @@ -1,548 +0,0 @@ ---- -title: Gráficos PNG animados -slug: Gráficos_PNG_animados -tags: - - Firefox 3 - - páginas_a_traducir -translation_of: Mozilla/Tech/APNG ---- -

- -

Autores

- -

La especificación APNG fué escrita por:

- - - -

 

- -

Descripción

- -

APNG es una extensión del formato (PNG) Portable Network Graphics que agrega soporte para imágenes animadas. Se pretende que sea una simple sustitución de las imágenes animadas que tradicionalmente han utilizado el formato GIF, añadiendo soporte para imágenes de 24 bits y de 8-bit de transparencia. APNG es una alternativa simple a MNG, proporcionando una especificación adecuada para el uso común de imágenes animadas en Internet.

- -

APNG es compatible con PNG y cualquier decodificador de formato PNG puede ignorar los fragmentos de APNG y mostrar la imagen codificada.

- -

Terminología

- -

Imagen por defecto:se especifica en el fragmento 'IDAT' y es mostrada por decodificadores que no soporten APNG.

- -

Canvas is the area on the output device on which the frames are to be displayed. Los contenidos de los canvas no esta necesariamente disponible para el decodificador. As per the PNG Specification, if a 'bKGD' chunk exists it may be used to fill the canvas if there is no preferrable background.

- -

The output buffer is a pixel array with dimensions specified by the width and height parameters of the PNG 'IHDR' chunk. Conceptually, each frame is constructed in the output buffer before being composited onto the canvas. The contents of the output buffer are available to the decoder. The corners of the output buffer are mapped to the corners of the canvas.

- -

Fully transparent black means red, green, blue and alpha components are all set to zero.

- -

For purposes of chunk descriptions, an unsigned int shall be a 32-bit unsigned integer in network byte order limited to the range 0 to (2^31)-1; an unsigned short shall be a 16-bit unsigned integer in network byte order with the range 0 to (2^16)-1; and a byte shall be an 8-bit unsigned integer with the range 0 to (2^8)-1.

- -

Manejo de errores

- -

APNG is designed to allow incremental display of frames before the entire image has been read. This implies that some errors may not be detected until partway through the animation. It is strongly recommended that when any error is encountered decoders should discard all subsequent frames, stop the animation, and revert to displaying the default image. A decoder which detects an error before the animation has started should display the default image. An error message may be displayed to the user if appropriate.

- -

Estructura

- -

An APNG stream is a normal PNG stream as defined in the PNG Specification, with three additional chunk types describing the animation and providing additional frame data.

- -

To be recognized as an APNG, an 'acTL' chunk must appear in the stream before any 'IDAT' chunks. The 'acTL' structure is described below.

- -

Conceptually, at the beginning of each play the output buffer must be completely initialized to a fully transparent black rectangle, with width and height dimensions from the 'IHDR' chunk.

- -

The default image may be included as the first frame of the animation by the presence of a single 'fcTL' chunk before 'IDAT'. Otherwise, the default image is not part of the animation.

- -

Subsequent frames are encoded in 'fdAT' chunks, which have the same structure as 'IDAT' chunks, except preceded by a sequence number. Information for each frame about placement and rendering is stored in 'fcTL' chunks. The full layout of 'fdAT' and 'fcTL' chunks is described below.

- -

The boundaries of the entire animation are specified by the width and height parameters of the PNG 'IHDR' chunk, regardless of whether the default image is part of the animation. The default image should be appropriately padded with fully transparent pixels if extra space will be needed for later frames.

- -

Each frame is identical for each play, therefore it is safe for applications to cache the frames.

- -

Chunk sequence numbers

- -

The 'fcTL' and 'fdAT' chunks have a 4 byte sequence number. Both chunk types share the sequence. The purpose of this number is to detect (and optionally correct) sequence errors in an Animated PNG, since the PNG specification does not impose ordering restrictions on ancillary chunks.

- -

The first 'fcTL' chunk must contain sequence number 0, and the sequence numbers in the remaining 'fcTL' and 'fdAT' chunks must be in order, with no gaps or duplicates.

- -

The tables below illustrates the use of sequence numbers for images with more than one frame and more than one 'fdAT' chunk.

- -

If the default image is the first frame:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sequence numberChunk
(none)'acTL'
0'fcTL' (first frame)
(none)'IDAT' (first frame -- used as the default image)
1'fcTL' (second frame)
2'fdAT' (first 'fDAT' for second frame)
3'fdAT' (second 'fDAT' for second frame)
......
- -

If the default image is not part of the animation:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sequence numberChunk
(none)'acTL'
(none)'IDAT' (default image)
0'fcTL' (first frame)
1First 'fdAT' for first frame
2Second 'fDAT' for first frame
......
- -

Decoders must treat out-of-order APNG chunks as an error. APNG-aware PNG editors should restore them to correct order using the sequence numbers.

- -

'acTL': The Animation Control Chunk

- -

The 'acTL' chunk is an ancillary chunk as defined in the PNG Specification. It must appear before the first 'IDAT' chunk within a valid PNG stream.

- -

The 'acTL' chunk contains:

- - - - - - - - - - - - - - - - - - - - - - -
Byte offsetField nameField typeDescription
0num_framesunsigned intThe number of frames in the APNG.
4num_playsunsigned intThe number of times to loop this APNG. 0 indicates infinite looping.
- -

num_frames indicates the total number of frames in the animation. This must equal the number of 'fcTL' chunks. 0 is not a valid value. 1 is a valid value for a single-frame APNG. If this value does not equal the actual number of frames it should be treated as an error.

- -

num_plays indicates the number of times that this animation should play; if it is 0, the animation should play indefinitely. If nonzero, the animation should come to rest on the final frame at the end of the last play.

- -

'fcTL': The Frame Control Chunk

- -

The 'fcTL' chunk is an ancillary chunk as defined in the PNG Specification. It must appear before the 'IDAT' or 'fdAT' chunks of the frame to which it applies, specifically:

- - - -

Exactly one 'fcTL' chunk is required for each frame.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Byte offsetField nameField typeDescription
0sequence_numberunsigned intSequence number of the animation chunk, starting with 0.
4widthunsigned intWidth of the following frame.
8heightunsigned intHeight of the following frame.
12x_offsetunsigned intX position at which to render the following frame.
16y_offsetunsigned intY position at which to render the following frame.
20delay_numunsigned shortFrame delay fraction numerator.
22delay_denunsigned shortFrame delay fraction denominator.
24dispose_opbyteType of frame area disposal to be done after rendering this frame.
25blend_opbyteType of frame area rendering for this frame.
- -

The frame must be rendered within the region defined by x_offset, y_offset, width, and height. The offsets must be non-negative, the dimensions must be positive, and the region may not fall outside of the default image.

- -

Constraints on frame regions:

- - - -

The delay_num and delay_den parameters together specify a fraction indicating the time to display the current frame, in seconds. If the denominator is 0, it is to be treated as if it were 100 (that is, delay_num then specifies 1/100ths of a second). If the the value of the numerator is 0 the decoder should render the next frame as quickly as possible, though viewers may impose a reasonable lower bound.

- -

Frame timings should be independent of the time required for decoding and display of each frame, so that animations will run at the same rate regardless of the performance of the decoder implementation.

- -

dispose_op specifies how the output buffer should be changed at the end of the delay (before rendering the next frame).

- -

Valid values for dispose_op are:

- - - - - - - - - - - - - - - - - - - - - - - - -
ValueConstantDescription
0APNG_DISPOSE_OP_NONENo disposal is done on this frame before rendering the next; the contents of the output buffer are left as is.
1APNG_DISPOSE_OP_BACKGROUNDThe frame's region of the output buffer is to be cleared to fully transparent black before rendering the next frame.
2APNG_DISPOSE_OP_PREVIOUSThe frame's region of the output buffer is to be reverted to the previous contents before rendering the next frame.
- -

If the first 'fcTL' chunk uses a dispose_op of APNG_DISPOSE_OP_PREVIOUS it should be treated as APNG_DISPOSE_OP_BACKGROUND.

- -

blend_op<code> specifies whether the frame is to be alpha blended into the current output buffer content, or whether it should completely replace its region in the output buffer.

- -

Valid values for <code>blend_op are:

- - - - - - - - - - - - - - - - - - - -
ValueConstantDescription
0APNG_BLEND_OP_SOURCEAll color components of the frame, including alpha, overwrite the current contents of the frame's output buffer region.
1APNG_BLEND_OP_OVERThe frame should be composited onto the output buffer based on its alpha, using a simple OVER operation as described in the Alpha Channel Processing section of the Extensions to the PNG Specification, Version 1.2.0. Note that the second variation of the sample code is applicable.
- -

Note that for the first frame the two blend modes are functionally equivalent due to the clearing of the output buffer at the beginning of each play.

- -

The 'fcTL' chunk corresponding to the default image, if it exists, has these restrictions:

- - - -

As noted earlier, the output buffer must be completely initialized to fully transparent black at the beginning of each play. This is to ensure that each play of the animation will be identical. Decoders are free to avoid an explicit clear step as long as the result is guaranteed to be identical. For example, if the default image is included in the animation, and uses a blend_op of APNG_BLEND_OP_SOURCE, clearing is not necessary because the entire output buffer will be overwritten.

- -

'fdAT': The Frame Data Chunk

- -

The 'fdAT' chunk has the same purpose as an 'IDAT' chunk. It has the same structure as an 'IDAT' chunk, except preceded by a sequence number.

- -

At least one 'fdAT' chunk is required for each frame. The compressed datastream is then the concatenation of the contents of the data fields of all the 'fdAT' chunks within a frame. When decompressed, the datastream is the complete pixel data of a PNG image, including the filter byte at the beginning of each scanline, similar to the uncompressed data of all the 'IDAT' chunks. It utilizes the same bit depth, color type, compression method, filter method, interlace method, and palette (if any) as the default image.

- - - - - - - - - - - - - - - - - - - - - - -
Byte offsetField nameField typeDescription
0sequence_numberunsigned intSequence number of the animation chunk, starting from 0.
4frame_dataX bytesFrame data for this frame.
- -

Each frame inherits every property specified by any critical or ancillary chunks before the first 'IDAT' in the file, except the width and height, which come from the 'fcTL' chunk.

- -

If the PNG 'pHYs' chunk is present, the APNG images and their x_offset and y_offset values must be scaled in the same way as the main image. Conceptually, such scaling occurs while mapping the output buffer onto the canvas.

- -

Revisions to this specification

- -

From 0.1

- - - - - - - - - -

From 0.2

- - - - - - - - - -

From 0.3

- - - - - - - - - - - - - - - - - - - - - -

From 0.4

- - - - - - - - - - - -

From 0.5

- - - - - -

From 0.6

- - - - - - - - - -

From 0.7

- - - - - -

From 0.8

- - - - - -

From 0.9

- - - -

From 0.10

- - - -

Test Encoder and Sample Images

- -

Sample images are available from the APNG implementation page at http://littlesvr.ca/apng/

- -

An encoder (open source) is available in versions of the Gecko engine starting with version 1.9 alpha 4.

- -

An application (open source) using the Mozilla encoder to assemble APNGs available here: http://littlesvr.ca/apng/apngedit.html

- -

See also

- - diff --git a/files/es/herramientas/borrador/index.html b/files/es/herramientas/borrador/index.html deleted file mode 100644 index 462db27e62..0000000000 --- a/files/es/herramientas/borrador/index.html +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Borrador -slug: Herramientas/Borrador -tags: - - Desarrollo_Web - - 'Desarrollo_Web:Herramientas' - - Herramientas -translation_of: Archive/Tools/Scratchpad ---- -
- Aunque el equipo de localización de Mozilla Hispano trabaja para mantener esta página continuamente actualizada, es posible que la página en inglés tenga contenidos nuevos que no aparecen registrados aquí. Si quieres ver el artículo en inglés, haz clic en Idiomas y selecciona English en el menú desplegable.
-

La herramienta Borrador integrada en Firefox 6 y en versiones posteriores proporciona un entorno de práctica para experimentar con el código JavaScript. Puedes escribir código que puede interactuar con el contenido de una página web y probar así las ideas antes de cambiar a tus herramientas de desarrollo web habituales para escribir el código final. O puedes utilizarlo para retocar y jugar con los sitios web existentes.

-

A diferencia de la Consola web, que está diseñada para la interpretación de una sola línea de código a la vez, Borrador te permite editar grandes trozos de código JavaScript y después ejecutarlo de varias formas dependiendo de cómo desees utilizar el resultado.

-

Cómo usar Borrador

-

Para abrir la ventana de Borrador, ve al menú Desarrollador web (que es un submenú en el menú Herramientas en Mac) y, a continuación, selecciona Borrador. Esto abrirá una ventana del editor Borrador, que incluye un comentario que ofrece una breve información acerca de cómo usarlo. A partir de ahí, puedes ya empezar a escribir algo de código JavaScript para probar.

-

La ventana de Borrador tiene este aspecto (en Windows y Linux, también tienes la barra de menú allí, mientras que en Mac, la barra de menús está en la parte superior de la pantalla, como de costumbre):

-

scratchpad.png

-

En la parte inferior, aparece el ámbito de ejecución actual de tu código, en este caso, se trata de "Contenido", es decir, el contenido de la página actual. Consulta {{ anch ("Alcance de Borrador") }} si necesitas tener más detalles.

-
- {{ gecko_callout_heading("10.0") }} -

Gecko 10.0 {{ geckoRelease("10.0") }} sustituyó el editor de Borrador por Orion, que proporciona subrayado de sintaxis, mejoras en la sangría y otras características. Además, el contenido de la ventana Borrador se guarda usando la función de restaurar sesión de Firefox, por lo que ahora es persistente en todos los reinicios de Firefox.

-
-

El menú Archivo ofrece opciones para guardar y cargar los fragmentos de código JavaScript, por lo que se puede reutilizar el código más tarde si lo deseas.

-

Ejecutar tu código

-

Una vez que hayas escrito el código, selecciona el código que deseas ejecutar y, a continuación, haz clic (o ve al menú Ejecutar en la barra de menús) y elige la forma en que deseas ejecutar el código. Hay tres opciones de ejecución disponibles.

-
- Nota: si no seleccionas nada, se ejecutará todo el código en la ventana.
-

Ejecutar (Run)

-

Cuando eliges la opción Ejecutar, se ejecuta el código seleccionado. Esto es lo que utilizarías para ejecutar una función u otro código que manipula el contenido de tu página.

-

Inspeccionar (Inspect)

-

La opción Inspeccionar ejecuta el código al igual que la opción Ejecutar; sin embargo, después de que se devuelva el código, se abre un inspector de objetos para que puedas examinar el valor devuelto.

-

Por ejemplo, si introduces el código:

-
window
-
-

A continuación, seleccionas Inspeccionar, obtienes una ventana de inspector que puede ser algo así:

-

inspector.png

-

Mostrar (Display)

-

La opción Mostrar ejecuta el código seleccionado y, a continuación, inserta el resultado directamente en la ventana del editor Borrador como un comentario. Esta es una forma cómoda de mantener un registro de los resultados de las pruebas mientras se trabaja. También puedes utilizarlo como una calculadora, en un apuro, aunque si no tienes un programa de calculadora mejor, puedes tener problemas.

-

Limpiar

-

Puedes restablecer todas las variables seleccionando la opción "Restablecer variables" en el menú Ejecutar o en el menú contextual que aparece al hacer clic con el botón secundario en la ventana Borrador.

-

Escenarios de uso de Borrador

-

Hay muchas maneras en que Borrador puede resultar útil. Esta sección trata algunas de ellas.

-

Probar código nuevo

-

Borrador es especialmente útil para probar código nuevo en un entorno de navegador en vivo, puedes copiar en Borrador el código que estés depurando  y ejecutarlo, y luego ajustarlo hasta que funcione. Una vez que funcione, se copia en el archivo de código principal y ya está. En muchos casos, se puede escribir, depurar y probar el código sin tener que recargar la página.

-

Fragmentos de código reutilizables

-

La barra de menús de Borrador ofrece instrucciones o comandos para guardar y cargar el código JavaScript. Esta instalación se puede utilizar para tener a mano los bits de código JavaScript que utilizas a menudo. Por ejemplo, si estás trabajando en un sitio que utiliza peticiones AJAX para cargar los datos, puedes tener a mano fragmentos que llevan a cabo las operaciones de carga para probar o verificar los datos. Del mismo modo, puedes tener a mano las funciones de depuración útiles de uso general, tales como las funciones que vierten cierto tipo de información acerca del DOM.

-

Alcance de Borrador

-

El código que ejecutas en Borrador se ejecuta en un entorno limitado que tiene acceso a todo en tu página, pero no filtrará nuevas variables a la página. Si expresamente quieres poner las variables en tu página, puedes hacerlo poniéndolas en el objeto {{ domxref ("window") }}:

-
window.myVariable = value;
-
-

El nuevo valor window.myVariable, en este caso, es accesible para los scripts que se ejecutan en la página.

-
- Nota: este entorno limitado funciona igual que la Consola web. Sin embargo, a diferencia de la Consola web, el Borrador te sigue de una pestaña a otra, el código que ejecutas en él siempre lo hace en la pestaña actual de la ventana del navegador en primer plano. Esto puede usarse, por ejemplo, para realizar la misma prueba en varios servidores.
-

Cómo usar Borrador para acceder a información interna de Firefox

-

Si estás trabajando en el propio Firefox, o en el desarrollo de complementos, puede que te resulte útil poder acceder a toda la información interna del navegador usando Borrador. Para ello, es necesario establecer la preferencia devtools.chrome.enabled a true usando about:config . Una vez que hayas hecho esto, el menú Entorno tiene la opción Navegador y una vez que se selecciona, tu ámbito es todo el navegador y no sólo el contenido de la página.

-

{{ languages( { "en" : "en/Tools/Scratchpad", "fr": "fr/Outils/Ardoise" } ) }}

diff --git a/files/es/incrustando_mozilla/index.html b/files/es/incrustando_mozilla/index.html deleted file mode 100644 index eafc681878..0000000000 --- a/files/es/incrustando_mozilla/index.html +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Incrustando Mozilla -slug: Incrustando_Mozilla -tags: - - Incrustando_Mozilla - - Todas_las_Categorías -translation_of: Mozilla/Gecko/Embedding_Mozilla ---- -

-

-
-

Gecko permite a desarrolladores externos usar la misma tecnologia que encontramos en Mozilla. Eso quiere decir que puedes incluir un navegador dentro de una aplicacion externa, abrir canales y salidas a traves de la red, usando DOM y demás. Incluso puedes construir una nueva aplicacion entera usando el chrome. -

-
-
-

Incrustando Mozilla

-
FAQ Incrustando Mozilla -
Una gran cantidad de preguntas frecuentes sobre incrustar Mozilla. -
Fundamentos para incrustar Gecko (en)
-
Debido a la creciente importacia de la Web como fuente de informacion, entretenimiento, y contacto personal, la habilidad de acceder y ver datos guardados en formato HTML se esta haciendo mas y mas importante para una amplia variedad de diferentes aplicaciones. Incrustar Gecko, el motor de renderizado de los navegadores Netscape y Mozilla, es una solución sobresaliente para este problema. -
-
Usa tu propio navegador - Como incrustar
-
Una rapida introducción para incrustar Mozilla. -
-
Incrustando el Editor
-
Este documento relata es estado actual de la incrustación del editor, problemas con las implementaciones existentes, algunos casos de incrustacion a los que tendremos que hacer frente, y una solucion para incrustarlo en esos casos. -
-

Ver Todo... -

-
-

Comunidad

-
  • En la comunidad Mozilla... en inglés -
-

{{ DiscussionList("dev-embedding", "mozilla.dev.embedding") }} -

Ver Todo... -


-

-

Temas Relacionados

-
Gecko, XPCOM -
-


-

-
-

Categorías -

Interwiki Language Links -


-

{{ languages( { "en": "en/Embedding_Mozilla", "fr": "fr/Mozilla_embarqu\u00e9", "ja": "ja/Embedding_Mozilla", "ko": "ko/Embedding_Mozilla", "pl": "pl/Zagnie\u017cd\u017canie_Mozilli", "zh-cn": "cn/Embedding_Mozilla" } ) }} diff --git a/files/es/interactuar_con_el_colector_de_ciclos_de_xpcom/index.html b/files/es/interactuar_con_el_colector_de_ciclos_de_xpcom/index.html deleted file mode 100644 index 2ca660bdac..0000000000 --- a/files/es/interactuar_con_el_colector_de_ciclos_de_xpcom/index.html +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Interactuar con el colector de ciclos de XPCOM -slug: Interactuar_con_el_colector_de_ciclos_de_XPCOM -tags: - - Firefox 3 - - Todas_las_Categorías - - XPCOM - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/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.

- -

The intended audience is Mozilla C++ developers.

- -

What the cycle collector does

- -

The cycle collector spends most of its time accumulating (and forgetting about) pointers to XPCOM objects thatmight be involved in garbage cycles. This is the idle stage of the collector's operation, in which special variants of nsAutoRefCnt register and unregister themselves very rapidly with the collector, as they pass through a "suspicious" refcount event (from N+1 to N, for nonzero N).

- -

Periodically the collector wakes up and examines any suspicious pointers that have been sitting in its buffer for a while. This is the scanning stage of the collector's operation. In this stage the collector repeatedly asks each candidate for a singleton cycle-collection helper class, and if that helper exists, the collector asks the helper to describe the candidate's (owned) children. This way the collector builds a picture of the ownership subgraph reachable from suspicious objects.

- -

If the collector finds a group of objects that all refer back to one another, and establishes that the objects' reference counts are all accounted for by internal pointers within the group, it considers that groupcyclical garbage, which it then attempts to free. This is the unlinking stage of the collectors operation. In this stage the collector walks through the garbage objects it has found, again consulting with their helper objects, asking the helper objects to "unlink" each object from its immediate children.

- -

Note that the collector also knows how to walk through the JS heap, and can locate ownership cycles that pass in and out of it.

- -

How the collector can fail

- -

The cycle collector is a conservative device. There are situations in which it will fail to collect a garbage cycle.

- -
    -
  1. It does not suspect any pointers by default; objects mustsuspect themselves, typically by using an nsCycleCollectingAutoRefCnt rather than a nsAutoRefCnt.
  2. -
  3. It only traverses objects that return a helper object when QI'ed to nsICycleCollectionParticipant. If it encounters an unknown edge during its traversal, it gives up on that edge; this means that every edge involved in a cycle must be participating, otherwise the cycle will not be found.
  4. -
  5. The Traverse and Unlink methods on the helper object are not magic; they are programmer-supplied and must be correct, or else the collector will fail.
  6. -
  7. The collector does not know how to find temporary owning pointers that exist on the stack, so it is important that it only run from near the top-loop of the program. It will not crash if there are extra owning pointers, but it will find itself unable to account for the reference counts it finds in the owned objects, so may fail to collect cycles.
  8. -
- -

How to make your classes participate

- -

The interface between the cycle collector and your classes can be accessed directly using the contents of xpcom/base/nsCycleCollector.h, but there are convenience macros for annotating your classes in xpcom/base/nsCycleCollectionParticipant.h that are much easier to use. In general, assuming you are modifying class nsFoo with two nsCOMPtr edges mBar and mBaz, the process can be distilled to a few simple modifications:

- -
    -
  1. Include the header nsCycleCollectionParticipant.h in both nsFoo.h and nsFoo.cpp.
  2. -
  3. Change the line NS_DECL_ISUPPORTS to NS_DECL_CYCLE_COLLECTING_ISUPPORTS in the definition of nsFoo.
  4. -
  5. Add a line NS_DECL_CYCLE_COLLECTION_CLASS(nsFoo) within the public portion of definition of nsFoo.
  6. -
  7. Add a line NS_INTERFACE_MAP_ENTRIES_CYCLE_COLLECTION(nsFoo) to the interface map of nsFoo in nsFoo.cpp.
  8. -
  9. Change the line NS_IMPL_ADDREF(nsFoo) to NS_IMPL_CYCLE_COLLECTING_ADDREF(nsFoo) in nsFoo.cpp.
  10. -
  11. Change the line NS_IMPL_RELEASE(nsFoo) to NS_IMPL_CYCLE_COLLECTING_RELEASE(nsFoo) in nsFoo.cpp.
  12. -
  13. Add a line NS_IMPL_CYCLE_COLLECTION_CLASS_2(nsFoo, mBar, mBaz) in nsFoo.cpp.
  14. -
- -

It is possible that your class has more complicated structure than this picture. For example, your class may have multiple nsISupports base classes, which requires the use of some *_AMBIGUOUS macros that perform a disambiguating downcast. Or your class may have a complicated ownership structure, such that the simple NS_IMPL_CYCLE_COLLECTION_CLASS_N macros are insufficient; in this case you might need to implement theTraverse andUnlink methods of your helper class manually. It's helpful even in these cases to use the NS_IMPL_CYCLE_COLLECTION_TRAVERSE_{BEGIN,END} and NS_IMPL_CYCLE_COLLECTION_UNLINK_{BEGIN,END} macros. You can see an example of their use in some more complicated classes such as content/base/src/nsGenericElement.cpp. If your class has tearoffs or is being aggregated by other classes it is important to make the tearoff classes or the outer classes participate in cycle collection too, not doing so could lead to the cycle collector trying to collect the objects too soon.

diff --git a/files/es/introduccion_venkman/index.html b/files/es/introduccion_venkman/index.html deleted file mode 100644 index d8c56edb05..0000000000 --- a/files/es/introduccion_venkman/index.html +++ /dev/null @@ -1,261 +0,0 @@ ---- -title: Introduccion a Venkman -slug: Introduccion_Venkman -translation_of: Archive/Mozilla/Venkman/Introduction ---- -

-

Advertencia: The content of this article may be out of date.

-

-

Es una version BETA de traduccion, falta revisar formato de titulos y toda la ultima seccion de 'Fundamentos de Depuracion

-

Una nueva y poderosa herramienta está disponible para los desarrolladores web para usar en varios productos basados ??en Mozilla , incluyendo Firefox , Mozilla Suite y Netscape 7.x El depurador JavaScript , también llamado Venkman , ha sido una parte del navegador de Mozilla y de la comunidad de sus desarrolladores web y scripts por algún tiempo. Este artículo proporciona una visión general y algunos ejemplos prácticos de cómo utilizar el depurador JavaScript en aplicaciones web y los guiones de páginas web. Esta introducción es el primero de una serie de artículos sobre Venkman y depuración de JavaScript. Incluso si usted ya está usando Venkman , las características , procedimientos y consejos descritos aquí le harán un desarrollador y depurador web más seguro.

-

Venkman es a la vez, un depurador gráfico y de consola. Características tales como la gestión del punto de interrupción , la inspección de la pila de llamadas , y la inspección de la variable / objeto están disponibles en la interfaz de usuario y tambien desde comandos de la consola , lo que le permite trabajar de la forma que más acostumbre. La consola interactiva también permite la ejecución de código JavaScript arbitrario. Los atajos de teclado de Venkman son los mismos que los principales entornos de depuración visual , y los usuarios gdb deberían estar familiarizados con los comandos de Venkman /break, /step, /next, /finish, /frame, and /where .

-

En Windows, el depurador de JavaScript se compara favorablemente con Visual InterDev y otras grandes herramientas de desarrollo web. En otras plataformas , incluyendo Mac OS y Unix , es el único que ofrece este grado de flexibilidad , profundidad y poder en un entorno de depuración visual.

-

Iniciar el depurador

-

El depurador JavaScript está automáticamente preinstalado en Mozilla 1.x , pero debe instalarse por separado en Firefox y otros productos basados en Gecko , como Thunderbird y Netscape 7.x. Afortunadamente , la tecnología XPInstall hace posible la instalación de nuevos módulos de aplicación en Firefox con sólo hacer clic en un hipervínculo

-

Si aún no tiene Venkman o desea actualizar , usted puede conseguir fácilmente la última versión de https://addons.mozilla.org/en-US/firefox/addon/216. El proceso de instalación es de dos pasos. En primer lugar, desde el navegador que se desea que aloje a la aplicación depurador, visite la página de complementos de Firefox y haga clic en el enlace de "instalar" para la versión más reciente. Cuando la descarga se haya completado , reinicie el navegador ( algunos usuarios de Windows también pueden necesitar tambien reiniciar su ordenador).  A continuación, puede acceder al depurador a través de un item  nuevo del menú Herramientas creado dinámicamente en ese navegador , o bien reiniciar el navegador con una opción especial de depurador.

-


- Para ver la versión de Venkman usted tiene , el tipo / versión en la vista Sesión Interactiva . Para obtener más información acerca de las últimas mejoras y versiones, consulte el Desarrollo Page Venkman Hay dos formas de iniciar el depurador:
- Desde Firefox , puede iniciar seleccionando JavaScript Debugger del menú Herramientas ( menú Herramientas-> Desarrollo Web en Mozilla 1.x y Netscape).
- También puede iniciar el navegador con la opción de línea de comandos -venkman , que inicia Venkman inicialmente en lugar frente de la aplicación.
-
- ( Tenga en cuenta que Venkman muestra datos de uso cuando se inicia : " . Inicio local Grabado X, global YYY" Estos datos vienen de un contador integrado en la aplicación Para obtener más información acerca de este contador y los datos , véase el punto 2.2 en el Venkman FAQ.)

-

Figure 1.  El depurador JavaScript.

-

Cuando inicie  Venkman por primera vez , las vistas básicas están dispuestas como en la imagen anterior , aunque se puede personalizar el diseño y la presencia de las diferentes vistas que le apetezca, como se describe en la sección View Customization a continuación. Las secuencias de comandos que han sido cargados por el motor de JavaScript aparecen en la ventana Loaded Scripts ( para más información sobre cómo se cargan y se accede a scripts en Venkman , consulte "Loading Scripts into the Debugger").

-

Figura 2 . Controles de Vista

-

La barra de menú , barra de herramientas, y todas las vistas se pueden contraer o esconder , que le da un gran control sobre el entorno de depuración. El Source Code View está vacío hasta que se seleccione una secuencia de comandos, y The Interactive Session View se inicia con la información básica de inicio.
-
- Cada una de las vistas tiene una etiqueta, un botón flotante que le permite mostrar la vista en su propia ventana , y un botón de cierre que la oculta hasta que usted desea que se muestre de nuevo, como se ve en la Figura 2 .
-
- La siguiente sección describe estas vistas y su uso dentro de la interfaz en su conjunto.

-

Familiarización con la interfaz de usuario de Venkman
-  

-

Barra de Herramientas

-

Figure 3. The Venkman Toolbar

-

La barra de herramientas se encuentra en la parte superior del depurador. La barra de herramientas contiene iconos para los comandos detener, continuar , pasar por encima , pasar adentro , salir , perfilar  y de impresión prolija. Estos comandos se explican por sí mismo , con la posible excepción de detener , lo que hace que el depurador se detenga cuando se ejecuta la siguiente línea de código JavaScript , y el botón de perfil , que se puede utilizar para medir los tiempos de ejecución de los scripts. Cuando se habilita el perfil haciendo clic en este botón, aparecerá una marca de verificación verde aparecerá junto al botón y se recogen datos de perfil para cada función , y se puede ahorrar eligiendo Guardar perfil de datos como ... en el menú Perfil.

-
-

Image:venkintro-stop-checked.png
- Figure 4.
- Stop Button
- Waiting for
- Execution

-
-

También tenga en cuenta que cuando usted está actualmente ejecutando JavaScript y haga clic en el botón Stop, el código JavaScript se detiene inmediatamente. Si no está ejecutando JavaScript y haga clic en el botón Detener , se mostrará "..." , como en la figura 4 , para indicar que el depurador se detendrá en la siguiente instrucción , pero no tiene ninguna parte para detener aún.
-
- Este modo de parada rápida refleja un escenario común en la depuración de JavaScript , que es de inspeccionar y depurar secuencias de comandos mientras se están ejecutando , como en una página donde los elementos se mueven alrededor dinámicamente con DHTML. También puede utilizar los comandos disponibles en el menú Depurar y desde la consola para parar en los errores o en excepciones.
-
- El botón Continuar a la derecha del botón de parada desestima el modo de parada y especifica que los scripts se deben ejecutar con normalidad, sin detenerse en cada declaración que se ejecuta.
-
- El botón Pretty Print cambia el modo de impresión prolija. En el modo de impresión Pretty, el contenido de la vista de origen contendrá el texto de origen descompilada para la función seleccionada . Este es el mismo texto que se obtendría a partir del método toSource del prototipo de función .Si el texto fuente que se está depurando está mal formateado, Pretty Print puede ayudar a hacer más fácil la lectura mediante la inserción de saltos de línea y espacios en blanco en los lugares apropiados .
-
- Cuando Pretty Print está habilitado, se verá una marca de verificación verde en el botón de barra de herramientas y el item de menú también se verá marcado.

-

Vista de los scripts cargados

-

Figure 5. The Loaded Scripts View. Active files and functions

-

La Vista de Scripts Cargados se encuentra en la parte superior izquierda de la ventana. Cuando un archivo es cargado por el navegador , aparecerá en esta vista , y cuando se descarga es eliminado . Los archivos se enumeran en orden alfabético , agrupados por tipo de archivo. Los nombres de archivo se visualizan después de un icono de una sola letra de color que representa la extensión de archivo. La figura 6 muestra la tabla de iconos y tipos de archivos .En el momento de escribir este documento, el orden y la agrupación de los nombres de archivo no se pueden cambiar .

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IconoTipo de Archivo
J.js
H.html, .htm
Z.xul
X.xml
?All other files
.JavaScript function
-

Figure 6.
- Iconos de la vista Scripts

-
-

El nombre de la función "especial" __ toplevel__ se visualiza para los scripts que no son parte de una función real. Al hacer clic en un nombre de archivo que lleva al comienzo  de ese archivo , mientras que al hacer clic en un nombre de función le lleva al inicio de la función.
-
- La columna Line en esta vista muestra el número de línea que esta función comienza. El selector de columna para este punto de vista ( el cuadro selector de la columna de árbol en la parte superior derecha ) se puede utilizar para mostrar una columna Longitud . Esta columna muestra el tamaño de las funciones en líneas . Tanto la línea y la columna Longitud están en blanco para los nombres de archivos.
-
- Si una función tiene un punto de interrupción en el mismo, un pequeño punto rojo aparecerá en el icono de la función , así como en el icono de los archivo padres.

-

La vista de Variables Locales

-

Figure 7. The Local Variables View

-

La vista variables locales esta en la porción izquierda de la ventana , en la parte inferior . Cuando se detiene el depurador, muestra valores de variables para la función actual. El objetode 'scope' tiene todos los argumentos y variables locales , y el objeto 'this'  tiene el valor de la palabra clave this .

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
ePropiedad enumerable
rPropiedad de solo lectura
pPermanente (no eliminable)
AAlias a otra propiedad
aArgumento de una funcion
vDeclareda con var
-

Figure 8. Indicadores de propiedades

-
-

Las propiedades de ambos  objetos 'scope' y 'this' aparecen en orden alfabético , agrupados por tipo de datos. La Figura 9 muestra los iconos que representan los tipos de datos .

-

Las propiedades  del tipo de objetos se muestran con el nombre de su función constructora entre llaves como su valor. Puede encontrar el código fuente del constructor seleccionando " Buscar Constructor " en el menú contextual de la propiedad. Usted puede encontrar el lugar donde el objeto se instancia con el comando "Buscar Creador " . De forma predeterminada , las propiedades de la función de tipo no se muestran , con el fin de ahorrar espacio en la vista. Si a usted le gustaría tener esto a la vista , marque la casilla " Incluir funciones"  en el menú contextual de la vista. Es posible que tenga que cerrar y volver a abrir los objetos que había abierto para ver el cambio .
-
- Las propiedades que se muestran en una fuente gris negrita se definen en un objeto a partir de la cadena de prototipo , y no en el objeto que se está inspeccionando actualmente . Si usted desea inspeccionar prototipos y predecesoras cadenas del objeto , marque la casilla " Incluir propiedades ECMA "  en el menú contextual de la vista. Si una propiedad aparece en una fuente roja en negrilla, se produjo una excepción cuando Venkman trató de leer el valor. El objeto de excepción aparecerá como el valor de la propiedad .

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IconData TypeIconData Type
XVoid (undefined) valuenullNull value
t/fBoolean value`'String value
#Integer value##Double value
*Object valuefFunction value
-

Figure 9. Iconos de tipos de dato

-
-

El selector de columna para este punto de vista ( el cuadro selector de la columna de árbol en la parte superior derecha ) se puede utilizar para mostrar columnas Tipo y Indicadores. La columna de referencia contiene una descripción textual del tipo de objeto. 'Flages' enumera una o más indicadores aplicables a este objeto. Los indicadores se muestran enumerados en la Figura 8 .
-
- Si un elemento visible en la vista de variables locales se modifica a través de la vista de Sesión Interactiva , la modificación se reflejará inmediatamente en la Vista de variables locales .
-
- En el momento de escribir estas líneas, las variables locales de Vista de ordenación predeterminado y agrupación no son ajustables.

-

Vista de la Pila de llamadas

-

Figure 10. The Call Stack View

-

La vista  de Pila de llamadas se encuentra por defecto, en la parte izquierda inferior de la ventana. Cuando se detiene el depurador, la vista Pila de llamadas muestra la lista de las funciones activas. La función en la parte superior de laesta vista  es aquel donde el depurador se detiene , la función debajo de él es la función que llama , debajo se encuentra la función que llama a la función que llama , y así sucesivamente. Estos elementos se denominan marcos de pila .
-
- Haciendo doble clic en un marco de pila cambiará el marco "actual". Esto hará que la fuente de la función que se muestra en la vista Código fuente , la vista variables locales cambiará para mostrar las variables locales al marco de pila seleccionada, y el guión evaluado en la vista Sesión Interactiva estará en relación con el marco seleccionado .
-
- Si usted desea copiar la pila de llamadas actual al portapapeles , seleccione " volcado de pila a la Sesión Interactiva " en el menú contextual , o tipee  '/where' en la vista Sesión Interactiva . A continuación, puede copiar el texto desde la vista Sesión Interactiva .
-
- Si usted desea evitar que en el futuro , Venkman se pare en un marco de pila en particular, marque " No Debug" desde el menú contextual del marco de pila .

-

Vista de Codigo Fuente

-

Figure 11. The Source Code View. Source code, line numbers, and breakpoints.

-

La vista de Código Fuente es un visor de archivos de sólo lectura. Los archivos y funciones específicas dentro de ellos se pueden visualizar al seleccionar el archivo o la función nombre apropiado en la Vista de script .
-
- Cuando la ejecución del script es interrumpido por el depurador , la línea del archivo donde se produjo la interrupción se muestra automáticamente en la vista código fuente. La línea en cuestión se resaltará en amarillo para que sea fácil de localizar.
-
- Al hacer clic en el margen izquierdo de esta visión se establecerá un punto de interrupción en esa línea. Si el punto de interrupción se establece con éxito ,  se mostrará la letra " B " en un fondo rojo al margen,  y tanto las vistas de Scripts Loaded y Sesión Interactiva proporcionarán retroalimentación. El punto de interrupción se puede borrar haciendo clic en el margen de nuevo ( en la letra " B"). No se pueden establecer Puntos de interrupción  en las líneas que no contienen código ejecutable , como líneas en blanco y comentarios. Para estas líneas , la vista Sesión Interactiva mostrará un mensaje de error que explica por qué el punto de interrupción , no se podría establecer .
-
- Los Puntos de interrupción también se pueden configurar y borrar desde  la vista Sesión Interactiva, con los comandos break y fbreak .El comando break toma un patrón de archivo y número de línea . Cualquier archivo cargado que coincida con el patrón de archivo , y contiene una línea ejecutable en el número de la línea solicitada tendrá un conjunto de punto de interrupción . Si no hay archivos cargados coincidentes con el patrón de archivo o número de línea , un mensaje de error se imprime en la consola y el comando falla. El comando fbreak es idéntico , con la excepción de que si no hay archivos coincidentes, se registra un "punto de ruptura futuro"  para el patrón y la línea. La próxima vez que se carga un archivo que coincida con el patrón y la línea, un punto de interrupción se configurará . De esta manera, fbreak permite establecer puntos de interrupción en los archivos que aún no están cargados , así como establecer puntos de interrupción que se desencadenan cuando se carga un archivo .

-

Vista de Sesion Interactiva

-

Figure 12. The Interactive Session View. Command line interface to the debugger

-

Otro vista básica en Venkman es la deSesión Interactiva, que le permite interactuar con el depurador desde una línea de comandos.
-
- Los comandos se introducen en el cuadro de texto , y las respuestas se añaden al final de la salida. Escriba /commands en la zona de entrada ( el cuadro de texto ) para listar todos los comandos disponibles. El comando /help se puede utilizar para obtener información adicional acerca de un comando específico . Puede escribir /help next, por ejemplo, para ver cómo se utiliza el comando /next.
-
- El área de entrada soporta historial de comandos y el completado con tabulador para nombres de comandos. La historia de comandos recuerda los últimos 20 comandos introducidos . Las flechas hacia arriba y hacia abajo se pueden usar para revisar estos comandos anteriores. La implementación del tabulador permite al usuario escribir la primera parte de un comando, y presiona el tabulador dos veces para ver las terminaciones posibles . Si sólo hay un comando coincide , será auto - completado en la primera ficha .

-

Vista  Personalizacion

-

Venkman ofrece un control casi total sobre la disposición y visualización de puntos de vista dentro de la aplicación . El depurador se construye sobre un marco de aplicación que le permite arrastrar y soltar , cambiar el tamaño y cambiar todas las vistas disponibles , e incluso crear nuevas vistas o módulos para el depurador si usted elige , aunque este último es un tema avanzado y un tema para un próximo artículo.
-
- Para eliminar una vista de Venkman , simplemente haga clic en el botón Cerrar en la parte superior derecha de ese punto de vista . Cuando la vista se hace necesario de nuevo - por ejemplo, cuando se abre un archivo fuente desde la vista Scripts Cargados y la vista de codigo fuente  reaparece donde estaba la última posicionado . Para hacer reaparecer una vista  de forma explícita , selecciónelo de la Ver-> Mostrar / Ocultar menú del depurador. Usted también puede hacer que las vistas floten en sus propias ventanas separadas. Para hacer flotar una vista, haga clic en el botón de flotador en la parte superior izquierda de esta opinión.
-
- Usted puede acceder a cualquiera de las vistas básicas con las función de submenus Mostrar / Ocultar del menú View. La lista que se muestra incluye  todas las vistas básicas en Venkman. A medida que usted cambia  cuales vistas se muestran y donde aparecen en la interfaz de usuario, sus preferencias se almacenan y se mantienen en todas las sesiones.

-

 

-

Cargando scripts en el Debugger

-

Tanto si inicia Venkman primero o el componente del navegador, cuando se pone en marcha el conjunto de aplicaciones Mozilla  , el motor de JavaScript empieza a mantener la pista  y compilar todos los scripts que se cargan en páginas web y en las diversas interfaces de usuario propios de Mozilla . El motor informa a Venkman sobre los scripts que conoce , y los scripts se cargan en la vista "Scripts Loaded" en el depurador.
-
- Si desea cargar nuevos scripts en -digamos desde una página web que está tratando de solucionar problemas - puede hacerlo con sólo abrir la página web en la ventana del navegador normal , momento en el cual el compilador pone la fuente JavaScript y rellena los Scripts Loaded ventana con la nueva entrada.
-
- Usando Archivo- > Abrir en Venkman se abrirá un archivo local en el depurador, y el uso de Archivo-> Abrir dirección se abrirá y mostrará todo el contenido HTML de la página solicitada. Probablemente , ninguno de ellos es lo que realmente quieres . Puesto que el motor JavaScript rellena automáticamente la lista Scripts Cargados en el depurador con JavaScript que se ejecuta como el navegador abre páginas web , por lo general basta con navegar por los sitios cuyos guiones usted está interesado en la depuración.

-

 

-

Fundamentos de Depuracion

-

En esta sección se ofrece un breve ejemplo de una sesión de depuración con el fin de que se familiarice con algunos de los comandos básicos y operaciones del depurador.

-

Nota: En un momento dado , el depurador necesitaba iniciarse antes de los scripts que se iban a depurar . Esta limitación se resolvio y ahora el compilador de JavaScript hace que todas las secuencias de comandos que se acceden a través del navegador,  esten disponibles para el depurador. Consulte Carga de scripts en el depurador para más información sobre cómo encontrar y cargar scripts en Venkman .

-
    -
  1. Comience Venkman
  2. -
  3. Inicie una ventana de navegador y vaya a http://wp.netscape.com/fishcam/dhtmltank.html .
  4. -
-

Tenga en cuenta que en Mozilla y Netscape 7.x 1.x , el depurador contiene un menú Ventana al igual que otros componentes principales en la suite de aplicaciones . Desde este menú, se puede acceder al navegador , el correo y otras aplicaciones.

-
    -
  1. Tipee /break animator-0.03 121 en el depurador.
  2. -
-

El comando de consola  /break se utiliza para establecer los puntos de interrupción y la lista. El primer parámetro es el nombre del archivo que contiene el código JavaScript que quieras detener. El segundo parámetro es el número de línea. No es necesario especificar el nombre completo del archivo. En este ejemplo, estamos estableciendo un punto de interrupción en la función que se llama cuando el navegador se inicia la ventana fishcam DHTML. Alternativamente, usted puede seleccionar animator-0.03.js de la vista scripts cargados, localizar la función de pausa en la línea 119 , y haga clic en el margen izquierdo . Establecer puntos de interrupción de esta manera es equivalente a usar el comando /break en la consola. En cualquier caso, un icono de punto de interrupción roja aparece en la vista Código fuente .

-
    -
  1. Tipee  /break en el depurador.
  2. -
-

Si usted no proporciona argumentos para el comando / descanso, todos los puntos de interrupción se enumeran en la vista Sesión Interactiva .

-
    -
  1. En la página fishcam , pulse el enlace de "pausa" .
  2. -
  3. Usted debe impactar el punto de interrupción que acaba de establecer en el paso 3 .
  4. -
-

En la sesión interactiva , el contexto se convierte en animador - 0.03.js y el ámbito de aplicación es la función de pausa . También habrá "Paramos para punto de interrupción " en rojo en la sesión interactiva , junto con el nombre de archivo, número de línea, y el fragmento de código fuente desde donde se detuvo

-

 

-

Figura 13 . ( A partir del paso 5 ) se detuvo en un punto de interrupción .

-
    -
  1. En el campo de entrada de la sesión interactiva , escriba this.fPaused
  2. -
  3. Venkman evalúa la expresión , que le da [ boolean ] doble fondo . Pulse en Paso a paso para seguir los pasos hasta que haya terminado la depuración de la función y los peces ha detenido .
  4. -
  5.  
  6. -
  7. Además que intervenir , que se ejecutará una sola línea de código JavaScript y parar, Paso a paso se puede utilizar para pasar por encima de una llamada de función inminente , y devolver el control al depurador cuando se devuelve la llamada . Step Out se ejecuta hasta que la corriente llamada de función se cierra.
  8. -
  9. Haga clic en el enlace de "pausa " de nuevo en la página fishcam para reanudar la demo .
  10. -
  11. Esto inicia el DHTML abajo del otro código base en start () y hace que los peces comienzan a nadar de nuevo .
  12. -
  13. Como se puede ver , se trata de una introducción muy modesto para la funcionalidad del depurador de JavaScript y la complejidad que los scripts pueden tener . Pero los pasos descritos aquí le puede dar una sensación básica para el depurador si aún no lo ha tenido alguna experiencia con él , y servir de base para los ejemplos más interesantes y prácticos en los artículos que siguen a éste.
  14. -
  15. La mejor manera de conocer a Venkman , por supuesto, es para jugar un rato con él - para configurarlo de la manera que tiene más sentido para usted, para tratar de secuencias de comandos de carga y establecer puntos de interrupción , la evaluación de expresiones en la Sesión Interactiva View, viendo los valores de las variables a medida que cambian cuando los scripts se ejecutan , obteniendo datos del perfil.
  16. -
  17. extensiones de depuración
  18. -
  19. Aunque a primera vista podría parecer que Venkman no puede depurar extensiones , hacerlo es , de hecho, totalmente compatible ; es sólo desactivada por defecto.
  20. -
  21. Para depurar la extensión con Venkman ( archivos XUL y sus archivos adjuntos JS ) , que tendrá que cargar el navegador y archivos de extensión en Venkman desmarcando Test> Excluir archivos del navegador .
  22. -
-

Recursos

-


- El uso de puntos de interrupción en Venkman - siguiente artículo sobre Venkman .
- La página principal del Venkman en el MDC .

-
-

Original Document Information

- -
-

diff --git "a/files/es/introducci\303\263n_a_la_extensi\303\263n_de_la_api_de_audio/index.html" "b/files/es/introducci\303\263n_a_la_extensi\303\263n_de_la_api_de_audio/index.html" deleted file mode 100644 index 05d03694b4..0000000000 --- "a/files/es/introducci\303\263n_a_la_extensi\303\263n_de_la_api_de_audio/index.html" +++ /dev/null @@ -1,360 +0,0 @@ ---- -title: Introducción a la extension del API de audio -slug: Introducción_a_la_extensión_de_la_API_de_audio -tags: - - para_revisar - - páginas_a_traducir -translation_of: Archive/Mozilla/Introducing_the_Audio_API_Extension ---- -

La extension de audio de la API se extiende de la especificación de HTML5 {HTMLElement("audio")}} y <video> multimedia mediante la exposición de elementos metadata de audio y datos puros en audio. Esto permite a los usuarios visualizar los datos de audio, para procesarlos y crear nuevos datos de audio.

-

Lectura de flujo de Audio

-

El loadedmetadata evento

-

Cuando la metadata multimedia del elemento está disponible, se desencadena un envento loadedmetadata. Este evento tiene los siguientes atributos:

- -

Esta información es necesaria más adelante para descifrar la secuencia de datos de audio. En los siguientes ejemplos se extraen los datos de un elemento de audio:

-
				<!DOCTYPE html>
-
-				<html>
-
-				<head>
-
-					<title>Ejemplo JavaScript Metadata </title>
-
-				</head>
-
-					<body>
-
-						<audio id="audio-element"
-
-						src="song.ogg"
-
-						controls="true"
-
-						style="width: 512px;">
-
-						</audio>
-
-					    <script>
-
-					function loadedMetadata() {
-
-						channels          = audio.mozChannels;
-
-						rate              = audio.mozSampleRate;
-
-						frameBufferLength = audio.mozFrameBufferLength;
-
-					      }
-
-					var audio = document.getElementById('audio-element');
-
-					      audio.addEventListener('loadedmetadata', loadedMetadata, false);
-
-
-
-					    </script>
-
-					  </body>
-
-					</html>
-
-			
-

El evento MozAudioAvailable

-

A medida que el audio se reproduce, los datos de muestras están disponible para la capa de audio y el buffer de audio (size definido en mozFrameBufferLength) se llenan con las muestras. Una vez que el buffer esta lleno, el eventoMozAudioAvailable se activa. Por lo tanto el evento contiene las muestras primas en un perido de tiempo. Esos muestreos pueden ser reproducidos o no en el momento que se hayan reproducido el evento y no se han ajustado para la configuración de mudo o volumen en el elemento de multimedia. Reproducir, pausar, y la búsqueda de audio tambien afecta transmision de estos datos de audio prima.

-

El evento MozAudioAvailable tiene 2 atributos:

- -

El framebuffer contiene una serie de muestras de audio. Es importnt tener en cuenta que las muestras no son separados por canales, todos ellos son entregados juntos. Por ejemplo, para una señal de dos canales: Canal1-Ejemplo1 Canal2-Ejemplo1  Canal1-ejemplo2 Canal2-Ejemplo2 Canal1-Ejemplo3 Canal2-Ejemplo3.

-

Podemos extender el ejemplo anterior para visualizar la fecha y hora y las muestras de los dos primeros en un <div> elemento:

-
-
-			<!DOCTYPE html>
-
-			<html>
-
-				<head>
-
-					<title>Ejemplo de visualizacion en JavaScript</title>
-
-				<body>
-
-
-
-					<audio id="audio-element"
-
-					src="revolve.ogg"
-
-					controls="true"
-
-					style="width: 512px;">
-
-					</audio>
-
-					<pre id="raw">hello</pre>
-
-					<script>
-
-				function loadedMetadata() {
-
-					channels          = audio.mozChannels;
-
-					rate              = audio.mozSampleRate;
-
-					frameBufferLength = audio.mozFrameBufferLength;
-
-				}
-
-
-
-				function audioAvailable(event) {
-
-					        var frameBuffer = event.frameBuffer;
-
-					var t = event.time;
-
-
-
-
-
-					        var text = "Ejemplo: " + t + "\n"
-
-					        text += frameBuffer[0] + "  " + frameBuffer[1]
-
-					        raw.innerHTML = text;
-
-				}
-
-
-
-					      var raw = document.getElementById('raw')
-
-					var audio = document.getElementById('audio-element');
-
-					audio.addEventListener('MozAudioAvailable', audioAvailable, false);
-
-					      audio.addEventListener('loadedmetadata', loadedMetadata, false);
-
-
-
-					</script>
-
-				</body>
-
-			</html>
-
-
-
-		
-

Creación de un flujo de audio

-

También es posible crear y configurar un <audio> elemento por escrito por raw de script (i.e., sin src atributos. Contiene scripts que pueden especificar audios característicos de los flujos, a continuación, escribir las muestras de audio. Los usuarios deben crear un objeto de audio y luego usar el mozSetup() función  especifica el numero de canales y frecuencia (en Hz).  Por Ejemplo:

-
-
-			// Crear un nuevo elemento de audio
-
-			var audioOutput = new Audio();
-
-			// Crea un elemento de audio con 2 canales, 44.1KHz audio flujo.
-
-			audioOutput.mozSetup(2, 44100);
-
-		
-

Una vez terminado, los ejemplos necesitan ser creado. Estas muestras tienen el mismo formato que los de el eventomozAudioAvailable. Luego las muestra son escritas en el audio de flujo con la función mozWriteAudio(). Es importante observar que no todas las muestras podría obtener por escrito en el arroyo. La función retorna el número de muestras por escrito, que es útil para la redacción siguiente. Puede ver un ejemplo a continuación:

-
-
-			// Escribir ejemplo usando un JS Array
-
-			var samples = [0.242, 0.127, 0.0, -0.058, -0.242, ...];
-
-			var numberSamplesWritten = audioOutput.mozWriteAudio(samples);
-
-
-
-			// Escribir ejemplo usando un Typed Array
-
-			var samples = new Float32Array([0.242, 0.127, 0.0, -0.058, -0.242, ...]);
-
-			var numberSamplesWritten = audioOutput.mozWriteAudio(samples);
-
-		
-

En el siguiente ejemplo, creamos un pulso de audio:

-
-
-			><!doctype html>
-
-				<html>
-
-				  <head>
-
-				     <title>Generando audio en tiempo real</title>
-
-				  <script type="text/javascript">
-
-				     function playTone() {
-
-				      var output = new Audio();
-
-
-
-				      output.mozSetup(1, 44100);
-
-				       var samples = new Float32Array(22050);
-
-				       var len = samples.length;
-
-
-
-				      for (var i = 0; i < samples.length ; i++) {
-
-				         samples[i] = Math.sin( i / 20 );
-
-				       }
-
-				              output.mozWriteAudio(samples);
-
-
-
-				     }
-
-				   </script>
-
-				 </head>
-
-				 <body>
-
-				   <p>Esta demo tiene un tono de un segundo al hacer clic en el botón de abajo.</p>
-
-				   <button onclick="playTone();">Play</button>
-
-
-
-				 </body>
-
-				 </html>
-

El mozCurrentSampleOffset() método da la posición sonora de la corriente de audio, es decir, la posición de la última muestra escuchado.

-
-
-				// Obtener la posición actual sonora de la secuencia de audio subyacentes, medido en las muestras.
-
-				var currentSampleOffset = audioOutput.mozCurrentSampleOffset();
-
-			
-

Los datos de audio por escrito con el mozWriteAudio() método tiene que ser escrita en un intervalo regular en partes iguales, a fin de mantener un poco por delante de la muestra actual de compensación (offset de la muestra que está siendo desempeñado por el hardware se puede obtener con mozCurrentSampleOffset()), donde "un poco" quiere decir algo del orden de 500 ms de las muestras. Por ejemplo, si se trabaja con dos canales de 44.100 muestras por segundo, un intervalo de escritura de 100 ms, y un buffer de pre-igual a 500 ms, se podría escribir una serie de(2 * 44100 / 10) = 8820 muestras, y un total de (currentSampleOffset + 2 * 44100 / 2).

-

También es posible detectar automáticamente la duración mínima de la memoria previa, de tal manera que el sonido se reproduce sin interrupciones, y el desfase entre la escritura y la reproducción es mínimo. Para ello empezar a escribir los datos en pequeñas porciones y esperar a que el valor devuelto por mozCurrentSampleOffset() debe ser mayor que 0.

-
				var prebufferSize = sampleRate * 0.020; // Initial buffer is 20 ms
-
-				var autoLatency = true, started = new Date().valueOf();
-
-				...
-
-				// Auto latency detection
-
-				if (autoLatency) {
-
-				prebufferSize = Math.floor(sampleRate * (new Date().valueOf() - started) / 1000);
-
-				if (audio.mozCurrentSampleOffset()) { // Play position moved?
-
-				autoLatency = false;
-
-				}
-
-			
-

El procesamiento de un audio de flujo

-

Desde el MozAudioAvailable evento y elmozWriteAudio() metodo ambos utilizan Float32Array valores, es posible tomar la salida de un flujo de audio y pasarlo directamente (o primer proceso y luego pasar) a un segundo. La secuencia de audio primero debe ser silenciado de manera que sólo el elemento secundario de audio que se escucha.

-
-
-				<audio id="a1"
-
-				src="song.ogg"
-
-				controls>
-
-				</audio>
-
-				<script>
-
-				var a1 = document.getElementById('a1'),
-
-				a2 = new Audio(),
-
-				buffers = [];
-
-
-
-				function loadedMetadata() {
-
-					// Mute a1 audio.
-
-					a1.volume = 0;
-
-					// Configuracion a2 de ser idéntica a la a1, y jugar por ahí.
-
-					a2.mozSetup(a1.mozChannels, a1.mozSampleRate);
-
-				}
-
-
-
-				function audioAvailable(event) {
-
-					// Escriba el actual framebuffer
-
-					var frameBuffer = event.frameBuffer;
-
-					writeAudio(frameBuffer);
-
-				}
-
-
-
-				a1.addEventListener('MozAudioAvailable', audioAvailable, false);
-
-				a1.addEventListener('loadedmetadata', loadedMetadata, false);
-
-
-
-				function writeAudio(audio) {
-
-				buffers.push(audio);
-
-
-
-					// Si hay buffer de datos, escribe que
-
-					while(buffers.length > 0) {
-
-						var buffer = buffers.shift();
-
-						var written = a2.mozWriteAudio(buffer);
-
-						// // Si todos los datos no se ha escrito,mantener los buffers:
-
-						if(written < buffer.length) {
-
-							buffers.unshift(buffer.slice(written));
-
-							return;
-
-							}
-
-					}
-
-				}
-
-				</script>
-
-			
-

Ver Tambien

- diff --git "a/files/es/introducci\303\263n_al_shell_de_javascript/index.html" "b/files/es/introducci\303\263n_al_shell_de_javascript/index.html" deleted file mode 100644 index 2da3b2bec8..0000000000 --- "a/files/es/introducci\303\263n_al_shell_de_javascript/index.html" +++ /dev/null @@ -1,248 +0,0 @@ ---- -title: Introducción al shell de JavaScript -slug: Introducción_al_shell_de_JavaScript -translation_of: Mozilla/Projects/SpiderMonkey/Introduction_to_the_JavaScript_shell ---- -

Introducción

-

Este artículo pretende servir como introducción a la descarga y compilación del shell de JavaScript desde el servidor CVS de Mozilla, prestando especial atención a la descarga y compilación de las versiones previas a las finales a modo de prueba y experimentación.

-

Además, este artículo proporciona información de uso básico sobre cómo se puede usar el shell para experimentar con código y ejecutar programas de JavaScript.

-

Descargando y compilando el shell de JavaScript

-

Traducciones para logging: * Entrar * Registrarse * Darse de alta???

-

Logueándose en el servidor CVS

-

Al igual que ocurre cuando se busca cualquier otro proyecto de Mozilla en el CVS, lo primero que hay que hacer es loguearse en el servidor CVS. Para hacer esto, hay que situarse en el directorio base en el que se encuentre el código al que quieres acceder y luego introducir el siguiente comando en la línea de comandos:

-
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot login
-
-

Cuando te lo pregunte, introduce la contraseña <tt>anonymous</tt>.

-

Compilando una versión trunk de JavaScript

-

Una vez logueado en el servidor, es hora de buscar el código en el CVS. Primero hay que situarse en el directorio raíz del árbol CVS y luego es necesario introducir el siguiente comando:

-
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co -l mozilla/js/src mozilla/js/src/config mozilla/js/src/editline mozilla/js/src/fdlibm
-
-

Esto comprueba todos los ficheros que hacen falta para compilar el shell de JavaScript.

-

Ahora puedes compilar JavaScript ejecutando los dos siguientes comandos:

-
cd mozilla/js/src
-make -f Makefile.ref
-
-

Cuando finalice la compilación, debería de haber un ejecutable llamado <tt>js</tt> en un directorio cuyo nombre depende del sistema en el que se ha realizado la compilación. Por ejemplo, en Mac OS X, el ejecutable estará ubicado en <tt>Darwin_DBG.OBJ/js</tt>.

-

En este momento, ya estás listo para ejecutar y probar el shell.

-

Compilando una versión branch de JavaScript

-

Si lo que quieres es experimentar con las versiones con lo último de JavaScript, necesitarás compilar una versión branch de JavaScript. Se hace de forma igual a la compilación de la versión trunk, excepto que hay que comprobar la versión branch del código en lugar de la versión trunk.

-

Realiza los mismos pasos explicados anteriormente y cuando compruebes los ficheros, cambia la línea <tt>cvs co...</tt> por

-
cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co -l -rbranch_name mozilla/js/src mozilla/js/src/config mozilla/js/src/editline mozilla/js/src/fdlibm
-
-

Sustituye - - branch_name - por el nombre de la versión branch comprobada. Por ejemplo, para comprobar la versión alpha branch de JavaScript 1.7 se debe poner <tt>JS_1_7_ALPHA_BRANCH</tt>.

-

Luego puedes seguir la compilación y ejecutar el shell como se ha explicado antes.

-

Usando el shell de JavaScript

-

El shell proporciona dos modos de operación. Puedes usarlo como shell interactivo, en el cual se puede escribir código JavaScript y se obtienen respuestas inmediatas; algo que es útil para experimentar o probar nuevas características. Además se le puede pasar (en la línea de comandos) un fichero que contenga un programa JavaScript para ejecutarlo, en cuyo caso el programa es ejecutado automáticamente.

-
- Nota: Dado que el shell de JavaScript es usado como entorno de pruebas para el motor JavaScript, las opciones disponibles y las funciones incorporadas pueden cambiar con el tiempo.
-

Opciones en línea de comandos

-

Existen una serie de opciones en línea de comandos que se pueden especificar para controlar el shell. Se muestran a continuación:

- -

Ejecutando el shell

-

Si quieres ejecutar el shell en modo interactivo, simplemente hay que usar el comando:

-
js
-
-

Si lo que quieres es ejecutar el código JavaScript dle fichero <tt>foo.js</td>, debes usar este comando: </tt>

-
js -f foo.js
-
-

Para ejecutar <tt>foo.js y luego volver al shell interactivo, haz esto:

-
js -f foo.js -f -
-
-

Usando el shell en modo interactivo

-

En el modo interactivo puedes introducir código JavaScript a mano para crear objetos y funciones, además de escribir sentencias. Esta es una buena forma de probar ideas y, de un modo más importante para los desarrolladores que trabajan en el motor de JavaScript, probar nuevas características del lenguaje.

-

Funciones integradas

-

Para hacer al shell de JavaScript más útil, existen un número de funciones integradas para que puedan ser usadas desde los programas JavaScript o en modo interactivo.

-

build()

-

Devuelve la fecha y hora en la que fue compilado el shell de JavaScript.

-

clear( - - [objeto] - )

-

Elimina las propiedades del objeto especificado. Llamando a clear() sin ningún parámetro se deja el entorno limpio como una patena.

-
- Nota: clear() sin parámetros se lo cepilla absolutamente todo. Esto incluye a estas funciones integradas.
-

clone( - - función, [ámbito] - )

-

Clona el objeto funcion especificado. Si ámbito no es especificado, el padre del nuevo objeto será el mismo que el del objeto original. En otro caso, el nuevo objeto es ubicado en el ámbito del objeto especificado por ámbito.

-

dis( - - [funcion] - )

-

Desensambla el programa o la función especificada en bytecodes de JavaScript.

-

Por ejemplo, si introduces la siguiente función de JavaScript:

-
function test() {
-  var i = 3;
-  print(i+2);
-}
-
-

entonces al ejectuar el comando <tt>dis(test);</tt> se obtiene esta salida:

-
main:
-00000:  uint16 3
-00003:  setvar 0
-00006:  pop
-00007:  name "print"
-00010:  pushobj
-00011:  getvar 0
-00014:  uint16 2
-00017:  add
-00018:  call 1
-00021:  pop
-00022:  stop
-
-Source notes:
-  0:     0 [   0] newline
-  1:     3 [   3] var
-  2:     7 [   4] newline
-  3:    18 [  11] xdelta
-  4:    18 [   0] pcbase   offset 11
-
-

dissrc( - - [función] - )

-

Desensambla el programa o la función especificada en bytecodes JavaScript, mostrando las líneas del código fuente. Esta función sólo funciona con programas cargados desde fichero, bien usando el modificador -f al lanzar el shell o usando la función load()</coad>

-

Si el programa incluye una función, <code>doStuff() como esta:

-
function doStuff(input) {
-	print("Introduce un número: ");
-	var n1 = readline();
-	print("Introduce otro: ");
-	var n2 = readline();
-
-	print("Has introducido " + n1 + " and " + n2 + "\n");
-}
-
-

al llamar a la función dissrc(doStuff) se obtiene la siguiente salida:

-
;-------------------------  10:         print("Introduce un número: ");
-00000:  10  name "print"
-00003:  10  pushobj
-00004:  10  string "Introduce un número: "
-00007:  10  call 1
-00010:  10  pop
-;-------------------------  11:         var n1 = readline();
-00011:  11  name "readline"
-00014:  11  pushobj
-00015:  11  call 0
-00018:  11  setvar 0
-00021:  11  pop
-;-------------------------  12:         print("Introduce otro: ");
-00022:  12  name "print"
-00025:  12  pushobj
-00026:  12  string "Introduce otro: "
-00029:  12  call 1
-00032:  12  pop
-;-------------------------  13:         var n2 = readline();
-00033:  13  name "readline"
-00036:  13  pushobj
-00037:  13  call 0
-00040:  13  setvar 1
-00043:  13  pop
-;-------------------------  14:
-;-------------------------  15:         print("Has introducido " + n1 + " and " + n2 + "\n");
-00044:  15  name "print"
-00047:  15  pushobj
-00048:  15  string "Has introducido "
-00051:  15  getvar 0
-00054:  15  add
-00055:  15  string " and "
-00058:  15  add
-00059:  15  getvar 1
-00062:  15  add
-00063:  15  string "\\n"
-00066:  15  add
-00067:  15  call 1
-00070:  15  po
diff --git a/files/es/ipdl/index.html b/files/es/ipdl/index.html deleted file mode 100644 index cfada43bdb..0000000000 --- a/files/es/ipdl/index.html +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: IPC Protocol Definition Language (IPDL) -slug: IPDL -translation_of: Mozilla/IPDL ---- -

IPDL, abreviado de "IPC (Inter-process communication) Protocol Definition Language" o Lenguaje de Definición de Protocolo para la Comunicación Entre Procesos, es un lenguaje específico de Mozilla que permite código C++ pasar mensajes entre procesos o hilos de manera organizada y segura. Todos los mensajes de plugins multi-procesos y pestañas dentro de Firefox se declaran en lenguaje IPDL.

- - diff --git a/files/es/javascript_code_modules/using/index.html b/files/es/javascript_code_modules/using/index.html deleted file mode 100644 index 42c7b01bd9..0000000000 --- a/files/es/javascript_code_modules/using/index.html +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Usando módulos de código JavaScript -slug: JavaScript_code_modules/Using -tags: - - páginas_a_traducir -translation_of: Mozilla/JavaScript_code_modules/Using ---- -

{{ Fx_minversion_header(3) }}

- -

Los módulos de código JavaScript son un concepto introducido en Firefox 3 (Gecko 1.9) y pueden ser usados para compartir código entre alcances (scopes) con diferentes privilegios. Los módulos pueden también ser usados para crear instancias únicas (singletons) globales de JavaScript que previamente requerian usar objetos XPCOM de JavaScript. Un módulo de código JavaScript es simplemente una porción de código JavaScript situado en una ubicación registrada. El módulo es cargado dentro de un alcance (scope) de JavaScript específico, tal como un script de XUL o un script XPCOM de JavaScript, usando Components.utils.import.

- -

Creación de módulos JavaScript

- -

Los módulos JavaScript tienen dos secciones: 1. un array EXPORTED_SYMBOLS en el que se declaran como "símbolos" los objetos, propiedades y métodos que serán empleados por los scripts que los importen. Y, 2. El código, que trata las propiedades y métodos de los "símbolos" exportados. Un muy sencillo módulo de JavaScript luce como esto:

- -
var EXPORTED_SYMBOLS = ["foo", "bar"]
-
-function foo() {
-  return "foo";
-}
-
-var bar = {
-  name : "bar",
-  size : "3"
-};
-
-var dummy = "dummy";
-
- -

Nótese que el módulo usa JavaScript normal para crear funciones, objetos, constantes y cualquier otro tipo JavaScript. Sólo los elementos declarados en el Array especial EXPORTED_SYMBOLS serán accesibles desde el exterior del módulo; los demás quedan encapsulados y no son accesibles fuera del mismo. Cualquier elemento de JavaScript nombrado en EXPORTED_SYMBOLS será exportado desde el módulo e insertado dentro del alcance (scope) importador. Por ejemplo:

- -
Components.utils.import("resource://app/modules/my_module.jsm");
-
-alert(foo());         // muestra "foo"
-alert(bar.size + 3);  // muestra "6"
-alert(dummy);         // muestra "dummy is not defined" porque 'dummy' no fue exportado desde el módulo.
-
- -

La URL de un módulo JavaScript

- -

Como se puede apreciar en el ejemplo, arriba, hace falta un llamado empleando una dirección URL para poder importar los módulos JavaScript. Éstos, normalmente, se crean como archivos planos con extensión jsm y se almacenan el el directorio /modules del aplicativo (XUL) o extensión para el que son creados. Y, se cargan usando un protocolo "resource:" (en el ejemplo) al presentar la URL como parámetro del llamado.

- -

Sólo se pueden emplear los protocolos "chrome:" ( Requiere Gecko 2) "resource:" o "file:"para cargar módulos JavaScript.

- - - -

Compartiendo objetos mediante módulos

- -

Un comportamiento extremadamente importante de Components.utils.import es que los módulos son cacheados cuando se cargan e importaciones posteriores no recargan una nueva versión del módulo, sino que usan la version cacheada anteriormente. Esto significa que un módulo dado será compartido cuando sea importado varias veces. Cualquier modificacion a datos, objetos o funciones estarán disponibles en cualquier alcance (scope) que haya importado el módulo. Por ejemplo, si el modulo de ejemplo fue importado en dos alcances (scopes) diferentes de JavaScript, los cambios en un alcance (Scope) serán visibles desde el otro alcance (scope).

- -

Alcance (scope) 1:

- -
Components.utils.import("resource://app/modules/my_module.jsm");
-
-alert(bar.size + 3);  // muestra "6"
-
-bar.size = 10;
-
- -

Alcance (scope) 2:

- -
Components.utils.import("resource://app/modules/my_module.jsm");
-
-alert(foo());         // muestra "foo"
-alert(bar.size + 3);  // muestra "13"
-
- -

Este comportamiento de compartir puede ser usado para crear objetos singleton que compartan datos entre ventanas y entre scripts XUL y componentes XPCOM.

- -
Nota: Cada ámbito (alcance) al que sea importado un módulo recibe una copia por-valor de los símbolos exportados por el módulo. De modo que los cambios que allí se realicen para los mismos no se verán reflejados en otros lugares. (Ésto garantiza que los "nombres" de los símbolos exportados no cambien para otros sitios y se pueda hacer referencia los mismos de modo uniforme)
- -

Alcance 1

- -
 Components.utils.import("resource://app/my_module.jsm");
-
-bar = "foo";
-alert(bar);         // muestra "foo"
-
- -

Alcance 2

- -
Components.utils.import("resource://app/my_module.jsm");
-
-alert(bar);         // muestra "[object Object]"
- -

resource: Protocol

- -

Cuando uses Components.utils.import, notarás que los módulos de código son cargados usando el protocolo "resource://". La sintaxis básica de un recurso URL es como sigue:

- -
resource://<alias>/<ruta-relativa>/<archivo.js|jsm>
-
- -

El <alias> es un alias a una ubicación, usualmente una hubicación física relativa a la aplicación o al runtime de XUL. Existen algunos alias predefinidos por defecto por el runtime de XUL runtime:

- - - -

La <ruta-relativa> puede tener múltiples niveles de profundidad y siempre es relativa a la ubicación definida por el <alias>. La ruta relativa común es "modules" y es usada por XUL Runner and Firefox. Los módulos de código son simples archivos JavaScript con la extensión .js o .jsm.

- -

La manera mas sencilla para extensiones y aplicaciones XUL de agregar alias propios es al registrar un alias en el manifiesto chrome usando algo como esto:

- -
resource nombrealias uri/a/los/archivos/
-
- -

Por ejemplo, si el XPI de tu extension foo incluye un directorio de primer nivel de módulos conteniendo el módulo bar.js, podrías crear un alias a ese directorio mediante la instrucción:

- -
resource foo modules/
-
- -

Podrias entonces importar el módulo en tu código JavaScript mediante la sentencia:

- -
Components.utils.import("resource://foo/bar.js");
-
- -

Los alias propios pueden también ser agregados programáticamente al protocolo de recursos. Por ejemplo:

- -
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
-                          .getService(Components.interfaces.nsIIOService);
-var resProt = ioService.getProtocolHandler("resource")
-                       .QueryInterface(Components.interfaces.nsIResProtocolHandler);
-
-var aliasFile = Components.classes["@mozilla.org/file/local;1"]
-                          .createInstance(Components.interfaces.nsILocalFile);
-aliasFile.initWithPath("/some/absolute/path");
-
-var aliasURI = ioService.newFileURI(aliasFile);
-resProt.setSubstitution("myalias", aliasURI);
-
-// asumiendo que el módulo de código está en el directorio de alias misma, no en un subdirectorio
-Components.utils.import("resource://myalias/file.jsm");
-
-// ...
-
diff --git a/files/es/l10n_en_mercurial/index.html b/files/es/l10n_en_mercurial/index.html deleted file mode 100644 index 2f16f31966..0000000000 --- a/files/es/l10n_en_mercurial/index.html +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: L10n en Mercurial -slug: L10n_en_Mercurial -tags: - - Localización - - para_revisar -translation_of: Mozilla/Localization/Localizing_with_Mercurial ---- -

{{ Fx_minversion_header(3.1) }} Traducir Firefox 3.1, SeaMonkey 2.0 y Thunderbird 3.0 supone trabajar con Mercurial. La documentación es incompleta; si tienes preguntas, por favor, déjate caer por #l10n o #hg en irc.mozilla.org, o pregunta en la página Discusión de este artículo.

-

Hay varios documentos sobre cómo tratar con Mercurial en MDC, etiquetados con "Mercurial". En particular, la FAQ de Mercurial merece la pena. Para los más impacientes y rápidos, aquí hay algunas órdenes para que descarguéis en-US, un repositorio de idioma y un .mozconfig  que debería permitiros crear paquetes de idioma y binarios.

-

Herramientas

-

Existen varias herramientas para conectarse a Mercurial, comenzando, por supuesto, con el cliente de línea de comandos. Sin embargo, para aquellos de vosotros que preferís herramientas GUI, están TortoiseHg para Windows y Mercurial Eclipse para los fans de este entorno de plataforma.

-

Repositorios

-

Hay dos repositorios que contienen archivos en-US:

- -

{{ Note("Cuando descargas el repositorio comm-central, éste incluye también el repositorio mozilla-1.9.2. Por tanto puedes usar una sola configuración para desarrollar o traducir Firefox, SeaMonkey y Thunderbird sin tener que descargar mozilla-1.9.2 una segunda vez.") }}

-

Descargar en-US por primera vez

-

Para descargar los archivos en-US,  tendrás que descargar mozilla-1.9.2 (o -central) o comm-central.

-

Sólo Firefox

-

Si sólo trabajas con Firefox usa:

-
hg clone http://hg.mozilla.org/mozilla-central/
-
-

Esto creará un clon del repositorio mozilla-1.9.2 en el directorio mozilla-1.9.2.

-

Cualquier combinación entre Firefox, SeaMonkey y Thunderbird

-

Si estás trabajando con cualquier combinación de Firefox, SeaMonkey y Thunderbird, usa:

-
hg clone http://hg.mozilla.org/comm-central/
-cd comm-central
-python client.py checkout
-
-

La primera orden creará un clon del repositorio comm-central en el directorio comm-central. La segunda orden cambiará tu directorio actual a ese directorio, comm-central.

-

La tercera orden creará un clon del repositorio mozilla-1.9.2 y recuperará varios directorios CVS. Los directorios CVS son necesarios para SeaMonkey y Thunderbird, algunos de ellos son código antiguo que SeaMonkey y Thunderbird están en proceso de dejar de usar, y algunas extensiones que todavía no están en Mercurial.

-

Actualizar en-US

-

Para actualizar tu copia de trabajo de mozilla-1.9.2, ve a tu directorio mozilla-1.9.2 y ejecuta

-
hg pull -u
-
-

Esto recuperará los nuevos conjuntos de cambios de mozilla-1.9.2 y aplicará esos cambios en tu copia de trabajo.

-

Para actualizar tu copia de trabajo de comm-central, ve a tu directorio comm-central y ejecuta

-
python client.py checkout
-
-

Esto recuperará los últimos cambios de comm-central, mozilla-1.9.2 y el resto de orígenes, y aplicará dichos cambios en tu copia de trabajo.

-

Descargar tu idioma

-

Todos los idiomas están en un MXR, . Los repositorios están, no obstante, separados: puedes conseguir una lista de los repositorios en . Para clonar tu localización, por favor usa (en este caso "ab-CD" es el código de idioma, sustitúyelo al correspondiente)

-
hg clone http://hg.mozilla.org/releases/l10n-mozilla-1.9.2/ab-CD/
-

o actualiza con

-
hg pull -u
-
-

Subir tus cambios a Mozilla

-

Con Mercurial trabajas en tu propio repositorio. Antes de hacer commit de tus propios cambios debes asegurarte de que no ha habido cambios más recientes al repositorio remoto; para ello, actualiza tu idioma como se indica en la sección anterior.

-

Tras terminar un cambio o conjunto de cambios y asegurarte de que tienes tu repositorio local actualizado, debes aplicar éstos (commit):

-
hg commit -m "message identifying the change (bug 555)"
-
-

El mensaje debe estar en inglés, por eso hemos dejado el ejemplo igual al documento original.

-

A diferencia de CVS esta orden no aplicará tus cambios al repositorio de Mozilla. Primero necesitas subir los cambios (push). Para subir a l10n-central y otros repositorios alojados en Mozilla debes tener acceso de escritura (committer) y debes editar el archivo (tu-raíz-hg-local)/.hg/hgrc (observa que éste NO es tu ~/.hgrc) para añadir esta línea (reemplazando email@host con tu nombre de usuario en Mozilla):

-
[paths]
-default = http://hg.mozilla.org/releases/l10n-mozilla-1.9.2/ab-CD/
-default-push = ssh://hg.mozilla.org/releases/l10n-m...a-1.9.2/ab-CD/
-central = ssh://hg.mozilla.org/l10n-central/ab-CD/
-
-
-

Tendrás que decirle a ssh qué cuenta usar para subir tus cambios, editando ~/.ssh/config y añadiendo las líneas

-
Host hg.mozilla.org
-User user@host.domain
-
-

user@domain es tu cuenta, con un @ real en lugar del % que usabas con CVS. Tras ello, podrás subir tu trabajo al repositorio (y comprobar el resultado en el panel de control):

-
hg push
-

Un .mozconfig

-

Firefox a través de mozilla-central

-

Si has seguido los pasos anteriores para descargar sólo mozilla-1.9.2, tu estructura de directorios tendrá este aspecto:

-
mozilla-1.9.2
-+ browser
-de
-+ browser
-
-

y un .mozconfig sería así:

-
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../fx-de
-ac_add_options --with-l10n-base=..
-ac_add_options --disable-compile-environment
-ac_add_options --enable-application=browser
-
-

Pondrías ese archivo en el directorio mozilla-1.9.2.

-
Nota: el --with-l10n-base es relativo al directorio obj, no al src.
-

Si deseas compilar directamente una versión localizada, añade la línea

-
ac_add_options --enable-ui-locale=<language code>
-
-

Otra opción es no compilar con esto, y crear y usar un paquete de idioma como se explica a continuación.

-

Firefox a través de comm-central

-

Si has seguido los pasos anteriores para descargar comm-central, tu estructura de directorios tendrá este aspecto:

-
comm-central
-+ mozilla
-  + browser
-de
-  + browser
-
-

y un .mozconfig tendría esta apariencia:

-
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../../fx-de
-ac_add_options --with-l10n-base=..
-ac_add_options --disable-compile-environment
-ac_add_options --enable-application=browser
-

{{ Note("La orden make -f client.mk configure debe ejecutarse desde el directorio comm-central/mozilla.") }}

-

La línea --with-l10n-base es correcta con únicamente "..". Esto se debe a la manera en que funciona el entorno dentro de comm-central.

-

El archivo debería colocarse en comm-central/mozilla.

-

La misma observación se aplica a la compilación de una versión localizada.

-

Thunderbird y SeaMonkey

-

Si has seguido los pasos anteriores para descargar comm-central, tu estructura de directorios tendrá este aspecto:

-
comm-central
-+ mail
-+ suite
-de
-+ mail
-+ suite
-
-

y un .mozconfig para Thunderbird se parecería a éste:

-
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../tb-de
-ac_add_options --with-l10n-base=..
-ac_add_options --disable-compile-environment
-ac_add_options --enable-application=mail
-
-

Sustituye tb-de con sm-de y mail con suite para tener un .mozconfig para SeaMonkey.

-

El archivo debería colocarse en comm-central.

-

La misma observación se aplica a la compilación de una versión localizada.

-

Ejecuta la orden make -f client.mk configure desde el directorio comm-central.

-

Compare-locales

-

Compare-locales funciona igual que lo hacía anteriormente, para Firefox:

-
compare-locales mozilla-central/browser/locales/l10n.ini . de
-
-

o para Thunderbird:

-
compare-locales comm-central/mail/locales/l10n.ini . de
-
-

Sustituye mail con suite si quieres comprobar SeaMonkey.

-

{{ Note("Esta orden puede no funcionar correctamente para Thunderbird y SeaMonkey, está en proceso de solucionarse.") }}

Construir paquetes de idiomas, etc.

-

Hay un pequeño cambio aquí, tienes que añadir --with-l10n-base como argumento de configure, apuntando al directorio base de tu repositorio l10n. Sigue Creating a Language Pack, ajustando las rutas según sea necesario.

-

{{ languages( { "fr": "fr/Localisation_avec_Mercurial", "en": "en/L10n_on_Mercurial" } ) }}

diff --git a/files/es/la_plataforma_mozilla/index.html b/files/es/la_plataforma_mozilla/index.html deleted file mode 100644 index ef9aca5013..0000000000 --- a/files/es/la_plataforma_mozilla/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: La plataforma Mozilla -slug: La_plataforma_Mozilla -tags: - - para_revisar -translation_of: Mozilla/The_Mozilla_platform ---- -

El proyecto Mozilla incluye varias tecnologías que, en conjunto, constituyen la plataforma Mozilla.  Estos enlaces te dirigirán a la documentación sobre cada una de ellas y sobre el uso de la plataforma Mozilla para construir tus propios proyectos.

- -

Temas de la documentación

Participación en el proyecto Mozilla
Artículos sobre el proyecto Mozilla, incluyendo cómo contribuir al proyecto Mozilla.
La Guía para desarrolladores de Mozilla
Herramientas, consejos y documentación para trabajar con el código fuente de Mozilla.
El uso de código de Mozilla en otros proyectos
Cómo utilizar las tecnologías de Mozilla en tus propios proyectos.
JavaScript
Gran parte del proyecto Mozilla está escrito en JavaScript.
XPCOM
Información sobre el Cross-Platform Component Object Model, que se utiliza para que los componentes escritos en lenguajes diferentes se comuniquen entre sí.
Interfaces
Documentación sobre las distintas interfaces que añaden funcionalidad a la plataforma.
XUL
Las interfaces de usuario en los proyectos de Mozilla se describen a través del XML User Interface Language.
XBL
El Extensible Binding Language se utiliza para enlazar elementos de interfaz de usuario creados en XUL para los eventos que se controlan por código.
Seguridad
La información relacionada con la seguridad en el proyecto Mozilla.
Móvil
Información sobre el proyecto Fennec, una versión de Firefox para dispositivos móviles.
Accesibilidad
Información sobre accesibilidad, un concepto que se refiere a la posibilidad de utilización de un determinado software por parte de las personas con discapacidad.
Control de calidad
Documentación sobre todos los tipos de pruebas.

Herramientas

-
Bugzilla
La base de datos Bugzilla se usa para rastrear los problemas o incidencias relacionados con los proyectos de Mozilla.
MXR
Navega y busca en el repositorio de código fuente de Mozilla en la Web.
Bonsai
La herramienta Bonsai te permite saber quién cambió qué archivo en el repositorio y cuándo lo hicieron.
Tinderbox
Tinderbox muestra el estado del árbol (si actualmente se construye o no con éxito).  Compruébalo antes de proteger (check in) o desplegar (check out) y asegúrate de que estás trabajando con un árbol de trabajo.
Seguimiento de errores
Información sobre los sistemas de notificación de fallos Socorro y Talkback
Seguimiento del rendimiento
Consulta la información sobre rendimiento para los proyectos de Mozilla.
Foros para desarrolladores
Una lista de temas específicos de foros de discusión, donde puedes hablar sobre temas de desarrollo de Mozilla.
-
-

{{ languages ({"en": "en/The_Mozilla_project", "ja": "ja / The_Mozilla_platform"}) }}

diff --git "a/files/es/lo_b\303\241sico_de_mercurial/index.html" "b/files/es/lo_b\303\241sico_de_mercurial/index.html" deleted file mode 100644 index 5dc5837e0b..0000000000 --- "a/files/es/lo_b\303\241sico_de_mercurial/index.html" +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: lo básico de Mercurial -slug: lo_básico_de_Mercurial -tags: - - Desarrollando_Mozilla - - Mercurial - - NecesitaRevisiónGramatical - - NecesitaRevisiónTécnica - - Todas_las_Categorías -translation_of: Mozilla/Mercurial/Basics ---- -

Voy a contarte algunas cosas sobre Mercurial que te evitarán mucha frustación. Esta página es cínica y orientada a la supervivencia, pero aún así sostengo que Mercurial es mucho mejor que CVS. —jorendorff 16:06, 12 May 2008 (PDT) -

-

Expectativas

-

Mercurial no es CVS. Las órdenes no son las mismas. Los conceptos no son los mismos. -

Esta pistola está cargada. Te puedes disparar en el pie. Puedes perder trabajo. La herramienta intenta protegerte, pero aún así puede suceder. Los dos modos de equivocarse más comunes son: (a) ejecutas una orden sin saber lo que va a hacer; (b) ejecutas hg commit o hg qrefresh con una idea equivocada de la situación de tu directorio de trabajo. Así que accidentalmente confirmas cambios que no querías confirmar (commit); o accidentalmente subes una fusión errónea (broken merge); etc. A menudo no es inmediatamente obvio que ha sucedido algo malo. -

La advertencia te permite ser precavido. No hagas estas cosas. No ejecutes órdenes sin saber lo que van a hacer —hg help es tu amigo. No confirmes cambios sin hacer primero un diff y pensarlo dos veces. Y no te dejes caer en el "modo diversión" y dejes de prestar atención al hecho de que estás jugando con tu propio trabajo pendiente de subir. -

Mercurial no es polvo mágico. Mercurial es flexible, potente, y divertido. Te permite intentar cosas que nunca habrías probado en CVS. Pero, por supuesto, no todo tiene porque acabar siendo una buena idea (por ejemplo, nosotros intentamos compartir colas de parches. Y resultó ser una porquería). -

-

Evitar los problemas

-

Usa Mercurial 1.0 o posterior (hg version para comprobarlo). -

Aprende a manejarte Usa órdenes de sólo-lectura (como hg status, hg head, hg parents, hg log, hg diff) para comprobar el estado de tu repositorio. Ésta es una habilidad fundamental. -

Configura un programa de fusión (un merge program) y asegúrate de que sabes cómo usarlo. HAZLO YA. En caso contrario acabarás cargándote tu repositorio en algún momento. -

CVS deja marcadores de conflicto en tus archivos en ocasiones. Mercurial no: en su lugar, quiere que corrijas los conflictos inmediatamente, usando un programa de fusión (como kdiff3) que abrirá para ti. -

Esto puede favorecer los errores. Por defecto, Mercurial usa el primer programa de fusión que encuentra en tu sistema, y la mayoría de los programas de fusión son bastante difíciles de usar correctamente. Mercurial no hace un buen trabajo detectando las fusiones canceladas y rechazando proseguir, así que limitarse a cerrar una ventana puede ponerte sin querer en una mala situación. Hay historias de hombres maduros que han salido huyendo de árboles hg completos que contenía muchas horas de trabajo, echándole la culpa a un comportamiento inexplicable de hg, debido todo a una fusión errónea. -

Si una fusión falla, asegúrate de que Mercurial sabe que ha fallado. Cuando estás comenzando a aprender los fundamentos, las fusiones a menudo salen mal. Podrías ver este mensaje: -

-
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
-There are unresolved merges, you can redo the full merge using:
-  hg update -C 2
-  hg merge 1
-
-

Esto significa que algunos conflictos no se resolvieron durante la fusión. Si no sabes exactamente cuáles son y cómo corregirlos, usa esa orden hg update -C para decirle a Mercurial que has desistido de esa fusión. -

Si no lo haces, Mercurial no se enterará, y la próxima vez que confirmes cambios, creará un conjunto de cambios (changeset) con la fusión. Esto es mal. El resultado puede parecerse mucho a destruir accidentalmente un puñado de trabajo, pero el daño puede deshacerse. -

Si hg parents muestra dos padres, estás fusionando. -

Si usas colas de Mercurial (Mercurial Queues), haz una copia de seguridad de tu trabajo. ¡hg qrefresh reemplaza de manera destructiva el parche antiguo con el nuevo! Usa hg qinit -c para crear un repositorio de respaldo separado para tus parches y hg qcommit -m backup regularmente. -

No uses colas de Mercurial en un repositorio del que alguien podría descargar. -

-

Recuperarse

-

¡Vaya! ¡Mercurial te acaba de cortar el brazo! -

No pruebes cosas al azar para ver si lo arreglan mágicamente. Recuerda que tienes las de perder, y desconecta la sierra eléctrica mientras aún te quede un brazo bueno. -

Consigue ayuda en el IRC. Prueba #hg o #developers en el IRC de Mozilla o #mercurial en freenode. -

-
-
-
-
-{{ languages( { "ja": "ja/Mercurial_basics", "en": "en/Mercurial_basics" } ) }} diff --git "a/files/es/localizaci\303\263n_y_plurales/index.html" "b/files/es/localizaci\303\263n_y_plurales/index.html" deleted file mode 100644 index 665b0afc2a..0000000000 --- "a/files/es/localizaci\303\263n_y_plurales/index.html" +++ /dev/null @@ -1,386 +0,0 @@ ---- -title: Localización y Plurales -slug: Localización_y_Plurales -tags: - - Internacionalizacion - - Internationalization - - Localización - - Localization -translation_of: Mozilla/Localization/Localization_and_Plurals ---- -

{{ Fx_minversion_header(3) }} Probablemente estas aquí porque estás localizando un archivo .properties el cual poseía un enlace a esta página. Esta página explica cómo localizar esas cadenas para mostrar la forma plural correcta al usuario. Por ejemplo, "una página" contra "dos páginas".

- -

Si estás aquí para hacer tu código (por ejemplo, una extensión) localizable para formas plurales, puedes ir directo aDesarrollar con Formas Plurales, pero probablemente necesitarás localizar las cadenas iniciales de tu código, por lo que será bueno que leas al menos hasta la sección Uso inclusive.

- -

Uso

- -

Aquí hay un par de términos usados en esta página para ayudar a mantener la claridad:

- - - -

Si estas aquí por las Reglas Plurales en el archivo chrome/global/intl.properties , necesitarás averiguar quéregla plural elegir para tu localización. Esta regla plurall se usa para determinar cuántasformas plurales se necesitan para cada palabra que necesita ser localizada teniendo en cuenta los plurales.

- -

Para todos los otros archivos de propiedades (properties files) que enlacen a esta página, necesitarás proveer sucifientes formas plurales de la palabra deseada y separarlas con punto y coma (;). Si no sabes cuántas formas plurales necesitas, revisa el número Regla Plural en chrome/global/intl.properties y búsca la entrada correspondiente en la siguiente lista de reglas plurales.

- -

Lista de Reglas Plurales

- -

Esta sección contiene una lista de reglas plurales ordenada por su número de regla plural. Cada entrada indica cuántas formas plurales se necesitan cuando se localiza una palabra. Para cada entrada, existe una lista de familias y lenguajes en esas familias para ayudarte a decidir si esa es la regla que deves elegir como Regla Plural. Además, hay una breve descripción de cada forma plural seguida de algunos números de ejemplo que caen dentro de esa forma particular.

- -

Para una regla plural dada, el orden en que las formas plurales son listadas es el mismo orden que necesitas para localizar una palabra, separado por punto y coma. Por ejemplo el inglés usa la regla plural 1, luego localizar plurales requeriría cadenas como "plural;plurales" donde la primer palabra es la forma singulas y la segunda es la forma plural general.

- -

Plural rule #0 (1 form)

- -

Families: Asian (Chinese, Japanese, Korean, Vietnamese), Turkic/Altaic (Turkish), Thai
- everything: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, …

- -

Plural rule #1 (2 forms)

- -

Families: Germanic (Danish, Dutch, English, Faroese, Frisian, German, Norwegian, Swedish), Finno-Ugric (Estonian, Finnish, Hungarian), Language isolate (Basque), Latin/Greek (Greek), Semitic (Hebrew), Romanic (Italian, Portuguese, Spanish, Catalan)
- is 1: 1
- everything else: 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, …

- -

Plural rule #2 (2 forms)

- -

Families: Romanic (French, Brazilian Portuguese)
- is 0 or 1: 0, 1
- everything else: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, …

- -

Plural rule #3 (3 forms)

- -

Families: Baltic (Latvian)
- is 0: 0
- ends in 1, not 11: 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …
- everything else: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, 55, …

- -

Plural rule #4 (3 forms)

- -

Families: Celtic (Scottish Gaelic)
- is 1: 1
- is 2: 2
- everything else: 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, …

- -

Plural rule #5 (3 forms)

- -

Families: Romanic (Romanian)
- is 1: 1
- is 0 or ends in 01-19: 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, …
- everything else: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, …

- -

Plural rule #6 (3 forms)

- -

Families: Baltic (Lithuanian)
- ends in 1, not 11: 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …
- ends in 0 or ends in 10-20: 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, …
- everything else: 2, 3, 4, 5, 6, 7, 8, 9, 22, 23, 24, 25, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39, 42, 43, 44, 45, 46, 47, 48, 49, 52, 53, 54, 55, 56, 57, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 72, 73, …

- -

Plural rule #7 (3 forms)

- -

Families: Slavic (Croatian, Serbian, Russian, Ukrainian)
- ends in 1, not 11: 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …
- ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84, 92, 93, 94, 102, 103, 104, 122, 123, 124, 132, 133, 134, 142, 143, 144, 152, 153, 154, 162, 163, 164, 172, 173, 174, 182, 183, …
- everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36, 37, 38, 39, 40, 45, 46, 47, 48, 49, 50, 55, 56, 57, 58, 59, 60, 65, 66, 67, 68, 69, 70, 75, 76, 77, …

- -

Plural rule #8 (3 forms)

- -

Families: Slavic (Slovak, Czech)
- is 1: 1
- is 2-4: 2, 3, 4
- everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, …

- -

Plural rule #9 (3 forms)

- -

Families: Slavic (Polish)
- is 1: 1
- ends in 2-4, not 12-14: 2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84, 92, 93, 94, 102, 103, 104, 122, 123, 124, 132, 133, 134, 142, 143, 144, 152, 153, 154, 162, 163, 164, 172, 173, 174, 182, 183, …
- everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 25, 26, 27, 28, 29, 30, 31, 35, 36, 37, 38, 39, 40, 41, 45, 46, 47, 48, 49, 50, 51, 55, 56, 57, 58, 59, 60, 61, 65, 66, 67, 68, …

- -

Plural rule #10 (4 forms)

- -

Families: Slavic (Slovenian, Sorbian)
- ends in 01: 1, 101, 201, …
- ends in 02: 2, 102, 202, …
- ends in 03-04: 3, 4, 103, 104, 203, 204, …
- everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, …

- -

Plural rule #11 (5 forms)

- -

Families: Celtic (Irish Gaeilge)
- is 1: 1
- is 2: 2
- is 3-6: 3, 4, 5, 6
- is 7-10: 7, 8, 9, 10
- everything else: 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, …

- -

Plural rule #12 (4 forms)

- -

Families: Semitic (Arabic)
- is 1: 1
- is 2: 2
- ends in 03-10: 3, 4, 5, 6, 7, 8, 9, 10, 103, 104, 105, 106, 107, 108, 109, 110, 203, 204, 205, 206, 207, 208, 209, 210,
- everything else but is 0 and ends in 00-02, excluding 0-2: 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, …
- ends in 00-02, excluding 0-2: 100, 101, 102, 200, 201, 202, …
- is 0: 0

- -

Plural rule #13 (4 forms)

- -

Families: Semitic (Maltese)
- is 1: 1
- is 0 or ends in 01-10: 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, …
- ends in 11-19: 11, 12, 13, 14, 15, 16, 17, 18, 19, 111, 112, 113, 114, 115, 116, 117, 118, 119, 211, 212, 213, 214, 215, 216, 217, 218, 219, …
- everything else: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, …

- -

Plural rule #14 (3 forms)

- -

Families: Slavic (Macedonian)
- ends in 1: 1, 11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 201, 211, 221, 231, 241, 251, 261, 271, 281, 291, …
- ends in 2: 2, 12, 22, 32, 42, 52, 62, 72, 82, 92, 102, 112, 122, 132, 142, 152, 162, 172, 182, 192, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, …
- everything else: 0, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 17, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 33, 34, 35, 36, 37, 38, 39, 40, 43, 44, 45, 46, 47, 48, 49, 50, 53, 54, 55, 56, 57, 58, 59, 60, 63, …

- -

Plural rule #15 (2 forms)

- -

Families: Icelandic, Macedonian
- ends in 1, excluding 11: 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …
- everything else: 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 53, 54, …

- -

Plural rule #16 (5 forms)

- -

Families: Celtic (Breton)
- ends in 1, excluding 11, 71, 91: 21, 31, 41, 51, 61, 81, 101, 121, 131, 141, 151, 161, 181, 201, 221, 231, 241, 251, 261, 281, ...
- ends in 2, excluding 12, 72, 92: 2, 22, 32, 42, 52, 62, 82, 102, 122, 132, 142, 152, 162, 182, 202, 222, 232, 242, 252, 262, 282, ...
- ends in 3, 4 or 9 excluding 13, 14, 19, 73, 74, 79, 93, 94, 99: 3, 4, 9, 23, 24, 29, 33, 34, 39, 43, 44, 49, 53, 54, 59, ...
- ends in 1000000: 1000000: 1000000, 2000000, 3000000, 4000000, 5000000, 6000000, 7000000, 8000000, 9000000, 10000000, ...
- everything else: 0, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 30, 35, 36, 37, 38, 40, ...

- -

Plural rule #17 (2 forms)

- -

Families: Ecuador indigenous languages (Shuar)
- is 0: 0
- everything else: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, …

- -

Plural rule #18 (6 forms)

- -

Families: Welsh
- is 0: 0
- is 1: 1
- is 2: 2
- is 3: 3
- is 6: 6
- everything else: 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, …

- -

Plural rule #19 (3 forms)

- -

Families: Slavic (Bosnian, Croatian, Serbian)
- ends in 1, excluding 11: 1, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 131, 141, 151, 161, 171, 181, 191, 201, 221, 231, 241, 251, 261, 271, 281, 291, …
- ends in 2-4, excluding 12-14: 2, 3, 4, 22, 23, 24, 32, 33, 34, 42, 43, 44, 52, 53, 54, 62, 63, 64, 72, 73, 74, 82, 83, 84, 92, 93, 94, 102, 103, 104, 122, 123, 124, 132, 133, 134, 142, 143, 144, 152, 153, 154, 162, 163, 164, 172, 173, 174, 182, 183, …
- everything else: 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 25, 26, 27, 28, 29, 30, 35, 36, 37, 38, 39, 40, 45, 46, 47, 48, 49, 50, 55, 56, 57, 58, 59, 60, 65, 66, 67, 68, 69, 70, 75, 76, 77, …, 112, 113, ..., 212, 213, ...

- -

Ejemplos

- -

Se presentan ejemplos para varios lenguajes y un breve proceso de pensamiento.

- -

Frances

- -

Some French speaking places treat 0 as plural while others treat it as singular. The only other singular is 1 while everything else is plural. So pick either plural rule #1 or #2.

- -

pluralRule=2
- seconds=seconde;secondes
- minutes=minute;minutes
- hours=heure;heures
- days=jour;jours

- -

Like many other times when localizing words, gender agreement might force you to rearrange words in a way that the gender is always the same. (seconde vs jour)

- -

Chino

- -

A word doesn't change if there is a different number in front of it, so all numbers use the same plural form. With just one plural form, it has to be plural rule #0. For each word to localize, it's just like localizing a single word with no semi-colons needed.

- -

pluralRule=0
- seconds=?
- minutes=?
- hours=?
- days=?

- -

Polaco

- -

There's a singular form for 1, a plural form for 2-4, and another for 5-21 at which point 22 is the same as 2. Plural rule #7 has a "ends in 2-4, not 12-14" but the singular form includes everything ending in 1 except 11. Plural rule #9 has the correct singular form for only 1.

- -

pluralRule=9
- seconds=sekunda;sekundy;sekund
- minutes=minuta;minuty;minut
- hours=godzina;godziny;godzin
- days=dzien;dni;dni

- -

Even though the last 2 plural forms of "day" are the same, both are still needed because there needs to be 3 plural forms for each word.

- -

Sorabo

- -

There are 4 plural forms: nominative singular, nominative dual, nominative plural, genitive plural. These match up with plural rule #10.

- -

pluralRule=10
- seconds=sekunda;sekundze;sekundy;sekundow
- minutes=mjenšina;mjenšinje;mjenšiny;mjenšin
- hours=hodzina;hodzinje;hodziny;hodzin
- days=dzen;dnjej;dny;dnjow

- -

Testing Extension

- -

To help make sure you pick the right plural rule and provide enough plural forms for strings, you should use the pluralForm Checker extension. After installing the extension, it should be available from the Tools menu.

- -

To use it, list off the property files and properties that you want to check and click the button. The extension will load each property and display the plural forms in a table. Selecting a table entry will populate the bottom box with sample uses of the word for some numbers.

- -

Image:pluralForm-checker.0.3.png

- -

Install pluralForm Checker v0.3 extension

- -

Extension input

- -

It would be good to keep this list updated with all the words that need plural forms. People using the extension can then copy/paste this input.

- -

chrome://mozapps/locale/downloads/do...tes,hours,days
- chrome://mozapps/locale/downloads/do...dsTitlePercent
- chrome://browser/locale/browser.prop...ausedDownloads

- -

Version history

- -

0.1: Initial version with pluralRule check, properties input loading, table generation, sample output display
- 0.2: Use PluralForm.numForms() to get the number of forms instead of figuring out locally to better support future rules - Requires build from 2007/01/27 or later
- 0.3: Generate a list of what numbers fall into which plural form to minimize the sample output to at most 3 of each form

- -

Desarrollar con Formas Plurales

- -

The functionality for getting the correct plural forms is provided by a JavaScript Module, PluralForm.jsm. This module provides a couple methods for localizing to the browser's current locale as well as getting methods to localize to a desired plural rule. The latter ability of specifying a plural rule is useful for extensions because the extension doesn't necessarily have to be localized to the browser's locale.

- -

Loading PluralForm.jsm

- -

Loading the PluralForm module from JavaScript is simple with Components.utils.import. Just put the following line somewhere that will be evaluated before you want to use PluralForm. At the top of your JavaScript file is fine.

- -
Components.utils.import("resource://gre/modules/PluralForm.jsm");
- -

Methods: get and numForms

- -

These methods make use of the browser's current locale specified by chrome://global/locale/intl.properties's pluralRule value.

- -
/**
- * Get the correct plural form of a word based on the number
- *
- * @param aNum
- *        The number to decide which plural form to use
- * @param aWords
- *        A semi-colon (;) separated string of words to pick the plural form
- * @return The appropriate plural form of the word
- */
-string pluralForm
-get(int aNum, string aWords)
- -
/**
- * Get the number of forms for the current plural rule
- *
- * @return The number of forms
- */
-int numForms
-numForms()
- -

Here is an example of using these methods:

- -
// Load PluralForm and for this example, assume English
-Components.utils.import("resource://gre/modules/PluralForm.jsm");
-
-// PluralForm.get expects a semi-colon separated list of words
-let forms = "form;forms";
-// We're going to pick the correct plural form based on the following number
-let numForms = PluralForm.numForms();
-
-// Display the correct plural form for "forms"
-print("This locale has " + numForms + " " + PluralForm.get(numForms, forms) + ".");
-
- -

The above example works, but is still difficult to localize because we're concatenating strings assuming a particular grammatical structure. The following would be better:

- -
Components.utils.import("resource://gre/modules/PluralForm.jsm");
-
-let forms = "This locale has one form.;This locale has #1 forms.";
-let numForms = PluralForm.numForms();
-
-// For English, this would display "This locale has 2 forms."
-print(PluralForm.get(numForms, forms).replace("#1", numForms);
- -

Notice in the above example that the code can be written to support placeholders or not use placeholders in some forms of the string. Additionally, the localizer has control over where the placeholder is in relation to the rest of the text.

- -

Of course, the strings to be localized will be placed in a separate file such as yourextension.properties instead of being hardcoded in the JavaScript code file.

- -

The following 3 file snippets show how to use PluralForm with your .xul, .properties, .js files.

- -

downloads.xul:

- -
<stringbundleset>
-  <stringbundle id="strings" src="chrome://downloads.properties"/>
-</stringbundleset>
- -

downloads.properties:

- -
# LOCALIZATION NOTE (downloadsTitleFiles): Semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 number of files
-# example: 111 files - Downloads
-downloadsTitleFiles=#1 file - Downloads;#1 files - Downloads
-
-# LOCALIZATION NOTE (timePair): #1 time number; #2 time unit
-# example: 1 second; 11 seconds
-timePair=#1 #2
-seconds=second;seconds
- -

downloads.js:

- -
Components.utils.import("resource://gre/modules/PluralForm.jsm");
-let getStr = function(string) document.getElementById("strings").getString(string);
-
-// Get the correct plural form for the title
-let numDownloads = 3;
-let title = PluralForm.get(numDownloads, getStr("downloadsTitleFiles"));
-// Put in the correct number of downloads
-print(title.replace("#1", numDownloads));
-
-// Get the correct plural form of seconds
-let timeLeft = 55;
-let seconds = PluralForm.get(timeLeft, getStr("seconds"));
-// Print the localized string for "55 seconds"
-print(getStr("timePair").replace("#1", timeLeft).replace("#2", seconds));
- -

Method: makeGetter

- -

If you're writing an extension, you'll want to use makeGetter instead of PluralForm.get() or PluralForm.numForms() because someone installing the extension on a different locale will be using the strings provided by your default extension locale. For example, your extension localized for English with plural rule #1, which expects 2 plural forms, is installed on a localized version of Firefox with plural rule #4, which expects 3 forms.

- -
/**
- * Create a pair of plural form functions for the given plural rule number.
- *
- * @param aRuleNum
- *        The plural rule number to create functions
- * @return A pair: [function that gets the right plural form,
- *                  function that returns the number of plural forms]
- */
-[string pluralForm get(int aNum, string aWords), int numForms numForms()]
-makeGetter(int aRuleNum)
- -

Here is an example usage of makeGetter:

- -
Components.utils.import("resource://gre/modules/PluralForm.jsm");
-
-// Let's get Irish (plural rule #11)
-let [get, numForms] = PluralForm.makeGetter(11);
-
-// Make up some values to use with "get"
-let dummyText = "form 1;form 2;form 3;form 4;form 5";
-let dummyNum = 10;
-
-// In the case of Irish, the value 10 uses plural form #4, so "form 4" is printed
-print(get(dummyNum, dummyText));
- -

In this example, the Irish plural rule was hardcoded, but this could be a value specified in the .properties file. So for your extension, specify a pluralRule value in the .properties and call PluralForm.makeGetter(pluralRuleFromProperties) making sure to save the 2 returned functions. (You can use destructured assignment in JavaScript 1.7 to keep things clean.) The returned functions act just like PluralForm.get() and PluralForm.numForms() except for the specified plural rule instead of the default plural rule.

- -

Credits

- -

Plural Form code first implemented for {{ Bug(394516) }} -Figure out a remaining-time rounding scheme for minutes -> hours/days
- Plural rules and families derived from GNU gettext documentation.

diff --git "a/files/es/lugares/gu\303\255a_para_migraci\303\263n_con_lugares/index.html" "b/files/es/lugares/gu\303\255a_para_migraci\303\263n_con_lugares/index.html" deleted file mode 100644 index 1f093b487d..0000000000 --- "a/files/es/lugares/gu\303\255a_para_migraci\303\263n_con_lugares/index.html" +++ /dev/null @@ -1,645 +0,0 @@ ---- -title: Guía para migración con lugares -slug: Lugares/Guía_para_migración_con_lugares -tags: - - páginas_a_traducir -translation_of: Mozilla/Tech/Places/Places_Developer_Guide ---- -

This document is for extension and application developers who want to use the bookmarks and history APIs in Firefox 3. It provides code samples for many common use-cases, such as CRUD operations, searching, and observing.

- -

Overview

- -

Places is the umbrella term for a set of APIs for managing browsing history and URI metadata first introduced in Firefox 3. It encompasses history, bookmarks, tags, favicons, and annotations. There are two models of identity in the system: URIs, and unique integer identifiers for items in the bookmark system. Some of the APIs are URI-centric, some use item ids. The API signature and context usually make clear which is required.

- -

Bookmarks

- -

The toolkit bookmarks service is nsINavBookmarksService:

- -
var bookmarks = Cc["@mozilla.org/browser/nav-bookmarks-service;1"]
-                .getService(Ci.nsINavBookmarksService);
-
- -

This service provides methods for adding, editing and deleting items in the bookmarks collection.

- -

Types in the Bookmark System

- -

There are the four types of items in the bookmarks system, and their identifiers in the IDL:

- - - -

Identifying Items in the Bookmark System

- -

Items in the bookmarks collection are identified by an id unique to the user's profile. Most of the APIs provided by the bookmarks service use an item's id to identify what to act on.

- -

The bookmarks datastore is hierarchical, modeling folders and their contents. The ids of several significant folders are made available as attributes of nsINavBookmarksService.

- - - -

Other Bookmarks APIs

- -

Note: This document covers the toolkit Places services. However, Firefox developers can take advantage of several helper APIs that are browser-specific:

- - - -

Creating Bookmarks, Folders and Other Items

- -

Creating a Bookmark

- -
// create an nsIURI for the URL to be bookmarked.
-var bookmarkURI = Cc["@mozilla.org/network/io-service;1"]
-                  .getService(Ci.nsIIOService)
-                  .newURI("http://www.mozilla.com", null, null);
-
-var bookmarkId = bookmarks.insertBookmark(
-  bookmarks.toolbarFolder, // The id of the folder the bookmark will be placed in.
-  bookmarkURI,             // The URI of the bookmark - an nsIURI object.
-  bookmarks.DEFAULT_INDEX, // The position of the bookmark in its parent folder.
-  "my bookmark title");    // The title of the bookmark.
-
- -

Creating a Folder

- -
var folderId = bookmarks.createFolder(
-  bookmarks.toolbarFolder, // The id of the folder the new folder will be placed in.
-  "my folder title",       // The title of the new folder.
-  bookmarks.DEFAULT_INDEX);    // The position of the new folder in its parent folder.
-
- -

Creating a Separator

- -
var separatorId = bookmarks.insertSeparator(
-  bookmarks.toolbarFolder, // The id of the folder the separator will be placed in.
-  bookmarks.DEFAULT_INDEX);    // The position of the separator in its parent folder.
-
- -

Creating a Livemark

- -
var IOService = Cc["@mozilla.org/network/io-service;1"]
-                .getService(Ci.nsIIOService);
-
-var siteURI = IOService.newURI("http://www.mozilla.com", null, null);
-var feedURI = IOService.newURI("http://www.mozilla.org/news.rdf", null, null);
-
-var livemarks = Cc["@mozilla.org/browser/livemark-service;2"]
-                .getService(Ci.nsILivemarkService);
-
-livemarks.createLivemark(bookmarks.toolbarFolder, // The id of the folder the livemark will be placed in
-  "My Livemark Title",        // The title of the livemark
-  siteURI,                    // The URI of the site. A nsIURI object.
-  feedURI,                    // The URI of the actual feed. A nsIURI object.
-  bookmarks.DEFAULT_INDEX);   // The position of the livemark in its parent folder.
-
- -

Accessing Bookmarks and Related Items

- -

Accessing Item Properties

- -

For all items:

- - - -

For bookmarks:

- - - -

For folders:

- - - -

Accessing Folder Contents

- -

Queries in Places are executed through the main history service. The example below shows how to enumerate a bookmark folder's contents, and how to access the properties of the items themselves.

- -
var history = Cc["@mozilla.org/browser/nav-history-service;1"]
-	 .getService(Ci.nsINavHistoryService);
-var query = history.getNewQuery();
-query.setFolders([myFolderId], 1);
-var result = history.executeQuery(query, history.getNewQueryOptions());
-// The root property of a query result is an object representing the folder you specified above.
-var folderNode = result.root;
-// Open the folder, and iterate over its contents.
-folderNode.containerOpen = true;
-for (var i=0; i < folderNode.childCount; ++i) {
-	var childNode = folderNode.getChild(i);
-	 // Some item properties.
-	var title = childNode.title;
-	var id = childNode.itemId;
-	var type = childNode.type;
-
-	// Some type-specific actions.
-	if (type == Ci.nsINavHistoryResultNode.RESULT_TYPE_URI) {
-		var uri = childNode.uri;
-	}
-	else if (type == Ci.nsINavHistoryResultNode.RESULT_TYPE_FOLDER) {
-		childNode.QueryInterface(Ci.nsINavHistoryContainerResultNode);
-		childNode.containerOpen = true;
-		// now you can iterate over a subfolder's children
-	}
-}
-
- -

ther available node types are documented in the IDL.

- -

Searching Bookmarks

- -

Queries are executed through the history service. The example below shows how to search through all bookmarks, and to iterate over the results.

- -
var bookmarks = Cc["@mozilla.org/browser/nav-bookmarks-service;1"]
-                .getService(Ci.nsINavBookmarksService);
-var history = Cc["@mozilla.org/browser/nav-history-service;1"]
-              .getService(Ci.nsINavHistoryService);
-
-var query = history.getNewQuery();
-
-// Specify folders to be searched
-var folders = [bookmarks.toolbarFolder, bookmarks.bookmarksMenuFolder,
-               bookmarks.unfiledBookmarksFolder];
-query.setFolders(folders, folders.length);
-
-// Specify terms to search for, matches against title, URL and tags
-query.searchTerms = "firefox";
-
-var options = history.getNewQueryOptions();
-options.queryType = options.QUERY_TYPE_BOOKMARKS;
-
-var result = history.executeQuery(query, options);
-
-// The root property of a query result is an object representing the folder you specified above.
-var resultContainerNode = result.root;
-
-// Open the folder, and iterate over its contents.
-resultContainerNode.containerOpen = true;
-for (var i=0; i < resultContainerNode.childCount; ++i) {
-  var childNode = resultContainerNode.getChild(i);
-
-  // Accessing properties of matching bookmarks
-  var title = childNode.title;
-  var uri = childNode.uri;
-}
-
- -

Updating Bookmark Items

- -

For all items:

- - - -

For bookmarks:

- - - -

Deleting Bookmark Items

- -

With the bookmarks service:

- - - -

Observing Bookmark Events

- -

The nsINavBookmarkObserver interface is used for observing bookmarks activity such as item additions, changes and deletions.

- -
// Create a bookmark observer
-var observer = {
-  onBeginUpdateBatch: function() {
-    // This method is notified when a batch of changes are about to occur.
-    // Observers can use this to suspend updates to the user-interface, for example
-    // while a batch change is occurring.
-  },
-  onEndUpdateBatch: function() {
-    this._inBatch = false;
-  },
-  onItemAdded: function(id, folder, index) {
-  },
-  onItemRemoved: function(id, folder, index) {
-  },
-  onItemChanged: function(id, property, isAnnotationProperty, value) {
-    // isAnnotationProperty is a boolean value that is true of the changed property is an annotation.
-    // You can access a bookmark item's annotations with the <code>nsIAnnotationService</code>.
-  },
-  onItemVisited: function(id, visitID, time) {
-    // The visit id can be used with the History service to access other properties of the visit.
-    // The time is the time at which the visit occurred, in microseconds.
-  },
-  onItemMoved: function(id, oldParent, oldIndex, newParent, newIndex) {
-    // oldParent and newParent are the ids of the old and new parent folders of the moved item.
-  },
-  QueryInterface: function(iid) {
-    if (iid.equals(Ci.nsINavBookmarkObserver) ||
-        iid.equals(Ci.nsISupports)) {
-      return this;
-    }
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-};
-
-// Register the observer with the bookmarks service
-var bmsvc = Cc["@mozilla.org/browser/nav-bookmarks-service;1"]
-            .getService(Ci.nsINavBookmarksService);
-bmsvc.addObserver(observer, false);
-
-// Un-register the observer when done.
-bmsvc.removeObserver(observer);
-
-
- -

HTML Import/Export

- -

The nsIPlacesImportExportService service is used for import and export of bookmarks in the Netscape Bookmarks HTML format. Note that this service is only currently available for Firefox, not other toolkit-based applications.

- -

Importing:

- - - -
Note: The method importHTMLFromFileToFolder() method was removed in Gecko 14.0 (Firefox 14.0 / Thunderbird 14.0 / SeaMonkey 2.11).
- -

Exporting:

- - - -

Backup/Restore

- -

The new bookmarks system uses the JSON format for storing backups of users' bookmarks. The APIs are available via the PlacesUtils API in the utils.js Javascript module.

- -
var Ci = Components.interfaces;
-var Cc = Components.classes;
-var Cu = Components.utils;
-
-// Import PlacesUtils
-Cu.import("resource://gre/modules/PlacesUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-// Create the backup file
-var jsonFile = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
-jsonFile.append("bookmarks.json");
-jsonFile.create(Ci.nsILocalFile.NORMAL_FILE_TYPE, 0600);
-
-// Export bookmarks in JSON format to file
-PlacesUtils.backupBookmarksToFile(jsonFile);
-
-// Restore bookmarks from the JSON file
-// NOTE: This *overwrites* all pre-existing bookmarks
-PlacesUtils.restoreBookmarksFromJSONFile(jsonFile);
-
- -

History

- -

The toolkit history service is nsINavHistoryService:

- -
var history = Cc["@mozilla.org/browser/nav-history-service;1"]
-              .getService(Ci.nsINavHistoryService);
-
-
- -

The history service provides methods for adding, editing, deleting browser history. It's also the jump-off point for querying and searching the history and bookmarks collections.

- -

While nsINavHistory is the main interface for history, there are a couple of other interfaces available for legacy and context-specific uses:

- - - -

Adding to History

- -

Places provides a couple of interfaces for adding to, and editing the browsing history. The main interface is nsINavHistoryService. Other interfaces that provide specialized abilities are nsIBrowserHistory and nsIGlobalHistory. Examples of the capabilities of each are provided below.

- -
// Places deals in URIs, so here's a helper for creating them.
-function uri(spec) {
-  return Cc["@mozilla.org/network/io-service;1"].
-         getService(Ci.nsIIOService).
-         newURI(spec, null, null);
-}
-
-// Adding a basic visit via the core Places history service.
-var history = Cc["@mozilla.org/browser/nav-history-service;1"].
-              getService(Ci.nsINavHistoryService);
-var ourURI = uri("http://www.mozilla.com");
-var visitDate = Date.now() * 1000; // in microseconds
-var referrerURI = null; // or a URI
-var isRedirect = false;
-var visitType = history.TRANSITION_LINK; // the visit is from a link that was clicked
-var sessionId = 0; // can link the visit with a specific browsing session
-history.addVisit(ourURI, visitDate, referrerURI,
-                 visitType, isRedirect, sessionId);
-
-// Add a visit to a URL, with a page title and visited time
-// via nsIBrowserHistory.
-var browserHistory = histsvc.QueryInterface(Ci.nsIBrowserHistory);
-var ourURI = uri("http://www.mozilla.com");
-var pageTitle = "Mozilla";
-var visitDate = Date.now() * 1000; // in microseconds
-browserHistory.addPageWithDetails(ourURI, "Mozilla", visitDate);
-
-// Add a visit to a URL, with extended behavior information
-// via nsIGlobalHistory3.
-var globalHistory = Cc["@mozilla.org/browser/global-history;2"].
-                    getService(Ci.nsIGlobalHistory2);
-var ourURI = uri("http://www.mozilla.com");
-var isRedirect = false;
-var isTopLevel = true;
-globalHistory.addURI(ourURI, isRedirect, isTopLevel, referrerURI);
-globalHistory.setPageTitle(ourURI, "Mozilla");
-
- -

Deleting from History

- -
// Places deals in URIs, so here's a helper for creating them.
-function uri(spec) {
-  return Cc["@mozilla.org/network/io-service;1"].
-         getService(Ci.nsIIOService).
-         newURI(spec, null, null);
-}
-
-var browserHistory = histsvc.QueryInterface(Ci.nsIBrowserHistory);
-var ourURI = uri("http://www.mozilla.com");
-
-// Remove all visits for a single URL from history
-browserHistory.removePage(ourURI);
-
-// Remove all visits for multiple URLs from history
-var urisToDelete = [ourURI];
-// will call nsINavHistoryObserver.onBeginUpdateBatch/onEndUpdateBatch
-var doNotify = false;
-browserHistory.removePages(urisToDelete, urisToDelete.length, doNotify);
-
-// Remove all visits within a given time period
-var endDate = Date.now() * 1000; // now, in microseconds
-var startDate = endDate - (7 * 86400 * 1000 * 1000); // one week ago, in microseconds
-browserHistory.removePagesByTimeframe(startDate, endDate);
-
-// Remove all pages for a given host
-var entireDomain = true; // will delete from all hosts from the given domain
-browserHistory.removePagesFromHost("mozilla.com", true);
-// Remove all history visits
-browserHistory.removeAllPages();
- -

Querying History

- -

The code sample below queries the browser history for the ten most visited URLs in the browser history.

- -
var historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"]
-                               .getService(Components.interfaces.nsINavHistoryService);
-var query = historyService.getNewQuery();
-var options = historyService.getNewQueryOptions();
-options.sortingMode = options.SORT_BY_VISITCOUNT_DESCENDING;
-options.maxResults = 10;
-
-// execute the query
-var result = historyService.executeQuery(query, options);
-
-// iterate over the results
-result.root.containerOpen = true;
-var count = result.root.childCount;
-for (var i = 0; i < count; i++) {
-  var node = result.root.getChild(i);
-  // do something with the node properties...
-  var title = node.title;
-  var url = node.uri;
-  var visited = node.accessCount;
-  var lastVisitedTimeInMicrosecs = node.time;
-  var iconURI = node.icon; // is null if no favicon available
-}
-
-result.root.containerOpen = false;
-
- -

Querying History for redirects and from_visit

- -

Results of type RESULT_TYPE_FULL_VISIT have information about the visit, such as the referring visit, and how the transition happened (typed, redirect, link, etc). The problem is that it is not yet implemented -- see bug 320831. So the only solution for now seems to do one own SQL queries to the Places database.

- -

Here is how one can get a connection to the Places database:

- -
function getPlacesDbConn() {
-    return Components.classes['@mozilla.org/browser/nav-history-service;1'].
-      getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;
-}
-
- -

And then to get the a redirected visit_id from another visit_id:

- -
function getFromVisit(visit_id) {
-  var sql = <cdata><![CDATA[
-    SELECT from_visit FROM moz_places, moz_historyvisits
-    WHERE moz_historyvisits.id = :visit_id AND moz_places.id = moz_historyvisits.place_id;
-  ]]></cdata>.toString();
-  var sql_stmt = getPlacesDbConn.createStatement(sql);
-  sql_stmt.params.visit_id = visit_id;  
-
-  var from_visit;
-  try {
-    // Here we can't use the "executeAsync" method since have to return a
-    // result right-away.
-    while (sql_stmt.executeStep()) {
-      from_visit = sql_stmt.row.from_visit;
-    }
-  } finally {
-    sql_stmt.reset();
-  }
-  return from_visit;
-}
-
- -
Note: The <cdata><![CDATA[ xxx ]]></cdata>.toString() notation is E4X and it makes possible to write multi-line strings in JavaScript. This is very useful when writing long SQL statements.
- -

Searching History

- -

Queries are executed through the history service. The example below shows how to search through browser history, and to iterate over the results.

- -
var history = Cc["@mozilla.org/browser/nav-history-service;1"]
-              .getService(Ci.nsINavHistoryService);
-
-var query = history.getNewQuery();
-
-// Specify terms to search for, matches against title and URL
-query.searchTerms = "firefox";
-
-var result = history.executeQuery(query, history.getNewQueryOptions());
-
-// The root property of a query result is an object representing the folder you specified above.
-var resultContainerNode = result.root;
-
-// Open the result, and iterate over it's contents.
-resultContainerNode.containerOpen = true;
-for (var i=0; i < resultContainerNode.childCount; ++i) {
-  var childNode = resultContainerNode.getChild(i);
-
-  // Accessing properties of matching bookmarks
-  var title = childNode.title;
-  var uri = childNode.uri;
-}
-
- -

Observing History

- -

The nsINavHistoryObserver interface allows observation of history events such as new visits, page title changes, page expiration and when all history is cleared.

- -
var history = Cc["@mozilla.org/browser/nav-history-service;1"].
-              getService(Ci.nsINavHistoryService);
-let observer = {
-  onBeginUpdateBatch: function() {
-  },
-  onEndUpdateBatch: function() {
-  },
-  onVisit: function(aURI, aVisitID, aTime, aSessionID, aReferringID, aTransitionType) {
-  },
-  onTitleChanged: function(aURI, aPageTitle) {
-  },
-  onDeleteURI: function(aURI) {
-  },
-  onClearHistory: function() {
-  },
-  onPageChanged: function(aURI, aWhat, aValue) {
-  },
-  onPageExpired: function(aURI, aVisitTime, aWholeEntry) {
-  },
-  QueryInterface: function(iid) {
-    if (iid.equals(Components.interfaces.nsINavHistoryObserver) ||
-        iid.equals(Components.interfaces.nsISupports)) {
-      return this;
-    }
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  }
-};
-
-history.addObserver(observer, false);
-
- -

New

- -

Tagging Service

- -

The tagging of URIs is provided by nsITaggingService. The service is URI-centric, meaning that consumers can tag URIs directly, without first creating a bookmark. The unique identifier is the URI, and all APIs require URIs as nsIURI objects.

- -
// Get the tagging service
-var tagssvc = Cc["@mozilla.org/browser/tagging-service;1"]
-              .getService(Ci.nsITaggingService);
-
-// Create a URI to tag
-var IOService = Cc["@mozilla.org/network/io-service;1"]
-                .getService(Ci.nsIIOService);
-var myURI = IOService.newURI("http://www.mozilla.com", null, null);
-
-// Tag the URI
-tagssvc.tagURI(myURI, ["mozilla", "firefox"]);
-
-// Get an array of tags for a URI
-var myTags = tagssvc.getTagsForURI(myURI, {});
-
-// Get an array of URIs for a tag
-var taggedURIs = tagssvc.getURIsForTag("mozilla");
-
-// Get an array of all tags
-var arrayOfAllTags = tagssvc.allTags;
-
-// Remove tags from a URI
-tagssvc.untagURI(myURI, ["mozilla", "firefox"]);
-
- -


- This service currently integrates with and is internally dependent upon bookmarks:

- - - -

Annotations

- -

Annotations provide a way to store small bits of arbitrary data for a URI or a bookmark:

- -
// Get the annotation service
-var annotations = Cc["@mozilla.org/browser/annotation-service;1"]
-                  .getService(Ci.nsIAnnotationService);
-
-// Create a URI to annotate
-var IOService = Cc["@mozilla.org/network/io-service;1"]
-                .getService(Ci.nsIIOService);
-var myURI = IOService.newURI("http://www.mozilla.com", null, null);
-
-// Add an annotation to the URI, that expires when the URI is deleted
-// or expires from the browser history
-annotations.setPageAnnotation(myURI, "myAnnotation", "notes for this URI...",
-                              0, annotations.EXPIRE_WITH_HISTORY);
-
-// Create a bookmark to annotate
-var bookmarks = Cc["@mozilla.org/browser/nav-bookmarks-service;1"]
-                .getService(Ci.nsINavBookmarksService);
-var myBookmark = bookmarks.insertBookmark(bookmarks.toolbarFolder, myURI,
-                                          bookmarks.DEFAULT_INDEX, "my bookmark");
-
-// Add an annotation to the bookmark, that expires only when
-// the bookmark is deleted
-annotations.setItemAnnotation(myBookmark, "myAnnotation", "notes for this bookmark...",
-                              0, annotations.EXPIRE_WITH_HISTORY);
-
- -

Note the syntactic difference between the URI and bookmark annotation APIs: URI annotation APIs use "Page" in method names whereas bookmark annotation APIs use "Item" in method names.

- -

Saved Searches

- -

New in Firefox 3 is the ability to save searches of bookmarks or history. These saved searches appear as folders in your bookmarks, with a special icon to signify their difference from normal folders. The contents of these folders are updated when expanded, executing the search against the current history and bookmarks collections.

- -

Saved searches can be formulated as URIs, and added to the bookmarks collection as a normal bookmark. Formulation of search URIs is documented here.

- -
// Formulate a URI to query for the 10 most visited URIs in the browser history
-var mostVisited = "place:queryType=0&sort=8&maxResults=10";
-
-// Create an nsIURI for the URL to be bookmarked.
-var bookmarkURI = Cc["@mozilla.org/network/io-service;1"]
-                  .getService(Ci.nsIIOService)
-                  .newURI(mostVisited, null, null);
-
-// Add the search to the bookmarks toolbar
-var id = bookmarks.insertBookmark(bookmarks.toolbarFolder, bookmarkURI,
-                                  bookmarks.DEFAULT_INDEX, "Most Visited");
-
diff --git "a/files/es/manifiesto_de_instalaci\303\263n/index.html" "b/files/es/manifiesto_de_instalaci\303\263n/index.html" deleted file mode 100644 index 33fdf324e9..0000000000 --- "a/files/es/manifiesto_de_instalaci\303\263n/index.html" +++ /dev/null @@ -1,653 +0,0 @@ ---- -title: Manifiesto de instalación -slug: Manifiesto_de_instalación -tags: - - Complementos - - Herramientas_API - - Todas_las_Categorías - - extensiones - - para_revisar - - páginas_a_traducir -translation_of: Archive/Add-ons/Install_Manifests ---- -

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.

- -

Introducción

- -

De aquí en adelante a los addon les llamaremos complemento. En algunos navegadores Mozilla, dependiendo del idioma español descargado para traducir la interfaz del navegador, se leerá como agregado en Herramientas->Agregado.

- -

Un manifiesto de instalador es un archivo agregado que la aplicación XUL (Administrador-Habilitado) usa para determinar la información acerca de como un agregado ó complemento (Add-on) ha de ser instalado. Este archivo contiene metadatos que identifican el complemento/agregado, provee información del creador de éste, donde se puede hallar más información acerca del complemento/agregado, con cuales versiones de qué aplicaciones es compatible, como debería ser actualizado y cosas por el estilo.

- -

El formato de un mainfiesto de instalador es RDF/XML.

- -

El archivo debe ser llamado install.rdf y ubicarse en el nivel superior del archivo XPI de un complemento.

- -

Disposición

- -

La disposición básica de un manifiesto de instalador es algo como esto:

- -
<?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">
-    <!-- properties -->
-  </Description>
-</RDF>
-
- -

Algunas propiedades son requeridas, otras son opcionales; algunas tienen cadenas simples, otras son recursos complejos.

- -

Referencia de propiedades requeridas

- -

Su manifiesto de instalador debe especificar estas propiedades correctamente, de lo contrario su agregado/complemento podría no instalarse.

- -

id

- -

La id de la extension, la cual es un:

- - - -

Este último formato es significativamente más fácil de generar y manipular. Firefox 1.5 tiene una comprobación para asegurarse que su id caiga dentro de un formato u otro y rechazará la instalació de complemetos/agregados que tengan ids mal formadas.

- -

Ejemplos

- -
<em:id>miextension@misitio.com</em:id>
-
-<em:id>{daf44bf7-a45e-4450-979c-91cf07434c3d}</em:id>
-
- -

versión

- -

La cadena de versión identificando la versión del complemento que está siendo proveído.

- -

Para Firefox/Thunderbird 1.0, el formato debe cumplir las reglas especificadas en Extensión de versiones, Actualización y Compatibilidad. Para Firefox/Thunderbird 1.5, ver Herramientas para formato de versión.

- -

Ejemplos

- -
<em:version>2.0</em:version>
-
-<em:version>1.0.2</em:version>
-
-<em:version>0.4.1.2005090112</em:version>
-
-
- -

Firefox 1.5 / XULRunner 1.8 - Complementos/agregados que no usan un formato de versión válido no serán instalados. El formato de la versión es diferente a, pero compatible con, 1.0's.

- -

Para complementos alojados en addons.mozilla.org - La actualización del sitio web de Mozilla puede reinstalar su complemento/agregado y corregir o rechazar versiones con cadenas de versión malformadas.

- -

tipo

- -

Un valor de tipo entero representa el tipo de complemento/agregado.

- - - - - - - - - - - - - - - - - - - - - - - - -
2Extensiones
4Temas
8Local
16Plugin
32Paquete o programa de tipos múltiples
- -

Ejemplos

- -
<em:type>2</em:type>
-
- -

Nuevo en Firefox 1.5 Esta propiedad fue añadida para Firefox 1.5, y es requerida únicamente para otros tipos de complementos/agregados diferentes a Extensiones y Temas.

- -

Aplicación destino (targetApplication)

- -

Un objeto que especifica una aplicación a la cual se dirije este complemento. Esto significa que el complemento trabajará con la aplicación definida por la propiedad id (<em:id>) especificada (para una lista compensiva de IDs de aplicaciones y sus valores máximo y mínimo (min/maxVersions) véase "Versiones de aplicaciones válidas para Desarrolladores de complementos/agregados", desde la versión mínima (<em:minVersion>) hasta e incluyendo la versión máxima (<em:maxVersion>). Estas cadenas para versión tienen el mismo formato que la propiedad de versión y será comparada con la versión de la aplicación; esto permite al autor de la extensión especificar, cuáles extensiones y con qué versiones de Firefox han sido probadas.

- -

Nota: Las extensiones compatibles con Firefox 3.5 deberán especificar un maxVersion de 3.5 *, por lo que son compatibles con actualizacinoes de seguridad de estabilidad. Para Firefox 3.0, debiera usarse un maxVersion de 3.0.* Las extensiones compatibles únicamente con Firefox o Thunderbird 2.0 deberán especificar un maxVersion de 2.0.0*.

- -

El manifiesto de instalador debe especificar al menos uno de estos objetos y podría especificar más si el complemento/agregado tiene múltiples aplicaciones destino que soportan al Administrador del complemento/agregado. (por ejemplo Firefox y Thunderbird).

- -

Ejemplos

- -
<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>
-
- -

Nuevo en Firefox 3 Las aplicaciones basadas en Gecko 1.9 te permiten usar la id especial targetApplication id toolkit@mozilla.org para indicar que el complemento/agregado es compatible con cualquier aplicación tipo toolkit que tenga valores similares de minVersion y maxVersion.

- -

nombre (name)

- -

El nombre del complemento, previsto para mostrarlo en el interfaz de usuario (UI = User Interface).

- -

Ejemplos

- -
<em:name>Mi Extension</em:name>
-
- -

Referencia de propiedades opcionales

- -

Podrías necesitar proveer estas propiedades, dependiendo de las capacidades de tu complemento/agregado.

- -

localizado (localized)

- -

 

- -
Edit section
- -

 

- -

Nuevo en Firefox 3 Te permite localizar el nombre de tu complemento/agregado, descripción, contribuidores y otros metadatos. La descripción de localized debe especificar al menos un em:locale que indique cuáles locales usan esta información.

- -

Ejemplos

- -

Esto declara un set de metadatos de un complemento/agregado para mostrar en pantalla cuando la aplicación se está ejecutando en el local de-DE.

- -
<em:localized>
-  <Description>
-    <em:locale>de-DE</em:locale>
-    <em:name>Tab Sidebar</em:name>
-    <em:description>Zeigt in einer Sidebar Vorschaubilder der Inhalte aller offenen Tabs an.</em:description>
-  </Description>
-</em:localized>
-
- -

Las siguientes propiedades que son descritas en otra parte en ésta página pueden ser incluidas en la propiedad localized:

- - - -

Más documentos pueden hallarse en Localización de descripción para extensiones.

- -

descripción (description)

- -

Una corta descripción del complemento/agregado - Prevista para mostrar en la interfaz de usuario. Esta descripción debe encajar en una corta linea de texto..

- -

Ejemplos

- -
<em:description>Herramienta Avanzada foo.</em:description>
-
- -

creator

- -

El nombre del creador/desarrollador principal - Prevista para mostrar en la interfaz de usuario.

- -

Ejemplos

- -
<em:creator>John Doe</em:creator>
-
- -

ó

- -
<em:creator>El Equipo Extensión </em:creator>
-
- -

developer

- -
Edit section
- -

Nuevo en Firefox 2 El/los nombre(s) de co-desarrolladores. Se deben especificar mas de uno de estos valores para especificar múltiples desarrolladores.

- -

Ejemplos

- -
<em:developer>Jane Doe</em:developer>
-<em:developer>Koos van der Merwe</em:developer>
-
- -

translator

- -
Edit section
- -

Nuevo en Firefox 2 El/los nombre(s) de traductores. Se deben especificar mas de uno de estos valores para especificar múltiples traductores.

- -

Ejemplos

- -
<em:translator>Janez Novak</em:translator>
-<em:translator>Kari Nordmann</em:translator>
-
- -

contributor

- -

El/los nombre(s) de contribuidores adicionales. Se deben especificar mas de uno de estos valores para especificar múltiples contribuidores.

- -

Ejemplos

- -
<em:contributor>John Doe</em:contributor>
-
-<em:contributor>John Doe</em:contributor>
-<em:contributor>Jane Doe</em:contributor>
-<em:contributor>Elvis Presley</em:contributor>
-
- -

homepageURL

- -

Un enlace a la página inicio del complemento/agregado - Prevista para mostrar en la interfaz de usuario.

- -

Ejemplos

- -
<em:homepageURL>http://www.foo.com/</em:homepageURL>
-
- -

updateURL

- -

Es un enlace a un archivo de manifiesto para actualización personalizada que especifica la disponibilidad de actualizaciones para el complemento/agregado. El fomato se describe abajo. Si está activado el administrador del complemento/agregado periódicamente verificará con este archivo de manifiesto si hay disponibles versiones más recientes.

- -
Atención: Se recomienda fuertemente que el updateURL sea un enlace HTTPS (seguro). Si no es seguro, las updateURL pueden ser secuestradas por un archivo malicioso- update.rdf- permitiendo a malwares (codigo dañino) infiltrarse en la computadora de los usuarios. Alternativamente, usted puede alojar su extensión en AMO y dejar completamente la updateURL. Esto provee actualizaciones seguras automáticamente.
- -

Nuevo en Firefox 3 Por razones de seguridad, las aplicaciones en Gecko 1.9 requieren que si al especificar una updateURL, esta debe ser un URL tipo https, o deberás incluir un updateKey.

- -

Su servidor debe enviar este archivo como text/rdf, text/xml ó aplicación/xml+rdf; o el analizador de actualizaciones no funcionará. 

- -

El administrador de complementos/agregados reemplazará los siguientes valores dentro de la URL en caso que desees generar la respuesta RDF dinámicamente, por ejemplo al usar PHP o CGI:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%REQ_VERSION%La versión de la solicitud. Actualmente 1
%ITEM_ID%La id del complemento/agregado que está siendo actualizado
%ITEM_VERSION%La versión del complemento/agregado que está siendo actualizado
%ITEM_MAXAPPVERSION%La maxVersion del objeto targetApplication que corresponde a la aplicación actual para el complemento/agregado que está siendo actualizado.
%ITEM_STATUS%Nuevo en Firefox 2 Lista separadas por comas de los complementos, estado de funcionamiento de las aplicaciones. Contiene al menos ya sea userEnabled o userDisabled mas cualquier cantidad de incompatible, blockslisted o needsDependencies.
%APP_ID%La id de la aplicación actual
%APP_VERSION%La versión de la aplicación para chequear las actualizaciones
%CURRENT_APP_VERSION%Nuevo en Firefox 3.5 La versión de la aplicación actual
%APP_OS%Nuevo en Firefox 1.5 El valor de OS_TARGET del sistema Firefox, identificando el sistema operativo en el que se está usando.
%APP_ABI%Nuevo en Firefox 1.5 El valor del  TARGET_XPCOM_ABI valor del sistema Firefox, identificando la combinación compilador/arquitectura usada para compilar la aplicación actual.
%APP_LOCALE%Nuevo en Firefox 3 El local actual de la aplicación.
- -

Ejemplos

- -
<em:updateURL>http://www.foo.com/update.cgi?id=%ITEM_ID%&amp;version=%ITEM_VERSION%</em:updateURL>
-<em:updateURL>http://www.foo.com/extension/windows.rdf</em:updateURL>
-
- -

Para complementos/agregados alojados en addons.mozilla.org: No debe una propiedad updateURL. Por defecto, las aplicaciones Mozilla que usan el administrador de complementos/agregados (tales como Firefox y Thunderbird) enviarán peticiones de actualización a addons.mozilla.org usando el servicio web predeterminado. Cada vez que usted suba o publique una nueva versión de su complemento/agregado, o cambie los parámetros de compatibilidad mediante la interfaz de autor, su manifiesto de actualización será generado automáticamente.

- -

Formato del manifiesto de actualización: El manifiesto de actualización es una fuente de datos RDF/XML. Para ejemplos de un manifiesto de actualización, véase Versiones de Extensión, Actualización y Compatibilidad y Habilitación de actualización de extensiones (externas).

- -

Clave de actualización (updateKey)

- -
Edit section
- -

 

- -
-

Introducido en Gecko 1.9

- -
Aplica para Firefox 3 y Thunderbird 3 o más recientes
-
- -
-

Este artículo cubre características introducidas en Firefox 3

-
- -

 

- -

Para mantener la seguridad de las actualizaciones de los datos rdf que son recuperados de http plan debes usa firmas digitales para verificar el contenido de los datos. Con este fin debes incluir la parte pública de la clave criptográfica en una entrada de updateKey en el archivo install.rdf del complemento/agregado. Esta puede generarse usando la herramienta McCoy. Cualquier linea descontinuada y espacio en blanco como parte de esta entrada será ignorada.

- -

Ejemplos

- -
 <em:updateKey>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDK426erD/H3XtsjvaB5+PJqbhj
-               Zc9EDI5OCJS8R3FIObJ9ZHJK1TXeaE7JWqt9WUmBWTEFvwS+FI9vWu8058N9CHhD
-               NyeP6i4LuUYjTURnn7Yw/IgzyIJ2oKsYa32RuxAyteqAWqPT/J63wBixIeCxmysf
-               awB/zH4KaPiY3vnrzQIDAQAB</em:updateKey>
-
- -

optionsURL

- -

La chrome:// URL del cuadro de diálogo de opciones de la extensión. Es útil únicamente para extensiones. Si esta propiedad es especificada, cuando la extensión es seleccionada en la lista de extensiones, el botón de opción está habilitado y mostrará esto:

- -

Ejemplos

- -
<em:optionsURL>chrome://miext/content/options.xul</em:optionsURL>
-
- -

aboutURL

- -

La chrome:// URL del cuadro de diálogo acerca de la extensión, Es útil únicamente para extensiones. Si esta propiedad es especificada, cuando la extensión es seleccionada en la lista de extensiones, el enlace acerca de... en el menú contextual del complemento/agregado mostrará este diálogo, mas bien por defecto.

- -

Ejemplos

- -
<em:aboutURL>chrome://myext/content/about.xul</em:aboutURL>
-
- -

iconURL

- -

Un chrome:// URL de icono 32x32 para mostrar en la lista de complementos/agregados. Si esta propiedad no es especificada, se usará un icono por defecto.

- -
<em:iconURL>chrome://miext/skin/icon.png</em:iconURL>
-
- -
Nota: Par que el ejemplo de arriba funcione deberás agregar además una línea de skin package a tu archivo chrome.manifest. Véase Registro de Chrome#Pieles. Alternativamente puedes ubicar tu icono en el directorio especificado en su linea de content package (contenido del paquete).
- -

hidden

- -

Valor booleano que cuando es true (verdadero) provoca que el complemento/agregado no se muestre en la lista de complementos/agregados, cuando es proveído el complemento/agregado se instalará en el Area de Acceso Restringido (entonces no trabaja como un complemento/agregado instalado en el perfil). Esto es para la integración de grandes aplicaciones donde no tiene sentido tener una lista de aplicaciones.

- -

Ejemplos

- -
<em:hidden>true</em:hidden>
-
- -

targetPlatform

- -
Edit section
- -

Nuevo en Firefox 1.5 Una cadena que especifica la plataforma que el complemento/agregado soporta. Contiene uno u otro de los valores de OS_TARGET solo ó combinado con TARGET_XPCOM_ABI, separados por un guión bajo (_).

- -

Puedes especificar propiedades para múltiples targetPlatform por manifiesto. Si algún valor concuerda con los parámetros de construcción de la aplicación, será instalado; si no, el usuario recibira un apropiado mensaje de error.

- -

Ejemplos

- -
<em:targetPlatform>WINNT_x86-msvc</em:targetPlatform>
-
-<em:targetPlatform>Linux</em:targetPlatform>
-
-<em:targetPlatform>Darwin_ppc-gcc3</em:targetPlatform>
-
-<em:targetPlatform>SunOS_sparc-sunc</em:targetPlatform>
-
- -

Usualmente, usarías únicamente la parte OS para temas o para extensiones que no son totalmente para plataforma cruzada. Para extensiones que incluyen componentes binarios (compilados), nunca deberá usar el OS solo, sino incluir el ABI (s) con el cual compilaste los componentes. Si deseas incluir múltiples versiones de los componentes, deberías también usar Subdirectorios de Plataforma-específica.

- -

Notas

- - - -

Esta propiedad fué agregada para el Firefox/Thunderbird 1.5. Las versiones previas de estas aplicaciones ignorarán las restricciones e instalarán el complemento/agregado a pesar de la plataforma.

- -

requires

- -
Edit section
- -

Nuevo en Firefox 2 Este apartado tiene una sintaxis similar a la de <em:targetApplication>. Si el complemento/agregado especificado por el apartado <em:id> no es instalado o tienes una versión incompatible, el administrador de extensiones deshabilitará tu extensión y mostrará el mensaje "Requiere items adicionales". Puedes poner tantos apartados <em:requires> como quieras. Tu extensión será deshabilitada si cualquiera de los requisito especificados falla.

- -

Ejemplo

- -
<em:requires>
-   <Description>
-     <!-- Lightning -->
-     <em:id>{e2fda1a4-762b-4020-b5ad-a41df1933103}</em:id>
-     <em:minVersion>0.5pre</em:minVersion>
-     <em:maxVersion>0.5pre</em:maxVersion>
-   </Description>
- </em:requires>
-
- -

Notas

- - - -

Esta propiedad fué agregada para Firefox/Thunderbird 2. Versiones previas de estas aplicaciones ignorarán las restricciones e instalarán el complemento/agregado a pesar de los requisitos.

- -

 

- -

Referencia de propiedades obsoletas

- -

Estas propiedades eran requeridas en viejas versiones del administrador de complementos/agregados, pero han sido reemplazadas por nuevos y mejores mecanismos.

- -

file

- -

Firefox 1.0 Esta propiedad apunta a un archivo chrome .jar que contiene paquetes chrome que requieren ser registrados con el registro de chrome.

- -

La propiedad <em:file> tiene un complejo valor de objeto. El uri(Uniform Resource Identifier - Identificador Uniforme de Recurso) del valor es urn:mozilla:extension:file:jarFile.jar donde jarFile.jar es el nombre del archivo jar que contiene el paquete de archivos de chrome. Este podría ser también el nombre de un directorio que contiene los archivos del paquete chrome, des-jareado (e.g. urn:mozilla:extension:file:directory). En todo caso, el referido paquete de archivos chrome debe estar ubicado en el subdirectorio chrome de los XPI.

- -

Este objeto tiene una propiedad package (con una ruta dentro del archivo jar o del directorio que lleva a la ubicación del archivo contents.rdf que es el responsable del registro del paquete), una propiedad locale (ídem, pero registra el locale) y una propiedad skin (ídem, pero para registrar el material del tema).

- -

En extensiones para Firefox 1.5, esta propiedad ya no es necesaria: el chrome.manifest en el nivel más alto del XPI es usado para ubicar el chrome a registrar. Si no hay chrome.manifest, esta propiedad es aún leída por el administrador de complementos/agregados y un chrome.manifest es generado a partir del antiguo archivo contents.rdf.

- -

Ejemplos

- -
<em:file>
- <Description about="urn:mozilla:extension:file:myext.jar">
-  <em:package>content/myext/</em:package>
-  <em:locale>locale/en-US/myext/</em:locale>
-  <em:skin>skin/classic/myext/<em:skin>
- </Description>
-</em:file>
-
- -

Un manifiesto de instalador puede especificar múltiples propiedades file; una para cada archivo jar o subdirectorio que contenga el chrome a registrar.

- -

Glosario

- -

Acceso de área restringida

- -

Un Area de Acceso Restringido es una ubicación para instalar que puede estar restringida en una cuenta de acceso-restringido, no importando si la ubicación está restringida aún con los privilegios del usuario actual.  (véase nsIInstallLocation::restricted ). Actualmente, la carpeta $APPDIR)/extensions y la ubicación del registro de instalación bajo HKEY_LOCAL_MACHINE (véase Agregando Extensiones usando el Registro de Windows (para detalles) están restringidas.

- -

Las ubicaciones de instalación ($PROFILE)/extensions y HKEY_CURRENT_USER, por otro lado no están restringidas.

diff --git "a/files/es/manipular_marcadores_usando_el_cat\303\241logo/index.html" "b/files/es/manipular_marcadores_usando_el_cat\303\241logo/index.html" deleted file mode 100644 index 64571624cd..0000000000 --- "a/files/es/manipular_marcadores_usando_el_cat\303\241logo/index.html" +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: Manipular marcadores usando el catálogo -slug: Manipular_marcadores_usando_el_catálogo -tags: - - Places - - páginas_a_traducir -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", -1);
-
- -

This code locates the Bookmarks menu's folder, then creates a new folder named "Folder name here" in it. Specifying -1 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 toolbarFolder.

- -

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/", "", "");
-var newBkmkId = bmsvc.insertBookmark(newFolderId, uri, -1, "");
-
- -

This example instantiates the IO service 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 newFolderId.

- -

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/", "", "");
-var bookmarksArray = bmsvc.getBookmarkIdsForURI(uri, {});
-
- -

After executing this code, the array bookmarksArray 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);
-alert(thisTitle);
-
- -

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);
-alert(thisURI.spec);
-
- -

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:

- -
uri = ios.newURI("http://mozilla.com/", "", "");
-bmsvc.changeBookmarkURI(newBkmkId, uri);
-
- -

This example changes the bookmark to refer to the Mozilla web site instead of Google.

- -

Nota: 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.

- -
if (!bmsvc.isBookmarked("http://www.mozilla.com")) {
-  var uri = ios.newURI("http://mozilla.com/", "", "");
-  bmsvc.insertBookmark(bmsvc.toolbarFolder, uri, -1, "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);
-
- -

See also

- - diff --git a/files/es/manual_de_compatibilidad_de_gecko/index.html b/files/es/manual_de_compatibilidad_de_gecko/index.html deleted file mode 100644 index 94de3fec69..0000000000 --- a/files/es/manual_de_compatibilidad_de_gecko/index.html +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: Manual de Compatibilidad de Gecko -slug: Manual_de_Compatibilidad_de_Gecko -tags: - - Desarrollo_Web - - Desarrollo_entre_navegadores - - Gecko - - NecesitaRevisiónTécnica - - Todas_las_Categorías -translation_of: Archive/Mozilla_Gecko_Compatibility_Handbook ---- -

 

-


-El objetivo de este manual es ayudar a poner al día vuestros sitios web para que funcionen en los navegadores respetando los estándares del Web y que detecten correctamente a Gecko.

-

Si desconocéis los estándares del Web, el artículo Utilización de estándares en vuestras páginas web constituye una introducción útil. (en inglés)

-

Gecko es un navegador ajustable, desarrollado como parte del proyecto de código abierto Mozilla y basado más bien en las normas del W3C que en los códigos propietarios típicos del pasado. Respetar los estándares/normas/pautas del Web simplifica la interacción de los navegadores en el desarrollo y permite la accesibilidad .

-

4.x contra Gecko

-

Desde 1997, numerosos sitios Internet se han concebido para funcionar con Microsoft Internet Explorer 4 o con Netscape Navigator 4. Éstos navegadores fueron desarrollados antes de existir las recomendaciones del W3C para HTML (lenguaje para el formato de hipertextos), CSS (hojas de estilo en cascada) y DOM (modelo de objetos del documento).

-

Éstos navegadores más antiguos, sin estándares del Web, se diferencian de Gecko en numerosos puntos:

-

Los navegadores antiguos

- -

Gecko es un motor de presentación "multiplataforma" compatible con un gran número de versiones de Windows, como Windows XP, Mac OS y Linux. Por esta pluralidad, sus funcionalidades son en general idénticas sea cual sea el soporte usado, al contrario de las versiones de Internet Explorer para Mac e Internet Explorer para Windows que son programas distintos y pueden entonces comportarse de maneras muy diferentes.

-

Prueba rápida de compatibilidad

-

Si vuestro sitio trabaja con las tecnologías propietarias de Netscape 4.x y de Microsoft, consulten el artículo siguiente para conocer rápidamente los principios generales de estas normas. Éste test de compatibilidad será mucho más benéfico para los sitios que utilicen un código simple o que estén en fase de modificación para soportar los estándares.

-

Preparación de los navegadores para la prueba

-

No todos los navegadores que utilizan Gecko contienen Firefox ou Netscape en su cadena "user-agent". Es importante, entonces, verificar que se detectan correctamente navegadores como AOL para Mac OS X.

-

Se pueden descargar varios navegadores de Mozilla. O, si se utiliza la detección de "user-agent", instalar una extensión para Firefox o Mozilla que permitirá «simular» las cadenas "user-agent" de éstos navegadores Gecko. Aquí tiene como hacerlo:

- -

Nota: he dejado lo anterior en inglés porque la extensión lo saca así, si lo ponemos en español habrá gente que se preguntará: dónde es que tengo que picar?

-

Una vez completado el cuadro de diálogo (debería parecerse a lo de abajo), Aceptar y cerrar la ventana «Options». Parece que el enlace no funciona, se puede mirar en el original
-[Image:GeckoCompatibilityHandbook-Configure-UASwitcher.PNG]

- -

Encontrará las cadenas "user-agent" de los navegadores basados en Gecko, aquí. Lo mejor y si es posible, descargue también los diferentes navegadores para probarlos individualmente.

-

Repasando los resultados

-

Los siguientes temas tienen relación con la detección de los navegadores. Para más soluciones de problemas corrientes, siga leyendo.

-
Problema 1: El sitio respeta los estándares Web pero no se muestra correctamente
- -
Problema 2: El sitio certificado Netscape 6.x se muestra incorrectamente en los otros navegadores
- -
Problema 3: El sitio no funciona bien en todos los navegadores Gecko
-

Si todavía tiene problemas, puede consultar la sección de soluciones rápidas de este manual. Además, si usa tecnologías propietarias de Netscape 4.x y/o de Microsoft, puede leer esto para saber rápidamente qué diferencias hay en Gecko.

-

Problemas con AOL o CompuServe

-

Aunque su sitio se muestra correctamente en Netscape 7.x, es importante que lo pruebe también en AOL pour Mac OS X y en CompuServe 7 para verificar la detección del navegador (en inglés) y los posibles problemas de red.

-

Prueba de AOL detrás de un corta-fuego

-

Si debe conectarse a AOL detrás de un corta-fuego, América Online ha abierto los puertos TCP/IP 5.190 y 11.523 para que pueda comunicarse con el servidor de AOL. De esta forma podrá probar su sitio detrás de un corta-fuego, siempre y cuando el administrador de redes haya abierto estos puertos.

-

Tiene que estar conectado a Internet para hacer la prueba de vuestro sitio en AOL; es imposible acceder al sitio en una máquina local vía red local (LAN) sin una conexión Internet. Para más información, ver: Webmaster@AOL (en).

-

Referencias en caso de problemas

-

Como se explica en Utilización de estándares en vuestras páginas web, es necesario escribir la codificación estándar para el buen funcionamiento y la obtención de compatibilidad entre los navegadores Gecko, Netscape 4 y IE .

- -
Síntoma Posible problema Solución
El sitio se muestra correctamente en Netscape 6.x pero no en Netscape 7.x u otros navegadores Gecko. La detección del navegador por JavaScript encuentra a Netscape 6.x pero no a los otros navegadores Gecko.
El contenido se presenta diferentemente en los navegadores Gecko e Internet Explorer. La utilización de códigos propietarios o inválidos (como los generados por varias aplicaciones de Microsoft Office).
  • Use las herramientas de validación de HTML y CSS del W3C para convalidar la página web. Corrija los errores y reemplace los códigos propietarios donde sea posible.
  • Actualice las herramientas de edición web con versiones respetuosas de las normas W3C y de los navegadores Gecko.
El contenido se presenta diferentemente en los navegadores Gecko e Internet Explorer. La consola JavaScript en Netscape, Mozilla o Firefox muestra errores relacionados con: document.all (todo el documento), document.layers (capas del documento), document.<propiedades> los cuales no son definidos a causa de una mala detección del navegador o por la utilización de JavaScript propietario.
  • Actualice:
  1. la detección del navegador para encontrar correctamente los navegadores Gecko.
  2. los "API" para utilizar versiones más recientes conformes a los estándares.
  3. vuestras herramientas de edición web con versiones que funcionen bien con las normas W3C y los navegadores Gecko.
El contenido se muestra diferentemente en los navegadores Gecko e Internet Explorer.
  • Su hoja de estilo (CSS) está trabajando con el código de la CSS de Internet Explorer.
  • Internet Explorer no es sensible a los nombres de ID (Identificación) y de CLASS (Clases) mientras que los navegadores Gecko los identifica y trata como lo que son, con sentido. Una utilización inconsistente de estos nombres (ID y CLASS) en la hoja de estilo y en los elementos HTML provocará la no aplicación de los estilos en los navegadores Gecko.
  • Internet Explorer indica inexactamente la altura y ancho de los elementos lineales, por ejemplo SPAN.
  • Internet Explorer ejecuta incorrectamente el modelo de caja CSS (padding, margin-margen, border-bordes).

Es recomendable: NO

  • utilizar códigos inválidos de las hojas de estilos de Internet Explorer.
  • definir altos y anchos de los elementos lineales como span

Pero sí:

  • usar únicamente la interacción entre navegadores, las funciones y los modelos de caja CSS estándares.
  • especificar de la misma forma los nombres de clase (CLASS) y de identificación (ID) en HTML que en las hojas de estilo.
El contenido se presenta diferentemente en los navegadores Gecko e Internet Explorer. Órdenes incorrectas sobre la manera de interpretar el modo de disposición en DOCTYPE (tipo de documento).
  • Si las páginas deben mostrarse en viejas versiones de navegadores, como Netscape Navigator 4 o Internet Explorer 4 y 5, no se olvide de especificar, en el tipo de documento, la forma en la cual los navegadores tienen que actuar: estándar, estricta o aleatoria. (quirks mode (en)).
Las imágenes aparecen sin áreas blancas entre ellas con Internet Explorer pero sí con unas en los navegadores Gecko. Órdenes incorrectas sobre la manera de interpretar el modo de disposición en el tipo de documento (DOCTYPE)
  • Los modos de disposición estándares han sido pedidos por la orden escrita en el tipo de documento. Cambie ese tipo de documento de manera que trabaje con las órdenes correctas de interpretación. Más información.
Al picar un enlace devuelve el error 404-la página no se ha encontrado, pero sí funciona con Internet Explorer. El enlace utiliza posiblemente una forma inválida de URL relativa.
  • Cambie las URLs relativas http://directory/... por directory/... o utilice direcciones absolutas como http://example.com/directory/...
  • Verifique que todos los hiper-enlaces contienen las barras oblicuas en el sentido correcto (/).
Al picar un enlace dispara una descarga o muestra directamente el código HTML en lugar de presentar la página correctamente, pero sí lo hace de forma prevista con Internet Explorer El servidor web especifica incorrectamente el tipo MIME del contenido. Internet Explorer intenta adivinar este tipo MIME en los documentos cuando los navegadores Gecko confían en el servidor web para conocer el buen tipo MIME. Gecko no intenta leer el tipo MIME de un documento para reducir las posibilidades de procesar contenidos poco seguros o peligrosos enmascarados como un tipo MIME seguro.
  • Aproveche la utilidad HEAD de Perl o PHP para determinar el tipo MIME real usado por el servidor Web. Corrija todos los tipos incorrectos en el servidor. (Artículo relacionado).
La hoja de estilo no es reconocida. La presencia de un atributo title en un enlace link que se refiere a un hoja de estilo externa puede hacer que la CSS sea ignorada.
  • Asegúrese que todas las hojas de estilo sean aplicadas de manera persistente antes que sólo preferidas. (Artículo relacionado).
Falla la conexión a un sitio seguro con un navegador Gecko, pero funciona con Internet Explorer. El servidor web no empieza correctamente la ejecución de la negociación para SSL.
  • El administrador del servidor web debe actualizar su programa de servicio seguro.
  • Para navegar en un sitio con ejecución defectuosa de SSL, los visitantes deberán desactivar el protocolo TLS en Netscape 6/7 o Mozilla hasta que el sitio este actualizado con versiones que lo aceptan.
Los menús DHTML usando HierMenu tienen problemas.

La versión de HierMenu es obsoleta.

  • Las más antiguas soportan sólo Netscape Navigator 4.x, Internet Explorer 4.x y siguientes.
  • Las un poco más recientes: Netscape 6 y a partir de Netscape 6.1 y posteriores, la ayuda de las propiedades propietarias offsetXXX de Internet Explorer hace que HierMenu ponga unas ventanas emergentes (popups) en posiciones equivocadas.
  • Las últimas versiones de HierMenu funcionan plenamente en todos los navegadores Gecko.
-

Problemas corrientes ligados al código y el servidor Web

-

Esta sección detalla las soluciones a los problemas más corrientes que afectan a los navegadores reopetuosos de los estándares así como preguntas específicas a Gecko.

-

HTML propietario

-

Problema: utilizar etiquetas HTML de un navegador propietario específico (tal como: <LAYER> capa).

-

Puesto que se supone que un navegador ignora las etiquetas que no reconoce y devuelve el contenido dentro de ellas, los autores de páginas web han combinado los códigos HTML propietarios para que sus páginas se muestren correctamente en cualquier navegador.

-

Los navegadores Gecko ignorarán las etiquetas HTML propietarias de Internet Explorer y Netscape Navigator 4. Así pues, una página web no se mostrará en los navegadores Gecko de la misma manera que en Internet Explorer 4 o Netscape Navigator 4.

-

El ejemplo principal es la utilización de la etiqueta <LAYER> propietaria de Netscape Navigator 4, corrientemente usada para la navegación en un sitio. Para saber las alternativas basadas en estándares, ver este artículo. (en).

-

Podemos verificar rápidamente la correcta utilización de las etiquetas HTML propietarias en una página sometiéndola al verificador de HTML del W3C usando el tipo de documentos HTML 4.01. Abordaremos detalladamente los tipos de documentos (DOCTYPE) más adelante, pero esencialmente, sirven para indicar al navegador cual es la versión HTML de la página.

-

La Referencia de interacción de elementos HTML (en) facilita una lista de todos los elementos HTML sostenidos en Netscape 4, los navegadores Gecko, Internet Explorer 4 y superiores, y se puede utilizar para determinar qué elementos son soportados para todos los navegadores.

-

Detección del navegador

-

Problema: mala detección del navegador o interpretación del código

-

Mientras que la detección es útil para permitir a los autores escribir páginas web que sólo trabajen con navegadores específicos, una equivocada detección podrá conducir a una mala experiencia de los usuarios.

-

Numerosos problemas pueden surgir cuando una página web usa la detección de un navegador para determinar que características propietarias utiliza un navegador en particular.

-

Consulte el artículo Detección del navegador y soporte entre ellos para un mejor entendimiento. (en inglés)

-

Entorno de trabajo de un navegador específico

-

Problema: el código incluye el entorno de trabajo de "bugs" y comportamientos aleatorios (quirks mode) de navegadores específicos.

-


-Puesto que una página web no se juzga por su código sino por la apariencia en la pantalla de los navegadores, los autores han desarrollado numerosas técnicas que aprovechan la idiosincrasia (carácter) en los navegadores particulares para conseguir los efectos deseados. Tiene pues una particular importancia ya que en las primeras puestas en práctica de las CSS encontradas en Internet Explorer 4 y Netscape Navigator 4 habían varios "bugs". Para conseguir obtener los efectos deseados, los autores escribieron los códigos HTML y JavaScript que dependían de estos "bugs" para que funcionara correctamente.

-

Ésto puede provocar problemas con los navegadores Gecko por ejecutar estrictamente los estándares. La vieja escritura de «codificar para los "bugs"» ya no funciona en Mozilla, Netscape 6.x/7.x y todos los otros navegadores Gecko.

-
Ejemplo - Poniendo formularios en una tabla
-

HTML no válida para eliminar el salto de línea en <FORM>.

-

En los antiguos navegadores, el resultado hacía que la celda TD envolviera herméticamente un elemento de entrada input.

-
<table border="1">
-  <tr>
-    <form name="formulario2">
-      <td>
-        <input type="texto">
-      </td>
-    </form>
-  </tr>
-<table>
-
-

Este acercamiento es comúnmente utilizado para dar la vuelta al hecho que <FORM> es un elemento en bloque en HTML y que simplemente empezará en una nueva línea en la página. Lamentablemente, éste código ya no es válido, puede provocar errores durante la presentación en pantalla y en la aplicación de las reglas de la hoja de estilo.

-
Uso incorrecto del código vacío en una etiqueta XML
-

Numerosos autores utilizan la anotación vacía en etiqueta XML (<tag />) en sus ficheros HTML. En XML, una etiqueta vacía no tiene nunca contenido. Las directivas de compatibilidad hacia atrás del XHTML estipulan que los elementos vacíos pueden ser codificados poniendo después del nombre de la etiqueta un espacio seguido de un signo como en "<tag />". Para ser compatible, necesita tener un espacio antes del cierre " />". Además, se debe utilizar ésta codificación XML sólo para los elementos HTML que son siempre vacíos — y no para elementos HTML que poseen una etiqueta opcional de cierre.

-

Por ejemplo, es correcta la forma: <br /> para codificar <br>, aún cuando no hay ventaja alguna de hacerlo en documentos HTML. Pero es incorrecto usar: <option /> para <option>. Para entender por que, consideramos lo siguiente:

- -
HTML sin etiqueta opcional de cierre HTML equivalente con etiqueta opcional de cierre
-<select>
-<option>Valor de la opción
-</select>
-<select>
-<option>Valor de la opción</option>
-</select>
-

Ahora veamos que pasa al utilizar la escritura de etiqueta XML vacía " /></tt>".

- -
HTML con código de etiqueta XML vacía HTML equivalente con etiqueta de cierre
-<select>
-<option />Valor de la opción
-</select>
-<select>
-<option></option>Valor de la opción
-</select>
-

Es simplemente incorrecto. Si debe utilizar la anotación de etiqueta XML vacía, entonces hacerlo únicamente para elementos HTML que no tengan nunca contenido — no para elementos HTML que tienen un cierre opcional.

-
Las identificaciones (ID) de las hojas de estilo deben ser tenidas en cuenta
-

Gecko responde correctamente a los identificadores ID de la hoja de estilo y presentará bien este ejemplo, mientras que Internet Explorer que no los tiene en cuenta no lo presentará.

-
<style type="text/css">
-  #id1 { text-decoration: line-through; }
-  #ID1 { text-decoration: underline; }
-</style>
-<div id="id1">
-  Debería estar tachado (line-through)
-</div>
-<div id="ID1">
-  Debería estar subrayado (underline)
-</div>
-

-(EJEMPLO SUPRIMIDO)-

-

Observe que el verificador de HTML del W3C señalará con una bandera a los atributos de los ID de HTML como duplicados sólo en el caso que difieran (sean diferentes). Parece ser que hay una inconsistencia entre la recomendación de HTML 4.01 y la declaración de SGML para el HTML en si los atributos del identificador ID se toman en cuenta o no. Esto es una lástima ya que el verificador de HTML es para los desarrolladores web uno de sus principales medios de aprendizaje de los estándares.

-

Debido a este común error, Netscape 6.2 no hace caso a los atributos de ID de CSS en modo de compatibilidad aleatoria (quirks mode). Si se invoca el modo de respeto de los estándares, convendrá ser consistente en escribirlo en las hoja de estilo de manera que se respete.

-
Los nombres de clase de la hoja de estilo deberían ser tomados en cuenta
-

Gecko hace caso a los nombres de clase de las hojas de estilo (CLASS) y por eso presentará correctamente este ejemplo, mientras que Internet Explorer hace caso omiso, por lo tanto no lo sacará bien en la pantalla.

-
<style type="text/css">
-  .class1 { font-size: 1em; }
-  .CLASS1 { font-size: 2em; }
-</style>
-<div>
-<div class="class1">
-  Debería tener la medida de fuente: 1em;
-</div>
-<div class="CLASS1">
-  Debería tener la medida de fuente: 2em;
-</div>
-

-(EJEMPLO SUPRIMIDO)-

-

Por este común error de los autores de páginas web, Netscape 6.2 tampoco hace caso de los atributos de clase CLASS en modo de compatibilidad aleatoria (quirks mode). Si se invoca el modo de respecto de los estándares, hay que definirlo correctamente en las hojas de estilo (CSS) para que sea tomado en cuenta.

-
Enlaces (URLs) relativos incorrectos
-

Una URL relativa se refiere al mismo servidor web que alberga a la página web.

- -

Los antiguos navegadores aceptaban la utilización incorrecta: http://directorio/ parar las direcciones relativas al directorio raíz del servidor web, pero no es el caso de los navegadores Gecko. Para especificar correctamente el enlace a una página del directorio raíz del servidor web, use esta forma: /directorio/pagina.html.

-
La utilización inválida de espacios en los nombres de atributos (por ejemplo: mapas de imágenes)
-

Muchos autores parecen infectados por la manía de utilizar espacios en los nombres. Un atributo name o id en HTML 4.01 no puede conformemente al W3 contener espacios. Esto puede dar problemas en los navegadores basados en Gecko, especialmente en los mapas de imágenes. Conviene, por eso, verificar que los nombres de atributos contengan sólo caracteres válidos.

-

Mala codificación debida a "API" y herramientas anticuadas

-

Problema: unas "APIs" o herramientas de edición obsoletas generan un código no estándar.

-

Muchas versiones antiguas de "API" de interacción entre navegadores comúnmente usadas como DYNAPI (en), no aguantan a Gecko por una u otra razón citada más arriba. Es igualmente el caso de antiguas versiones de herramientas de edición web como Macromedia Dreamweaver 2 y 3.

-

Sin embargo las versiones más recientes de "API" y de herramientas web soportan a Gecko. Por ejemplo, DYNAPI (en) es ahora mantenido en SourceForge y ofrece una versión compatible con Gecko. Las nuevas Herramientas de edición respetuosas de los estándares también soportan a Gecko.

-

Tipo de documento (DOCTYPE) impropio, mal codificado

-

Problema: el tipo de documento incorrecto puede alterar completamente la presentación de las páginas.

-

Gecko, Internet Explorer para Mac OS e Internet Explorer 6 utilizan todos la técnica de detección del tipo de documento para determinar la forma de presentación, si debe ser en modo compatible con los antiguos navegadores o conformemente a las normas W3C.

-

Usando el tipo de documento apropiado en el HTML permite a los autores de páginas web hacer que soporten tanto, los viejos navegadores menos conformes, que los nuevos, especificando en él, el modo de composición elegido. Al paso del tiempo y con la progresiva desaparición de los viejos navegadores en el mercado, los autores de páginas web pueden efectuar la transición hacia las normas W3. (Artículo relacionado).

-

Mientras que la detección de la declaración del tipo de documento es útil para permitir el soporte de viejos navegadores, puede ser un problema para los de última generación como Netscape 6.x y Netscape 7.x si se especifica incorrectamente el modo de composición.

-

Gecko tiene dos modos de composición: el de compatibilidad aleatoria (quirks) y el de respeto estricto de los estándares (standards). El modo aleatorio imita el comportamiento de Netscape Navigator 4 cuando el estricto sigue las recomendaciones para HTML y CSS del W3C. En particular, el modo estricto utiliza el modelo de caja CSS como se define en el Capítulo 10 de las recomendaciones sobre CSS 2. El modo de presentación es determinado con la ayuda en la declaración del tipo de documento (o de su carencia) al principio de documento HTML.

-

Escritura inválida para dejar un comentario

-

Gecko posee también tres modelos de análisis de compatibilidad: modo aleatorio (quirks), modo casi-estándar (en) y modo estricto de los estándares. El modo aleatorio permite la utilización no válida de más de dos guiones "--" para dejar un comentario, lo cual no dejan hacer los otros modos.

-
<!---- Ésto es un comentario HTML '''inválido''' pero aceptado en el análisis aleatorio de comentario ---->
-
-<span class="highlightblue"><!-- Ésto es un comentario '''válido''' aceptado en el análisis estricto de comentario --></span>
-

Para saber las reglas exactas de como se invoca desde la declaración en el tipo de documento al modo aleatorio vs. al modo estricto con los estándares, consulten este artículo.

-

Codificación de plugins (pequeñas aplicaciones para la web)

-

Habrá visto que algunos "plugins" no se comportan de la misma forma en Gecko y en Netscape Navigator 4. Visite la página plugins para más información sobre la codificación de los navegadores Gecko, el buen uso de las etiquetas, los cambios en la arquitectura comparado con la generación Netscape 4, y las sugerencias de estratégias para plugins.

-

Problemas de configuración en el servidor web

-

Tipos MIME especificados incorrectamente

-

Muchos servidores web especifican incorrectamente los tipos MIME para los ficheros. Los navegadores Gecko requieren que el servidor web defina correctamente el tipo MIME correspondiente al tipo de contenido:

- -

Mala ejecución del protocolo HTTP

-

Varios servidores ejecutan incorrectamente el protocolo HTTP, lo cual puede dar problemas en Netscape 6.

-

Mala ejecución del protocolo SSL

-

Los antiguos navegadores tal como Internet Explorer 4 et Netscape Navigator 4 ejecutaban versiones viejas del protocolo SSL. La versión más común ahora es SSL 3.0, empero, la última versión: TLS (SSL 3.1), la cual es soportado por los navegadores Gecko, no lo es aún por varios servidores web. Desgraciadamente, varios procedimientos de SSL 3.0 ejecutan incorrectamente la negociación de qué versión de SSL hay que usar y fallan en la conexión con Gecko.

-

Para más información sobre esta cuestión, lea: Notas sobre TLS - Servidores SSL 3.0 intolerantes.

-

Recursos útiles

- -

Referencias

- -
-

Información sobre el documento original

- -
-

Interwiki Languages Links

-

diff --git "a/files/es/marcado_xml_en_los_microres\303\272menes/index.html" "b/files/es/marcado_xml_en_los_microres\303\272menes/index.html" deleted file mode 100644 index 3b903dc9c9..0000000000 --- "a/files/es/marcado_xml_en_los_microres\303\272menes/index.html" +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: Marcado XML en los microresúmenes -slug: Marcado_XML_en_los_microresúmenes -tags: - - Esbozos - - Microresúmenes - - Todas_las_Categorías -translation_of: Archive/Mozilla/Microsummary_topics/XML_grammar_reference ---- -

-

Borrador
- Esta página no está completa.

- -

-

Introducción

-

Un generador de microrresúmenes es un documento XML que describe la forma de recuperar información específica desde una página web para ser presentada de forma resumida como un marcador cuyo título cambia basándose en el contenido de la página que referencia.

-

Este artículo proporciona información detallada sobre la gramática XML usada para construir generadores de microrresúmenes, describiendo cada elemento y sus atributos. Puedes ver una introducción de cómo crear un microrresumen leyendo el artículo Crear un microrresumen.

-

Ejemplo

-

A continuación se muestra el generador de microrresúmenes creado en el tutorial Crear un microrresumen.

-
<?xml version="1.0" encoding="UTF-8"?>
-<generator xmlns="http://www.mozilla.org/microsummaries/0.1" name="Firefox Download Count">
-  <template>
-    <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0">
-      <output method="text"/>
-      <template match="/">
-        <value-of select="id('download-count')"/>
-        <text> Fx downloads</text>
-      </template>
-    </transform>
-  </template>
-  <pages>
-    <include>http://(www\.)?spreadfirefox\.com/(index\.php)?</include>
-  </pages>
-</generator>
-
-

Espacio de nombres

-

El URI del espacio de nombres para los documentos XML generadores de microrresúmenes es:

-
http://www.mozilla.org/microsummaries/0.1
-
-

Todos los elementos en un documento generador de microrresúmenes deben de estar en este espacio de nombres excepto los descendientes del elemento <template>, el cual debe de estar en el espacio de nombres de XSLT:

-
http://www.w3.org/1999/XSL/Transform
-
-

El elemento <generator>

-

El elemento <generator> es la etiqueta raíz para todos los generadores de microrresúmenes y debe de contener el resdo del código XML que describen al generador.

-

Atributos:

-
-
- name (requirido)
-
- Un nombre descriptibo y legible para el microrresumen creado por el generador.
-
- uri (opcional)
-
- Un URI único válido que identifique al generador. Sólo es relevante para los generadores creados dinámicamente por el código y las extensiones de Firefox. Los generadores instalados desde el web vía nsSidebar::addMicrosummaryGenerator son identificados por la URL remota desde la que son descargados. Para éstos, Firefox ignorará el valor de este atributo.
-
-

Elementos hijos:

-
-
- <template> (requerido)
-
- Especifica cómo transformar páginas en sus microrresúmenes.
-
- <pages> (requerido)
-
- Identifica el conjunto de páginas que el generador es capaz de resumir.
-
- <update> (opcional)
-
- Especifica cada cuanto tiempo debe Firefox actualizar los microrresúmenes.
-
-

El elemento <template>

-

El elemento <template> contiene la hoja de estilos XSLT que transforma páginas web en sus microrresúmenes.

-

Atributos:

-

- - Ninguno. -

-

Elementos hijos:

-
-
- <stylesheet> o <transform> (requeridos)
-
- La hoja de estilos XSLT que realiza la transformación.
-
-

Para cada XSLT, debes especificar el elemento hijo de hojas de estilo usando o bien <stylesheet> o bien la etiqueta <transform>, las cuales son intercambiables.

-
-

Nota: Aunque el elemento <template> debe de estar en el espacio de nombres del microrresumen (http://www.mozilla.org/microsummaries/0.1), sus elementos <stylesheet>/<transform> deben de estar en el espacio de nombres de XSLT (http://www.w3.org/1999/XSL/Transform).

-
-

El elemento <pages>

-

El elemento <pages> identifica el conjunto de páginas que el generador es capaz de resumir.

-

Atributos:

-

- - Ninguno. -

-

Elementos hijo:

-
-
- <include> (opcional)
-
- Una expresión regular que coincide con las URLs de las páginas que el generador es capaz de resumir.
-
- <exclude> (opcional)
-
- Una expresión regular que coincide con las URLs de las páginas que el generador es incapaz de resumir.
-
-

El elemento <pages> puede contener cero o más elementos hijos <include> y <exclude>, cada uno de los cuales puede contener una expresión regular compatible con JavaScript. No debe de contener ningún otro elemento y no tiene ningún attributo.

-

Cuando un generador es examinado para determinar si es capaz o no de resumir una página, las expresiones regulares proporcionadas por los elementos hijos son evaluadas con la URL de la página. Un generador es considerado capaz de resumir una página si al menos una de las expresiones <include> coincide con la URL de la página y ninguna de las expresiones <exclude> coincide con la URL de la página.

-

El orden en el que los elementos hijos aparecen en el elemento <pages> no es relevante. Los espacios en blanco entre los elementos hijos y las expresiones regulares tampoco importan; no se consideran parte de la expresión regular y no afectan a la evaluación de dichas expresiones.

-

El siguiente ejemplo identifica un generador como aquel capaz de resumir todas las páginas del sitio web www.example.com excepto las páginas llamadas about.html:

-
<pages>
-  <include>
-    ^http://www\.example\.com/
-  </include>
-  <exclude>/about\.html</exclude>
-</pages>
-
-
- Nota: Las expresiones regulares diseñadas para coincidir con el comienzo de las URLs de las páginas deberían de empezar con el acento circunflejo(^) para asegurar que no coinciden por error con las URLs que simplemente contienen la URL con la que pretenden coincidir. Por ejemplo, la expresión regular http://www\.example\.com/ coincidirá tanto con la URL http://www.example.com/ como en la URL http://www.evil.com/http://www.example.com/, pero la expresión regular ^http://www\.example\.com/ sólo coincidirá con la primera de las anteriores dos URLs.
-

Véase la referencia Core_JavaScript_1.5_Reference:Global_Objects:RegExp para detalles sobre la sintaxis válida de las expresiones regulares para los generadores y el tutorial Crear expresiones regulares para generadores de microrresúmenes para seguir paso a paso las instrucciones sobre cómo escribir expresiones regulares que coincidan con URLs.

-

El elemento <include>

-

El elemento <include> identifica un conjunto de páginas que el generador es capaz de resumir. Debe de ser hijo del elemento <pages> y debe de contener una expresión regular compatible con JavaScript.

-

Para más información sobre el uso de este elemento, véase la entrada para #The_<pages>_element.

-

El elemento <exclude>

-

El elemento <exclude> identifica un conjunto de páginas que el generador no es capaz de resumir. Debe ser hijo del elemento <pages> y debe de contener una expresión regular compatible con JavaScript.

-

Para más información sobre el uso de este elemento, véase la entrada para #The_<pages>_element.

-

El elemento <update>

-

El elemento opcional <update> especifica cada cuánto tiempo debe Firefox actualizar los microrresúmenes generados por el generador. El elemento puede ser usado para especificar tanto un intervalo absoluto de actualización como una serie de intervalos condicionales basados en el contenido de la página que está siendo resumida.

-

Atributos:

-
-
- interval (opcional)
-
- Es el intervalo de tiempo absoluto (en minutos) que debe de transcurrir entre las actualizaciones.
-
-

Child Elements:

-
-
- <condition> (opcional)
-
- Una expresión XPath booleana junto con el intervalo de tiempo (en minutos) que debe de transcurrir entre las actualizaciones si la expresión se evalua a true.
-
-

El atributo interval define un intervalo absoluto en minutos. Su valor debe de ser un número mayor o igual que 1. Los valores decimales (p.e.: 5.5 minutos) están permitidos aunque probablemente no sean útiles.

-

El elemento <update> puede contener cualquier número de elementos hijos <condition>.

-

Firefox determina qué intervalo aplicar a un microrresumen generado por un generador de acuerdo a las siguiente reglas:

-
    -
  1. Firefox procesa cada elemento hijo <condition> en el orden en el que aparecen en el documento. Para cada uno, Firefox evalúa la expresión XPath booleana del elemento contra la página que va a ser resumida. Si la expresión se evalúa a true, Firefox aplicará el intervalo de ese elemento y detendrá el procesado de los elementos hijos. Así, la primera <condition> que coincida determinará el intervalo de actualización.
  2. -
-
    -
  1. Si no hay elementos hijos <condition> o si ninguna de sus expresiones se evalúa a true, Firefox aplicará el valor del atributo interval del elemento <update>.
  2. -
-
    -
  1. Si el elemento <update> no incluye un atributo interval, Firefox aplicará el intervalo especificado por la entrada browser.microsummary.updateInterval en las preferencias.
  2. -
-
    -
  1. Si esa entrada no ha sido establecida, Firefox aplicará su intervalo de actualización por defecto, el cual dura 30 minutos.
  2. -
-

Notas:

- -

El elemento <condition>

-

El elemento opcional <condition> especifica una expresión XPath booleana junto con un intervalo de tiempo condicional (en minutos) que debe de transcurrir entre las actualizaciones si la expresión se evalúa a true cuando se evalúa contra la página que va a ser resumida. Debe de ser hijo del elemento <update>.

-

Atributos:

-
-
- expression (requerido)
-
- Una expresión XPath booleana para ser evaluada contra la página que va a ser resumida.
-
- interval (requerido)
-
- Un intervalo de tiempo, en minutos, que debe de transcurrir entre las actualizaciones si la expresión se evalúa a true.
-
-

Elementos hijos:

-

- - Ninguno. -

-

Para más información acerca del uso de este elemento, véase la entrada para #The_<update>_element.

-

Ver también

- diff --git a/files/es/mdn/contribute/howto/enlace_cuenta_github/index.html b/files/es/mdn/contribute/howto/enlace_cuenta_github/index.html deleted file mode 100644 index 825081aead..0000000000 --- a/files/es/mdn/contribute/howto/enlace_cuenta_github/index.html +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Como unir tu cuenta GitHub a tu perfil MDN -slug: MDN/Contribute/Howto/enlace_cuenta_GitHub -translation_of: Archive/MDN/Howto_Link_a_Github_account ---- -
{{MDNSidebar}}
- -
{{IncludeSubnav("/en-US/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.

-
- -

Debido a que el sistema de autentificacion de Persona  Mozilla esta siendo cerrado, todos los usuarios que deseen contribuir a MDN necesitaran otra manera de ingresar desde el 1 de Noviembre del 2016. Actualmente, la unica alternativa soportada es  GitHub, debido a esto necesitaras una cuenta en GitHub para editar y contribuir apartir de esta fecha. Este articulo describe como añadir la autentificacion de GitHub  a tu perfil MDN.

- -
-

Debes hacer esto antes del 1 de Noviembre de 2016, o no tendras modo de ingresar a MDN!

-
- -

Descripción

- -

Añadir la autentificacion mediamte GitHub a tu cuenta no es dificíl. Entraremos en detalle más adelante, pero primero, aqui hay una pequeña lista de pasos necesarios:

- -
    -
  1. ingresa a tu cuenta MDN mediante Persona.
  2. -
  3. Ve a la pagina cuentas asosiadas.
  4. -
  5. Añade la autentificacion GitHub.
  6. -
- -

Instrucciones Detalladas

- -

Esta es una guia paso a paso de todo lo que necesitas saber.

- -

Ingresar a tu cuenta MDN

- -
    -
  1. En la parte superior de la pagina de MDN, hubica el mouse sobre Registrarse o da tap para llegara este cuadro. aqui se muestran los metodos de autentificacion disponibles, Persona y GitHub.
    - Sign in box on MDN, showing Persona and Github.
  2. -
  3. Seleciona Persona, y usa tus datos de usuario usuales. si obtienes un error de inicio no reconocido, asegurese de estar ingresando la cuenta de correo con la que se unio a MDN, esta puede ser su direccion de correo usual. Si aún tienes problemas, mira {{anch("Persona no me reconoce")}}.
  4. -
- -

Ir a la pagina "cuentas asociadas"

- -

Existen dos maneras de llegara esta pagina.

- -

La primera y mas gacil es dar click en el siguiente link.

- -

Otra manera seria, haciendo:

- -
    -
  1. Dar Click en tu nombre de usuario en la parte superior de cualquier pagina MDN. (en la misma posicion donde aparecia Registrarse cuando aún no habia ingresado.) Esta lo enviara a su pagina de perfil.
  2. -
  3. Abra el "menu", y da click en Cuentas Asociadas.
    - Gear menu in profile, showing the "Account connections" option
  4. -
- -

Añadir autentificación GitHub

- -

You're now on the "Account connections" page, which lists the external accounts you've already linked to your MDN profile. If GitHub is already listed, congratulations! You're ready to go! But test it to be sure you remember your password, by signing out of MDN and signing back in using your GitHub credentials.

- -

If GitHub isn't already listed, then near the bottom of the page, look below the list of already-linked external accounts. There you'll find a section called Connect a new account, which lists the types of accounts you can connect to your MDN profile. It looks something like this:

- -

- -

To add GitHub:

- -
    -
  1. Click  Connect with GitHub. MDN will contact GitHub to request  permission to link the accounts.  If you're not already signed in to GitHub, you'll be asked to do so:
    - Screenshot of GitHub sign in window.
  2. -
  3. If you have two-factor authentication enabled on your GitHub account, you'll be asked to enter your authentication code:
    - Screenshot of GitHub's Two-factor authentication window.
  4. -
  5. Now that you're signed in to your GitHub account, you'll be asked to authorize the link between GitHub and MDN (unless you already have this authorization on file for some reason). This page is shown below.
    - Screenshot of GitHub "Authorize application" window.
    - Click the green Authorize application button to grant permission for your MDN profile to access your GitHub account. If the GitHub account is successfully linked to your MDN profile, you'll see this message:
    - Account successfully created.
  6. -
- -

Not only can you now use GitHub to sign in to MDN, but you're actually already signed in using your GitHub authentication! You're now ready for the Persona shutdown. Be sure to update any password managers you may have installed, if necessary.

- -

Troubleshooting

- -

If you run into problems while trying to add your GitHub account to your profile, hopefully the troubleshooting tips below will help. If they don't, please don't hesitate to ask us for help on the MDN Web Docs chat room.

- -

Error: Could not find profile matching account

- -

If you try to add your GitHub account to your profile and get the error "Could not find profile matching account," it can mean a few different things. If you have multiple accounts on your GitHub account, there may be some confusion; GitHub may not report the expected email address to MDN during the account pairing attempt, which will result in this error. Other glitches in the process may also result in the same error message.

- -

One way to work around this problem: open a new private window in your browser; in Firefox, for example, choose "New Private Window" in the File menu (or press Ctrl+Shift+P [Cmd-Shift-P on Mac]). Browse to MDN there, sign into your MDN account, then try again to add your GitHub account to your profile as covered above.

- -

Also, be sure that when you try to log into Persona to

- -

My GitHub authorization is not displayed on the Account Connections page.

- -

That might be a caching issue. Reloading the page or loggin out and loggin in again should solve the problem.

- -

Persona doesn't remember me

- -

If you try to log into Persona so you can add a GitHub login to your MDN account and get told "Your email address is new to us," this is likely because it's been long enough since you last logged into Persona that they've deleted your email address from their system. This happens after some period of time; the Persona login window looks like this in that situation:

- -

- -

If this happens, you need to simply follow Persona's instructions to create a new password for that email address. MDN doesn't care about this process; the fact that your email address matches up is all that matters. A confirmation email will be sent to verify that you own the email address, probably from no-reply@persona.org. If you have spam filtering, it may be sent to your spam folder.

- -

Once you've finished the process of setting the password for the email address you used to log into MDN, your access to MDN will be restored. Then you can follow the steps in {{anch("Detailed instructions")}} above to add your GitHub login to your MDN account.

- -

See also

- - diff --git a/files/es/mdn/contribute/registro_persona/index.html b/files/es/mdn/contribute/registro_persona/index.html deleted file mode 100644 index 37cad64b07..0000000000 --- a/files/es/mdn/contribute/registro_persona/index.html +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Registro MDN y Persona -slug: MDN/Contribute/Registro_Persona -tags: - - Documentación - - MDN - - MDN Meta - - Mozilla - - Persona -translation_of: Archive/MDN/Persona_sign-ins ---- -
{{MDNSidebar}}
-

Por favor Enlaza tu cuenta GitHub a tu perfil  MDN ahora

- -
, para que puedas continuar accediendo en MDN.
- -

 

-
- -

Actualmente, MDN permite a los colaboradores iniciar sesión proveiendo dos tipos diferentes de autenticación: Mozilla Persona y GitHub. A partir del 1 de noviembre del 2016, eliminaremos la opción Persona para iniciar sesión. Por lo tanto, deberás habilitar la autenticación de Github en tu perfil para evitar perder el acceso de inicio de sesión a MDN.

- -

Reconocemos que esto es un inconveniente, y nos disculpamos por ello. Desafortunadamente, esto esta fuera de nuestro control.

- -

¿Porqué Persona sera eliminado?

- -

Mozilla ha cerrado el proyecto Persona, y sus servidores serán desactivados en Noviembre del 2016. Puedes obtener mas información sobre la decisión de Mozilla para retirar Persona de Mozilla wiki.

- -

¿Cuándo será eliminado Persona?

- -

Vamos a desactivar Persona como un proveedor de autenticación el 1 de Noviembre del 2016; en otras palabras, el ultimo dia que podrás tener acceso para iniciar sesión en MDN usando Persona sera el 31 de Octubre del 2016. Estaremos emitiendo notificaciones mas frecuentes y cada vez mas urgentes para agregar la cuenta de GitHub a tu perfil de MDN iniciando ahora. Por favor realiza esto tan pronto como sea posible, con la finalidad de evitar el riesgo de perder el acceso a tu cuenta de MDN.

- -

¿MDN ofrecerá otro proveedor de autenticación?

- -

Nos gustaría mucho hacerlo, pero en este momento no tenemos identificado otro proveedor de autenticación que cumpla con nuestros requisitos; además, actualmente no tenemos los recursos de desarrolladores para integrar otro proveedor. Por el momento, la única opción para mantener acceso como colaborador en MDN es Enlazando tu perfil MDN a tu cuenta GitHub.

- -

Ten en cuenta, por supuesto, que no es necesario iniciar sesión en tu cuenta MDN para leer nuestro contenido. Pero si es necesario tener una cuenta para contribuir, y si deseas ser capaz de contribuir en cualquier momento en el futuro, asegurarte de agregar una cuenta de GitHub a tu perfil tan pronto como sea posible, antes del 31 de Octubre del 2016.

diff --git a/files/es/mdn/contribute/team_status/index.html b/files/es/mdn/contribute/team_status/index.html deleted file mode 100644 index c8146f8566..0000000000 --- a/files/es/mdn/contribute/team_status/index.html +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Tabla de estado del equipo -slug: MDN/Contribute/Team_status -translation_of: Archive/Meta_docs/Team_status_board ---- -
{{MDNSidebar}}

Esta tabla es una lista de contribuyentes MDN y lo que actualmente están trabajando. Siéntase libre de agregarse usted mismo y lo que estás haciendo a esta lista, pero ten en cuenta que vamos a purgar elementos fuera de fecha con regularidad; por lo que si decide añadirte a ti mismo, debe hacer su mejor esfuerzo para mantener actualizada la información (incluso si todo lo que hace es actualizar la "última actualización" que por lo que sabemos que está mantenerlo actualizado, a pesar de su trabajo toma mucho tiempo para terminar).

-
-

Nota:  No agregue una nueva fila para cada actualización de estado; simplemente actualizar el contenido existente. Esto no tiene la intención de realizar un seguimiento de lo que haces con el tiempo, sino simplemente dejar que las partes interesadas conozcan lo su trabajo actual es.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
UsernameLast UpdatedStatus
{{UserLink("Sheppy")}}June 19, 2013Ongoing work on MDN contributor guide. Gradually getting back into work on core B2G docs.
{{UserLink("jswisher")}}April 8, 2013Contribution pathway for writing volunteers; Mozilla Reps SIGs for Evangelism and Documentation.
{{UserLink("teoli")}}April 9, 2013Web Audio API; Maintaining CSS/HTML; Fx for devs
{{UserLink("wbamberg")}}  
{{UserLink("MarkGiffin")}}April 8, 2013App payments (in-app and paid apps); reference apps; packaged apps; managing your app.
{{UserLink("Domecraft")}}September 20, 2013Contributions to docs involving Web development
{{UserLink("Jeremie")}}August 8, 2013Keep going on WebAPI, now with a focus on various network APIs
{{UserLink("madarche")}}April 9, 2013Plan to work on IndexedDB again in the next weeks/months, especially on IDBCursor and IDBCursorWithValue.
{{UserLink("ScottMichaud")}}November 6, 2013 -

Doing what I can with the gaming documentation.

-
{{UserLink("Dbs")}}April 20, 2013Familiarizing myself with MDN tools, styles, and existing content
{{UserLink("tregagnon")}}June 25, 2013Fixing many broken links between French translations and English source articles. (Thanks to {{UserLink("SphinxKnight")}} crawl reports)
{{UserLink("justinpotts")}}December 9, 2013Adding tags to docs needing them
{{UserLink("kscarfone")}}July 25, 2013Knock out the editorial reviews on all the pending Web API documentation for Firefox OS
{{UserLink("Chandan1002")}}April 21,2014Contributing to docs and translating to Hindi from English source articles.
-

 

diff --git a/files/es/mdn/user_guide/writing/index.html b/files/es/mdn/user_guide/writing/index.html deleted file mode 100644 index f90a45bfdf..0000000000 --- a/files/es/mdn/user_guide/writing/index.html +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Escribir contenido -slug: MDN/User_guide/Writing -tags: - - Agregar - - Content - - Crear - - Create - - MDN - - Nueva - - Page - - Writing -translation_of: Archive/Meta_docs/Writing_content ---- -
{{MDNSidebar}}

Siempre hay cosas que se pueden agregar o actualizar en MDN. Ya sea una documentación completamente nueva y brillante API o una revisión de una vieja API que ha cambiado sutilmente, encontrarás muchas oportunidades para ayudar.

-

Editar una página existente

-

Si has encontrado una página que te gustaría revisar, simplemente haz click en el botón "editar" en la parte superior derecha de la página. Esto abrirá el editor WYSIWYG para trabajar en los contenidos de la página. Mira la guía del editor MDN para tener detalles de cómo trabajar con el editor, como así también cómo trabajar con el sistema macro que usamos para ayudar a automatizar la construcción y dar formato al contenido.

-

Hay muchas muchas razones por las que podrías editar una página existente:

- -

Agregar una nueva página

-

¡Esto es grandioso! Agregar una nueva página a MDN hace que la Web te quiera y que quiera abrazarte. Hay muchas razones obvias para crear una nueva página, incluyendo documentar una API que todavía no lo está o agregar un nuevo tutorial o guía de un tema.

-

Hay unos pasos a seguir para crear una nueva página enMDN, una vez que te hayas logueado:

-
-
- Haz click en el enlace "falta una página" ("missing page")
-
- Cuando navegas en MDN, ocasionalmente puedes encontrar enlaces a páginas que todavía no existen. A menudo, cuando creamos artículos, incluimos enlaces a páginas que hay que crear, incluso si no han sido construidas todavía. Esto nos ayuda a realizar un seguimiento de las cosas que se necesitan hacer, aunque algunas veces lleva algo de tiempo retomarlas. ¡Siéntete libre para hacerlo! Sólo haz click en estos enlaces y te llevarán derecho al editor para una nueva página.
-
- Crear una sub-página
-
- Cerca de la esquina superior derecha de cada artículo hay un menu desplegable llamado "Esta página" ("This page"). En ese menú, hay una opción "Nueva sup-página" ("New sub-page"). Haciendo click en esa opción se abre el editor de página para una nueva página, cuya página ascendente en la jerarquía del sitio, es la que elegiste "Nueva sup-página" ("New sub-page"). Simplemente completa el título y el enlace amigable, y comienza a escribir el contenido del artículo.
-
- Clonar una página
-
- También puedes clonar una página existente usando la opción "Clonar esta página" en el menú desplegable "Esta página". Haciendo click se crea una copia de la página actual, cuya página contenedora es la miama que la página actual, y abre el editor en esa página donde puedes colocar el título de la página y el enlace amigable y también, editar su contenido. Esta, normalmente, es una buena manera de agregar una nueva página a un área de referencia existente en el sitio porque, por ejemplo, te provee de un diseño de muestra para el contenido.
-
- Crear un enlace a una página que no existe, luego hacer click en él
-
- Este es un método un poco híbrido. Como cada debería ser enlazada de alguna parte podrías empezar creando un enlace al nuevo artículo agregándolo a una página existente y, luego de guardar la página, puedes hacer click en el lick que acabas de insertar para abrir un editor para el nuevo article.
-
-
-

Nota: si no ingresaste con tu nombre usuario, te va a aparecer el error 404 cuando trates de visitar un artículo que no existe en vez del editor de páginas.

-
-

Buscar información

-

Hay un montón de información allí afuera y puede ser difícil dar con la ayuda exacta que necesites. Aquí hay unos consejos para que comiences.

-
-
- Listas de propietarios de módulos
-
- Los proyectos Mozilla funcionan con una base de "propietario de módulo" . Cada componente mayor tiene un propietario o propietarios responsables de lo que pasa allí. Estos propietarios son muy frecuentemente tu mejor fuente de información o, por lo menos, un muy buena manera de encontrar a la persona correcta con la cual comunicarse.
-
- Referencia cruzada de la fuente de Mozilla
-
- RCM (ó en ingles, MXR), la referencia cruzada de Mozilla, te permite acceder a todo el código fuente del proyecto Mozilla (a excepción de algunas cosas, como gran parte del Sistema operativo Firefox, que se encuentra en GitHub). El código y sus comentarios son, amenudo. un gran resurso para la información.
-
- La wiki de Mozilla wiki
-
- La wiki de Mozilla, frecuentemente referenciada como "wikimo", es un depósito de notas de procesos y diseños, borradores, planes y especificaciones preliminares. A pesar de ser muchas veces un caos, es un tesoro con información invaluable.
-
diff --git a/files/es/mejoras_css_en_firefox_3/index.html b/files/es/mejoras_css_en_firefox_3/index.html deleted file mode 100644 index 8a4665ee81..0000000000 --- a/files/es/mejoras_css_en_firefox_3/index.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Mejoras para CSS en Firefox 3 -slug: Mejoras_CSS_en_Firefox_3 -tags: - - CSS - - Firefox 3 - - Todas_las_Categorías -translation_of: Mozilla/Firefox/releases/3/CSS_improvements ---- -
{{FirefoxSidebar}}

{{ Fx_minversion_header(3) }}

- -
-

 

- -

Firefox 3 ofrece una variedad de mejoras en su implementación de CSS. Mientras esperamos a que se incluyan estos cambios en la documentación, este artículo ofrece una descripción general de todos ellos. De esta forma, los desarrolladores podrán estar al tanto de dichos cambios.

- -

 

- -

Se han implementado:

- - - -

 

- -

Otros cambios

- - - -

 

- -
-

Lecturas relacionadas

-
-
- -

 

- - - -

{{ languages( { "en": "en/CSS_improvements_in_Firefox_3", "fr": "fr/Am\u00e9liorations_CSS_dans_Firefox_3", "ja": "ja/CSS_improvements_in_Firefox_3", "pl": "pl/Poprawki_CSS_w_Firefoksie_3" } ) }}

- -

 

diff --git a/files/es/mejoras_en_el_administrador_de_descargas_en_firefox_3/index.html b/files/es/mejoras_en_el_administrador_de_descargas_en_firefox_3/index.html deleted file mode 100644 index 7a928cfdca..0000000000 --- a/files/es/mejoras_en_el_administrador_de_descargas_en_firefox_3/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Mejoras en el administrador de descargas en Firefox 3 -slug: Mejoras_en_el_administrador_de_descargas_en_Firefox_3 -tags: - - Firefox 3 -translation_of: Archive/Mozilla/Download_Manager_improvements_in_Firefox_3 ---- -

Firefox 3 tiene algunas mejoras en el Administrador de Descargas que permite la existencia de múltiples escuchas de progreso, utiliza el API Storage para el manejo de datos, resumen de descargas, etcétera. Adicionalmente, puedes aumentar o reemplazar el interfaz de usuario del Administrador de Descargas, implementando un nuevo interfaz nsIDownloadManagerUI.

- -

{{ Note("These changes will require some modest revisions to code using the Download Manager; several methods have had minor changes.")}}

- -

El interfaz Administrador de Descargas

- -
-
nsIDownloadManager
-
Ofece a las aplicaciones y extensiones, acceso al Administrador de Descargas, permitiendoles agregar o eliminar archivos en la lista de descargas, recuperar información acerca de descargas pasadas y presentes y recoger notificaciones sobre el estado de progreso de las descargas.
-
nsIDownload
-
Describe un archivo en la cola de descargas. El archivo puede estar en espera de ser descargado, estar en proceso de descarga, o haber finalizado su descarga.
-
nsIDownloadProgressListener
-
Las aplicaciones y las extensiones implementan este interfaz para ser notificadas de los cambios en el estado de las descargas.
-
nsIDownloadManagerUI
-
Implementa esta interfaz para reemplazar o aumentar la interfaz de usuario del Administrador de Descargas.
-
- -

Otra documentación del Administrador de Descargas

- -
-
Preferencias_del_Administrador_de_Descargas
-
Este artículo enumera las preferencias usadas por el Administrador de Descargas,así como sus valores por defecto.
-
Esquema_del_Administrador_de_descargas
-
Este artículo describe el formato de la base de datos que se usa para almacenar y hacer seguimiento de cada descarga.
-
- -

Ejemplos

- -
-
Vigilar_descargas
-
Un ejemplo que muestra cómo usar el nuevo API del Administrador de Descargas para crear una ventana de registro de descargas que muestra todas las descagas pasadas y presentes y su estado, incluyendo las horas de comienzo y final de las descargas y más. Muestra también el funcionamiento del API Storage.
-
- -

 

- -
 
diff --git a/files/es/mercurial/index.html b/files/es/mercurial/index.html deleted file mode 100644 index c8a72386ab..0000000000 --- a/files/es/mercurial/index.html +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Mercurial -slug: Mercurial -tags: - - Desarrollando_Mozilla - - Mercurial - - Todas_las_Categorías -translation_of: Mozilla/Mercurial ---- -

Mercurial es el software de control distribuido de versiones (inglés) que estamos usando para el desarrollo de las próximas versiones principales ("trunk"). Ha reemplazado a CVS ahora que Mozilla 1.9 ha sido ramificado.

- -

hg es la herramienta de línea de órdenes de Mercurial, en consonancia con el hecho de que Hg es el símbolo químico para el elemento mercurio.

- -

Aprender a usar Mercurial

- -

Lo primero, léete completo lo básico de Mercurial, antes de hacer nada más.

- -

Luego la FAQ de Mercurial es un lugar decente para comenzar.

- -

Revisa Código fuente de Mozilla (Mercurial) para obtener un árbol que compilar.

- -

Lecturas adicionales

- -

El libro de hg (inglés) es la guía de usuario definitiva de Mercurial.

- -

Category:Mercurial lista los artículos relacionados con Mercurial en MDC.

- -

Y en wiki.mozilla.org, estas páginas son muy útiles:

- - - -

{{ languages( { "fr": "fr/Mercurial", "ja": "ja/Mercurial", "en": "en/Mercurial" } ) }}

diff --git a/files/es/microsummary_topics/index.html b/files/es/microsummary_topics/index.html deleted file mode 100644 index 86696978b5..0000000000 --- a/files/es/microsummary_topics/index.html +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Microsummary topics -slug: Microsummary_topics -tags: - - Microsummaries - - NeedsTranslation - - TopicStub -translation_of: Archive/Mozilla/Microsummary_topics ---- -
Warning: Microsummary support was removed in Gecko 6.0 (Firefox 6.0 / Thunderbird 6.0 / SeaMonkey 2.3)
-

Programmatically installing a microsummary generator

-

To programmatically install a microsummary generator -- for example, in an extension that helps users create custom generators for their favorite sites -- obtain a reference to the nsIMicrosummaryService interface implemented by the nsIMicrosummaryService component, then call its installGenerator() method, passing it an XML document containing the generator.

-

For example, the following code snippet installs the microsummary generator from the Creating a Microsummary tutorial:

-
var generatorText = ' \
-  <?xml version="1.0" encoding="UTF-8"?> \
-  <generator xmlns="http://www.mozilla.org/microsummaries/0.1" \
-             name="Firefox Download Count" \
-             uri="urn:{835daeb3-6760-47fa-8f4f-8e4fdea1fb16}"> \
-    <template> \
-      <transform xmlns="http://www.w3.org/1999/XSL/Transform" version="1.0"> \
-        <output method="text"/> \
-        <template match="/"> \
-          <value-of select="id(\'download-count\')"/> \
-          <text> Fx downloads</text> \
-        </template> \
-      </transform> \
-    </template> \
-    <pages>
-      <include>http://(www\.)?spreadfirefox\.com/(index\.php)?</include>
-    </pages>
-  </generator> \
-';
-
-var domParser =
-  Components.classes["@mozilla.org/xmlextras/domparser;1"].
-  createInstance(Components.interfaces.nsIDOMParser);
-
-var generatorDoc = domParser.parseFromString(generatorText, "text/xml");
-
-var microsummaryService =
-  Components.classes["@mozilla.org/microsummary/service;1"].
-  getService(Components.interfaces.nsIMicrosummaryService);
-
-var generator = microsummaryService.installGenerator(generatorDoc);
-
-

The service installs the generator by serializing its XML to a file in the user's profile directory and adding the generator to the service's in-memory generator cache.

-

When programmatically installing generators, you should specify a unique identifier for the generator in the uri attribute of the <generator> element. The value of the attribute must be a valid URI, but you can specify an arbitrary identifier using a URN, for example:

-
urn:{835daeb3-6760-47fa-8f4f-8e4fdea1fb16}
-
-

To guarantee uniqueness, use URNs containing UUIDs generated by the nsUUIDGenerator component. See Generating a UUID in the nsIUUIDGenerator documentation.

-

You may also use another form appropriate to your extension.

-
Note: When web sites install generators via window.sidebar.addMicrosummaryGenerator(), Firefox sets their uri attribute to urn:source:sourceURL, where sourceURL is the URL from which the generator was downloaded. In the future, Firefox may access source URLs to download updated versions of generators, so unless you are installing generators which are available from URLs, you should not use this form for your programmatically-installed generators.
- -

When Firefox updates a microsummary generated by a microsummary generator add-on, it automatically downloads the HTML content of the page being summarized. It does not generally download related content like embedded images and JavaScript scripts referenced by the page. However, because of a technical limitation (bug 340746), it does download CSS stylesheets referenced by the page.

-

Firefox includes the X-Moz request header with these requests. It sets the value of the header to the string microsummary. Thus, to differentiate requests initiated manually by users for the purpose of viewing a web page from those initiated automatically by Firefox for the purpose of summarizing that page, check for the presence and value of the X-Moz request header.

-

If the X-Moz header is present, and its value is microsummary, then the request is a microsummary-related request. Otherwise, it is a user-initiated request.

-

 

-

Controlling the frequency of microsummary requests

-

When Firefox downloads content in order to update a microsummary, it honors cache-related HTTP response headers. Thus, if you would like to control how frequently Firefox initiates microsummary-related requests to your web server, you can do so by including an HTTP Expires or Cache-Control header in your response to a microsummary-related request.

-

For example, you might include the following header in your response to prevent Firefox from making another microsummary-related request for one hour:

-
Cache-Control: max-age=3600
-
-
Note: Because of a technical limitation (bug 346820), Firefox uses the same cache for both microsummary-related requests and user-initiated requests, so the cache headers you return apply to both. Thus if your cache headers tell Firefox not to refresh a page on your site more than once per hour, and the user reloads the page within that time period, the user will see the cached version of your page, which may not be what you want.
-

To mitigate this effect, only return microsummary-specific cache headers in response to microsummary-related requests. Then only microsummary users will be affected by those headers.

diff --git a/files/es/midas/index.html b/files/es/midas/index.html deleted file mode 100644 index 547ad3f550..0000000000 --- a/files/es/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/es/mozilla/add-ons/add-on_manager/index.html b/files/es/mozilla/add-ons/add-on_manager/index.html deleted file mode 100644 index a36c26e1be..0000000000 --- a/files/es/mozilla/add-ons/add-on_manager/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Add-on Manager -slug: Mozilla/Add-ons/Add-on_Manager -translation_of: Mozilla/JavaScript_code_modules/Add-on_Manager ---- -

{{ gecko_minversion_header("2.0") }}

- -

el Add-on Manager es responsable de manejar  todos los add-ons instalados en la aplicación. A traves de la informacion de la APIs acerca de todos los add-ons instalados puede ser recuperado y nuevos  add-ons pueden ser instalados. Las APIs son diseñadas para ser genericas y soportar diferentes tipos de add-ons.

- -

Muchas funciones en la interfaz de  Add-on Manager operan de manera asincrona  retornando resultados a traves de devoluciones de llamadas que se pasan a las funciones . Estas devoluciones pueden ser llamadas inmediatamente, mientras la funcion inicial se esta ejecutando o apenas despues de su ejecución dependiendo de cuando la informacion requerida este disponible.

- -

Accediendo add-ons Instalados

- -

la informacion acerca de add-ons instalados puede ser recuperada a traves de main AddonManager API. Todas sus funciones son asincronas, significando que una funcion de devolucion de llamada debe ser pasada para recibir las instancias de Addon. La devolucion de llamada puede solamente ser llamada despues de la funcion de retorno de la API . Por ejemplo:

- -
Components.utils.import("resource://gre/modules/AddonManager.jsm");
-
-AddonManager.getAllAddons(function(aAddons) {
-  // Here aAddons is an array of Addon objects
-});
-// This code will execute before the code inside the callback
-
- -

Notificaciones acerca de cambios de add-ons instalados se envian a cualquier AddonListener registrado. Deben ser registrados a traves del metodo addAddonListener().

- -

Instalando Nuevos add-ons

- -

Nuevos add-ons pueden ser instalados usando los metodos getInstallForFile() o getInstallForURL() del objeto AddonManager. Estos pasaran una instancia de AddonInstall al invocador, el cual puede ser usado para instaladar add-ons:

- -
Components.utils.import("resource://gre/modules/AddonManager.jsm");
-
-AddonManager.getInstallForURL("http://www.foo.com/test.xpi", function(aInstall) {
-  // aInstall is an instance of AddonInstall
-  aInstall.install();
-}, "application/x-xpinstall");
-
- -

El progreso de  AddonInstall puede ser monitoreado usando IntallListener. Un escucha puede ser registrado por el uso especifico de un metodo  addListener() o por todas las instalaciones usando el metodo addInstallListener().

- -

Encontrando updates

- -

Add-ons pueden ser chekeados por updates usando el metodo findUpdates(). Debe pasarse como parametro un  UpdateListener para recibir informacion acerca de la compatibilidad asi como tambien la informacion acerca la nueva actualizacion. Cualquier nueva actualizacion es retornada como un AddonInstall el cual esta listo para ser descargado e instalado.

- -

{{ h1_gecko_minversion("Detectando cambios en los add-ons", "7.0") }}

- -

Tambien puedes conseguir una lista de add-ons que al iniciar fueron modificados de varias maneras. El metodo  getStartupChanges()  permite encontrar que add-ons fueron instalados, eliminados, modificados, habilitados o deshabilitados al iniciar la aplicacion.

- -

Por ejemplo, para saber los add-ons que fueron deshabilitados al iniciar la aplicacion se utilizaria:

- -
Components.utils.import("resource://gre/modules/AddonManager.jsm");
-
-let addonIDs = AddonManager.getStartupChanges(AddonManager.STARTUP_CHANGE_DISABLED);
-if (addonIDs.length > 0) {
-  // addonIDs is now an array of the add-on IDs that have been disabled
-alert("Note: " + addonIDs.length + " add-ons have been disabled.");
-}
-
- -

Vease

- -

{{ ListSubpages() }}

diff --git a/files/es/mozilla/add-ons/add-on_repository/index.html b/files/es/mozilla/add-ons/add-on_repository/index.html deleted file mode 100644 index 0ef9c73f61..0000000000 --- a/files/es/mozilla/add-ons/add-on_repository/index.html +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: Add-on Repository -slug: Mozilla/Add-ons/Add-on_Repository -translation_of: Mozilla/JavaScript_code_modules/Add-on_Repository ---- -

{{ gecko_minversion_header("2") }}

- -

 

- -

El repositorio Add-on es responsable de encontrar complementos disponibles, este provee una interface para interactuar con la página addons.mozilla.org (AMO). Su API provee varias URL que se puede visitar para explorar los complementos del repositorio. El API también ofrece dos formas de buscar y recuperar un vector de Addon instancias: {{ manch("retrieveRecommendedAddons") }}, la cual retorna una lista de complementos recomendados  y {{ manch("searchAddons") }}, el cual realiza una búsqueda en el repositorio.

- -

Estas búsquedas son asíncronas, los resultados se pasan al objeto SearchCallback proporcionado cuando se completa la búsqueda. Los resultados pasados al objeto SearchCallback solo incluyen complementos que son compatibles con la aplicación actual y que aún no están instalados o en proceso de instalación. AddonRepository solo puede procesar una búsqueda a la vez. Una nueva búsqueda fallará inmediatamente si el AddonRepository ya está manejando otra solicitud de búsqueda.

- -

Para importar el módulo de código del Repositorio Add-on , use:

- -

 

- -
Components.utils.import("resource://gre/modules/AddonRepository.jsm");
-
- -

Method overview

- - - - - - - - - - - - - - - - - - - -
string getRecommendedURL()
string getSearchURL(in string searchTerms)
void cancelSearch()
void retrieveRecommendedAddons(in integer maxResults, in SearchCallback callback)
void searchAddons(in string searchTerms, in integer maxResults, in SearchCallback callback)
- -

Properties

- - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
homepageURLstringThe URL of the repository site's home page.
isSearchingbooleantrue if a search is currently in progress; otherwise false.
- -

Methods

- -

getRecommendedURL()

- -

Returns the URL that can be visited to see recommended add-ons.

- -
string getRecommendedURL();
- -
Parameters
- -

None.

- -
Return value
- -

An URL indicating the repository's page of recommended add-ons.

- -

getSearchURL()

- -

Returns an URL of a web page that can be visited to see search results for the specified search terms.

- -
string getSearchURL(
-  in string searchTerms
-);
- -
Parameters
- -
-
searchTerms
-
Search terms used to search the repository.
-
- -
Return value
- -

The URL of the search results page for the specified search terms.

- -

cancelSearch()

- -

Cancels the search in progress. Does nothing if there is no search in progress.

- -
void cancelSearch();
- -
Parameters
- -

None.

- -

retrieveRecommendedAddons()

- -

Begins a search for recommended add-ons in the repository. The list of recommended add-ons frequently changes. Results will be passed to the given SearchCallback callback.

- -
void retrieveRecommendedAddons(
-  in integer maxResults,
-  in SearchCallback callback
-);
- -
Parameters
- -
-
maxResults
-
The maximum number of results to return.
-
callback
-
The SearchCallback callback to which results will be delivered.
-
- -

searchAddons()

- -

Begins a search for add-ons in this repository. Results will be passed to the given callback.

- -
string searchAddons(
-  in string searchTerms,
-  in integer maxResults,
-  in SearchCallback callback
-);
- -
Parameters
- -
-
searchTerms
-
The search terms to pass to AMO. The results will match what you would get if you typed this string in the search box on the AMO web site.
-
maxResults
-
The maximum number of results to return.
-
callback
-
The SearchCallback callback to pass results to.
-
- -

See also

- - - -
-
- -
-
diff --git a/files/es/mozilla/add-ons/amo/index.html b/files/es/mozilla/add-ons/amo/index.html deleted file mode 100644 index 0845e54e3d..0000000000 --- a/files/es/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/es/mozilla/add-ons/amo/policy/contacto/index.html b/files/es/mozilla/add-ons/amo/policy/contacto/index.html deleted file mode 100644 index be8cdd9998..0000000000 --- a/files/es/mozilla/add-ons/amo/policy/contacto/index.html +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Información de contacto de AMO -slug: Mozilla/Add-ons/AMO/Policy/Contacto -translation_of: Mozilla/Add-ons#Contact_us ---- -

{{AddonSidebar}}

- -

Gracias por tu interés en contactar al equipo de Extensiones de Mozilla. Por favor lee esta página cuidadosamente para asegurarte de que tu solicitud se dirija al lugar correcto.

- -

Soporte de Complementos

- -

SI tienes alguna pregunta de soporte con respecto a un complemento en particular, tal como "¿Cómo utilizo este complemento?" o "¿Por qué no funciona de manera apropiada?", por favor contacta al autor del complemento a través de los canales de soporte listados en la página de listado de extensiones.

- -

Preguntas sobre la Revisión de Complementos

- -

Si tienes alguna pregunta acerca de la revisión de un complemento o deseas reportar una violación de políticas, por favor escríbenos a amo-editors@mozilla.org. Casi todos los reportes de complementos se incluyen bajo esta categoría. Por favor, asegúrate de incluir un enlace al complemento en cuestión y una descripción detallada de tu pregunta o duda.

- -

Vulnerabilidades de Seguridad de un Complemento

- -

Si has descubierto una vulnerabilidad de seguridad en un complemento, incluso si no está alojado aquí, Mozilla está muy interesada en tu descubrimiento y trabajará con el desarrollador del complemento para corregir el problema lo más pronto posible. Los problemas de seguridad de complementos pueden ser reportados confidencialmente en Bugzilla o por e-mail mediante amo-admins@mozilla.org.

- -

Funcionalidad y Desarrollo del Sitio Web

- -

Si has encontrado un problema con el sitio, nos gustaría solucionarlo. Por favor reporta un informe de error en Github, incluyendo la localización del problema y cómo lo encontraste.

- -

How to get in touch with us regarding these policies or your add-on.

diff --git a/files/es/mozilla/add-ons/amo/policy/index.html b/files/es/mozilla/add-ons/amo/policy/index.html deleted file mode 100644 index 5fffee1dc8..0000000000 --- a/files/es/mozilla/add-ons/amo/policy/index.html +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: AMO Policies -slug: Mozilla/Add-ons/AMO/Policy -tags: - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Add-ons/AMO/Policy ---- -

{{AddonSidebar}}

- -

Mozilla is committed to ensuring a great add-ons experience for our users and developers. Please review the policies below before submitting your add-on.

- -
-
Developer Agreement
-
Effective January 5, 2016
Review Process
-
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.
Featured Add-ons
-
How up-and-coming add-ons become featured and what's involved in the process.
Contacting us - -

How to get in touch with us regarding these policies or your add-on.

- -
diff --git a/files/es/mozilla/add-ons/amo/policy/revisiones/index.html b/files/es/mozilla/add-ons/amo/policy/revisiones/index.html deleted file mode 100644 index 1ae4eed402..0000000000 --- a/files/es/mozilla/add-ons/amo/policy/revisiones/index.html +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Normativas para los complementos -slug: Mozilla/Add-ons/AMO/Policy/Revisiones -translation_of: Mozilla/Add-ons/AMO/Policy/Reviews ---- -

{{AddonSidebar}}

- -

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.

- -

All add-ons are subject to these policies, regardless of how they are distributed. Add-ons that do not comply with these policies may be subject to rejection or disabling by Mozilla.

- -

No Surprises

- -

Surprises can be appropriate in many situations, but they are not welcome when user security, privacy and control are at stake. It is extremely important to be as transparent as possible when submitting an add-on. Users should be able to easily discern what the functionality of your add-on is and not be presented with unexpected user experiences after installing it.

- -

Unexpected Features

- -

“Unexpected” features are those that are unrelated to the add-on’s primary function, and are not likely from the add-on name or description to be expected by a user installing that add-on.

- -

Should an add-on include any unexpected feature that falls into one of the following categories:

- - - -

Then the “unexpected” feature(s) must adhere to all of the following requirements:

- - - -

Content

- -

Add-ons that make use of Mozilla trademarks must comply with the Mozilla Trademark Policy. If the add-on uses “Firefox” in its name, the naming standard the add-on is expected to follow is “<Add-on name> for Firefox”.

- -

In addition, add-ons listed on addons.mozilla.org (AMO) must adhere to the following policies:

- - - -

Submission Guidelines

- -

Add-ons must function only as described, and should provide an appealing user experience. Based on the description of the add-on, a user must be able to understand and use the add-on’s features without requiring expert knowledge. Tips on how to create a good user experience for your add-on can be found here.

- -

During review, the add-on undergoes basic testing in addition to code review. To facilitate the functional testing, the add-on author must provide testing information and, if applicable, testing credentials required to use the add-on if an account is needed for any part of the add-on’s functionality.

- -

Issues brought up during review must be addressed using best efforts. If corrections have been requested, the new version should not contain unrelated changes, as this complicates the review process and can lead to further rejections.

- -

Source Code Submission

- -

Add-ons may contain transpiled, obfuscated, minified or otherwise machine-generated code, but Mozilla needs to review a copy of the human-readable source code. The author must provide this information to Mozilla during submission as well as instructions on how to reproduce the build.

- -

The provided source code will be reviewed by an administrator and will not be redistributed in any way. The code will only be used for the purpose of reviewing the add-on. Failure to provide this information will result in rejection.

- -

Please read our Source Code Submission guidelines to avoid unexpected rejections.

- -

Development Practices

- -

In general, developers are free to maintain their add-ons in the manner they choose. However, in order to maintain appropriate data security and effectively review code, we do have certain technical requirements that all add-ons must meet. In particular, potentially dangerous APIs may only be used in ways that are demonstrably safe, and code within add-ons that cannot be verified as behaving safely and correctly may need to be refactored.

- -

While any code, method or practice in a submitted add-on is subject to review and rejection, the following requirements are of particular importance:

- - - -

Data Disclosure, Collection and Management

- -

You must disclose how the add-on collects, uses, stores and shares user data in the privacy policy field on AMO. Mozilla expects that the add-on limits data collection whenever possible, in keeping with Mozilla’s Lean Data Practices and Mozilla’s Data Privacy Principles, and uses the data only for the purpose for which it was originally collected.

- -

User data includes all information the add-on collects, regardless of the manner. It can be personal data actively provided by the user (such as a name or email address), technical data (such as operating system, build ID, version numbers, crash reports, activation, updates), and interaction or activity data (add-on activity data, visited URLs, console logs), including interactions with Firefox.

- -

The add-on’s privacy policy must be the full policy text; it cannot be a link to an externally hosted privacy policy. In addition, the privacy policy must:

- - - -

A summary of this information must be included in the add-on’s listing description. Finally, you and your add-on must also comply with all applicable data privacy laws as well as any other laws that may apply to your specific add-on.

- -

User Interactions & Technical Data

- - - -

Cookies

- - - -

Personal Data

- - - -

Additional Privacy Protocols

- - - -

Security Vulnerabilities

- -

Because add-ons run in an environment with elevated privileges relative to ordinary web pages, they present a very serious set of security considerations. They have the potential to open security holes not only in the add-ons themselves, but also in the browser, in web pages, and, in particularly distressing cases, the entire system the browser is running on.

- -

As a result, we take our security policies very seriously and apply them to all add-ons, whether hosted on AMO or not. We expect all add-ons to be secure and well-maintained in handling both their own data and their user’s data. They must also securely manage all of their interactions with the web, the browser and the operating system.

- -

Monetization

- - - -

Compliance & Blocklisting

- -

For add-ons that don’t meet these policies, Mozilla may reject or blocklist affected versions or entire add-ons, depending on the extent of their non-compliance.

- -

Generally, Mozilla will attempt to contact the add-on’s developer(s) and provide a reasonable time frame for the problems to be corrected before a block is deployed. 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.

- -

Mozilla reserves the right to block or delete the developer’s account on addons.mozilla.org, thereby preventing further use of the service.

diff --git a/files/es/mozilla/add-ons/code_snippets/index.html b/files/es/mozilla/add-ons/code_snippets/index.html deleted file mode 100644 index 1d5fd8b90d..0000000000 --- a/files/es/mozilla/add-ons/code_snippets/index.html +++ /dev/null @@ -1,138 +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 ---- -
-

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}}

- -

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/es/mozilla/add-ons/code_snippets/queryselector/index.html b/files/es/mozilla/add-ons/code_snippets/queryselector/index.html deleted file mode 100644 index ff3b7d1258..0000000000 --- a/files/es/mozilla/add-ons/code_snippets/queryselector/index.html +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: QuerySelector -slug: Mozilla/Add-ons/Code_snippets/QuerySelector -translation_of: Archive/Add-ons/Code_snippets/QuerySelector ---- -

 {{ fx_minversion_header(3.5) }}

- -

Siguiendo con lineas de otros frameworks como "jQuery" o "Prototype", acortar el nombre de "querySelector" podria ser conveniente:

- -
function $ (selector, el) {
-     if (!el) {el = document;}
-     return el.querySelector(selector);
-}
-function $$ (selector, el) {
-     if (!el) {el = document;}
-     return el.querySelectorAll(selector);
-     // Note: the returned object is a NodeList.
-     // If you'd like to convert it to a Array for convenience, use this instead:
-     // return Array.prototype.slice.call(el.querySelectorAll(selector));
-}
-alert($('#myID').id);
-
- -

(Note that while using the Firefox Web Console, the above functions are available automatically.)

- -

Both XUL and even XML can be easily made supportable (an alternative approach to the following would be to add ChromeWindow.prototype or Window.prototype, accessing this.document.querySelector, or following the jQuery style of chaining by returning 'this' within each prototype method of $()):

- -
HTMLDocument.prototype.$ = function (selector) { // Only for HTML
-    return this.querySelector(selector);
-};
-
-Example:
-
-<h1>Test!</h1>
-<script>
-HTMLDocument.prototype.$ = function (selector) {
-    return this.querySelector(selector);
-};
-alert(document.$('h1')); // [object HTMLHeadingElement]
-</script>
-
- -
XULDocument.prototype.$ = function (selector) { // Only for XUL
-    return this.querySelector(selector);
-};
-
-Example:
-
-<label value="Test!"/>
-<script type="text/javascript"><![CDATA[
-XULDocument.prototype.$ = function (selector) { // Only for XUL
-    return this.querySelector(selector);
-};
-
-alert(document.$('label')); // [object XULElement]
-]]></script>
-
- -
Document.prototype.$ = function (selector) { // Only for plain XML
-    return this.querySelector(selector);
-};
-var foo = document.implementation.createDocument('someNS', 'foo', null); // Create an XML document <foo xmlns="someNS"/>
-var bar = foo.createElementNS('someNS', 'bar'); // add <bar xmlns="someNS"/>
-foo.documentElement.appendChild(bar);
-alert(foo.$('bar').nodeName); // gives 'bar'
-
- -
Element.prototype.$ = function (selector) { // Works for HTML, XUL, and plain XML
-    return this.querySelector(selector);
-};
-
-HTML example:
-<h1><a>Test!<a/></h1>
-<script>
-Element.prototype.$ = function (selector) {
-    return this.querySelector(selector);
-};
-alert(document.getElementsByTagName('h1')[0].$('a').nodeName); // 'A'
-
-XUL example:
-<hbox><vbox/></hbox>
-<script type="text/javascript"><![CDATA[
-Element.prototype.$ = function (selector) {
-    return this.querySelector(selector);
-};
-var XULNS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
-alert(document.getElementsByTagNameNS(XULNS, 'hbox')[0].$('vbox').nodeName); // vbox
-]]></script>
-
-XML example:
-<foo xmlns="someNS"><bar/></foo> in document earlier
-var foo = document.getElementsByTagNameNS('someNS', 'foo')[0];
-alert(foo.$('bar'));
-
-
- -

Note that for plain XML, the # 'id' selector will not work with an 'id' attribute (since a such-named attribute need not necessarily be of type ID in XML, though it is in HTML and XUL), nor will it work with xml:id.

- -

However, it will work with attribute selectors that target non-prefixed attributes (such as 'id', but not xml:id: http://www.w3.org/TR/selectors-api/#resolving) (even though CSS3 does support namespaced attribute selectors: http://www.w3.org/TR/css3-selectors/#attrnmsp and potentially xml:id as #: http://www.w3.org/TR/css3-selectors/#id-selectors ).

diff --git a/files/es/mozilla/add-ons/lineamientos_de_complementos/index.html b/files/es/mozilla/add-ons/lineamientos_de_complementos/index.html deleted file mode 100644 index 3c490d101e..0000000000 --- a/files/es/mozilla/add-ons/lineamientos_de_complementos/index.html +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: Líneamientos Generales para complementos -slug: Mozilla/Add-ons/Lineamientos_de_complementos -tags: - - Complementos -translation_of: 'https://extensionworkshop.com/documentation/publish/add-on-policies/' ---- -

Estos lineamientos para complementos se crearon para fomentar una comunidad de desarrolladores de complementos abierta y diversa mientras que al mismo tiempo se garantiza una excelente experiencia de usuario. Se aplican a todos los complementos y actualizaciones complementos independientemente del lugar donde se alojan y también se aplican a las personalizaciones realizadas por instaladores que configuran Firefox sin necesidad de utilizar un complemento. Los complementos alojados en AMO están sujetos a políticas adicionales.

-

Se transparente

- -

Se Respetuoso con los Usuarios

- -

Se Seguro

- -

Se Estable

- -

Excepciones

- -

Otras Excepciones pueden aplicar.

-

Cumplimiento

-

Los complementos que no sigan estos lineamientos pueden calificar para ser bloqueados, dependiendo en la extensión de las violaciones. Los lineamientos calificados con la palabra debe son especialmente importantes y las violaciones de estos seguramente en una nominación a ser bloqueados.

-

El equipo de complementos hará lo mejor posible para tratar de contactar al desarrollador de complementos y proveerá un lapso de tiempo razonable para resolver los problemas antes de que el bloqueo se haga efectivo. Si el complemento es considerado malicioso o su desarrollador es imposible de localizar o posee repetitivas violaciones el bloqueo se llevará acabo de inmediato.

-

Las violaciones de los lineamientos deben ser reportadas vía Bugzilla, bajo evangelización tecnológica > Complementos. Las preguntas deben ser publicadas en elCanal de IRC #addons.

-

Estos lineamientos pueden cambiar en futuro. Todas las actualizaciones serán anunciadas en el Blog de complementos.

diff --git a/files/es/mozilla/add-ons/overlay_extensions/index.html b/files/es/mozilla/add-ons/overlay_extensions/index.html deleted file mode 100644 index 1522f3ba35..0000000000 --- a/files/es/mozilla/add-ons/overlay_extensions/index.html +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Extensiones de Superposición -slug: Mozilla/Add-ons/Overlay_Extensions -tags: - - Extensions - - Overlay - - extensiones -translation_of: Archive/Add-ons/Overlay_Extensions ---- -

Esta página contiene enlaces a la documentaciónpara aproximarse al desarrollo de extensiones basadas en aplicaciones Gecko que usa:

- - - -

Antes de que Gecko 2.0 fuera lanzado esta era la única manera de desarrollar extensiones. Ahora hay dos técnicas alternativas: extensionen sin reinicio y extensiones complementarias basadas SDK. Las privilegiadas APIs de  JavaScript descriptas aquí, aún pueden ser utilizadas por las técnicas más nuevas.

- -

Escuela XUL

- -

La escuela XUL es una exhaustivo tutorial para el desarrollo de complementos que se enfoca en el desarrollo de extensiones Firefox pero mayoritariamente aplicable a otras aplicaciones basadas en Gecko.

- -

Más recursos

- -
-
-
-
Configurando tu entorno
-
Configurar la aplicación para el desarollo de la extensión.
-
XUL
-
Tutoriales and referencia para el lenguaje de interfaz de usuario utilizadopor las extensiones XUL.
-
Trozos de códigos
-
Código de muestra para muchas de las cosas que querrás hacer.
-
Instalando extensiones
-
Cómo instalar una extensión copiando los archivos de extensión en un directorio de instalación de la aplicación.
-
Firefox add-ons developer guide
-
Una guía para desarrollar extensiones de superposición.
-
-
- -
-
-
Módulos de código JavaScript
-
Módulos JavaScript disponibles para desarrolladores de extensiones.
-
Preferencias de una extension
-
Cómo especificar las preferencias para tu extensión que aparecerá en el administrador de complementos.
-
Preguntas frecuentes
-
Cuestiones comunes en el desarrollo de una extensión.
-
Empaquetado de la extensión
-
Cómo se empaquetan e instalan las extensiones.
-
Extensiones binarias de Firefox 
-
Crear extensiones binarias para Firefox.
-
-
-
- -

 

diff --git a/files/es/mozilla/add-ons/sdk/builder/index.html b/files/es/mozilla/add-ons/sdk/builder/index.html deleted file mode 100644 index be566483c0..0000000000 --- a/files/es/mozilla/add-ons/sdk/builder/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Builder -slug: Mozilla/Add-ons/SDK/Builder -translation_of: Archive/Add-ons/Add-on_SDK/Builder ---- -

El Builder Add-on fue basado en un ambiente de desarrollo web que permitió a desarrolladores la creación de add-ons usando las APIs de SDK, pero sin tener que usar las herramientas de linea de comando cfx. El cual fue retirado el primero de Abril 2014 y ahora el dominio direccionara a esta pagina "builder.addons.mozilla.org".
-
- Sí tu solo has usado el SDK a trabes del Builder, probablemente ya sabes lo que necesitas para el desarrollo con en el SDK. En el alto nivel y el bajo nivel de las APIs usadas por Builder add-ons son exactamente la misma para el Builder y SDK. Para cambiar al  SDK se necesita:

- diff --git a/files/es/mozilla/add-ons/sdk/index.html b/files/es/mozilla/add-ons/sdk/index.html deleted file mode 100644 index 6681924d2e..0000000000 --- a/files/es/mozilla/add-ons/sdk/index.html +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Add-on SDK -slug: Mozilla/Add-ons/SDK -tags: - - Add-on SDK - - Jetpack -translation_of: Archive/Add-ons/Add-on_SDK ---- -

Usando el Add-on SDK puedes crear complementos de Firefox utilizando tecnologías Web estándar: JavaScript, HTML y CSS. El SDK incluye una API de JavaScript que se puede utilizar para crear complementos y herramientas para creación, funcionamiento, pruebas y empaquetado de complementos.

- -
-

Tutoriales

- -
- - -
-
-
Creando compenentes para la intefaz de usuario
-
Crear componentes de interfaz de usuario, tales como botones de barras de herramientas, menús contextuales, elementos de menu y cuadros de dialogo.
-
Modificación de páginas web
-
Modificar las páginas que coincidan con un patron de URL o dinámicamente modificar una ficha particular.
-
Juntando todo
-
Tutorial del ejemplo de add-on Annotator.
-
-
-
- -
-

Guias

- -
-
-
-
Guide de cómo contribuir
-
Aprender como empezar a contribuir en la SDK, y sobre los idiomas más importantes que se utilizan en el código SDK, como los modulos, classes y herancias, propiedad privada, y procesos de contenido.
-
SDK infrastructura
-
Aspectos de la tecnología subyacente de la SDK: modulos, la identificacion del Programa, y las reglas que definen la compatibilidad de Firefox .
-
Contentido scripts
-
Una guía detallada para trabajar con scripts.
-
-
- - -
- -
-

Referencias

- -
-
-
-
APIs de alto nivel
-
Documentación de referencia para las API del SDK de alto nivel.
-
Referencias de herramientas
-
Documentación de referencia para la herramienta cfx usada para el desarrollo, pruebas, y empaquetado add-ons, la consola global usada para el registro, el paquete package.json.
-
-
- -
-
-
APIs de bajo nivel
-
Documentación de referencia para las API del SDK de bajo nivel.
-
-
-
- -

 

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/add_a_context_menu_item/index.html b/files/es/mozilla/add-ons/sdk/tutorials/add_a_context_menu_item/index.html deleted file mode 100644 index f493c0ab0e..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/add_a_context_menu_item/index.html +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: Agregar una opción al Menú Contextual -slug: Mozilla/Add-ons/SDK/Tutorials/Add_a_Context_Menu_Item -tags: - - Add-on SDK - - Firefox - - Guide -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Add_a_Context_Menu_Item ---- -
-

Para realizar los pasos que se describen a continuación es necesario tener instalado el SDK y conocimientos básico de cfx.

-
- -

Para agregar opciones y submenús al menú contextual de Firefox, se usa el módulo context-menu.

- -

Aquí se presenta un add-on que agrega una nueva opción al menú contextual. La opción es mostrada en cualquier parte donde sea seleccionado algo en la página. Cuando se hace clic, la selección es enviada al código principal del add-on, el cual simplemente lo registra:

- -
var contextMenu = require("sdk/context-menu");
- var menuItem = contextMenu.Item({
-  label: "Log Selection",
-  context: contextMenu.SelectionContext(),
-  contentScript: 'self.on("click", function () {' +
-                 '  var text = window.getSelection().toString();' +
-                 '  self.postMessage(text);' +
-                 '});',
-  onMessage: function (selectionText) {
-    console.log(selectionText);
-  }
-});
- -

Pruebe lo siguiente: ejecute el add-on, cargue una página web, seleccione algún texto y haga clic derecho sobre el. Debe aparecer una nueva opción:

- -

- -

Haga clic en ella, y la selección es registrada en la terminal:

- -
info: elephantine lizard
-
- -

Detalles

- -

Todo lo que hace este add-on es construir una opción en el menú contextual. No se necesita agregarla: una vez construida la opción, esta es agregada automáticamente en el contexto correcto. En este caso el constructor toma cuatro opciones: label, context, contentScript, y onMessage.

- -

label

- -

El label es simplemente la cadena de caracteres que es mostrada.

- -

context

- -

El context describe las circunstancias en las cuales la opción debe ser mostrada. El módulo context-menu  provee varios contextos simples integrados, incluyendo el SelectionContext(), el cual refiere: muestra la opción cuando algo es seleccionado en la página.

- -

Si estos contextos simples no son suficientes, puede definir contextos más sofisticados usando scripts.

- -

contentScript

- -

Este adjunta un script a la opción. En este caso el script escucha hasta que se hace clic en la opción, luego envía un mensaje al add-on que contiene el texto seleccionado.

- -

onMessage

- -

La propiedad onMessage proporciona una vía para que el código del add-on responda a los mensajes del script integrado a la opción del menú contextual. En este caso solo registra el texto seleccionado.

- -

Por lo tanto:

- -
    -
  1. El usuario o la usuaria hace clic en la opción
  2. -
  3. se activa el evento click del script de contenido, retorna el texto seleccionado y envía un mensaje al add-on
  4. -
  5. se activa el evento message del add-on, la función responsable en el código del add-on pasa el texto seleccionado, el cual registra
  6. -
- -

Más opciones

- -

Agregar una imágen

- -

Se puede agregar una imagen a la opción del menú contextual con la opción image. Esta es una URL que apunta a un icono de tamaño 16x16 que es mostrado a la izquierda de la opción en el menú contextual. Generalmente se guarda la imagen en el directorio "data" del add-on, y se construye la URL usando self.data.url():

- -
var self = require("sdk/self");
-
-var contextMenu = require("sdk/context-menu");
-var menuItem = contextMenu.Item({
-  label: "Log Selection",
-  context: contextMenu.SelectionContext(),
-  contentScript: 'self.on("click", function () {' +
-                 '  var text = window.getSelection().toString();' +
-                 '  self.postMessage(text);' +
-                 '});',
-  image: self.data.url("icon-16.png"),
-  onMessage: function (selectionText) {
-    console.log(selectionText);
-  }
-});
- -

Agregar tecla de acceso directo

- -
-

Nuevo en Firefox 35.

-
- -

Desde Firefox 35 es posible especificar una tecla de acceso directo usando la opción accessKey. Esta debe ser una cadena de un solo carácter. Al presionar la tecla se selecciona la opción cuando el menú contextual esta abierto:

- -
var contextMenu = require("sdk/context-menu");
-var menuItem = contextMenu.Item({
-  label: "Log Selection",
-  context: contextMenu.SelectionContext(),
-  contentScript: 'self.on("click", function () {' +
-                 '  var text = window.getSelection().toString();' +
-                 '  self.postMessage(text);' +
-                 '});',
-  accessKey: "l",
-  onMessage: function (selectionText) {
-    console.log(selectionText);
-  }
-});
-
- -

 

- -

Conozca más

- -

Para conocer más sobre el módulo context-menu, puede ver la referencia de la API context-menu.

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/add_a_menu_item_to_firefox/index.html b/files/es/mozilla/add-ons/sdk/tutorials/add_a_menu_item_to_firefox/index.html deleted file mode 100644 index f30a388a88..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/add_a_menu_item_to_firefox/index.html +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: Agregar una opción de Menú en Firefox -slug: Mozilla/Add-ons/SDK/Tutorials/Add_a_Menu_Item_to_Firefox -tags: - - Add-on SDK -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Add_a_Menu_Item_to_Firefox ---- -
-

Para realizar los pasos que se describen a continuación es necesario tener instalado el SDK y conocimientos básico de cfx.

-
- -
-

Si esta usando jpm en vez de cfx, el método para usar módulos externos es diferente, y debe leer la versión jmp en vez de esta guía.

-
- -

El SDK aún no posee una API para agregar nuevas opciones de menú a Firefox. Pero su diseño permite que sus funcionalidades sean ampliadas, por lo tanto cualquiera puede desarrollar y publicar módulos para que sean usados por los desarrolladores de add-on. Afortunadamente, Erik Vold escribió el módulo menuitems que permite agregar opciones al menú.

- -

Este manual cumple con una doble funcionalidad. Describe el método general para usar un módulo externo, de terceras partes en el add-on, y describe como agregar una opción al menú usando el módulo menuitems en particular.

- -

Primero, cree una nuevo add-on. Cree un directorio llamado "clickme" donde desee, ingrese en el directorio recien creado y ejecute cfx init.

- -
mkdir clickme
-cd clickme
-cfx init
-
- -

La estructura del directorio sera creada:

- - - -
 
- -

Instalar menuitems

- -

Cree un directorio llamado "packages" dentro del directorio "clickme". Luego descargue el paquete menuitems package desde https://github.com/mykmelez/menuitems-jplib y extraiga el archivo dentro del directorio "packages" que acaba de crear:

- -
mkdir packages
-cd packages
-tar -xf ../erikvold-menuitems-jplib-d80630c.zip
-
- -

Dependencias del Módulo

- -

Si los módulos de terceras partes solo dependen de los módulos de SDK, puede usarlos inmediatamente, pero si dependen de otros módulos de terceras partes, debe instalar también esas dependencias.

- -

En el directorio principal del paquete encontrará un archivo llamado "package.json". Abralo y busque una entrada llamada "dependencies". La entrada para el paquete menuitems es:

- -
"dependencies": ["vold-utils"]
-
- -

Esto significa que se debe instalar el paquete vold-utils, lo cual puede hacerse descargándolo desde https://github.com/mykmelez/vold-utils-jplib y agregándolo dentro del directorio packages junto a menuitems.

- -

Usar menuitems

- -

La documentación para el módulo menuitems nos dice que creemos una opción del menú usando MenuItem(). De las opciones aceptadas por MenuItem(), usaremos este resumido conjunto:

- - - -
-
-
var menuitem = require("menuitems").Menuitem({
-  id: "clickme",
-  menuid: "menu_ToolsPopup",
-  label: "Click Me!",
-  onCommand: function() {
-    console.log("clicked");
-  },
-  insertbefore: "menu_pageInfo"
-});
- -
 
-
-
- -

Luego, se debe declarar la dependencia en el paquete menuitems. En el archivo package.json del add-on se agrega:

- -
"dependencies": "menuitems"
-
- -

Note que debido al bug 663480, si agrega una línea dependencies en package.json, y usa cualquier módulo del SDK, tendrá que declarar la dependencia a ese paquete integrado, como sigue:

- -
"dependencies": ["menuitems", "addon-sdk"]
-
- -

Ahora esta todo listo. Ejecute el add-on y verá la nueva opción de menú en el menú Herramientas: seleccionela y verá aparecer en la terminal info: clicked.

- -

Advertencia

- -

Los módulos de terceras partes son una manera genial de usar funcionalidades que no son proporcionadas directamente por SDK, pero debido a que los módulos de terceras partes usan APIs de bajo nivel pueden no funcionar correctamente en las nuevas versiones de Firefox.

- -

 

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/adding_a_button_to_the_toolbar/index.html b/files/es/mozilla/add-ons/sdk/tutorials/adding_a_button_to_the_toolbar/index.html deleted file mode 100644 index 91bde8e45c..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/adding_a_button_to_the_toolbar/index.html +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: Agregar un Botón a la Barra de Herramienta -slug: Mozilla/Add-ons/SDK/Tutorials/Adding_a_Button_to_the_Toolbar -tags: - - Add-on SDK -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Adding_a_Button_to_the_Toolbar ---- -
-

Para realizar los pasos que se describen a continuación es necesario tener instalado el SDK y conocimientos básico de cfx.

- -

Este manual usa la API action button, que esta disponible solo para Firefox 29 en adelante.

-
- -

Para agregar un botón a la barra de herramientas, use los módulos action button o toggle button.

- -

Cree un nuevo directorio, accese al directorio recien creado, y ejecute cfx init.

- -

Luego guarde estos tres iconos en el directrio "data":

- - - - - - - - - - - - - - - - -
icon-16.png
icon-32.png
icon-64.png
- -

Luego abra el archivo llamado "main.js" en el directorio "lib" y agregue el siguiente código:

- -
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/");
-}
- -

Ahora ejecute el add-on con cfx run. El botón es agregado a la barra de herramientas en la parte superior de la ventana del navegador:

- -

Puede fijar la localización inicial del botón, pero el usuario puede moverlo usando la función para personalizar del navegador. El atributo id es obligatorio, y es usado para recordar la posición del botón, por lo tanto no debería cambiarse en las versiones siguientes del add-on.

- -

Hacer clic en el botón cargará la página https://www.mozilla.org/ en una nueva pestaña.

- -

Especificar el icono

- -

La propiedad del icono puede especificar un solo icono o una colección de iconos de diferentes tamaños, como en el ejemplo anterior. Si se especifica una colección de iconos de diferentes tamaños el navegador automáticamente seleccionará el que mejor se ajuste a la resolución de pantalla y el lugar en la IU del navegador que alberga el botón. Lea mas sobre especificar múltiples iconos.

- -

El archivo del icono debe ser empacado con el add-on: no debe referenciar a una archivo remoto.

- -

Puede cambiar el icono en cualquier momento estableciendo la propiedad del icono del botón. Puede cambiar el icono, y otros atributos de estado, incluso globalmente, para una ventana o pestaña específica. Lea mas sobre la actualización de estado.

- -

Fijando un panel

- -

Si necesita fijar un panel a un botón, use la API toggle button. Esta es similar a la API action button pero agrega la propiedad booleana checked cuyo estado cambia cuando el botón es seleccionado. Para fijar el panel, pase el botón al método show() del panel. Para más detalles sobre esto, vea la documentación de toggle button.

- -

Mostrar contenido mas sofisticado

- -

Para crear interfaces de usuario más complejas de las que son posibles con solo un botón, use la AIP toolbar. Con la API toolbar obtiene una franja horizontal completa de la interfaz de usuario. Puede agregar botones a la barra de herramientas y también marcos, que pueden contener HTML, CSS, y JavaScript.

- -

Aprender más

- - diff --git a/files/es/mozilla/add-ons/sdk/tutorials/display_a_popup/index.html b/files/es/mozilla/add-ons/sdk/tutorials/display_a_popup/index.html deleted file mode 100644 index 8a65788a64..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/display_a_popup/index.html +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Mostrar una ventana emergente -slug: Mozilla/Add-ons/SDK/Tutorials/Display_a_Popup -tags: - - Add-on SDK -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Display_a_Popup ---- -
-

Para realizar los pasos que se describen a continuación es necesario tener instalado el SDK y conocimientos básico de cfx.

- -

Esta guía usa la API action button, la cual esta solo disponible para Firefox 29 en adelante.

-
- -

Para mostrar un dialogo emergente, se usa el modulo panel.  El contenido de un panel se define usando HTML. Puede ejecutar scripts de contenido en el panel: aunque el script que se ejecuta en el panel no pueda acceder directamente al código principal del add-on, puede intercambiar mensajes entre el script del panel y el código del add-on.

- -

En esta guía se crea un add-on que agrega un botón de acción en la barra de herramientas,  que al ser presionado muestra un panel. El panel solo contiene un elemento <textarea> : cuando se presiona la tecla return, el contenido del <textarea> es enviado al código principal del add-on. El código principal del add-on registra el mensaje en la terminal.

- -

El add-on consta de seis archivos:

- - - -

El archivo "main.js" contiene lo siguiente:

- -
var data = require("sdk/self").data;
-// Construct a panel, loading its content from the "text-entry.html"
-// file in the "data" directory, and loading the "get-text.js" script
-// into it.
-var text_entry = require("sdk/panel").Panel({
-  contentURL: data.url("text-entry.html"),
-  contentScriptFile: data.url("get-text.js")
-});
-
-// Create a button
-require("sdk/ui/button/action").ActionButton({
-  id: "show-panel",
-  label: "Show Panel",
-  icon: {
-    "16": "./icon-16.png",
-    "32": "./icon-32.png",
-    "64": "./icon-64.png"
-  },
-  onClick: handleClick
-});
-
-// Show the panel when the user clicks the button.
-function handleClick(state) {
-  text_entry.show();
-}
-
-// When the panel is displayed it generated an event called
-// "show": we will listen for that event and when it happens,
-// send our own "show" event to the panel's script, so the
-// script can prepare the panel for display.
-text_entry.on("show", function() {
-  text_entry.port.emit("show");
-});
-
-// Listen for messages called "text-entered" coming from
-// the content script. The message payload is the text the user
-// entered.
-// In this implementation we'll just log the text to the console.
-text_entry.port.on("text-entered", function (text) {
-  console.log(text);
-  text_entry.hide();
-});
- -

El script de contenido "get-text.js" muestra:

- -
-
// When the user hits return, send the "text-entered"
-// message to main.js.
-// The message payload is the contents of the edit box.
-var textArea = document.getElementById("edit-box");
-textArea.addEventListener('keyup', function onkeyup(event) {
-  if (event.keyCode == 13) {
-    // Remove the newline.
-    text = textArea.value.replace(/(\r\n|\n|\r)/gm,"");
-    self.port.emit("text-entered", text);
-    textArea.value = '';
-  }
-}, false);
-// Listen for the "show" event being sent from the
-// main add-on code. It means that the panel's about
-// to be shown.
-//
-// Set the focus to the text area so the user can
-// just start typing.
-self.port.on("show", function onShow() {
-  textArea.focus();
-});
- -
 
-
- -

Finalmente, el archivo "text-entry.html" define el elemento <textarea> :

- -
-
-
<html>
-<head>
-    <style type="text/css" media="all">
-      textarea {
-        margin: 10px;
-      }
-      body {
-        background-color: gray;
-      }
-    </style>
-  </head>
-<body>
-    <textarea rows="13" cols="33" id="edit-box"></textarea>
-  </body>
-</html>
- -
 
-
-
- -

Por último, se guardan estos tres iconos en el directorio "data":

- - - - - - - - - - - - - - - - -
icon-16.png
icon-32.png
icon-64.png
- -

Pruebe lo siguiente: el archivo "main.js" se encuentra en el directorio lib del add-on, y los otros cinco archivos el el directorio data :

- -
my-addon/
-         data/
-              get-text.js
-              icon-16.png
-              icon-32.png
-              icon-64.png
-              text-entry.html
-         lib/
-             main.js
-
- -

Ejecute el add-on, presione el botón, y debería poder ver el panel. Escriba algo en el cuadro de texto y presione "return" y verá la salida en la terminal.

- -

Desde Firefox 30 en adelante, si usa botón del selección simple, puede acoplar el panel al botón.

- -

Conozca más

- -

Para conocer más sobre el módulo panel, puede ver la referencia de la API panel.

- -

Para conocer más sobre los botones,  puede ver la referencia de la API action button y toggle button.

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/getting_started/index.html b/files/es/mozilla/add-ons/sdk/tutorials/getting_started/index.html deleted file mode 100644 index 04c901f4f9..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/getting_started/index.html +++ /dev/null @@ -1,214 +0,0 @@ ---- -title: Primeros pasos -slug: Mozilla/Add-ons/SDK/Tutorials/Getting_started -translation_of: Mozilla/Add-ons/SDK/Tutorials/Getting_Started_%28jpm%29 ---- -

Este tutorial recorre los pasos para la creación de un add-on simple usando el SDK.

- -

Requisitos previos

- -

Para crear add-ons para Firefox usando el SDK, primero es necesario seguir las instrucciones para instalar y activar el SDK. Una vez hecho esto, se debe ir directamente a la terminal.

- -

Inicializar un add-on vacío

- -

En la terminal, cree un directorio nuevo. El directorio no tiene que estar bajo la raíz del SDK: puede crearlo donde quiera. Dirijase al directorio recién creado, escriba cfx init, y presione la tecla enter o intro:

- -
mkdir my-addon
-cd my-addon
-cfx init
-
- -

Visualizará una salida como esta:

- -
* lib directory created
-* data directory created
-* test directory created
-* doc directory created
-* README.md written
-* package.json written
-* test/test-main.js written
-* lib/main.js written
-* doc/main.md written
-Your sample add-on is now ready for testing:
-try "cfx test" and then "cfx run". Have fun!"
-
- -

Implementar el add-on

- -

Ahora puede escribir el código del add-on, el cual se ubica en el archivo "main.js" en el directorio "lib". Este archivo fue creado en el paso anterior. Abra este archivo y agrege el siguiente código:

- -
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/");
-}
-
- -

Guarde los cambios.

- -

Luego, guarde estos tres iconos en el directorio "data" :

- - - - - - - - - - - - - - - - -
icon-16.png
icon-32.png
icon-64.png
- -

Vuelva a la terminal y escriba:

- -
cfx run
-
- -

Esta es la orden del SDK para ejecutar una nueva instancia de Firefox con el add-on instalado. Cuando el Firefox es presentado, en la esquina superior derecha se puede ver un ícono con el logo de Firefox. Al hacer clic en el ícono, se abrirá una pestaña nueva donde se cargará la página https://www.mozilla.org/.

- -
-

Es posible que vea un error como este al ejecutar cfx run:

- -
A given cfx option has an inappropriate value:
-  ZIP does not support timestamps before 1980
- -

De ser así, se ha encontrado con el bug 1005412, lo que significa que los archivos de los iconos que ha descargado están arrojando una marca de tiempo de 1970. Hasta que este error sea resuelto, la solución es usar la orden touch para actualizar la marca de tiempo:

- -
touch icon-16.png
-
- -

Esto es todo lo que este add-on hace. Usa dos módulos del SDK: el módulo action button, el cual permite agregar botones al navegador, y el módulo tabs, el cual permite llevar a cabo operaciones básicas con las pestañas. En este caso, se ha creado un botón cuyo icono es el logo de Firefox, y se le agregó un controlador que carga la página principal de Mozilla en una nueva pestaña al hacer clic en el icono.

- -

Intente editar este archivo. Por ejemplo, puede cambiar la página que es cargada:

- -
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/");
-}
- -

En la terminal, ejecute de nuevo cfx run. Ahora al hacer clic en el ícono se cargará la página https://developer.mozilla.org/.

- -

Empaquetar el add-on

- -

Cuando el add-on este terminado y listo para distribuirse, será necesario empaquetarlo como un archivo XPI. Este es el formato de archivo de instalación para los add-ons de Firefox. Puede distribuir los archivos XPI por cuenta propia o publicarlos en https://addons.mozilla.org para que otros usuarios puedan descargarlos e instalarlos.

- -

Para construir un XPI, solo se debe ejecutar la orden cfx xpi desde el directorio del add-on:

- -
cfx xpi
-
- -

Visualizará una salida como esta:

- -
Exporting extension to my-addon.xpi.
-
- -

Para comprobar que funcione, intente instalar el archivo XPI en el Firefox instalado en su sistema. Lo puede hacer presionando la combinación de teclas Ctrl+O (Cmd+O en Mac) desde el Firefox, o seleccionando la opción "Abrir" desde el menú "Archivo" de Firefox. Esto abrirá un diálogo de selección; navegue hasta el archivo "my-addon.xpi", abra el archivo y siga las instrucciones para instalar el add-on.

- -

Resumen

- -

En este tutorial se ha construido y empaquetado un add-on usando tres órdenes:

- - - -

Estas son las tres órdenes principales, usadas cuando se desarrollan add-ons con SDK. Existe una completa documentación de referencia que cubre todas las órdenes que pueden ser usadas y todas sus opciones disponibles.

- -

El código del add-on usa dos módulos del SDK, action button y tabs. Existe una documentación de referencia para todas las APIs de alto-nivel y bajo-nivel en el SDK.

- -

Qué sigue?

- -

Para tener una idea de lo que se puede hacer con las APIs del SDK, puede revisar alguno de estos tutoriales.

- -

Técnicas avanzadas

- -

Sobrescribiendo los módulos integrados

- -

Los módulos del SDK que son usados para implementar un add-on están integrados en Firefox. Cuando se ejecuta o empaqueta un add-on usando cfx run o cfx xpi, el add-on usará las versiones de los módulos de la versión de Firefox que los aloja.

- -

Como desarrollador de add-on, esto es usualmente lo deseable. Pero si esta desarrollando los módulos del SDK, por supuesto, que no lo es. En este caso se asume que se accedió al SDK desde el repositorio de GitHub y se ejecutó la secuencia de comandos bin/activate desde la raíz de checkout.

- -

Luego al aplicar cfx run or cfx xpi, se agrega la opción "-o":

- -
cfx run -o
-
- -

Esto le indica a cfx a usar las copias locales de los módulos del SDK, y no aquellas en Firefox.

- -

Desarrollar sin cfx run

- -

Debido a que cfx run reinicia el navegador cada vez que es invocado, en ocasiones puede resultar un poco incómodo si se realizan cambios frecuentes al add-on. Un modelo alternativo de desarrollo es usar el add-on Extension Auto-Installer: el cual esta atento a la existencia de nuevos archivos XPI en un puerto determinado y los instala automáticamente. De esta manera se pueden probar los cambios realizados sin necesidad de reiniciar el navegador:

- - - -

Incluso, se puede automatizar este proceso con una simple secuencia de comandos. Por ejemplo:

- -
while true ; do cfx xpi ; wget --post-file=codesy.xpi http://localhost:8888/ ; sleep 5 ; done
-
- -

Nótese que el nivel de acceso definido para la terminal cuando se usa este método es diferente, comparado con el nivel de acceso usado cuando un add-on es ejecutado usando cfx run. Esto significa que si se desea ver la salida desde los mensajes de  console.log(), se debe modificar la configuración. Vea la documentación en niveles de acceso para más detalles.

- -

Otra alternativa es con el uso de grunt y grunt-shell:

- -
module.exports = function(grunt) {
-  'use strict';
-  require('matchdep').filterDev('grunt-!(cli)').forEach(grunt.loadNpmTasks);
-  grunt.initConfig({
-    shell: {
-      xpi: {
-        command: [
-          'cd pluginpath',
-          'cfx xpi',
-          'wget --post-file=pluginname.xpi http://localhost:8888/ || echo>/dev/null'
-        ].join('&&')
-      }
-    },
-    watch: {
-      xpi: {
-        files: ['pluginpath/**'],
-        tasks: ['shell:xpi']
-      }
-    }
-  });
-
-  grunt.loadNpmTasks('grunt-contrib-watch');
-  grunt.loadNpmTasks('grunt-shell');
-  grunt.registerTask('default', ['watch']);
-};
diff --git a/files/es/mozilla/add-ons/sdk/tutorials/index.html b/files/es/mozilla/add-ons/sdk/tutorials/index.html deleted file mode 100644 index 478d88d56a..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/index.html +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: Tutoriales -slug: Mozilla/Add-ons/SDK/Tutorials -tags: - - Add-on SDK - - NeedsTranslation - - TopicStub -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials ---- -

Esta página lista prácticos artículos funcionales sobre como lograr realizar tareas específicas usando SDK.

- -
-

Primeros pasos

- -
-
-
-
Instalación
-
Descargar, instalar, e inicializar el SDK en Windows, OS X y Linux.
-
- -
-
Resolución de problemas
-
Algunos consejos para solucionar problemas comunes y obtener más ayuda.
-
-
- -
-
-
Primeros pasos
-
Guía paso a paso para la creación de un add-on simple con SDK.
-
-
-
- -
-

Crear interfaces de usuario

- -
-
-
-
Agregar un botón a la barra de herramientas
-
Fijar un botón a la barra de herramientas de Add-on de Firefox.
-
Agregar una opción de menú en Firefox
-
Agregar opciones a los menú principales de Firefox.
-
-
- -
-
-
Mostrar una ventana emergente
-
Mostrar una ventana de dialogo emergente implementando HTML y JavaScript.
-
Agregar una opción al menú contextual
-
Agregar opciones al menú contextual de Firefox
-
-
-
- -
-

Interactuar con el navegador

- -
-
-
-
Abrir una página web
-
Abrir una página web en una nueva pestaña o ventana del navegador usando el modulo de pestañas, y accediendo a su contenido.
-
Atender las cargas de página
-
Usar el módulo de pestañas para recibir notificaciones cuando una página web nueva sea cargada, y acceder a su contenido.
-
-
- -
-
-
Obtener la lista de las pestañas abiertas
-
Usar el módulo de pestañas para recorrer las pestañas abiertas actualmente, y acceder a su contenido.
-
-
-
- -
-

Modificar páginas web

- -
-
-
-
Modificar páginas web basándose en el URL
-
Crear filtro para páginas web basándose en el URL: siempre que una página web cuyo URL coincida con el filtro cargado, ejecuta una secuencia de comandos específica en él.
-
-
- -
-
-
Modificar la página web activa
-
Cargar de forma dinámica una secuencia de comandos dentro de la página web activa.
-
-
-
- -
-

Técnicas de desarrollo

- -
-
-
-
Registro de actividad
-
Registrar los mensajes a la terminal con propósitos de diagnósticos.
-
Crear módulos reusables
-
Estructurar el add-on en módulos separados para hacer más fácil el desarrollo, depuración, y mantenimiento. Crear paquetes reusables que contengan los módulos, de esta manera otros desarrolladores puedan usarlos también.
-
Pruebas unitarias
-
Escribir y ejecutar pruebas unitarias usando el marco de trabajo para pruebas de SDK.
-
Autoridad Chrome
-
Ganar acceso al objeto Components, permitiendo al add-on cargar y usar el objeto XPCOM.
-
Creando destinos del evento
-
Permite a los objetos definidos emitir sus propios eventos.
-
-
- -
-
-
Encargarse de las cargas y descargas
-
Obtener las notificaciones cuando el add-on sea cargado y descargado por Firefox, y pasar argumentos en el add-on desde la terminal.
-
Usar módulos externos (jpm)
-
Instalar y usar módulos adicionales que no son entregados con el SDK.
-
Localización
-
Escribir código que pueda ser adaptado a otro idioma.
-
Desarrollo Móbil
-
Desarrollar add-ons para Firefox Móbil en Android.
-
Depurador de Add-on
-
Depurar el código JavaScript del add-on.
-
-
-
- -
-

Juntando todo

- -
-
-
-
Add-on Anotador
-
Un manual de un add-on relativamente complejo.
-
-
-
- -

 

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/installation/index.html b/files/es/mozilla/add-ons/sdk/tutorials/installation/index.html deleted file mode 100644 index 655c6e098f..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/installation/index.html +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Instalación -slug: Mozilla/Add-ons/SDK/Tutorials/Installation -tags: - - Guía - - Principiante -translation_of: Mozilla/Add-ons/SDK/Tools/jpm#Installation ---- -

Requerimientos previos

- -

Para desarrollar add-ons usando el SDK Add-o, necesitaras:

- - - -

Instalación

- -

Instalación en OS X, FreeBSD, Linux

- -

Extrae el contenido del archivo en el lugar de tu preferencia, y navega hasta el directorio principal del SDK con una shell/command prompt. Por ejemplo:

- -
tar -xf addon-sdk.tar.gz
-cd addon-sdk
-
- -

Luego, si eres un usuario Bash, ejecuta:

- -
source bin/activate
-
- -

Si no eres un usuario Bash, debes ejecutar:

- -
bash bin/activate
-
- -

En la línea de entrada de tu terminal ahora deberías tener un prefijo con el nombre del directorio raíz del SDK:

- -
(addon-sdk)~/mozilla/addon-sdk >
-
- -

La orden activate establece algunas variables de entorno necesarias para el SDK. Establece las variables solo para la terminal actual. Si abres una terminal nueva, el SDK no estará activo hasta que ejecutes nuevamente activate. Si deseas una activación permanente, dirigete a Establecer activate permanentemente mas abajo.

- -

Instalación en OS X usando Homebrew

- -

Si usas Mac, puedes usar Homebrew para instalar el SDK, usando la siguiente orden:

- -
brew install mozilla-addon-sdk
- -

Una vez que el proceso se haya completado satisfactoriamente, puedes usar el programa cfx en tu línea de órdenes en cualquier momento: no necesitas ejecutar bin/activate.

- -

Instalación en Windows

- -

Extrae el contenido del archivo en el lugar de tu peferencia, y navega hasta el directorio principal de SDK con la terminal. Por ejemplo:

- -
7z.exe x addon-sdk.zip
-cd addon-sdk
-
- -

Luego ejecuta:

- -
bin\activate
-
- -

En la línea de entrada de tu terminal ahora deberías tener un prefijo con el nombre completo del directorio raíz del SDK:

- -
(C:\Users\mozilla\sdk\addon-sdk) C:\Users\Work\sdk\addon-sdk>
-
- -

La orden activate establece algunas variables de entorno necesarias para el SDK. Establece las variables solo para la terminal actual. Si abres una terminal nueva, el SDK no estará activo hasta que ejecutes nuevamente activate. Si deseas una activación permanente, dirigete a Estableciendo activate permanentemente mas abajo.

- -

Verificar congruencia

- -

Ejecuta esto en tu terminal:

- -
cfx
- -

Esto debería arrojar una salida cuyas primeras lineas deberían verse algo parecido a esto, seguidas de muchas línas de información útil:

- -
Usage: cfx [options] [command]
- -

Este es el  programa de la línea de órdnes cfx. Es tu principal interfaz con el Add-on SDK. Lo usas para ejecutar Firefox y probar tu add-on, empaquetar tu add-on para distribuirlo, ver documentación, y ejecutar pruebas unitarias.

- -

Si no puedes ver esto, dirigete a la página Resolución de problemas.

- -

Próximos Pasos

- -

Ahora, dale un vistazo al tutorial Comenzando con cfx, en el cual se explica como crear add-ons usando la herramienta cfx.

- -

Tópicos avanzados

- -

Usar el SDK desde Git

- -

El SDK es desarrollado en GitHub. En vez de usar versiones en archivos comprimidos, puedes echar un vistazo al repositorio GitHub: con esto puedes usar la última versión de desarrollo en vez de usar el lanzamiento oficial.

- -

Si usas la última versión de desarrollo, debes usarla con la versión Nightly de Firefox, y no podrás enviar a addons.mozilla.org (AMO) ningún add-ons que desarrolles, porque AMO solicita que uses el lanzamiento oficial.

- -

Desarrollar add-ons para AMO desde Git

- -

Si deseas desarrollar add-ons que puedan ser admitidos en AMO usando Git, entonces deberás:

- - - -
git checkout 1.17
-
-git archive 1.17 python-lib/cuddlefish/_version.py | tar -xvf -
- -

Establecer activate permanentemente

- -

La orden activate establece algunas variables de entorno necesarias para el SDK. Establece las variables solo para la terminal actual. Si abres una terminal nueva, el SDK no estará activo hasta que ejecutes nuevamente activate.

- -

Esto significa que puedes tener multiples copias del SDK en diferentes partes del disco y cambiar entre ellas, o incluso tenerlas activas al mismo tiempo en diferentes terminales.

- -

Estableciendo estas variables de forma permanente en tu entorno para que cada nueva terminal pueda leerlas, podrás hacer que la activación sea permanente. Por lo tanto no tendrás que ejecutar activate cada vez que habrás una nueva terminal.

- -

Debido a que el conjunto exacto de variables pueden cambiar en nuevas versiones del SDK, lo mejor es consultar la secuencia de órdenes de activación para determinar cuales variables deben ser establecidas. La activación usa diferentes secuencias de órdenes de activación para entornos bash (Linux and OS X) y ambientes Windows .

- -

Windows

- -

En Windows, bin\activate usa activate.bat, y puedes hacer la activación permanente usando la herramienta setx de la terminal o el Panel de Control.

- -

Pasos para el establecimiento permanente:

- -

Paso 0. Abre el Panel de Control > Sistema > Avanzado > Variables de Entorno.
- Paso 1. Agrega el directorio Python y el directorio SDK\bin a la Variable de la Ruta del Sistema.
- Path=...;C:\PYTHON26\;C:\Users\Omid\Documents\FirefoxAddons\addon-sdk-1.15\bin
- Paso 2. Agrega una Variable de usuario llamada CUDDLEFISH_ROOT y establece su valor a "C:\Users\Omid\Documents\FirefoxAddons\addon-sdk-1.15"
- Paso 3. Agrega una Variable de usuario llamada PYTHONPATH y establece su valor a "C:\Users\Omid\Documents\FirefoxAddons\addon-sdk-1.15\python-lib"
- Paso 4. Agrega una Variable de usuario llamada VIRTUAL_ENV y establece su valor a "C:\Users\Omid\Documents\FirefoxAddons\addon-sdk-1.15"

- -

Linux / OS X

- -

En Linux y OS X, source bin/activate usan la secuencia de órdenes bash activate, y puedes hacer la activación permanente usando tu ~/.bashrc (en Linux) o ~/.bashprofile (en OS X).

- -

Como alternativa a esto, puedes crear un enlace simbólico al programa cfx en tu directorio ~/bin:

- -
ln -s PATH_TO_SDK/bin/cfx ~/bin/cfx
-
- -

Si usaste Homebrew para instalar SDK, las variables de entorno ya estan establecidas permanentemente.

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/list_open_tabs/index.html b/files/es/mozilla/add-ons/sdk/tutorials/list_open_tabs/index.html deleted file mode 100644 index e817b40495..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/list_open_tabs/index.html +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Obtener la lista de las pestañas abiertas -slug: Mozilla/Add-ons/SDK/Tutorials/List_Open_Tabs -tags: - - Add-on SDK -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/List_Open_Tabs ---- -
-

Para realizar los pasos que se describen a continuación es necesario tener instalado el SDK y conocimientos básico de cfx.

- -

Este ejemplo usa la API action button, la cual esta solo disponible para Firefox 29 en adelante.

-
- -

Para listar las pestañas abiertas, se puede iterar sobre el mismo objeto tabs.

- -

El siguiente add-on agrega un action button que registra las URLs de las pestañas abiertas cuando el/la usuario/a hacen click en el:

- -
require("sdk/ui/button/action").ActionButton({
-  id: "list-tabs",
-  label: "List Tabs",
-  icon: "./icon-16.png",
-  onClick: listTabs
-});
-
-function listTabs() {
-  var tabs = require("sdk/tabs");
-  for (let tab of tabs)
-    console.log(tab.url);
-}
-
- -

Observe que para hacer que esto funcione debe guardar un icono para el botón al directorio "data" del add-on con el nombre de "icon-16.png": puede descargarlo de aqui: .

- -

Ejecute el add-on, cargue algunas pestañas y hace click en el botón. Verá en la terminal una salida similar a esta:

- -
info: http://www.mozilla.org/en-US/about/
-info: http://www.bbc.co.uk/
-
- -

No tiene acceso directo a ningún contenido de la pestaña. Para acceder al contenido de la pestaña necesita adjuntar un script usando tab.attach(). Este add-on adjunta un script a todas las pestañas abiertas. El script agrega un borde rojo al documento de la pestaña:

- -
require("sdk/ui/button/action").ActionButton({
-  id: "list-tabs",
-  label: "List Tabs",
-  icon: "./icon-16.png",
-  onClick: listTabs
-});
-
-function listTabs() {
-  var tabs = require("sdk/tabs");
-  for (let tab of tabs)
-    runScript(tab);
-}
-
-function runScript(tab) {
-  tab.attach({
-    contentScript: "document.body.style.border = '5px solid red';"
-  });
-}
-
- -

Conozca más

- -

Para conocer más sobre las pestañas en el SDK, puede dirigirse a la referencia de tabs en la API.

- -

Para conocer mas sobre la ejecución de scripts en las pestañas, puede diregirse a usando tab.attach() en el tutorial.

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/listen_for_page_load/index.html b/files/es/mozilla/add-ons/sdk/tutorials/listen_for_page_load/index.html deleted file mode 100644 index 99642fade4..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/listen_for_page_load/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Atender las cargas de página -slug: Mozilla/Add-ons/SDK/Tutorials/Listen_for_Page_Load -tags: - - Add-on SDK -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Listen_for_Page_Load ---- -
Para realizar los pasos que se describen a continuación es necesario tener instalado el SDK y conocimientos básico de cfx.
- -

Se pueden obtener notificaciones sobre la carga de nuevas paǵinas a través del módulo tabs. El siguiente add-on escucha el evento integrado de la pestaña ready  y simplemente registra el URL de cada pestaña en la medida que el/la usuario/a realiza la carga:

- -
require("sdk/tabs").on("ready", logURL);
-
-function logURL(tab) {
-  console.log(tab.url);
-}
-
- -

No se obtiene acceso directo a ningún contenido de la pestaña.

- -

Para acceder al contenido de la pestaña se necesita adjuntar un script a la pestaña usando tab.attach(). Este add-on adjunto un script para abrir todas las pestañas. El script agrega un borde rojo al documento de la pestaña:

- -
require("sdk/tabs").on("ready", runScript);
-
-function runScript(tab) {
-  tab.attach({
-    contentScript: "if (document.body) document.body.style.border = '5px solid red';"
-  });
-}
-
- -

(Este ejemplo es solo para mostrar la idea: para implementar algo como esto, se debería usar page-mod, y especificar un "*" como el patron de coincidencia.)

- -

Conozca más

- -

Para conocer más sobre las pestañas en el SDK, puede dirigirse a la referencia de tabs en la API. Puede escuchar varios eventos relacionados con las pestañas incluyendo open, close, y activate.

- -

Para conocer mas sobre la ejecución de scripts en las pestañas, puede diregirse a usando tab.attach() en el tutorial.

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/modifying_the_page_hosted_by_a_tab/index.html b/files/es/mozilla/add-ons/sdk/tutorials/modifying_the_page_hosted_by_a_tab/index.html deleted file mode 100644 index 08a0a80224..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/modifying_the_page_hosted_by_a_tab/index.html +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Modificar la página web activa -slug: Mozilla/Add-ons/SDK/Tutorials/Modifying_the_Page_Hosted_by_a_Tab -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Modifying_the_Page_Hosted_by_a_Tab ---- -
-

Para seguir esta guía. necesita instalar el add-on SDK y saber lo basico sobre jpm (para Firefox 38 en adelante) o lo  basicp sobre cfx .

- -

Esta guía usa la API action button, la cual esta disponible para Firefox 29 en adelante.

-
- -

Para modificar la página web activa, se carga uno o mas scripts de contenido dentro de ella usando el método attach() del objeto tab. El trabajo de estos scripts es interactuar con el contenido de la web.

- -

Aquí se muestra un ejemplo simple:

- -
var button = require("sdk/ui/button/action").ActionButton({
-  id: "style-tab",
-  label: "Style Tab",
-  icon: "./icon-16.png",
-  onClick: function() {
-    require("sdk/tabs").activeTab.attach({
-      contentScript: 'document.body.style.border = "5px solid red";'
-    });
-  }
-});
- -

Para ejecutar este ejemplo, se guarda el icono llamado "icon-16.png" en el directorio "data" del add-on. Puede descargar este icono:  .

- -

Este add-on crea un botón con el icono de Mozilla. Este tienen un controlador de eventos del ratón el cual busca la pestaña activa y carga un script dentro de la página activa. El script es especificado usando la opción contentScript, y simplemente dibuja un borde rojo alrededor de la página.

- -

Abra cualquier página web en el navegador, y haga clic en el botón. Deberá poder ver un borde rojo que aparecerá alrededor de la página, como este:

- -

- -

Mantener los Scripts de Contenido en un archivo diferente

- -

En el ejemplo anterior, hemos pasado el contenido del script como una cadena.

- -

A menos que el script sea extremadamente simple, manten el script como un archivo separado en el directorio data del add-on. Esto hace que el código sea más fácil de mantener, depurar, y revisar. Para hacer esto, utiliza la opción contentScriptFile y no contentScript, cuyos valores es una URL que apunta a uno o varios archivos con el contenido de los scripts.

- -

Por ejemplo,  si guardamos el script anterior bajo el directorio data  del add-on en un archivo llamado my-script.js:

- -
var self = require("sdk/self");
-
-var button = require("sdk/ui/button/action").ActionButton({
-  id: "style-tab",
-  label: "Style Tab",
-  icon: "./icon-16.png",
-  onClick: function() {
-    require("sdk/tabs").activeTab.attach({
-      contentScriptFile: self.data.url("my-script.js")
-    });
-  }
-});
-
- -

Puedes cargar mas de un script, y los scripts pueden interactuar directamente entre ellos. Por lo tanto puede cargar jQuery, y luego tu script de contenido puede usarlo.

- -

Cargar varios archivo de script de contenido

- -

Los datos asignados a contentScriptFile pueden ser un vector. Los scripts serán cargados en el mismo orden del vector.

- -

En el siguiente ejemplo, estamos cargando dos scripts, first.js & second.js. Ambos scripts serán ejecutados en el mismo contexto, por lo tanto todo lo definido como publico en first.js será accedible desde second.js.

- -
// lib/main.js
-
-var self = require("sdk/self");
-var tabs = require("sdk/tabs");
-
-require("sdk/ui/button/action").ActionButton({
-  id: "load-several",
-  label: "load several scripts",
-  icon: "./icon-16.png",
-  onClick: function () {
-    tabs.activeTab.attach({
-      contentScriptFile: [self.data.url('first.js'),
-                          self.data.url('second.js')]
-    });
-  }
-});
-
- -

Comunicación con los Scripts de Contenido

- -

Tu script del add-on tus scripts de contenido no pueden acceder directamente a las variables del otro o llamar a las funciones del otro, pero pueden enviarse mensajes entre ellos.

- -

Para enciar un mensaje de un lado a otro, el remitente llama a port.emit() y el receptor escucha usando port.on().

- - - -

Re escribamos el ejemplo anterior para pasar un mensaje desde el add-on al script de contenido.

- -

El script de contenido debe verse así_

- -
// "self" is a global object in content scripts
-// Listen for a "drawBorder"
-self.port.on("drawBorder", function(color) {
-  document.body.style.border = "5px solid " + color;
-});
-
- -

En el script del add-on, enviaremos un mensaje "drawBorder" al script de contenido usando el objeto devuelto desde attach():

- -
var self = require("sdk/self");
-var tabs = require("sdk/tabs");
-
-var button = require("sdk/ui/button/action").ActionButton({
-  id: "style-tab",
-  label: "Style Tab",
-  icon: "./icon-16.png",
-  onClick: function() {
-    var worker = tabs.activeTab.attach({
-      contentScriptFile: self.data.url("my-script.js")
-    });
-    worker.port.emit("drawBorder", "red");
-  }
-});
-
- -

El mensaje drawBorder no es un mensaje construido, es un mensaje que el add-on define en la llamada port.emit().

- -

Inyectando CSS

- -

Al contrario de la API page-mod, tab.attach() no te permite inyectar CSS directamente dentro de la página.

- -

Para modificar el estilo de la página, tienes que usar Javascript, como en el ejemplo anteriot.

- -

Aprender más

- -

Para aprender más sobre el trabajo con pestañas en el SDK, puede ver la guía Open a Web Page, la guía List Open Tabs, y la tabs API reference.

- -

Para aprender mpas sobre los scripts de contenido, puede ver content scripts guide.

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/modifying_web_pages_based_on_url/index.html b/files/es/mozilla/add-ons/sdk/tutorials/modifying_web_pages_based_on_url/index.html deleted file mode 100644 index e20146d84d..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/modifying_web_pages_based_on_url/index.html +++ /dev/null @@ -1,227 +0,0 @@ ---- -title: Modificar páginas web basándose en el URL -slug: Mozilla/Add-ons/SDK/Tutorials/Modifying_Web_Pages_Based_on_URL -tags: - - Add-on SDK -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Modifying_Web_Pages_Based_on_URL ---- -
Para realizar los pasos que se describen a continuación es necesario tener instalado el SDK y conocimientos básicos de jpm (Firefox 38 en adelante) o cfx.
- -

Para modificar cualquier página que coincida con un patrón en particular (por ejemplo, "http://example.org/") mientras es cargada, se usa el módulo page-mod.

- -

Para crear un page-mod, es necesario especificar dos cosas:

- - - -

El siguiente es un fragmento de código donde el script de contenido es provisto como una opción de contentScript y el patrón de URL es dado como una opción de  include:

- -
// Import the page-mod API
-var pageMod = require("sdk/page-mod");
-
-// Create a page-mod
-// It will run a script whenever a ".org" URL is loaded
-// The script replaces the page contents with a message
-pageMod.PageMod({
-  include: "*.org",
-  contentScript: 'document.body.innerHTML = ' +
-                 ' "<h1>Page matches ruleset</h1>";'
-});
-
- -

Haga lo siguiente:

- - - -

Abajo se muestra lo que debe poder ver.

- -

- -

Especificar el Patrón de Coincidencia

- -

El patrón de coincidencia usa la sintaxis match-pattern. Se puede definir un patrón de coincidencia como una única cadena o una matriz.

- -

Mantener el Script de Contenido en un Archivo Separado

- -

En el ejemplo anterior, se definió el script de contenido como una cadena de caracteres.

- -

A menos que el script sea muy simple, se debe mantener el script en un archivo separado. Esto hace al código más fácil de mantener, depurar, y revisar. Para hacer esto es necesario:

- - - -

Por ejemplo, si se guarda el script anterior en un archivo llamado my-script.js bajo el directorio data del add-on:

- -
// Import the page-mod API
-var pageMod = require("sdk/page-mod");
-// Import the self API
-var self = require("sdk/self");
-
-// Create a page-mod
-// It will run a script whenever a ".org" URL is loaded
-// The script replaces the page contents with a message
-pageMod.PageMod({
-  include: "*.org",
-  contentScriptFile: self.data.url("my-script.js")
-});
- -

O para Firefox 34 en adelante:

- -
// Import the page-mod API
-var pageMod = require("sdk/page-mod");
-
-// Create a page-mod
-// It will run a script whenever a ".org" URL is loaded
-// The script replaces the page contents with a message
-pageMod.PageMod({
-  include: "*.org",
-  contentScriptFile: "./my-script.js"
-});
- -

Cargar Múltiples Scripts de Contenido

- -

Es posible cargar mas de un script, y los scripts pueden interactuar directamente.

- -

Por ejemplo, se puede reescribir my-script.js para usar jQuery.

- -
$("body").html("<h1>Page matches ruleset</h1>");
-
- -

Luego se descarga jQuery al directorio data del add-on, y se carga conjuntamente el script y el jQuery (asegurándose de cargar primero el jQuery).

- -
// Import the page-mod API
-var pageMod = require("sdk/page-mod");
-// Import the self API
-var self = require("sdk/self");
-
-// Create a page mod
-// It will run a script whenever a ".org" URL is loaded
-// The script replaces the page contents with a message
-pageMod.PageMod({
-  include: "*.org",
-  contentScriptFile: [self.data.url("jquery-1.7.min.js"), self.data.url("my-script.js")]
-});
-
- -

Se puede usar contentScript y contentScriptFile juntos en el mismo page-mod. Si se hace esto, los script cargados usando contentScriptFile son cargados primero.

- -
// Import the page-mod API
-var pageMod = require("sdk/page-mod");
-// Import the self API
-var self = require("sdk/self");
-
-// Create a page-mod
-// It will run a script whenever a ".org" URL is loaded
-// The script replaces the page contents with a message
-pageMod.PageMod({
-  include: "*.org",
-  contentScriptFile: self.data.url("jquery-1.7.min.js"),
-  contentScript: '$("body").html("<h1>Page matches ruleset</h1>");'
-});
-
- -

Note, sin embargo, que no es posible cargar un script desde un sitio web. El script debe ser cargado desde el directorio data.

- -

Comunicarse con el Script de Contenido

- -

El script del add-on y los scripts de contenido no pueden acceder directamente a las variables o llamar a las funciones de los demás, pero pueden enviar mensajes.

- -

Para enviar un mensaje de un lado a otro, el emisor llama a port.emit() y el receptor escucha usando port.on().

- - - -

Se reescribe el ejemplo anterior para pasar un mensaje desde el add-on al script de contenido. El mensaje contendrá el nuevo contenido para ser insertado en el documento.

- -

El script de contenido ahora necesita lucir de esta manera:

- -
// "self" is a global object in content scripts
-// Listen for a message, and replace the document's
-// contents with the message payload.
-self.port.on("replacePage", function(message) {
-  document.body.innerHTML = "<h1>" + message + "</h1>";
-});
-
- -

En el script del add-on, se enviará al script de contenido un mensaje desde onAttach.

- -
// Import the page-mod API
-var pageMod = require("sdk/page-mod");
-// Import the self API
-var self = require("sdk/self");
-
-// Create a page-mod
-// It will run a script whenever a ".org" URL is loaded
-// The script replaces the page contents with a message
-pageMod.PageMod({
-  include: "*.org",
-  contentScriptFile: self.data.url("my-script.js"),
-  // Send the content script a message inside onAttach
-  onAttach: function(worker) {
-    worker.port.emit("replacePage", "Page matches ruleset");
-  }
-});
-
- -

El mensaje replacePage no es un mensaje ya definido: es un mensaje definido por el add-on en la llamada port.emit().

- -
-

Inyectar CSS

- -

Note que la característica descrita en esta sección es experimental por los momentos. Se continuará dando soporte a esta característica, pero los detalles dela API pueden cambiar.

- -

En vez de inyectar JavaScript en una página, es posible inyectar CSS configurando la opción contentStyle del page-mod.

- -
var pageMod = require("sdk/page-mod").PageMod({
-  include: "*",
-  contentStyle: "body {" +
-                "  border: 5px solid green;" +
-                "}"
-});
-
- -

Como con el contentScript, hay una opción correspondiente a contentStyleFile que toma una URL de un archivo CSS en el directorio "data" ; es una buena practica usar esta opción en vez de contentStyle si el CSS un poco complejo.

- -
var pageMod = require("sdk/page-mod").PageMod({
-  include: "*",
-  contentStyleFile: require("sdk/self").data.url("my-style.css")
-});
-
- -

O, para Firefox 34, se puede usar una versión más simple:

- -
var pageMod = require("sdk/page-mod").PageMod({
-  include: "*",
-  contentStyleFile: "./my-style.css"
-});
-
- -

Conociendo más

- -

Para conocer más sobre page-mod, puede dirigirse a la página de referencia de la API. En particular, el constructor de PageMod toma algunas opciones adicionales para tomar el control de este comportamiento:

- - - -

Para conocer más sobre los scripts de contenido en general, puede dirigirse a la  guía de scripts de contenido.

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/open_a_web_page/index.html b/files/es/mozilla/add-ons/sdk/tutorials/open_a_web_page/index.html deleted file mode 100644 index 1140029e16..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/open_a_web_page/index.html +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Abrir una página web -slug: Mozilla/Add-ons/SDK/Tutorials/Open_a_Web_Page -tags: - - Add-on SDK -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Open_a_Web_Page ---- -
Para realizar los pasos que se describen a continuación es necesario tener instalado el SDK y conocimientos básico de cfx.
- -

Para abrir una nueva página web, se usa el módulo tabs:

- -
var tabs = require("sdk/tabs");
-tabs.open("http://www.example.com");
-
- -

Esta función es asíncrona, por lo tanto no se tendrá inmediatamanete un objeto tab  el cual se pueda examinar. Para hacer esto, se pasa una función de retrollamada en open(). La retrollamada es asignada a pa propiedad onReady, y pasará la pestaña como argumento:

- -
var tabs = require("sdk/tabs");
-tabs.open({
-  url: "http://www.example.com",
-  onReady: function onReady(tab) {
-    console.log(tab.title);
-  }
-});
-
- -

Incluso ahora, no se tiene acceso directo a ningún contenido dentro de la pestaña.

- -

Para acceder al contenido de la pstaña se necesita adjuntar un script a la pestaña usando tab.attach(). Este add-on carga una página, luego adjunta un script a la página el cual le agrega un borde rojo:

- -
var tabs = require("sdk/tabs");
-tabs.open({
-  url: "http://www.example.com",
-  onReady: runScript
-});
-
-function runScript(tab) {
-  tab.attach({
-    contentScript: "document.body.style.border = '5px solid red';"
-  });
-}
-
- -

Conozca más

- -

Para conocer más sobre las pestañas en el SDK, puede dirigirse a la referencia de tabs en la API.

- -

Para conocer mas sobre la ejecución de scripts en las pestañas, puede diregirse a usando tab.attach() en el tutorial.

diff --git a/files/es/mozilla/add-ons/sdk/tutorials/troubleshooting/index.html b/files/es/mozilla/add-ons/sdk/tutorials/troubleshooting/index.html deleted file mode 100644 index cb2c3d7b18..0000000000 --- a/files/es/mozilla/add-ons/sdk/tutorials/troubleshooting/index.html +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Resolución de problemas -slug: Mozilla/Add-ons/SDK/Tutorials/Troubleshooting -translation_of: Archive/Add-ons/Add-on_SDK/Tutorials/Troubleshooting ---- -

Si tiene problemas para lograr que el Add-on SDK funcione correctamente, ¡no entre en pánico! Esta página lista algunos puntos de inicio que pueden ayudarte a solucionar el problema.

- -

Problema de Cuarentena en Mac OS X

- -

En Mac OS X, puede aparecer el siguiente error cuando intenta ejecutar cfx:

- -
/path/to/sdk/bin/cfx: /usr/bin/env: bad interpreter: Operation not permitted
-
- -

Esto puede ser causado debido a que el archivo ejecutable de cfx fue puesto en cuarentena durante la descarga desde Internet.

- -

Pra sacar el archivo de la cuarentena, use xattr -d, especificando com.apple.quarantine como el nombre del atributo a ser eliminado, y cfx como el archivo desde el cual borrar ese atributo:

- -
xattr -d com.apple.quarantine /path/to/sdk/bin/cfx
-
- -

Verificar Python

- -

La herramienta cfx del SDK se ejecuta sobre Python. Si tiene problemas para ejecutar cfx de cualquier manera, asegúrese de tener Python correctamente instalado.

- -

Intente ejecutar la siguiente línea desde una terminal:

- -
  python --version
-
- -

cfx espera contar con Python 2.5, 2.6 o 2.7. Versiones anteriores o superiores pueden o no funcionar correctamente. Los espacios en blanco en la ruta de instalación no estan soportados.

- -

Verificar Firefox o XULRunner

- -

cfx busca lugares conocidos en el sistema para encontrar a Firefox o XULRunner. cfx puede no haber encontrado una instalación, o si tiene múltiples instalaciones, cfx puede haber encontrado la instalación menos apropiada. En esos casos debe usar  la opción --binary de cfx. Vea la guia cfx Tool para más información.

- -

Cuando ejecuta cfx para probar el add-on o realiza pruebas unitarias, se muestra en pantalla la ubicación de los binarios de Firefox o XULRunner encontrados, por lo que puede asegurarse de la ubicación revisando estas salidas.

- -

Verificar la Terminal de Texto

- -

Cuando se generan errores en la API del SDK y el código, estos son registrados en la terminal de texto. Esta debería ser la misma terminal desde la cual ejecuta cfx.

- -

No deje sueltos los Archivos No-SDK

- -

Actualmente el SDK no maneja de manera adecuada los archivos y directorios que no espera encontrar. Si hay directorios vacíos, directorios o archivos  que no estan relacionados con el SDK dentro del directorio addon-sdk o sus subdirectorios, intente eliminarlos.

- -

Buscar Problemas Conocidos

- -

Alguien mas debe haber experimentado su mismo problema. Frecuentemente otras personas publican sus problemas a la lista de correo del proyecto. Usted también puede explorar la lista de problemas conocidos ó buscar palabras claves específicas.

- -

Contactar al Equipo del Proyecto y al Grupo de Usuarios

- -

Las personas usuarias del SDK y las personas miembro del equipo del proyecto discuten problemas y propuestas en la lista de correo del proyecto. Alguien más puede haber tenido un problema igual al suyo, por lo tanto puede intentar buscar en la lista. Igualmente puede publicar una pregunta si así lo desea.

- -

También puede hablar en tiempo real con otras personas usuarias de SDK en el canal #jetpack en la red IRC de Mozilla.

- -

Y si desea reportar un error en el SDK, es siempre bienvenido! Para esto deberá crear una cuenta con Bugzilla, el rastreador de errores de Mozilla.

- -

Ejecutar Pruebas Unitarias en SDK

- -

El SDK trae consigo un conjunto de pruebas las cuales aseguran el correcto funcionamiento de las APIs. Puede ejecutaras de la siguiente manera:

- -
  cfx testall
-
- -

Algunas de las pruebas abren la ventana de Firefox para verificar las APIs relacionadas a la interfaz de usuario, no se preocupe. Por favor deje que el proceso culmine antes de reanudar su trabajo.

- -

Cuando el proceso culmine, la terminal debe mostrar la salida que puede verse de la siguiente manera:

- -
  Testing cfx...
-  .............................................................
-  ----------------------------------------------------------------------
-  Ran 61 tests in 4.388s
-
-OK
-  Testing reading-data...
-  Using binary at '/Applications/Firefox.app/Contents/MacOS/firefox-bin'.
-  Using profile at '/var/folders/FL/FLC+17D+ERKgQe4K+HC9pE+++TI/-Tmp-/tmpu26K_5.mozrunner'.
-  .info: My ID is 6724fc1b-3ec4-40e2-8583-8061088b3185
-  ..
-  3 of 3 tests passed.
-  OK
-  Total time: 4.036381 seconds
-  Program terminated successfully.
-  Testing all available packages: nsjetpack, test-harness, api-utils, development-mode.
-  Using binary at '/Applications/Firefox.app/Contents/MacOS/firefox-bin'.
-  Using profile at '/var/folders/FL/FLC+17D+ERKgQe4K+HC9pE+++TI/-Tmp-/tmp-dzeaA.mozrunner'.
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  .........................................................................
-  ...............................................
-
-3405 of 3405 tests passed.
-  OK
-  Total time: 43.105498 seconds
-  Program terminated successfully.
-  All tests were successful. Ship it!
-
- -

Si la salida revela muchos errores, puede ser una señal que el SDK no se esta ejecutando correctamente en su sistema. En ese caso, por favor reporte el error o envíe un mensaje a la lista de correo. Vea la sección anterior para más información sobre como hacer esto.

diff --git a/files/es/mozilla/add-ons/themes/obsolete/index.html b/files/es/mozilla/add-ons/themes/obsolete/index.html deleted file mode 100644 index d420b6ebf0..0000000000 --- a/files/es/mozilla/add-ons/themes/obsolete/index.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Obsolete -slug: Mozilla/Add-ons/Themes/Obsolete -tags: - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Add-ons/Themes/Obsolete ---- -

This page collects theme docs that we don't expect will ever be updated, but which we're keeping for the time being as potential source material for updated docs.

-

{{ ListSubPages ("/en-US/Add-ons/Themes/Obsolete", 5) }}

diff --git a/files/es/mozilla/add-ons/thunderbird/howtos/common_thunderbird_extension_techniques/add_toolbar_button/index.html b/files/es/mozilla/add-ons/thunderbird/howtos/common_thunderbird_extension_techniques/add_toolbar_button/index.html deleted file mode 100644 index 216b120445..0000000000 --- a/files/es/mozilla/add-ons/thunderbird/howtos/common_thunderbird_extension_techniques/add_toolbar_button/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Añadir botón a la barra de herramientas -slug: >- - Mozilla/Add-ons/Thunderbird/HowTos/Common_Thunderbird_Extension_Techniques/Add_Toolbar_Button -translation_of: >- - Mozilla/Thunderbird/Thunderbird_extensions/HowTos/Common_Thunderbird_Extension_Techniques/Add_Toolbar_Button ---- -

{{AddonSidebar}}

- -

Fichero XUL de ejemplo:

- -
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://demo/skin/overlay.css" type="text/css" ?>
-
-<overlay id="messengerWindow" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script type="application/x-javascript" src="overlay.js" />
-  <toolbarpalette id="MailToolbarPalette">
-    <toolbarbutton id="demo-button"
-      class="demo-button toolbarbutton-1"
-      label="Demo"
-      type="button"
-      oncommand="Demo.load();"
-      />
-  </toolbarpalette>
-</overlay>
-
- -

Añada el siguiente código al fichero CSS referenciado en el fichero XUL:

- -
#demo-button, [place="palette"] > #demo-button {
-  list-style-image: url("chrome://demo/skin/icon.png") !important;
-}
-
diff --git a/files/es/mozilla/add-ons/thunderbird/howtos/common_thunderbird_extension_techniques/index.html b/files/es/mozilla/add-ons/thunderbird/howtos/common_thunderbird_extension_techniques/index.html deleted file mode 100644 index 8711130729..0000000000 --- a/files/es/mozilla/add-ons/thunderbird/howtos/common_thunderbird_extension_techniques/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Common Thunderbird Extension Techniques -slug: Mozilla/Add-ons/Thunderbird/HowTos/Common_Thunderbird_Extension_Techniques -tags: - - NeedsTranslation - - TopicStub - - thunderbird -translation_of: >- - Mozilla/Thunderbird/Thunderbird_extensions/HowTos/Common_Thunderbird_Extension_Techniques ---- -

{{AddonSidebar}}

- -

{{ tree() }}

diff --git a/files/es/mozilla/add-ons/thunderbird/howtos/index.html b/files/es/mozilla/add-ons/thunderbird/howtos/index.html deleted file mode 100644 index 6d5cb0424a..0000000000 --- a/files/es/mozilla/add-ons/thunderbird/howtos/index.html +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Thunderbird HowTos -slug: Mozilla/Add-ons/Thunderbird/HowTos -tags: - - Add-ons - - Extensions - - NeedsTranslation - - TopicStub - - thunderbird -translation_of: Mozilla/Thunderbird/Thunderbird_extensions/HowTos ---- -

{{AddonSidebar}}

- -
-

This page is badly broken (https://bugzilla.mozilla.org/show_bug.cgi?id=868872), use http://mdn.beonex.com/en/Extensions/Thunderbird/HowTos.html in the meanwhile.

-
- -

Please add questions or answers to this page so that other people can benefit from your work. Also, you will see that there are many topics for which there is a question, but no answer. Please help by adding an answer! (Adding another question helps too!)

- -

To get started creating the most basic extension framework, please see Building a Thunderbird Extension.

- -

This page is organized into two parts: common extension techniques and Thunderbird-specific APIs. The former discusses general methods to hook into Thunderbird, while the latter is more focused on how to do interesting things once Thunderbird has started running your code.

- -

See also "An overview of Thunderbird components". Many of the components described on that page have links to related examples.

- -

Common Extension Techniques

- -
- -
- -

Thunderbird-specific APIs for Extensions

- -

Each of the pages listed in this section contains a number of related topics. For example, the "Compose New Message" page contains sections that describe how to open a new message window, modify a message body, etc.

- -

Folders and message lists

- - - -

View message

- - - -

Compose new messages

- - - -

Reply to message

- - - -

Access address book

- - - -
- - -

Activity Manager

-
- - diff --git a/files/es/mozilla/add-ons/thunderbird/index.html b/files/es/mozilla/add-ons/thunderbird/index.html deleted file mode 100644 index 4e66877136..0000000000 --- a/files/es/mozilla/add-ons/thunderbird/index.html +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Thunderbird extensions -slug: Mozilla/Add-ons/Thunderbird -tags: - - Add-ons - - Extensions - - NeedsTranslation - - TopicStub - - thunderbird -translation_of: Mozilla/Thunderbird/Thunderbird_extensions ---- -
Building a Thunderbird extension
-Step-by-step explanation on how to build an extension for Thunderbird.
- -
-

{{AddonSidebar}}

-The following documentation provides help for creating extensions for Mozilla's Thunderbird email client. Although there are many similarities with Firefox extensions there are also some differences that may confound the starting developer.
- -

-Please help! You can add a how-to (a question or an answer or a code snippet), summarize and link to a relevant newsgroup discussion, or create a tutorial. Need help? Contact jenzed.
- - - - - - - - -
-

Documentation

- -

Getting started with Thunderbird

- -

A brave, young developer wants to develop an add-on for Thunderbird. Here's a few links to help them through this journey.

- -
    -
  • Start by reading the tutorial and learn how to build a Thunderbird extension (Outdated, still talks about overlays and the add-on builder is no longer available but the tutorial has not been updated.)
  • -
  • Read about the main windows so that you know what one means when they say « thread pane », « preview pane », and « folder pane ».
  • - -
  • Want to do some real stuff? See how to inspect a message (demo add-on included!)
  • -
  • Play with our other demo add-on that exercises some more advanced Thunderbird-specific features
  • -
  • Want to do even more stuff? Don't reinvent the wheel: steal functions from the thunderbird-stdlib project (doc here). Functions for dealing with messages (delete them, archive them, change their tags, etc.) are included.
  • -
  • Haven't found what you're looking for? Read the Thunderbird how-tos; they contain a lot of recipes for things extensions want to do.
  • -
  • Still haven't managed to do what you wanted? See the list of all Thunderbird communication channels so that you know where to ask when you get stuck :-).
  • -
  • Feeling really brave? Read the source using a fancy interface; you can often find tests that demonstrate how to do what you're trying to achieve.
  • -
- -

The Gloda database

- -

Thunderbird has a subsystem called Gloda. Gloda stands for « Global Database », and creates Thunderbird-wide relations between objects. Gloda provides concepts such as Conversations, Messages, Identities, Contacts. All these concepts are related together: a Conversation contains Messages which are linked to Identities (from field, to field) which are themselves part of a Contact: indeed, a contact has multiple identities.

- -

Typical use cases for Gloda: find all messages whose subject matches [search term], find all messages from [person], find all messages in the same thread as [a given message], find all messages involving [person], etc. etc.

- -

Gloda is extremely powerful and is used heavily by add-ons such as Thunderbird Conversations. Learn more about Gloda:

- - - - - -

Some of these links may be wildly out of date, but they still provide valuable information on the codebase.

- - - - - - -
-

Community

- - - -

{{ DiscussionList("dev-extensions", "mozilla.dev.extensions") }}

- - - -

Tools

- - - -

... more tools ...

- -

View All...

- - - -
-
XUL, JavaScript, XPCOM, Themes, Developing Mozilla
-
-
- -

Categories

- -

{{ languages( { "ja": "ja/Extensions/Thunderbird" } ) }}

diff --git a/files/es/mozilla/bugzilla/index.html b/files/es/mozilla/bugzilla/index.html deleted file mode 100644 index 37ae6d1b09..0000000000 --- a/files/es/mozilla/bugzilla/index.html +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Bugzilla -slug: Mozilla/Bugzilla -tags: - - Bugzilla - - Calidad - - Developing Mozilla - - 'Developing_Mozilla:Tools' - - Herramientas - - Pruebas - - QA - - Tools -translation_of: Mozilla/Bugzilla ---- -

bugzilla.mozilla.org (abreviado comunmente como b.m.o) es un sistema de seguimiento de defectos de Mozilla.org, una base de datos para bugs registrados y solicitudes de mejoras para Firefox, Thunderbird, SeaMonkey, Camino, y otros proyectos de mozilla.org.

- -
-
-

Documentación about B.m.o.

- -
-
Qué hacer y qué NO hacer en Bugzilla
-
Tips for how to use Bugzilla, as well as things you should avoid.
-
La etiqueta en Bugzilla
-
A guide to etiquette; this guide will help you understand how best to conduct yourself on b.m.o. and how using proper manners and civility will help ensure your problem gets solved sooner rather than later.
-
Cómo saber si un bug ha sido reportado
-
It's useful (but not mandatory) for you to check if the problem you're reporting has been already tracked. This guide will help you do so.
-
Aseguramiento de calidad
-
Documentation about quality assurance at Mozilla.
-
Guías para redacción de bugs
-
A guide to writing a good, understandable, bug that will be easily followed by the development team.
-
How to submit a patch
-
If you've fixed a bug, or have implemented a new feature, you'll need to get your patch into the tree so it can become part of the product. This guide will teach you how!
-
- -

View All...

-
- -
-

Otros materiales

- - - -

Herramientas

- -
    -
  • Bugzilla Todos lists review and flag requests, patches to check in, unfulfilled requests you made of other people, and assigned bugs.
  • -
  • Bz Kanban is a board to visualize the status of bugs within a milestone.
  • -
-
-
diff --git a/files/es/mozilla/bugzilla/testopia/index.html b/files/es/mozilla/bugzilla/testopia/index.html deleted file mode 100644 index cfb6d65a22..0000000000 --- a/files/es/mozilla/bugzilla/testopia/index.html +++ /dev/null @@ -1,162 +0,0 @@ ---- -title: Testopia -slug: Mozilla/Bugzilla/Testopia -translation_of: Mozilla/Bugzilla/Testopia ---- -

Testopia es un administrador de casos de prueba, el cual maneja extensiones para interactuar con Bugzilla. Testopia está diseñado para ser una herramienta genérica para el seguimiento de casos de prueba, permitiendo a las organizaciones realizar las pruebas de software e integrar reportes de defectos encontrados, así como el resultado de los caso de prueba. Testopia está diseñado desde el punto de vista de la actividad de pruebas, este puede ser usado para llevar el seguimiento de pruebas, así como el seguimiento virtual de cualquier proceso de ingenieria.

- -

Testopia 2.5

- -

Estas versiones soportan Bugzilla 4.2 y la mejor noticia es que no requerirá mas un patch para Bugzilla. Si estas actualizando, por favor revierte el parche de la versión existente antes de instalar. Una instalación nueva solo requiere que descomprimas el tarball en tu directorio raiz de Bugzilla y corras un checksetup. Gracias a LpSolit del equipo Bugzilla por su esfuerzo en hacer esto posible.

- -

Testopia 2.4 - Important notice!

- -

If you are upgrading on a case sensitive filesystem you must remove the existing testopia folder in the extensions directory. If you have made modifications to the testopia source code, you will need to merge them into the new Testopia folder (capital T). If you are on Windows or another case insensitive file system you should first rename the folder (testopia-old for example) and then unzip the tarball. You can then merge your changes before deleting the old version.

- -

API USERS TAKE NOTE: Positional parameters are now deprecated. All params should now be sent in a hash (struct, dict, hashmap or whatever your language of choice calls key, value pairs). Though all attempts have been made to provide continuing support for positional parameters, please be aware that some API calls may fail until you make this change. Also, future versions may remove this support completely.

- -

As always please backup your installation before attempting to install or upgrade.

- -

Integration Points

- - - -

Features for version 2.4 (Bugzilla 3.6.x)

- - - -

Features for version 2.3 (Bugzilla 3.4.x)

- - - -

Features for version 2.2 (Bugzilla 3.2 and 3.0.x)

- -

This release is primarily a bug fix release and to make Testopia compatable with Bugzilla 3.2 and Bugzilla 3.0.6. Please be sure to download the correct package based on your Bugzilla version.

- -

To install, do the following (see the README for more detailed instructions):

- -
    -
  1. Untar the Testopia 2.4 tarball inside your Bugzilla directory.
  2. -
  3. Patch the Bugzilla files.
    - On Linux systems it should look something like: -

    patch -p0 -i extensions/testopia/patch-3.6

    -
  4. -
  5. Run checksetup.pl
  6. -
- -

To upgrade an existing Testopia installation you follow the same steps only you need to first REVERSE the old patch BEFORE untarring the files. If upgrading Bugzilla at the same time, this should be done before that as well..

- -

patch -p0 -R -i extensions/testopia/patch-<version>

- -

Where <version> represents the version of the patch you have applied (Bugzilla version).

- -

Requirements

- -

As our development has moved forward, we have decided to try to keep abreast of the latest stable release from Bugzilla (currently 3.4). This gives us a stable code base to work from. Developing plugins or extensions for any software is like trying to hit a moving target. This decision allows us to focus our time more on releasing new features often and early rather than back porting. However, this means that most major feature will not be back ported to earlier versions unless and until we have time to do so. Anyone wishing to help in this effort is more than welcome.

- - - -

TODO

- - - -

See the Roadmap and Bug List for more details.

- - - - - -

Downloads

- - - -

Developers

- -

Greg Hendricks
- Vance Baarda (former developer)
- Ed Fuentetaja (former developer)

diff --git a/files/es/mozilla/como_obtener_un_seguimiento_de_pila_para_un_informe_de_error/index.html b/files/es/mozilla/como_obtener_un_seguimiento_de_pila_para_un_informe_de_error/index.html deleted file mode 100644 index 00716daf42..0000000000 --- a/files/es/mozilla/como_obtener_un_seguimiento_de_pila_para_un_informe_de_error/index.html +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: Cómo obtener un seguimiento de pila para un informe de bug -slug: Mozilla/como_obtener_un_seguimiento_de_pila_para_un_informe_de_error -translation_of: Mozilla/How_to_get_a_stacktrace_for_a_bug_report ---- -

Si presenta un informe de bug en Bugzilla sobre un bloqueo, debe incluir un seguimiento de pila (pila de llamadas) en su informe. Un seguimiento de pila le dirá a los desarrolladores de Mozilla qué falló y proporcionará un punto de partida para investigar su causa. Este artículo describe cómo usar Mozilla Crash Reporter (Breakpad) para obtener una ID de bloqueo, que nuestros ingenieros pueden usar para obtener un stacktrace, y formas alternativas de obtener un stacktrace si no puede obtener una ID de crash.

- -

Requirements

- -

You need a binary build of Firefox from Mozilla.org. SeaMonkey and Thunderbird also support crash reporting.

- -

Mozilla's crash report server currently only has debug information for Mozilla builds and thus the crash reporter cannot work if you use a build from a Linux distribution or if you compile from source code. In these cases you will need to use one of the alternative methods listed below.

- -
Note: When filing a crash report, it is important to know whether the crash occurs with Firefox safe mode. This helps engineers determine whether a particular extension or plugin is the cause of the crash.
- -

How to get a crash ID with the Mozilla Crash Reporter

- - - - - - - - -
-

1. Crash and submit a report to the system.

- -

The Mozilla Crash Reporter window should automatically come up after Firefox crashes. If you have any additional information about the crash, such as additional detail on what you were doing at the time that may have triggered the crash, please enter it into the comments box. Be sure that you check the "Tell Mozilla about this crash" checkbox and click the restart button. The crash reporter should now submit the crash report and Firefox should open again.

- -
The "Details" button gives additional data about the incident, however this is not useful in a bug report.
-
-

reporter.jpg

-
- - - - - - - - -
-

2. Tell us the ID of the report you submitted.

- -

To access all of your submitted reports type "about:crashes" into the Firefox address bar and press enter. Firefox should open a list of IDs for your submitted crash reports. Copy two or three of the IDs for the appropriate crashes and paste them into your Bugzilla report. Please check the listed times to avoid copying the ID of an unrelated crash report.

- -
You can prefix a "bp-" to the beginning of an ID to make Bugzilla turn it into a link: bp-a70759c6-1295-4160-aa30-bc4772090918
-
-

crashlist.jpg

-
- -

How to get the crash ID if Firefox crashes on startup

- -

If Firefox crashes on startup you can still access your submitted crash reports. Crash reports are accessible from all Firefox profiles, so if a new profile does not crash you can use it to access them through "about:crashes" as above.

- -

Accessing crash report IDs outside of Firefox

- -

If you cannot load Firefox at all you can find the crash report files at this location depending on your operating system:

- -

Windows : %APPDATA%\Mozilla\Firefox\Crash Reports\submitted\
- OS X : ~/Library/Application Support/Firefox/Crash Reports/submitted/
- Linux : ~/.mozilla/firefox/Crash Reports/submitted/

- -

Each file in this folder contains one submitted crash report ID. You can check the modified or creation time for each file to discern which crash reports are relevant to your bug report.

- -

Alternative ways to get a stacktrace

- -

If the Mozilla crash reporter doesn't come up or isn't available you will need to obtain a stacktrace manually:

- -

Windows

- -

See the article Create a stacktrace with Windbg for information on how to do this.

- -

For a full process dump, see How to get a process dump with Windows Task Manager [en-US]

- -

OS X

- -

Run /Applications/Utilities/Console.app.  Expand "~/Library/Logs" and "CrashReporter", then look for logs for "firefox-bin".

- -

Linux

- -

Note that for most distros, the package you need to get symbols for will be something like "xulrunner", not "firefox".

- -

Crash reports files on your computer

- -

When Breakpad initially catches a crash it first writes crash report files (e.g. .dump and .extra files) into the 'pending' subdirectory of its 'Crash Reports' directory.

- -

If Breakpad successfully sends the crash report to the reporting server then, by default, the files added to the 'pending' subdirectory for the crash are removed, and a .txt file is placed in the 'submitted' directory containing the crash ID created by the reporting server.

- -

If you want Breakpad to leave the .dump and .extra files on your computer so that you can examine them locally, then set the MOZ_CRASHREPORTER_NO_DELETE_DUMP environment variable to 1.

- - diff --git a/files/es/mozilla/connect/index.html b/files/es/mozilla/connect/index.html deleted file mode 100644 index b7151db9a6..0000000000 --- a/files/es/mozilla/connect/index.html +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Conectate con Mozilla -slug: Mozilla/Connect -tags: - - Español - - Mozilla -translation_of: Mozilla/Connect ---- -
-

Se parte de la aventura Mozilla Developer Network, Inspirate en colaborar y formar parte del equipo de contribuidores.

- -

¡Tú también puedes!.

-
- -

 

- -

 

- -

 

- -

 

- -

 

- -
-
-
- -
- -
- -
- -
- -
-
- -
-

Conectarte con Mozilla

- -

Los desarrolladores están creando el futuro mediante la creación de aplicaciones para todas las personas alrededor del mundo. El objetivo de Mozilla Developer Relations es ayudar a los desarrolladores a utilizar tecnologías web estandarizadas para tener éxito en el logro de sus objetivos. Además de la documentación disponible en MDN, ofrecemos ayuda y otros recursos para este objetivo, a través de diversos canales. Te invitamos a conectarte, aprender y compartir tu conocimiento.

- -

Ofrecemos ayuda através de Q&A en Stack Overflow, para solucionar cuestiones técnicas específicas y desafios que pueda tener. Tambien tenemos un boletín para mantenerte informado sobre los últimos acontecimientos en la escena web, entorno a aplicaciones web y mucho más. Suscríbete al boletín de noticias de apps y hacks

- -

Si compartes la misión y principios de Mozilla y quieres ayudar a progresar a otros desarrolladores, da un vistazo a las maneras en que puedes involucrarte en la evangelización técnica y únete a nuestro grupo de discusión de evangelización.

- -

Tenemos muchos planes e ideas para expandir de forma iterativa nuestra oferta de relaciones de desarrolladores y ¡queremos que estés involucrado en como lo hacemos! así que , ¡sigue las etiquetas de  Stack Overflow, suscribete al Blog Hack, suscribete al boletin y registrate para obtener una cuenta!

- -

Únete a Mozilla

- -

Si quieres ir más allá de la conexión con Mozilla, puedes unirte a Mozilla y ayudar a hacer realidad su misión de construir una mejor internet. Como desarrollador, tienes habilidades para contribuir en muchas áreas, así como la posibiliad de mejorar tus habilidades. Mozilla es un proyecto de código abierto, como es "abierto por defecto" puede "ver el código fuente" y contribuir en el desarrollo de proyectos de software, como el navegador Firefox para escritorio y Android, Firefox OS, y sitios web de Mozilla. Puedes convertirte en parte de la comunidad internacional y obtener reconocimiento por tus esfuerzos. Estas son algunas de las ventajas de contribuir al proyecto Mozilla.

- -

Oportunidad de aprender algo nuevo.

- -
-

Al escribir código para un proyecto de código abierto, podrás enfrentarte a problemas que antes no has encontrado, que presentan oportunidades de aprendizaje para ti. Puedes probar nuevas herramientas y técnicas en un proyecto de código abierto. Si por ejemplo, nunca has hecho pruebas unitarias, y tras codificar no logras obtener el permiso para hacerlo en el trabajo, un proyecto de código abierto sería un excelente lugar para aprender. Contribuir al código abierto le da la oportunidad de conocer y colaborar con muchas personas alrededor del mundo que tiene intereses similiares. Por otra parte, una organización de código abierto como Mozilla tiene muchos colaboradores que le podrán ayudar a solucionar los problemas que encuentre. Si solo acabas de empezar a contribuir, puedes buscar "mentoria de errores", donde un colaborador con mayor experiencia se ha ofrecido a ayudar a los recién llegados a solucionarlos.

- -

¿Qué puedo obtener contribuyendo?

- -

Explora muchas cosas y obten reconocimiento de la comunidad-- Estos son los beneficios intangibles de contribuir a Mozilla. Si bien no podemos garantizar beneficios tangibles específicos, muchos valiosos colaboradores reciben gratis articulos Mozilla e invitaciones a eventos relacionados, y estan de primeros en las lista para pasantias. por otra parte, tu experiencia en la contribución a un proyecto de código abierto podria ayudarte a obtener un trabajo. Cada vez son mas los empleadores que están buscando contribuyentes de codigo abierto. A ellos les gusta ver que usted está en blogs y contribuyendo en listas de correo, y les gusta ver que usted ayudó en el desarrollo de un proyecto de código abierto. También te puede ayudar en la sección de experiencia laboral para tu CV.

- -

¿Cómo puedes contribuir a Mozilla?

- -

Hay muchas áreas del proyecto donde puedes contribuir a Mozilla. Puedes encontrar un camino, el listado completo está en la página de involúcrate. Algunas de las áreas que te pueden interesar como desarrollador incluyen:

- - -
-
- -
-
-

Q&A en Stack Overflow Veer todo Q&A

- -

Tenemos Q&A para discutir los asuntos del desarrollo, en particular en Firefox OS y la  Web libre en movil. Está disponible en Stack Overflow de forma fácil en la URL de abajo.

- -

http://stackoverflow.com/r/mozilla.

- -
Stack form
- -

Últimos temas de Q&A

-
- -
 
-
- -

Developers at a Firefox OS workshop in Madrid.

- -
-
-

¿Dónde está Mozilla? Mira los asistentes  y detalles en nuestra pagina de eventos...

- -

Aqui hay un listado de los eventos donde los representantes de Mozilla hablarán. ¡Asegurate de hablar con ellos!

-
- - -
-
- -

 

diff --git a/files/es/mozilla/creando_un_complemento_de_diccionario_de_ortografia/index.html b/files/es/mozilla/creando_un_complemento_de_diccionario_de_ortografia/index.html deleted file mode 100644 index 1dbd2ca898..0000000000 --- a/files/es/mozilla/creando_un_complemento_de_diccionario_de_ortografia/index.html +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Creando un complemento de diccionario de ortografía -slug: Mozilla/creando_un_complemento_de_diccionario_de_ortografia -translation_of: Mozilla/Creating_a_spell_check_dictionary_add-on ---- -

Esta página describe cómo empaquetar un diccionario de ortografía Hunspell como complemento para Firefox, o cómo actualizar tu complemento existente para que pueda ser instalado, desinstalado y actualizado sin necesidad de reiniciar.

- -

Partes necesarias

- -

Para crear un complemento de diccionario, primero necesitas dos cosas:

- - - -

Si estás creando un nuevo diccionario, a diferencia de actualizar uno existente, por favor asegúrate de que no haya un diccionario disponible para tu localización. Si es que ya hay uno, intenta contactar al autor para actualizarlo, o contacta a los editores de AMO si es que el autor no responde.

- -

Empaquetamiento

- -

Un complemento de Firefox es un archivo ZIP renombrado para usar una extensión de archivo .xpi en lugar de la extensión de archivo .zip normal. Para crear un complemento de diccionario, simplemente crea un archivo ZIP que contenga los siguientes archivos y carpetas:

- -

my-dictionary.xpi

- - - -

Los archivos .dic y .aff deben estar ubicados en una subcarpeta llamada dictionaries dentro del archivo ZIP. Ambos archivos deben tener el código de localización como nombre de archivo. También tienes que añadir un archivo llamado install.rdf a la raíz del archivo ZIP. Este archivo contiene información sobre tu complemento, como por ejemplo el nombre y el número de versión (ver a continuación). Además de estos archivos requeridos, puedes añadir archivos opcionales, por ejemplo darle un ícono a tu complemento o describir la licencia del diccionario.

- -

Aquí hay un ejemplo del archivo install.rdf. Puedes crearlo y editarlo con un editor de texto plano como "Bloc de notas".

- -

<?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>Código-de-localización@dictionaries.addons.mozilla.org</em:id>
-     <em:version>número de versión</em:version>
-     <em:type>64</em:type>
-     <em:unpack>true</em:unpack>
-     <em:name>Nombre</em:name>
-     <!--
-       Otros metadatos de install.rdf tales como em:localized, em:description, em:creator,
-       em:developer, em:translator, em:contributor o em:homepageURL
-     -->

-
-     <!-- Firefox -->
-     <em:targetApplication>
-       <Description>
-         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-         <em:minVersion>18.0a1</em:minVersion>
-         <em:maxVersion>46.0</em:maxVersion>
-       </Description>
-     </em:targetApplication>
-
-     <!-- Thunderbird -->
-     <em:targetApplication>
-       <Description>
-         <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
-         <em:minVersion>18.0a1</em:minVersion>
-         <em:maxVersion>22.0</em:maxVersion>
-       </Description>
-     </em:targetApplication>
-
-     <!-- SeaMonkey -->
-     <em:targetApplication>
-       <Description>
-         <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
-         <em:minVersion>2.15a1</em:minVersion>
-         <em:maxVersion>2.49</em:maxVersion>
-       </Description>
-     </em:targetApplication>
-   </Description>
- </RDF>

- -

Aquí hay algunas reglas sobre cómo debieras adaptar el archivo install.rdf:

- - - -

Una vez que has añadido estos archivos a tu archivo ZIP, y este último lo has renombrado para que tenga la extensión .xpi, puedes instalar tu complemento en Firefox y problarlo. Luego de una prueba exitosa, puedes subir tu complemento a addons.mozilla.org y solicitar que sea incluido en la página de Diccionarios y paquetes de idioma.

diff --git a/files/es/mozilla/firefox/compilar_firefox_con_codigo_en_rust/index.html b/files/es/mozilla/firefox/compilar_firefox_con_codigo_en_rust/index.html deleted file mode 100644 index 76ea78e7b0..0000000000 --- a/files/es/mozilla/firefox/compilar_firefox_con_codigo_en_rust/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Compilar Firefox con código en Rust -slug: Mozilla/Firefox/Compilar_Firefox_con_codigo_en_Rust -tags: - - Compilación - - Gecko - - rust -translation_of: Archive/Mozilla/Firefox/Building_Firefox_with_Rust_code ---- -
{{FirefoxSidebar}}

En mayo de 2015, el lenguaje de programación Rust alcanzó su objetivo de estabilidad 1.0 y se comenzaron diversos experimentos que consistieron en escribir partes de Gecko en Rust. Esta página contiene una guía de orientación aproximada para las personas que trabajan en esta área.

- -

Consulte el informe n.º 1135640 (oxidation) para ver el seguimiento integral de la integración de componentes en el lenguaje Rust.

- -

Activación del código en Rust

- -

Con el trabajo realizado en el informe n.º 1161339 se implementó compatibilidad básica para compilar código en Rust. Esta compatibilidad está activada para las compilaciones oficiales de la mayoría de las plataformas, con la excepción de las compilaciones que realice localmente. Si en su «path» tiene «rustc», puede añadir:

- -
ac_add_options --enable-rust
- -

… a su archivo mozconfig y la compilación probablemente funcionará. Normalmente apuntamos a versiones estables de Rust pero, en ocasiones, para admitir algunas plataformas nuevas se necesitan versiones especiales de las herramientas de compilación. Si aún no tiene Rust, utilice la herramienta «rustup» para instalarlo.

- -

Poner a prueba el código en Rust

- -

En el árbol hay una sencilla prueba unitaria de vinculación. Es posible utilizarla para comprobar que Rust esté activado y funcione correctamente con su configuración de compilaciones.

- -
./mach gtest rust.*
- -

Revise que la prueba rust.CallFromCpp se supere, junto con cualquier otra que haya.

- -

Adición de código en Rust

- -

Para agregar código nuevo en Rust se requiere añadir el archivo .rs de nivel superior para agruparlo en un cajón (crate) de SOURCES en moz.build.

- -

Debido a límites de Cargo y al sistema de compilaciones de Firefox, por el momento solo admitimos cajones sencillos, sin dependencias. No empleamos Cargo, sino que creamos un archivo rlib a partir de todos los archivos rust enumerados en SOURCES. El compilador de Rust buscará los módulos internos según los nombres de archivo de código fuente, pero las referencias de extern crate no se resolverán.

- -

El sistema de compilaciones generará un cajón especial para una «biblioteca unificada de Rust», compilada como una biblioteca estática (librul.a) que a su vez se enlaza en XUL, de modo que todos sus símbolos públicos estén disponibles para el código en C++.

diff --git "a/files/es/mozilla/firefox/edici\303\263n_de_desarrollador/index.html" "b/files/es/mozilla/firefox/edici\303\263n_de_desarrollador/index.html" deleted file mode 100644 index 12642f7044..0000000000 --- "a/files/es/mozilla/firefox/edici\303\263n_de_desarrollador/index.html" +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Edición de Desarrollador -slug: Mozilla/Firefox/Edición_de_Desarrollador -tags: - - Firefox - - Iniciado - - Lanzamiento -translation_of: Mozilla/Firefox/Developer_Edition ---- -
{{FirefoxSidebar}}

La versión de Firefox a la medida de los desarrolladores web. (Versión Actualizada)

- -

Descarga Firefox Developer Edition

- -
-
-
-

Las últimas funciones de Firefox

- -

Firefox Developer Edition sustituye al canal Aurora en el Proceso de lanzamiento de versiones de Firefox.  En Developer Edition, como en Aurora,  las caracteristicas se lanzan cada seis semanas, despues de que se hayan estabilizado en Nightly builds.

- -

Utilizando Firefox Developer Edition, tienes acceso a las herramientas y a las caracteristicas de la plataforma al menos 12 semanas antes de que lleguen a alcanzar el canal principal de lanzamiento Firefox.

- -

Descubre las novedades de Firefox Developer Edition..

-
- -
-

Herramientas de Desarrollo Experimentales

- -

Incluiremos herramientas de desarrollo que aún no están todavía del todo listas para ser lanzadas en la versión final de Firefox. Por ejemplo Valence add-on (Adaptador de Herramientas Firefox) , la cual te permite conectar las Herramientas de Desarrollo Firefox  con las de otros navegadores , como Chrome en android o Safari en IOS.

-
-
- -
-
-

Un Perfil Separado

- -

Firefox Developer Edition utiliza un perfil separado de las otras versiones de Firefox instaladas en tu ordenador. Esto hace que puedas intercambiar más facilmente entre las versiones ya lanzadas o las betas de Firefox.

-
- -
-

Configuración para Desarrolladores Web

- -

Hemos establecido valores de preferencia predeterminados adaptados a los desarrolladores web. Por ejemplo, {{glossary ("chrome")}} y depuración remota están habilitados de forma predeterminada.

-
-
- -
-
-

Una Apariencia Distinta

- -

Incluidos accesos directos a las herramientas de desarrollo

-
- -
-
Nota: Esto significa que la primera vez que inicie  Developer Edition, verá un navegador totalmente no personalizado, sin complementos, marcadores o historial. Puedes utilizar Firefox Sync si quieres unificar tu configuración entre Developer Edition y otras ediciones de Firefox.
-
-
- -

 

diff --git "a/files/es/mozilla/firefox/edici\303\263n_de_desarrollador/revertir/index.html" "b/files/es/mozilla/firefox/edici\303\263n_de_desarrollador/revertir/index.html" deleted file mode 100644 index a4df9a3ba6..0000000000 --- "a/files/es/mozilla/firefox/edici\303\263n_de_desarrollador/revertir/index.html" +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Revertir -slug: Mozilla/Firefox/Edición_de_Desarrollador/Revertir -translation_of: Mozilla/Firefox/Developer_Edition/Reverting ---- -
{{FirefoxSidebar}}

Revertir el tema Firefox Developer Edition

- -


- Si quieres usar Firefox Developer Edition, pero prefieres el tema 'Australis' usado en Firefox y Firefox Beta, puedes cambiarlo: simplemente abre el panel "Personalizar" y haz clic en el botón "Usar el tema Firefox Developer Edition".

- -

{{EmbedYouTube("OvJwofTjsNg")}}

- -

Ten en cuenta que el tema Firefox Developer Edition no es aún compatible con temas ligeros. Si quieres usar un tema ligero, tendrás que volver al tema 'Australis'.

- -

Revertir a Firefox Aurora

- -


- Si quieres disfrutar de todas las características pre-Beta de Firefox Developer Edition, descartando el resto de cambios, puedes revertir el navegador a algo parecido al viejo Firefox Aurora. Esto también restaurará tu perfil y datos de sesión previos a la actualización. Es un proceso de dos pasos, que debes de seguir en este orden:

- -
    -
  1. Abre Preferencias y desmarca la opción "Permitir a Firefox Developer Edition y Firefox ejecutarse al mismo tiempo". Se te avisará de que es necesario reiniciar el navegador.
  2. -
  3. Tras reiniciar, podrás revertir la aplicación del tema Firefox Developer Edition abriendo el panel "Personalizar" y haciendo clic en el botón "Usar el tema Firefox Developer Edition".
  4. -
- -

 

diff --git a/files/es/mozilla/firefox/firefox_esr/index.html b/files/es/mozilla/firefox/firefox_esr/index.html deleted file mode 100644 index af8625e1c3..0000000000 --- a/files/es/mozilla/firefox/firefox_esr/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Firefox ESR -slug: Mozilla/Firefox/Firefox_ESR -tags: - - Necesita revisión -translation_of: Mozilla/Firefox/Firefox_ESR ---- -
{{FirefoxSidebar}}
- -

Firefox Extended Support Release (ESR) se basa en una versión oficial de Firefox para el escritorio para su uso por organizaciones que necesitan soporte extendido para implementaciones masivas. La diferencia de otros canales de lanzamiento, las ESR no se actualizan con nuevas características cada seis semanas. En su lugar, son compatibles durante alrededor de un año, actualizándose con importantes soluciones de seguridad o estabilidad. La versión actual de ESR es basa en Firefox 52 emitida el 7 de marzo de 2017. La próxima versión de ESR será el número 59.
-
-
- Animamos firmemente a los usuarios de Firefox ESR que se inscriban en la lista de correo del grupo Enterprise Working Group (EWG).

diff --git a/files/es/mozilla/firefox/multiprocess_firefox/index.html b/files/es/mozilla/firefox/multiprocess_firefox/index.html deleted file mode 100644 index 139a345752..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/index.html +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Firefox multiproceso -slug: Mozilla/Firefox/Multiprocess_Firefox -translation_of: Mozilla/Firefox/Multiprocess_Firefox ---- -
{{FirefoxSidebar}}

En las versiones actuales de Firefox para escritorio, todo el navegador se ejecuta en un solo proceso del sistema operativo. Esto quiere decir que el código JavaScript que ejecuta la IU (interfaz de usuario) del navegador (también conocido como "código chrome") se ejecuta en el mismo proceso que el código de las página web (también conocido como "contenido" o "contenido web").
-
- Las versiones futuras de Firefox ejecutarán la interfaz de usuario del navegador en un proceso separado del contenido web. En la primera etapa de esta arquitectura, todas las pestañas del navegador se ejecutarán en el mismo proceso y la IU del navegador en un proceso diferent. En futuras etapas, esperamos tener más de un proceso de contenido. El proyecto de Firefox multiproceso es llamado Electrolysis, en ocasiones abreviado como e10s.

- -

Las páginas web normales no estarán afectadas por Firefox multiproceso. Quienes trabajen en Firefox en sí mismo y desarrolladores de complementos para Firefox estarán afectados si su código se basa en acceder al contenido web directamente.

- -

En lugar de acceder al contenido web directamente, el código JavaScript deberá usar el administrador de mensajes para acceder al contenido. Para facilitar la transición hemos implementado contenedores de objetos de multiproceso y algunas capas de compatibilidad para complementos. Si eres un desarrollador de complementos y deseas saber cómo estrás afectado, revisa la guía para trabajar con Firefox multiproceso.

- -
-
-
-
-
Repaso técnico
-
Una vista de alto nivel acerca de cómo se está implementando Firefox multiproceso.
-
Guía de compatibilidad para contenido web
-
Directrices y detalles acerca de problemas potenciales de compatiblidad en sitios web que podrían ocurrir debido a la transición. Tip: ¡No son muchos!
-
Glosario
-
Una referencia de la jerga usada en Firefox multiproceso.
-
Administrador de mensajes
-
Una guía completa a los objetos usados para comunicarse entre el código chrome y el contenido.
-
Complementos basados en el SDK
-
Cómo migrar complementos creados utilizando el SDK de complementos.
-
Dónde se carga cada URI
-
Una guía rápida a qué URIs - chrome:, about:, file:, resource: - se cargan en cada proceso.
-
-
- -
-
-
Motivación
-
Por qué estamos implementando Firefox multiproceso: rendimiento, seguridad y estabilidad.
-
Guía para la migración de complementos
-
Si eres un desarollador de complementos, entérate cómo estás afectado y cómo actualizar tu código.
-
Contenedores de objetos multiproceso
-
Los contenedores de objetos multiproceso ayudan a la migración, dando al código chrome acceso síncrono al contenido.
-
Depurando procesos de firefox
-
Cómo depurar código en el proceso de contenido, incluyendo scripts de marco y proceso.
-
Selección de pestañas en Firefox multiproceso
-
Cómo funciona el cambio de pestañas en Firefox multiproceso.
-
-
-
- -
-
-
-
-
Limitaciones de los scripts chrome
-
Prácticas que ya no funcionan en el código chrome, y cómo solucionarlas.
-
-
- -
-
-
Limitaciones de los scripts de marco
-
Prácticas que no funcionarán en los scripts de marco, y qué hacer en su lugar.
-
-
-
- -
-

Contáctanos

- -

Entérate más acerca del proyecto, involúcrate o pregúntanos tus dudas.

- - diff --git a/files/es/mozilla/firefox/multiprocess_firefox/message_manager/index.html b/files/es/mozilla/firefox/multiprocess_firefox/message_manager/index.html deleted file mode 100644 index 5d3214a425..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/message_manager/index.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Message manager -slug: Mozilla/Firefox/Multiprocess_Firefox/Message_Manager -tags: - - API - - Guide - - JavaScript - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Message_Manager ---- -
{{FirefoxSidebar}}

Message managers provide a way for chrome-privileged JavaScript code to communicate across process boundaries. They are particularly useful for allowing chrome code, including the browser's code and extension's code, to access web content while the browser is running web content in a separate process.

- -

These guides explain how to use message managers in multiprocess Firefox.

- -

Note that none of this requires multiprocess Firefox: everything described here will work with single-process Firefox, so the same code will work on both variants.

- -
-

Guides

- -
- - - -
- -
-

API reference

- -
- - - -
diff --git a/files/es/mozilla/firefox/multiprocess_firefox/message_manager/process_scripts/index.html b/files/es/mozilla/firefox/multiprocess_firefox/message_manager/process_scripts/index.html deleted file mode 100644 index f6011c7836..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/message_manager/process_scripts/index.html +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Process scripts -slug: Mozilla/Firefox/Multiprocess_Firefox/Message_Manager/Process_scripts -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Message_Manager/Process_scripts ---- -
{{FirefoxSidebar}}
-

Los scripts de proceso son nuevos en Firefox 38.

-
- -
-

Si esta utilizando el addon sdk, puede utilizar el remote/parent módulo remoteRequire en su lugar.

-
- -

Cuando necesite ejecutar código en el proceso de contenido para acceder al contenido web, debe utilizar secuencias de frame scripts. Sin embargo, un problema con los scripts es que se pueden cargar varias veces en el proceso de contenido, en varios ámbitos que están aislados unos de otros. Por ejemplo, si llama a la funcion loadFrameScript() del gestor de mensajes de script, entonces el script se cargará por separado en todas las pestañas abiertas. Esto puede causar un problema que las secuencias de scripts de trama están interactuando con un servicio global en el proceso de contenido.

- -

Por ejemplo, en multiprocesos Firefox, si necesita usar nsIContentPolicy to register a content policy, you must do this in the content process. para registrar una política de contenido, debe hacerlo en el proceso de contenido. Pero si lo registra en una secuencia de frame script la secuencia de frame script se carga más de una vez, registrará la política de contenido más de una vez, lo que probablemente no es lo que pretende.

- -

De forma similar, algunas notificaciones de observadores deben registrarse en el frame script, pero si lo hace en una secuencia de frame scrip, se cargara más de una vez, recibirá varias notificaciones, para ese evento.

- -

La solución en estos casos es usar un script de proceso en lugar de un frame script.

- -

You can load a process script by accessing a parent process message manager and calling its loadProcessScript() function. The following code uses the global parent process message manager, which will load the script into the the chrome process and any child processes:

- -
// chrome code
-let ppmm = Cc["@mozilla.org/parentprocessmessagemanager;1"]
-  .getService(Ci.nsIProcessScriptLoader);
-ppmm.loadProcessScript("chrome://whatever/process-script.js", true);
-ppmm.addMessageListener("Hello", function(msg) { ... });
- -

The process script's global is a child process message manager, which enables the process script to receive messages from the chrome side, and to send messages to the chrome side:

- -
// process-script.js
-if (Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT) {
-  dump("Welcome to the process script in a content process");
-} else {
-  dump("Welcome to the process script in the main process");
-}
-
-// Message is sent using ContentProcessMessageManager
-sendAsyncMessage("Hello");
- -

In this example, the dump() statement will run once in each content process as well as in the main process. This example also figures out whether it is running in the chrome or in a content process by looking at the process type in Services.appinfo.

- -

In just about every respect, using process scripts is like using frame scripts:

- - - -

Retrieving the content frame message manager for a content window

- -

When an observer notification in a process script contains a content document or window it can be useful to not use talk through the child/parent process message managers but through the window's content frame message manager, e.g. if responses should be processed by a frame script instead of the process script.

- -

This can be achieved by traversing the docshell tree up to the top window and then retrieving its content message manager, as follows:

- -
function contentMMFromContentWindow(window) {
-  let tree = window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDocShellTreeItem);
-  let top = tree.sameTypeRootTreeItem;
-  let iface = QueryInterface(Ci.nsIDocShell).QueryInterface(Ci.nsIInterfaceRequestor);
-  return iface.getInterface(Ci.nsIContentFrameMessageManager);
-}
-
- -
-

This is intended for unprivileged pages running in a content process. Chrome-privileged pages or things running in the parent process may require special treatment.

-
- -

If the above doesn't work try this:

- -
function contentMMFromContentWindow_Method2(aContentWindow) {
-    return aContentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
-                         .getInterface(Ci.nsIDocShell)
-                         .QueryInterface(Ci.nsIInterfaceRequestor)
-                         .getInterface(Ci.nsIContentFrameMessageManager);
-}
diff --git a/files/es/mozilla/firefox/multiprocess_firefox/motivation/index.html b/files/es/mozilla/firefox/multiprocess_firefox/motivation/index.html deleted file mode 100644 index 0a4f0cb3e6..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/motivation/index.html +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Motivation -slug: Mozilla/Firefox/Multiprocess_Firefox/Motivation -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Motivation ---- -
{{FirefoxSidebar}}

There are three main reasons for making Firefox run content in a separate process: performance, security, and stability.

- -

Performance

- -

Most performance work at Mozilla over the last two years has focused on responsiveness of the browser. The goal is to reduce “jank”—those times when the browser seems to briefly freeze when loading a big page, typing in a form, or scrolling. Responsiveness tends to matter a lot more than throughput on the web today. Much of this work has been done as part of the Snappy project. The main focuses have been:

- - - -

Much of the low-hanging fruit in these areas has already been picked. The remaining issues are difficult to fix. For example, JavaScript execution and layout happen on the main thread, and they block the event loop. Running these components on a separate thread is difficult because they access data, like the DOM, that are not thread-safe. As an alternative, we’ve considered allowing the event loop to run in the middle of JavaScript execution, but doing so would break a lot of assumptions made by other parts of Firefox (not to mention add-ons).

- -

Running web content in a separate process is a nice alternative to these approaches. Like the threaded approach, Firefox is able to run its event loop while JavaScript and layout are running in a content process. But unlike threading, the UI code has no access to content DOM or or other content data structures, so there is no need for locking or thread-safety. The downside, of course, is that any code in the Firefox UI process that needs to access content data must do so explicitly through message passing.

- -

We feel this tradeoff makes sense for a few reasons:

- - - -

Security

- -

Right now, if someone discovers an exploitable bug in Firefox, they’re able to take over users’ computers. There are a lot of techniques to mitigate this problem, but one of the most powerful is sandboxing. Technically, sandboxing doesn’t require multiple processes. However, a sandbox that covered single-process Firefox wouldn’t be very useful. Sandboxes are only able to prevent processes from performing actions that a well-behaved process would never do. Unfortunately, a well-behaved Firefox process (especially one with add-ons installed) needs access to much of the network and file system. Consequently, a sandbox for single-process Firefox couldn’t restrict much.

- -

In multiprocess Firefox, content processes will be sandboxed. A well-behaved content process won’t access the filesystem directly; it will have to ask the main process to perform the request. At that time, the main process can verify that the request is safe and that it makes sense. Consequently, the sandbox for content processes can be quite restrictive. Our hope is that this arrangement will make it much harder to craft exploitable security holes for Firefox.

- -

Stability

- -

Currently, a crash in the code running a web page will take down the entire browser. With multiprocess Firefox, only the content process that crashed will be killed.

- -
-

This page incorporates a lot of content from Bill McCloskey's blog post on multiprocess Firefox: http://billmccloskey.wordpress.com/2013/12/05/multiprocess-firefox/

-
- -

 

diff --git a/files/es/mozilla/firefox/multiprocess_firefox/pitfalls_for_add-on_developers/index.html b/files/es/mozilla/firefox/multiprocess_firefox/pitfalls_for_add-on_developers/index.html deleted file mode 100644 index 4f109bf795..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/pitfalls_for_add-on_developers/index.html +++ /dev/null @@ -1,212 +0,0 @@ ---- -title: Pitfalls for add-on developers -slug: Mozilla/Firefox/Multiprocess_Firefox/Pitfalls_for_add-on_developers -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Pitfalls_for_add-on_developers ---- -
{{FirefoxSidebar}}

Overview

- -

This page lists patterns that add-on authors might be using that won't work, or will work differently, in multiprocess Firefox.

- -

It's split into two sections: chrome process and content process.

- -

Chrome process

- -

The first section, chrome process, covers things that used to work in the chrome process that will no longer work in multiprocess Firefox. These are the sorts of things that will break an old add-on in multiprocess Firefox. The fix is generally some variant of "do that in a frame script loaded into the content process".

- -

Compatibility shims

- -

For many of the patterns described here we've implemented compatibility shims so the patterns still work. For example: whenever extensions try to access web content from the chrome process, the browser will return a Cross Process Object Wrapper that gives the chrome code synchronous access to the content.

- -

You'll get the shims for your add-on by default, unless you set the multiprocessCompatible flag in your add-on's install manifest.

- -

However, these shims are not a substitute for migrating extensions:

- - - -

For each pattern we've noted:

- - - -

Content process

- -

However, some things that used to work in a chrome process will not work in the content process. The second section, content process, lists these sorts of things along with their mitigation.

- -

Chrome process pitfalls

- -

gBrowser.contentWindow, window.content...

- -

Without the shim

- -

All APIs in the chrome process that provide direct access to content objects will no longer work. For example:

- -
// chrome code
-
-gBrowser.contentWindow;                    // null
-
-gBrowser.contentDocument;                  // null
-
-gBrowser.selectedBrowser.contentWindow;    // null
-
-window.content;                            // null
-
-content;                                   // null
-
- -

With the shim

- -

The shim will give you a CPOW for the content object in these situations.

- -

To make the shim unnecessary: factor the code that needs to access content into a separate script, load that script into the content process as a frame script, and communicate between the chrome script and the frame script using the message-passing APIs. See the article on using the message manager.

- -

nsIContentPolicy

- -

Without the shim

- -

Under multiprocess Firefox you can't use nsIContentPolicy in the chrome process, because it needs to touch web content.

- -

With the shim

- -

The shim enables you to add content policies in the chrome process. It transparently registers an nsIContentPolicy in the content process, whose shouldLoad just forwards to the chrome process. The content to check is forwarded as a CPOW. The chrome process then checks the content against the policy supplied by the add-on, and forwards the response back to the child to be enforced.

- -

To make the shim unnecessary: define and register nsIContentPolicy inside a frame script.

- -

Observers in the chrome process

- -

Depending on the topic, you need to register observers in either the chrome process or in a frame script.

- -

For most topics you need to register observers in the chrome process.

- -

However, you must listen to content-document-global-created and document-element-inserted in a frame script. Observers for these topics get content objects as the aSubject argument to observe(), so notifications are not sent to the chrome process.

- -

There is a shim that will forward these two topics to the chrome process, sending CPOWs as the aSubject argument.

- -

HTTP requests

- -

You can't observe HTTP requests in the content process. If you do, you'll get an error.
-
- If you do so in the chrome process, it will mostly work. The subject for the observer notification will be an nsIHttpChannel as you would expect. A common pattern here is to use the notificationCallbacks property of the nsIHttpChannel to get the DOM window that initiated the load, like this:

- -
observe: function (subject, topic, data) {
-  if (topic == "http-on-modify-request") {
-    var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
-    var domWindow = httpChannel.notificationCallbacks.getInterface(Ci.nsIDOMWindow);
-  }
-}
- -

Or this:

- -
observe: function (subject, topic, data) {
-  if (topic == "http-on-modify-request") {
-    var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);
-    var domWindow = httpChannel.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow;
-  }
-}
- -

In multiprocess Firefox these patterns will no longer work: the getInterface call will fail.

- -

In multiprocess Firefox, notificationCallbacks is a special object that tries to emulate the single-process notificationsCallbacks object as best it can. It will return a dummy nsILoadContext when asked, but any attempt to get a window out of it will fail.
-
- There is an outstanding bug (bug 1108827) to implement a shim here, that will make notificationCallbacks a CPOW for the objects in the content process.

- -

DOM Events

- -

Without the shim

- -

In multiprocess Firefox, if you want to register an event listener on some content DOM node, that needs to happen in the content process.

- -

It used to be that if you registered a listener on the XUL <browser>  or <tab> element that hosted some DOM content, then events in the content would bubble up to the XUL and you could handle them there. This no longer happens in multiprocess Firefox.

- -

With the shim

- -

The shim intercepts chrome process code that adds listeners to XUL elements and sets up listeners in the content process, relaying the result back to the chrome process. The Event object itself is relayed to the chrome process as a CPOW.

- -

To make the shim unnecessary: register event listeners on the global object inside a frame script. For example:

- -
addEventListener("load", handler, true) // for example
- -
If you need to contact the chrome process when that happens, send it a message.
- -
 
- -

Content process pitfalls

- -

Many privileged APIs will just work in a content process. Anything that just manipulates data structures will just work. XHR and Workers will work.

- -

File I/O

- -

You should not write to or read from the disk from a frame script, in particular the profile directory. Even if this is possible, you should not do it and may expect that it could stop working at any time. File I/O should all be done in the chrome process. For example:

- - - -

XUL and browser UI

- -

Anything that tries to touch the browser UI or anything to do with XUL is likely to not work in the content process. For example:

- - - -

Chrome windows

- -

Anything that needs to use chrome windows will not work in the content process. For example:

- - - -

Places API

- -

The Places API can't be used inside a frame script. For example:

- - - -

Observers in the content process

- -

As noted in Observers in the chrome process, most observers should be registered in the chrome process and will not work in the content process. The exceptions are content-document-global-created and document-element-inserted , which must be registered in a frame script.

- -

QI from content window to chrome window

- -
There's a particular pattern often used to get from a content window to the associated chrome window. It looks something like this:
- -
 
- -
window.QueryInterface(Ci.nsIInterfaceRequestor)
-                         .getInterface(Ci.nsIWebNavigation)
-                         .QueryInterface(Ci.nsIDocShellTreeItem)
-                         .rootTreeItem
-                         .QueryInterface(Ci.nsIInterfaceRequestor)
-                         .getInterface(Ci.nsIDOMWindow);
- -
This will no longer work. In the content process the root tree item is an nsITabChild, that cannot be converted to an nsIDOMWindow, so the second getInterface call here will fail.
- -
 
- -

If you want a chrome window: send a message from the content process using the message manager. The target property of the object passed into the message handler in the chrome process is the XUL <browser> receiving the message, and you can get the chrome window from that (Note: I'm not really sure how...).

- -

nsIAboutModule

- -

By default, custom about: pages registered using nsIAboutModule are loaded in the chrome process. This means that you can't access their content from the content process (via XHR, for example).

- -

There is a shim for this, that makes the content of about: pages registered by the add-on transparently available in the content process.

- -

To avoid the shim: if you need to access the content of your about page from the content process, you need to register the nsIAboutModule in the content process as well as the chrome process. By default, about: pages (except for a small whitelist) are loaded in the chrome process when browsed to from the AwesomeBar.

diff --git a/files/es/mozilla/firefox/multiprocess_firefox/remotepagemanager/index.html b/files/es/mozilla/firefox/multiprocess_firefox/remotepagemanager/index.html deleted file mode 100644 index 083b13f1e0..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/remotepagemanager/index.html +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: RemotePageManager -slug: Mozilla/Firefox/Multiprocess_Firefox/RemotePageManager -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/RemotePageManager ---- -
{{FirefoxSidebar}}

{{ gecko_minversion_header('39') }}

- -

One of the challenges of converting Firefox features and add-ons to multiprocess Firefox involves in-content pages. These pages (like about:addons) display in a tab but for now still render in the main process. There can be many reasons for wanting to move these into the content process, particularly if the page interacts with web content in any way but more generally just to keep the main UI as responsive as possible.

- -

This raises the problem of how the page communicates back to the main process to get information and trigger actions. Commonly this is done with a frame script listening for DOM events from inside the page, performing the necessary message passing and then passing results back to the page. However, this middleman approach has problems. The frame code is maintained separately from the page code leading to three different pieces of code handling behavior for the page. Add-ons also have to be careful to choose unique names for messages to avoid conflicting with other add-ons and Firefox code.

- -

RemotePageManager is an API designed to simplify this. It acts as the middleman between code in the main process and code in the page without needing to write custom code in a frame script. Code in the main process registers URLs that it is interested in. Whenever a frame loads a page with that URL, a pseudo message manager is created to allow message passing between just that page and the code in the main process. Code running in the page itself can access the message manager directly without needing to use a frame script at all.

- -

RemotePageManager

- -

RemotePageManager is the low-level way to interact with in-content pages. It includes the following methods:

- -
-
addRemotePageListener(url, callback)
-
Registers interest in a URL. Whenever a new page loads at that URL callback is called and passed the message channel to use to communicate with the page. Only one callback can be registered per URL.
-
removeRemotePageListener(url)
-
Unregisters interest in a URL. The callback passed above will not be called again.
-
- -

RemotePages

- -

RemotePages is a higher-level option. As well as the methods listed here it also has the message channel methods which will send messages to, and receive messages from, every page currently loaded at the URL.

- -
-
RemotePages(url)
-
Creates a new RemotePages instance for a URL.
-
destroy()
-
Destroys the instance.
-
- -

Message channel methods

- -

All of these methods are available directly in the page, on RemotePages instances, or on the channel passed to callbacks registered with RemotePageManager.addRemotePageListener.

- -
-
sendAsyncMessage(name, data)
-
Sends a named message to the other side of the channel. data is copied as a structured clone.
-
addMessageListener(name, listener)
-
Adds a listener for a named message. listener will be called when the other side of the channel sends a message for name. listener will be passed an object with the properties target, name, and data.
-
removeMessageListener(name, listener)
-
Removed a listener for a named message.
-
- -

Special messages

- -

As well as any messages that Firefox or add-on code sends through the message channels, some special messages will be sent. Generally any message name starting with "RemotePage:" should be considered reserved for future use.

- -
-
RemotePage:Init
-
Sent to a RemotePages instance when a new page is loaded with the matching URL. The target property of the object passed to any listener is a message channel for just that page.
-
RemotePage:Load
-
Sent when the load event for a matching page in the content process is fired.
-
RemotePage.Unload
-
Sent when a matching page in the content process is unloaded.
-
- -

Low level example

- -

This example waits for a page to load and then passes it some information.

- -
// code running in the main process somewhere
-Components.utils.import("resource://gre/modules/RemotePageManager.jsm");
-
-RemotePageManager.addRemotePageListener("about:foo", (channel) => {
-  // Wait for page load here to be sure the page has had chance to register for this message
-  channel.addMessageListener("RemotePage:Load", function() {
-    channel.sendAsyncMessage("MyMessage", { somedata: 42 });
-  });
-});
-
- -

Here is the code that runs in the page. Note that it has direct access to addMessageListener (as well as the other message channel methods).

- -
// code running in the content webpage
-addMessageListener("MyMessage", function(msg) {
-  alert(msg.data.somedata);
-});
-
- -

High level example

- -

The code above uses a callback that is called every time a page is loaded. In reality it is going to be more common for code in the main process to simply respond to requests from the page and want to update all pages at once. RemotePages is more suited to this:

- -
// code running in the main process somewhere
-Components.utils.import("resource://gre/modules/Preferences.jsm");
-Components.utils.import("resource://gre/modules/RemotePageManager.jsm");
-
-let listener = new RemotePages("about:bar");
-
-// Listens to messages from all current and future pages
-listener.addMessageListener("GetLabel", ({ target }) => {
-  // target is the channel for just the page that sent this message
-  target.sendAsyncMessage("SetLabel", Preferences.get("extensions.label.text"));
-});
-
-Preferences.observe("extensions.label.text", (newLabel) => {
-  // Sends messages to all currently open pages
-  listener.sendAsyncMessage("SetLabel", newLabel);
-});
-
-listener.addMessageListener("ButtonClicked", () => {
-  // Do something here
-});
-
- -
// code running in the content webpage
-var button = document.getElementById("button");
-var label = document.getElementById("label");
-
-sendAsyncMessage("GetLabel");
-addMessageListener("SetLabel", function(msg) {
-  label.textContent = msg.data;
-});
-
-function buttonClicked() {
-  sendAsyncMessage("ButtonClicked");
-}
-
-button.addEventListener("click", buttonClicked, false);
-
diff --git a/files/es/mozilla/firefox/multiprocess_firefox/tab_selection_in_multiprocess_firefox/index.html b/files/es/mozilla/firefox/multiprocess_firefox/tab_selection_in_multiprocess_firefox/index.html deleted file mode 100644 index 255fe18315..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/tab_selection_in_multiprocess_firefox/index.html +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Tab selection in multiprocess Firefox -slug: Mozilla/Firefox/Multiprocess_Firefox/Tab_selection_in_multiprocess_Firefox -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Tab_selection_in_multiprocess_Firefox ---- -
{{FirefoxSidebar}}

In single-process Firefox, when the user switches tabs, this is a synchronous operation. The browser blocks while it loads content into the newly selected tab, then switches to that tab. It indicates that the tab is selected by setting the selected attribute on the XUL tab object. Code (including browser code, extensions, or themes) that wants to change the appearance of the selected tab can use the selected attribute to apply CSS for that tab.

- -

In multiprocess Firefox, tab switching is asynchronous. When the user switches tabs, the chrome process sends a request to the content process to load the page into the newly selected tab. The function in the chrome process then returns immediately, so other code can run. Once the content process is ready, it sends a message back to the chrome process, which then switches tabs in the user interface.

- -

There's also a timer in the chrome process: if the content process has not responded before the timer expires, then the browser switches tabs anyway, and just displays an empty tab containing a spinner, until the content process has finished loading the page. Currently the timer is set to 300 milliseconds.

- -

There are, correspondingly, two attributes used to signal tab selection:

- - - -

This means that code which wants to style the currently selected tab needs to use the visuallyselected attribute to do so. If it uses the selected attribute, then there will be a momentary disconnect in which the newly selected tab's style is updated, but the browser is still displaying the old tab's content.

- - diff --git a/files/es/mozilla/firefox/multiprocess_firefox/technical_overview/index.html b/files/es/mozilla/firefox/multiprocess_firefox/technical_overview/index.html deleted file mode 100644 index bc743d1dfb..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/technical_overview/index.html +++ /dev/null @@ -1,166 +0,0 @@ ---- -title: Technical overview -slug: Mozilla/Firefox/Multiprocess_Firefox/Technical_overview -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Technical_overview ---- -
{{FirefoxSidebar}}
-

This page is an edited extract from Bill McCloskey's blog post on multiprocess Firefox: http://billmccloskey.wordpress.com/2013/12/05/multiprocess-firefox/

-
- -

At a very high level, multiprocess Firefox works as follows. The process that starts up when Firefox launches is called the parent process. Initially, this process works similarly to single-process Firefox: it opens a window displaying browser.xul, which contains all the principal UI elements for Firefox. Firefox has a flexible GUI toolkit called XUL that allows GUI elements to be declared and laid out declaratively, similar to web content. Just like web content, the Firefox UI has a window object, which has a document property, and this document contains all the XML elements from browser.xul. All the Firefox menus, toolbars, sidebars, and tabs are XML elements in this document. Each tab element contains a <browser> element to display web content.

- -

The first place where multiprocess Firefox diverges from single-process Firefox is that each <browser> element has a remote="true" attribute. When such a browser element is added to the document, a new content process is started. This process is called a child process. An IPC channel is created that links the parent and child processes. Initially, the child displays about:blank, but the parent can send the child a command to navigate elsewhere.

- -

Drawing

- -

Somehow, displayed web content needs to get from the child process to the parent and then to the screen. Multiprocess Firefox depends on a new Firefox feature called off main thread compositing (OMTC). In brief, each Firefox window is broken into a series of layers, somewhat similar to layers in Photoshop. Each time Firefox draws, these layers are submitted to a compositor thread that clips and translates the layers and combines them together into a single image that is then drawn.

- -

Layers are structured as a tree. The root layer of the tree is responsible for the entire Firefox window. This layer contains other layers, some of which are responsible for drawing the menus and tabs. One subtree displays all the web content. Web content itself may be broken into multiple layers, but they’re all rooted at a single “content” layer.

- -

In multiprocess Firefox, the content layer subtree is actually a shim. Most of the time, it contains a placeholder node that simply keeps a reference to the IPC link with the child process. The content process retains the actual layer tree for web content. It builds and draws to this layer tree. When it’s done, it sends the structure of its layer tree to the parent process via IPC. Backing buffers are shared with the parent either through shared memory or GPU memory. References to this memory are sent as part of the layer tree. When the parent receives the layer tree, it removes its placeholder content node and replaces it with the actual tree from content. Then it composites and draws as normal. When it’s done, it puts the placeholder back.

- -

The basic architecture of how OMTC works with multiple processes has existed for some time, since it is needed for Firefox OS. However, Matt Woodrow and David Anderson have done a lot of work to get everything working properly on Windows, Mac, and Linux. One of the big challenges for multiprocess Firefox will be getting OMTC enabled on all platforms. Right now, only Macs use it by default.

- -

User input

- -

Events in Firefox work the same way as they do on the web. Namely, there is a DOM tree for the entire window, and events are threaded through this tree in capture and bubbling phases. Imagine that the user clicks on a button on a web page. In single-process Firefox, the root DOM node of the Firefox window gets the first chance to process the event. Then, nodes lower down in the DOM tree get a chance. The event handling proceeds down through to the XUL <browser> element. At this point, nodes in the web page’s DOM tree are given a chance to handle the event, all the way down to the button. The bubble phase follows, running in the opposite order, all the way back up to the root node of the Firefox window.

- -

With multiple processes, event handling works the same way until the <browser> element is hit. At that point, if the event hasn’t been handled yet, it gets sent to the child process by IPC, where handling starts at the root of the content DOM tree. The parent process then waits to run its bubbling phase until the content process has finished handling the event.

- -

Inter-process communication

- -

All IPC happens using the Chromium IPC libraries. Each child process has its own separate IPC link with the parent. Children cannot communicate directly with each other. To prevent deadlocks and to ensure responsiveness, the parent process is not allowed to sit around waiting for messages from the child. However, the child is allowed to block on messages from the parent.

- -

Rather than directly sending packets of data over IPC as one might expect, we use code generation to make the process much nicer. The IPC protocol is defined in IPDL, which sort of stands for “inter-* protocol definition language”. A typical IPDL file is PNecko.ipdl. It defines a set messages and their parameters. Parameters are serialized and included in the message. To send a message M, C++ code just needs to call the method SendM. To receive the message, it implements the method RecvM.

- -

IPDL is used in all the low-level C++ parts of Gecko where IPC is required. In many cases, IPC is just used to forward actions from the child to the parent. This is a common pattern in Gecko:

- -
void AddHistoryEntry(param) {
-  if (XRE_GetProcessType() == GeckoProcessType_Content) {
-    // If we're in the child, ask the parent to do this for us.
-    SendAddHistoryEntry(param);
-    return;
-  }
-
-  // Actually add the history entry...
-}
-
-bool RecvAddHistoryEntry(param) {
-  // Got a message from the child. Do the work for it.
-  AddHistoryEntry(param);
-  return true;
-}
-
- -

When AddHistoryEntry is called in the child, we detect that we’re inside the child process and send an IPC message to the parent. When the parent receives that message, it calls AddHistoryEntry on its side.

- -

For a more realistic illustration, consider the Places database, which stores visited URLs for populating the awesome bar. Whenever the user visits a URL in the content process, we call this code. Notice the content process check followed by the SendVisitURI call and an immediate return. The message is received here; this code just calls VisitURI in the parent.

- -

The code for IndexedDB, the places database, and HTTP connections all runs in the parent process, and they all use roughly the same proxying mechanism in the child.

- -

Frame scripts

- -

IPDL takes care of passing messages in C++, but much of Firefox is actually written in JavaScript. Instead of using IPDL directly, JavaScript code relies on the message manager to communicate between processes. To use the message manager in JS, you need to get hold of a message manager object. There is a global message manager, message managers for each Firefox window, and message managers for each <browser> element. A message manager can be used to load JS code into the child process and to exchange messages with it.

- -

As a simple example, imagine that we want to be informed every time a load event triggers in web content. We’re not interested in any particular browser or window, so we use the global message manager. The basic process is as follows:

- -
// Get the global message manager.
-let mm = Cc["@mozilla.org/globalmessagemanager;1"].
-         getService(Ci.nsIMessageListenerManager);
-
-// Wait for load event.
-mm.addMessageListener("GotLoadEvent", function (msg) {
-  dump("Received load event: " + msg.data.url + "\n");
-});
-
-// Load code into the child process to listen for the event.
-mm.loadFrameScript("chrome://content/content-script.js", true);
-
- -

For this to work, we also need to have a file content-script.js:

- -
// Listen for the load event.
-addEventListener("load", function (e) {
-  // Inform the parent process.
-  let docURL = content.document.documentURI;
-  sendAsyncMessage("GotLoadEvent", {url: docURL});
-}, false);
-
- -

This file is called a frame script. When the loadFrameScript function call runs, the code for the script is run once for each <browser> element. This includes both remote browsers and regular ones. If we had used a per-window message manager, the code would only be run for the browser elements in that window. Any time a new browser element is added, the script is run automatically (this is the purpose of the true parameter to loadFrameScript). Since the script is run once per browser, it can access the browser’s window object and docshell via the content and docShell globals.

- -

The great thing about frame scripts is that they work in both single-process and multiprocess Firefox. To learn more about the message manager, see the message manager guide.

- -

Cross-process APIs

- -

There are a lot of APIs in Firefox that cross between the parent and child processes. An example is the webNavigation property of XUL <browser> elements. The webNavigation property is an object that provides methods like loadURI, goBack, and goForward. These methods are called in the parent process, but the actions need to happen in the child. First I’ll cover how these methods work in single-process Firefox, and then I’ll describe how we adapted them for multiple processes.

- -

The webNavigation property is defined using the XML Binding Language (XBL). XBL is a declarative language for customizing how XML elements work. Its syntax is a combination of XML and JavaScript. Firefox uses XBL extensively to customize XUL elements like <browser> and <tabbrowser>. The <browser> customizations reside in browser.xml. Here is how browser.webNavigation is defined:

- -
<field name="_webNavigation">null</field>
-
-<property name="webNavigation" readonly="true">
-   <getter>
-   <![CDATA[
-     if (!this._webNavigation)
-       this._webNavigation = this.docShell.QueryInterface(Components.interfaces.nsIWebNavigation);
-     return this._webNavigation;
-   ]]>
-   </getter>
-</property>
-
- -

This code is invoked whenever JavaScript code in Firefox accesses browser.webNavigation, where browser is some <browser> element. It checks if the result has already been cached in the browser._webNavigation field. If it hasn’t been cached, then it fetches the navigation object based off the browser’s docshell. The docshell is a Firefox-specific object that encapsulates a lot of functionality for loading new pages, navigating back and forth, and saving page history. In multiprocess Firefox, the docshell lives in the child process. Since the webNavigation accessor runs in the parent process, this.docShell above will just return null. As a consequence, this code will fail completely.

- -

One way to fix this problem would be to create a fake docshell in C++ that could be returned. It would operate by sending IPDL messages to the real docshell in the child to get work done. We may eventually take this route in the future. We decided to do the message passing in JavaScript instead, since it’s easier and faster to prototype things there. Rather than change every docshell-using accessor to test if we’re using multiprocess browsing, we decided to create a new XBL binding that applies only to remote <browser> elements. It is called remote-browser.xml, and it extends the existing browser.xml binding.

- -

The remote-browser.xml binding returns a JavaScript shim object whenever anyone uses browser.webNavigation or other similar objects. The shim object is implemented in its own JavaScript module. It uses the message manager to send messages like "WebNavigation:LoadURI" to a content script loaded by remote-browser.xml. The content script performs the actual action.

- -

The shims we provide emulate their real counterparts imperfectly. They offer enough functionality to make Firefox work, but add-ons that use them may find them insufficient. I’ll discuss strategies for making add-ons work in more detail later.

- -

Cross-process object wrappers

- -

The message manager API does not allow the parent process to call sendSyncMessage; that is, the parent is not allowed to wait for a response from the child. It’s detrimental for the parent to wait on the child, since we don’t want the browser UI to be unresponsive because of slow content. However, converting Firefox code to be asynchronous (i.e., to use sendAsyncMessage instead) can sometimes be onerous. As an expedient, we’ve introduced a new primitive that allows code in the parent process to access objects in the child process synchronously.

- -

These objects are called cross-process object wrappers, frequently abbreviated to CPOWs. They’re created using the message manager. Consider this example content script:

- -
addEventListener("load", function (e) {
-  let doc = content.document;
-  sendAsyncMessage("GotLoadEvent", {}, {document: doc});
-}, false);
-
- -

In this code, we want to be able to send a reference to the document to the parent process. We can’t use the second parameter to sendAsyncMessage to do this: that argument is converted to JSON before it is sent up. The optional third parameter allows us to send object references. Each property of this argument becomes accessible in the parent process as a CPOW. Here’s what the parent code might look like:

- -
let mm = Cc["@mozilla.org/globalmessagemanager;1"].
-         getService(Ci.nsIMessageListenerManager);
-
-mm.addMessageListener("GotLoadEvent", function (msg) {
-  let uri = msg.objects.document.documentURI;
-  dump("Received load event: " + uri + "\n");
-});
-mm.loadFrameScript("chrome://content/content-script.js", true);
-
- -

It’s important to realize that we’re send object references. The msg.objects.document object is only a wrapper. The access to its documentURI property sends a synchronous message down to the child asking for the value. The dump statement only happens after a reply has come back from the child.

- -

Because every property access sends a message, CPOWs can be slow to use. There is no caching, so 1,000 accesses to the same property will send 1,000 messages.

- -

Another problem with CPOWs is that they violate some assumptions people might have about message ordering. Consider this code:

- -
mm.addMessageListener("GotLoadEvent", function (msg) {
-  mm.sendAsyncMessage("ChangeDocumentURI", {newURI: "hello.com"});
-  let uri = msg.objects.document.documentURI;
-  dump("Received load event: " + uri + "\n");
-});
-
- -

This code sends a message asking the child to change the current document URI. Then it accesses the current document URI via a CPOW. You might expect the value of uri to come back as "hello.com". But it might not. In order to avoid deadlocks, CPOW messages can bypass normal messages and be processed first. It’s possible that the request for the documentURI property will be processed before the "ChangeDocumentURI" message, in which case uri will have some other value.

- -

For this reason, it’s best not to mix CPOWs with normal message manager messages. It’s also a bad idea to use CPOWs for anything security-related, since you may not get results that are consistent with surrounding code that might use the message manager.

- -

Despite these problems, we’ve found CPOWs to be useful for converting certain parts of Firefox to be multiprocess-compatible. It’s best to use them in cases where users are less likely to notice poor responsiveness. As an example, we use CPOWs to implement the context menu that pops up when users right-click on content elements. Whether this code is asynchronous or synchronous, the menu cannot be displayed until content has responded with data about the element that has been clicked. The user is unlikely to notice if, for example, tab animations don’t run while waiting for the menu to pop up. Their only concern is for the menu to come up as quickly as possible, which is entirely gated on the response time of the content process. For this reason, we chose to use CPOWs, since they’re easier than converting the code to be asynchronous.

- -

It’s possible that CPOWs will be phased out in the future. Asynchronous messaging using the message manager gives a user experience that is at least as good as, and often strictly better than, CPOWs. We strongly recommend that people use the message manager over CPOWs when possible. Nevertheless, CPOWs are sometimes useful.

diff --git a/files/es/mozilla/firefox/multiprocess_firefox/types_of_message_manager/index.html b/files/es/mozilla/firefox/multiprocess_firefox/types_of_message_manager/index.html deleted file mode 100644 index fe2917686b..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/types_of_message_manager/index.html +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Message manager overview -slug: Mozilla/Firefox/Multiprocess_Firefox/Types_of_message_manager -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Types_of_message_manager ---- -
{{FirefoxSidebar}}

In the initial version of multiprocess Firefox there are two processes:

- - - -

Message managers are designed to enable code in one process to communicate with code in a different process. At the top level, there are two different sorts of message managers:

- - - -

Frame message managers

- -

In multiprocess Firefox, when chrome code needs to interact with web content, it needs to:

- - - -
-

Some older articles on multiprocess Firefox and the message manager might refer to "content scripts" instead of "frame scripts", but this usage is deprecated because the Add-on SDK uses "content script" to refer to a similar but different kind of script.

-
- -

There are three different subtypes of frame message manager: the global message manager, the window message manager, and the browser message manager. All three enable chrome code to:

- - - -
-

Note that in this context, "browser" refers to the XUL <browser> object, which is a frame that hosts a single Web document. It does not refer to the more general sense of a Web browser.

-
- -

Global message manager

- -

The global message manager operates on every <browser>  (that is, every open content tab).

- - - -

It's a ChromeMessageBroadcaster object, which implements the following interfaces:

- - - -

You can access the global message manager like this:

- -
// chrome script
-let globalMM = Cc["@mozilla.org/globalmessagemanager;1"]
-  .getService(Ci.nsIMessageListenerManager);
- -

Window message manager

- -

The window message manager is associated with a specific browser window, and operates on every <browser> (that is, every content tab) loaded into that window:

- - - -

It's a ChromeMessageBroadcaster object, which implements the following interfaces:

- - - -

The window message manager can be accessed as a property of the browser window:

- -
// chrome script
-let windowMM = window.messageManager;
- -

Browser message manager

- -

The browser message manager is specific to a single XUL <browser> element (which essentially corresponds to a single tab):

- - - -

You can mix and match: so for example, you could load a script into every <browser> using the global message manager, but then send a message to the script instance loaded into a specific <browser> using the browser message manager.

- -

It's a ChromeMessageSender object, which implements the following interfaces:

- - - -

The browser message manager can be accessed as a property of the XUL <browser> element:

- -
// chrome script
-let browserMM = gBrowser.selectedBrowser.messageManager;
- -

Process message managers

- -

Process message managers correspond to process boundaries, and enable code running in different processes to communicate. Multiprocess Firefox has the concept of:

- - - -

For practical purposes, in multiprocess Firefox the parent process is the chrome process, and child processes are content processes. 

- -

In each child process, there's a single child process message manager (CPMM). For each child process message manager, there's a parent process message manager (PPMM) in the parent process. There's also a single global parent process message manager (GPPMM) in the parent process, that provides access to all the parent process message managers:

- -

- -

 

- -

With the GPPMM, you can broadcast messages to all CPMMs. With a PPMM, you can send a message to its corresponding CPMM. With a CPMM, you can send messages to the parent process: these messages are received first by the corresponding PPMM, then by the GPPMM.

- -

From Firefox 38 onwards, you can also use a parent process message manager to load a script into a child process. This is the recommended way to load a script that executes just once per child process, which is something you might want to do if you are interacting with some global service (for example, adding listeners to observer notifications or registering components).

- -

Accessing process message managers

- -

You can access the global parent process manager with code like this:

- -
// parent process
-let parentProcessMessageManager = Cc["@mozilla.org/parentprocessmessagemanager;1"]
-                                  .getService(Ci.nsIMessageBroadcaster);
- -

You can also access it as the ppmm property of Services.jsm.

- -
// child process script
-let childProcessMessageManager = Cc["@mozilla.org/childprocessmessagemanager;1"]
-                                 .getService(Ci.nsISyncMessageSender);
- -

Parent process message manager

- -

The parent process message manager lives in the

- -

implements

- - - -

 

- -

Child process message manager

- -

implements

- - - -

Loading scripts per child process

- -

Since the process message managers do not support script loading the only way to implement per-child process code is to use a frame script which imports a custom javascript module (JSM). Since javascript modules are singletons they will only be executed once per process even when they are loaded in multiple frame scripts.
- The JSM can then use the child process message manager to exchange messages with the parent process message manager.

- -

This can be useful for addons to register categories, observers and components in child processes.

diff --git a/files/es/mozilla/firefox/multiprocess_firefox/web_content_compatibility/index.html b/files/es/mozilla/firefox/multiprocess_firefox/web_content_compatibility/index.html deleted file mode 100644 index 3089e24000..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/web_content_compatibility/index.html +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Web content compatibility -slug: Mozilla/Firefox/Multiprocess_Firefox/Web_content_compatibility -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Web_content_compatibility ---- -
{{FirefoxSidebar}}

While the introduction of multi-process capabilities to Firefox should be seamless and invisible to Web content, there are some exceptions and subtle changes from past behavior. This article discusses the known differences you may encounter.

- -

Events

- -

Here you'll find information about events whose behaviors have changed due to multiprocess Firefox's implementation.

- -

No bubbling of events from <option> to <select>

- -

Historically, Firefox has allowed keyboard and mouse events to bubble up from the <option> element to the parent {{HTMLElement("select")}} element. This doesn't happen in Chrome, however, although this behavior is inconsistent across many browsers. For better Web compatibility (and for technical reasons), when Firefox is in multi-process mode and the <select> element is displayed as a drop-down list. This behavior is unchanged if the <select> is presented inline and it has either the multiple attribute defined or a size attribute set to more than 1.

- -

Rather than watching <option> elements for events, you should watch for {event("change")}} events on {{HTMLElement("select")}}. See {{bug(1090602)}} for details.

- -

See also

- - diff --git a/files/es/mozilla/firefox/multiprocess_firefox/which_uris_load_where/index.html b/files/es/mozilla/firefox/multiprocess_firefox/which_uris_load_where/index.html deleted file mode 100644 index 7f9ee69755..0000000000 --- a/files/es/mozilla/firefox/multiprocess_firefox/which_uris_load_where/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Which URIs load where -slug: Mozilla/Firefox/Multiprocess_Firefox/Which_URIs_load_where -tags: - - Necesita traducción -translation_of: Mozilla/Firefox/Multiprocess_Firefox/Which_URIs_load_where ---- -
{{FirefoxSidebar}}

Based initially on the page's URI scheme, the browser can decide whether to load a page in the chrome process or a content process. For some schemes, you can change the default behavior.

- - - - - - - - - - - - - - - - - - - - - - - - - - -
SchemeBehavior
about: -

By default, about: pages are always loaded in the chrome process. However, when you register a new about: page, you can change this default.

- -

Two new flags are defined in nsIAboutModule:

- -
    -
  • URI_CAN_LOAD_IN_CHILD: the page will be loaded in the same process as the browser that has loaded it.
  • -
  • URI_MUST_LOAD_IN_CHILD: the page will always be loaded in a child process.
  • -
- -

To use one of these flags, return it from your implementation of getURIFlags in the code that registers the about: URI.

- -

If you use these flags, you must register the about page in the framescript for each tab. If you do not set multiprocessCompatible to true in your install.rdf then shims will be used. But the e10s shims will be deprecated soon. Read more here - Bug 1257201.

-
chrome: -

By default, chrome: pages are always loaded in the chrome process. However, when you register a new chrome: page, you can change this default.

- -

Two new flags are defined in the chrome.manifest file:

- -
    -
  • remoteenabled: the page will be loaded in the same process as the browser that has loaded it.
  • -
  • remoterequired: the page will always be loaded in a child process.
  • -
-
file: -

Always loaded in a content process.

- -

Note: This does not mean file: URIs can be used freely by code in content processes. Sandboxing may blacklist particular directories and future changes may restrict file: URIs to a separate content process, isolated from regular web content. See bug 1187099 how this can affect addons attempting to load files from the profile directory.

-
resource:Always loaded in a content process.
diff --git a/files/es/mozilla/firefox/privacy/index.html b/files/es/mozilla/firefox/privacy/index.html deleted file mode 100644 index c6a9e69b09..0000000000 --- a/files/es/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/es/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedtracker/index.html b/files/es/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedtracker/index.html deleted file mode 100644 index a66c128f8f..0000000000 --- a/files/es/mozilla/firefox/privacy/storage_access_policy/errors/cookieblockedtracker/index.html +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: 'Blocked: Storage access requests from trackers' -slug: Mozilla/Firefox/Privacy/Storage_access_policy/Errors/CookieBlockedTracker -translation_of: Mozilla/Firefox/Privacy/Storage_access_policy/Errors/CookieBlockedTracker ---- -

Mensaje

- -

Firefox:

- -
 CookieBlockedTracker = La solicitud de acceso a cookies o almacenamiento en "X" se bloqueó porque provenía de un rastreador y el bloqueo de contenido está habilitado.
-
- -

¿Qué salió mal?

- -

Se bloqueó una solicitud de acceso a cookies o almacenamiento porque el navegador la identificó como proveniente de un rastreador y el bloqueo de contenido está habilitado .

- -

El permiso puede ser cambiado o eliminado por:

- - - -

If the blocked resource doesn't need authentication, you can fix the warning message by adding a crossorigin="anonymous" attribute to the relevant element.

- -

See also

- - - - - -
-
-

Traducción en Español:

-
- - - -
-
-
- -
Autoguardado activado.
-
- -
-
-
- - -
-
-
-
-
-
-
diff --git a/files/es/mozilla/firefox/privacy/storage_access_policy/errors/index.html b/files/es/mozilla/firefox/privacy/storage_access_policy/errors/index.html deleted file mode 100644 index e34540eb06..0000000000 --- a/files/es/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/es/mozilla/firefox/privacy/storage_access_policy/index.html b/files/es/mozilla/firefox/privacy/storage_access_policy/index.html deleted file mode 100644 index 14d79a009c..0000000000 --- a/files/es/mozilla/firefox/privacy/storage_access_policy/index.html +++ /dev/null @@ -1,267 +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:

- - - -

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/es/mozilla/firefox/privacy/tracking_protection/index.html b/files/es/mozilla/firefox/privacy/tracking_protection/index.html deleted file mode 100644 index 50dfda6984..0000000000 --- a/files/es/mozilla/firefox/privacy/tracking_protection/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Protección contra el rastreo -slug: Mozilla/Firefox/Privacy/Tracking_Protection -tags: - - bloqueo - - navegación privada - - privacidad - - rastreo - - seguimiento -translation_of: Mozilla/Firefox/Privacy/Tracking_Protection ---- -
{{FirefoxSidebar}}

¿Qué es la protección contra el rastreo?

- -

A partir de la versión 42, Firefox para PC y Firefox para Android cuentan con protección contra el rastreo integrada. En las ventanas de Navegación Privada (o pestañas privadas, en Firefox para Android), Firefox bloqueará el contenido de dominios que rastrean la navegación de los usuarios entre diferentes sitios.

- -

A veces, algunos contenidos bloqueados son parte de la estructura de la página, y los usuarios notarán problemas de disposición de elementos cuando Firefox realice estos bloqueos. Otras veces los usuarios no notarán nada, si la estructura de la página está diseñada de tal manera que los espacios vacíos dejados por los elementos bloqueados los ocupen otros contenidos.

- -

Cuando Firefox bloquee contenido, registrará un mensaje como el siguiente en la consola web:

- -
The resource at "http://some/url" was blocked because tracking protection is enabled.
- -

Nótese que en Firefox para Android uno puede acceder a la salida de la consola usando el depurador remoto.

- -

La interfaz de usuario de Firefox indica a los usuarios cuándo se ha producido un bloqueo de contenido y les permite desbloquearlo en esa sesión. Si lo desean, también pueden desactivar completamente la protección contra el rastreo. Descubre más en este artículo.

- -

¿Cómo elige Firefox qué bloquear?

- -

El contenido se bloquea en base al dominio desde el que se carga.

- -

Firefox se lanza junto con una lista de sitios en los que se ha detectado actividades de rastreo entre diferentes sitios web. Cuando la protección está activada, Firefox bloqueará el contenido de todos los sitios que se encuentran en esa lista.

- -

Por norma general,, los sitios que hacen este tipo de rastreo son analíticos y de publicidad de terceras partes.

- -

¿Qué significa esto para tu sitio?

- -

Lo más común es que cuando la protección contra rastreo esté activada:

- - - -

Lo menos común es que si otras partes de tu sitio dependen de la carga de estos rastreadores, entonces estas partes no funcionarán cuando la protección esté habilitada. Por ejemplo, si tu sitio incluye una llamada (callback) que se ejecuta cuando se carga el contenido de un sitio que rastrea, entonces no se ejecutará esa llamada.

- -

Por ejemplo, no deberías usar Google Analytics de la siguiente forma:

- -
<a href="http://www.example.com" onclick="trackLink('http://www.example.com', event);">Visit example.com</a>
-<script>
-function trackLink(url,event) {
-    event.preventDefault();
-    ga('send', 'event', 'outbound', 'click', url, {
-     'transport': 'beacon',
-     'hitCallback': function() {
-       document.location = url;
-     }
-   });
-}
-</script>
- -

En cambio, deberías tener cuenta la posibilidad de que no se cargue Google Analytics. Para ello, comprueba si se ha iniciado el objeto ga:

- -
<a href="http://www.example.com" onclick="trackLink('http://www.example.com', event);">Visit example.com</a>
-<script>
-function trackLink(url,event) {
-    event.preventDefault();
-    if (window.ga && ga.loaded) {
-         ga('send', 'event', 'outbound', 'click', url, {
-         'transport': 'beacon',
-         'hitCallback': function() { document.location = url; }
-       });
-    } else {
-        document.location = url;
-    }
-}
-</script>
-
- -

Encontrarás más información sobre esta técnica en este artículo (en inglés).

- -

Nótese que, de cualquier manera, la dependencia de terceras partes no es una buena práctica, ya que implica que tu sitio no funcione si la tercera parte va lenta o es inaccesible, o si un complemento bloquea ese elemento rastreador.

diff --git a/files/es/mozilla/firefox_para_android/index.html b/files/es/mozilla/firefox_para_android/index.html deleted file mode 100644 index 7ba3ca497b..0000000000 --- a/files/es/mozilla/firefox_para_android/index.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Firefox para Android -slug: Mozilla/Firefox_para_Android -translation_of: Mozilla/Firefox_for_Android ---- -

Para cada vez más personas, los dispositivos móviles representan su manera principal —o incluso la única manera— de navegar por la web. Firefox para Android (cuyo nombre en código es Fennec) es un navegador abierto, «hackeable» y que cumple con los estándares, al igual que el Firefox de escritorio.

- -

Firefox para Android construye su interfaz de usuario mediante «widgets» nativos de Android en lugar de XUL: esto mejora considerablemente el rendimiento, especialmente el tiempo de inicio y el consumo de memoria. Actualmente esta versión está destinada únicamente a los teléfonos, y la versión para tabletas todavía utiliza XUL. En el futuro, esperamos traer la compatibilidad con los «widgets» nativos también para la IU para tabletas.

- -

Contribuir a Firefox para Android

- -

El punto de partida principal para obtener información sobre el proyecto Firefox para Android es la página del wiki del proyecto.

- -

Puede ayudarnos a crear y mejorar Firefox para Android:

- - - -

Desarrolle para la web movil

- -

Hemos comenzado a armar una guía para diseñar sitios web para dispositivos móviles.

- -

Con Firefox para Android, tiene acceso a varias API que permiten acceder a las capacidades fundamentales del dispositivo, cerrando la brecha entre la Web y las aplicaciones nativas:

- -

B'

- - - -

Para probar su sitio web en Firefox para Android, puede instalarlo en un dispositivo con Android o ejecútelo en su escritorio mediante el Emulador de Android.

- -

Cree complementos para móviles

- -

Firefox para Android es compatible con los complementos, utilizando el mismo sistema de extensiones que usan todas las demás aplicaciones basadas en Gecko. No hemos inventado un nuevo sistema de complementos. Esto quiere decir que crear un complemento para Firefox en Android es el mismo proceso que seguiría con Firefox para el escritorio. Los complementos que funcionan en el Firefox del escritorio no funcionan automáticamente en Firefox para Android. Pongámoslo así: las interfaces son demasiado diferentes.

- -
Firefox en Android tiene un identificador de aplicación único que debe utilizarse en install.rdf. El identificador es {aa3c5121-dab2-40e2-81ca-7ea25febc110}
- -

Son compatibles ambas clases de complementos (los clásicos, que requieren reinicio; y los más recientes que no lo necesitan). De ser posible, se prefiere utilizar la clase que no necesita reinicio, porque la experiencia del usuario es mucho mejor cuando no se necesita forzar un reinicio de la aplicación cada vez que el usuario instala o desinstala un complemento.

- -

Visión general rápida

- - - -

Obtenga ayuda con Firefox para Android

- -

En el sitio web de asistencia de Mozilla hay documentación y tutoriales para aprender a usar Firefox para Android y resolver problemas.

diff --git a/files/es/mozilla/git/index.html b/files/es/mozilla/git/index.html deleted file mode 100644 index a92f22d5ed..0000000000 --- a/files/es/mozilla/git/index.html +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Git -slug: Mozilla/Git -translation_of: Mozilla/Git ---- -

El espejo git oficial actual de la base de código de Firefox (también conocido como "gecko" o "mozilla-central") se puede encontrar en https://github.com/mozilla/gecko-dev. Este repositorio contiene todas las ramas que forman parte del desarrollo de la línea principal, incluidas las ramas del tren mozilla-central (todas las noches), mozilla-aurora (edición para desarrolladores), mozilla-beta y mozilla-release.
-
- Si está buscando trabajar con otras ramas de Mozilla, https://github.com/mozilla/gecko-projects también podrían ser útiles. Este repositorio contiene las ramas del proyecto (también conocidas como "ramitas") cuyo uso varió.
-
- Si prefiere usar git directamente con los repositorios hg, este flujo de trabajo describe cómo proceder. El uso de este enfoque también le permitirá pasar directamente de su repositorio git a mercurial.
-
- El flujo de trabajo mencionado anteriormente es el enfoque más actual y oficialmente documentado para usar git para interactuar con mozilla-central.

diff --git a/files/es/mozilla/http_cache/index.html b/files/es/mozilla/http_cache/index.html deleted file mode 100644 index 44b59a8bc1..0000000000 --- a/files/es/mozilla/http_cache/index.html +++ /dev/null @@ -1,487 +0,0 @@ ---- -title: HTTP Cache -slug: Mozilla/HTTP_cache -translation_of: Mozilla/HTTP_cache ---- -
-

Este documento describe la Nueva caché HTTP versión 2.

-
- -

- -

El código reside en /network/cache2.

- -

- -

API

- -

Aquí hay una descripción detallada de la API de caché HTTP v2, con ejemplos incluidos.  Este documento sólo contiene lo que no se puede encontrar o puede no estar claro directamente de los comentarios de los archivos IDL.

- - - -
-

Está fuertemente codificado para NO USAR más la ANTIGUA API de  caché - nsICacheService y otros.  Pronto será completamente obsoleto y eliminado (bug 913828).

-
- -

nsICacheStorageService

- - - -

nsILoadContextInfo

- - - -

nsICacheStorage

- - - -

nsICacheEntryOpenCallback

- - - -

nsICacheEntry

- - - -

Ciclo de vida de un nuevo ingreso

- - - -

Concurrent read and write

- -
-

Important difference in behavior from the old cache: the cache now supports reading a cache entry data while it is still being written by the first consumer - the writer.

-
- -

This can only be engaged for resumable responses that (bug 960902) don't need revalidation. Reason is that when the writer is interrupted (by e.g. external canceling of the loading channel) concurrent readers would not be able to reach the remaning unread content.

- -
-

This could be improved by keeping the network load running and being stored to the cache entry even after the writing channel has been canceled.

-
- -

When the writer is interrupted, the first concurrent reader in line does a range request for the rest of the data - and becomes that way a new writer. The rest of the readers are still concurrently reading the content since output stream for the cache entry is again open and kept by the current writer.

- -

Lifetime of an existing entry with only a partial content

- - - -

Lifetime of an existing entry that doesn't pass server revalidation

- - - -

Adding a new storage

- -

Should there be a need to add a new distinct storage for which the current scoping model would not be sufficient - use one of the two following ways:

- -
    -
  1. [preffered] Add a new <Your>Storage method on nsICacheStorageService and if needed give it any arguments to specify the storage scope even more.  Implementation only should need to enhance the context key generation and parsing code and enhance current - or create new when needed - nsICacheStorage implementations to carry any additional information down to the cache service.
  2. -
  3. [not preferred] Add a new argument to nsILoadContextInfo; be careful here, since some arguments on the context may not be known during the load time, what may lead to inter-context data leaking or implementation problems. Adding more distinction to nsILoadContextInfo also affects all existing storages which may not be always desirable.
  4. -
- -

See context keying details for more information.

- -

Code examples

- -

TBD

- -

Opening an entry

- -

Creating a new entry

- -

Recreating an already open entry

- -

Implementation

- -

Threading

- -

The cache API is fully thread-safe.

- -

The cache is using a single background thread where any IO operations like opening, reading, writing and erasing happen.  Also memory pool management, eviction, visiting loops happen on this thread.

- -

The thread supports several priority levels. Dispatching to a level with a lower number is executed sooner then dispatching to higher number layers; also any loop on lower levels yields to higher levels so that scheduled deletion of 1000 files will not block opening cache entries.

- -
    -
  1. OPEN_PRIORITY: except opening priority cache files also file dooming happens here to prevent races
  2. -
  3. READ_PRIORITY: top level documents and head blocking script cache files are open and read as the first
  4. -
  5. OPEN
  6. -
  7. READ: any normal priority content, such as images are open and read here
  8. -
  9. WRITE: writes are processed as last, we cache data in memory in the mean time
  10. -
  11. MANAGEMENT: level for the memory pool and CacheEntry background operations
  12. -
  13. CLOSE: file closing level
  14. -
  15. INDEX: index is being rebuild here
  16. -
  17. EVICT: files overreaching the disk space consumption limit are being evicted here
  18. -
- -

NOTE: Special case for eviction - when an eviction is scheduled on the IO thread, all operations pending on the OPEN level are first merged to the OPEN_PRIORITY level. The eviction preparation operation - i.e. clearing of the internal IO state - is then put to the end of the OPEN_PRIORITY level.  All this happens atomically. This functionality is currently pending in bug 976866.

- -

Storage and entries scopes

- -

A scope key string used to map the storage scope is based on the arguments of nsILoadContextInfo. The form is following (currently pending in bug 968593):

- -
a,b,i1009,p,
- - - -

CacheStorageService keeps a global hashtable mapped by the scope key. Elements in this global hashtable are hashtables of cache entries. The cache entries are mapped by concantation of Enhance ID and URI passed to nsICacheStorage.asyncOpenURI.  So that when an entry is beeing looked up, first the global hashtable is searched using the scope key. An entries hashtable is found. Then this entries hashtable is searched using <enhance-id:><uri> string. The elemets in this hashtable are CacheEntry classes, see below.

- -

The hash tables keep a strong reference to CacheEntry objects. The only way to remove CacheEntry objects from memory is by exhausting a memory limit for intermediate memory caching, what triggers a background process of purging expired and then least used entries from memory. Another way is to directly call the nsICacheStorageService.purge method. That method is also called automatically on the "memory-pressure" indication.

- -

Access to the hashtables is protected by a global lock. We also - in a thread-safe manner - count the number of consumers keeping a reference on each entry. The open callback actually doesn't give the consumer directly the CacheEntry object but a small wrapper class that manages the 'consumer reference counter' on its cache entry. This both mechanisms ensure thread-safe access and also inability to have more then a single instance of a CacheEntry for a single <scope+enhanceID+URL> key.

- -

CacheStorage, implementing the nsICacheStorage interface, is forwarding all calls to internal methods of CacheStorageService passing itself as an argument.  CacheStorageService then generates the scope key using the nsILoadContextInfo of the storage. Note: CacheStorage keeps a thread-safe copy of nsILoadContextInfo passed to a *Storage method on nsICacheStorageService.

- -

Invoking open callbacks

- -

CacheEntry, implementing the nsICacheEntry interface, is responsible for managing the cache entry internal state and to properly invoke onCacheEntryCheck and onCacheEntryAvaiable callbacks to all callers of nsICacheStorage.asyncOpenURI.

- - - -

The openers FIFO is an array of CacheEntry::Callback objects. CacheEntry::Callback keeps a strong reference to the opener plus the opening flags.  nsICacheStorage.asyncOpenURI forwards to CacheEntry::AsyncOpen and triggers the following pseudo-code:

- -

CacheStorage::AsyncOpenURI - the API entry point:

- - - -

CacheEntry::AsyncOpen (entry atomic):

- - - -

CacheEntry::InvokeCallbacks (entry atomic):

- - - -

CacheEntry::OnFileReady (entry atomic):

- - - -

CacheEntry::OnHandleClosed (entry atomic):

- - - -

All consumers release the reference:

- - - -

Intermediate memory caching of frequently used metadata (a.k.a. disk cache memory pool)

- -
-

This is a description of this feature status that is currently only a patch in bug 986179. Current behavior is simpler and causes a serious memory consumption regression (bug 975367).

-
- -

For the disk cache entries we keep some of the most recent and most used cache entries' meta data in memory for immediate zero-thread-loop opening. The default size of this meta data memory pool is only 250kB and is controlled by a new browser.cache.disk.metadata_memory_limit preference. When the limit is exceeded, we purge (throw away) first expired and then least used entries to free up memory again. 

- -

Only CacheEntry objects that are already loaded and filled with data and having the 'consumer reference == 0' (bug 942835) can be purged.

- -

The 'least used' entries are recognized by the lowest value of frecency we re-compute for each entry on its every access. The decay time is controlled by the browser.cache.frecency_half_life_hours preference and defaults to 6 hours. The best decay time will be based on results of an experiment.

- -

The memory pool is represented by two lists (strong refering ordered arrays) of CacheEntry objects:

- -
    -
  1. Sorted by expiration time (that default to 0xFFFFFFFF)
  2. -
  3. Sorted by frecency (defaults to 0)
  4. -
- -

We have two such pools, one for memory-only entries actually representing the memory-only cache and one for disk cache entries for which we only keep the meta data.  Each pool has a different limit checking - the memory cache pool is controlled by browser.cache.memory.capacity, the disk entries pool is already described above. The pool can be accessed and modified only on the cache background thread.

- -
"@mozilla.org/netwerk/cache-storage-service;1"
diff --git a/files/es/mozilla/implementing_pontoon_in_a_mozilla_website/index.html b/files/es/mozilla/implementing_pontoon_in_a_mozilla_website/index.html deleted file mode 100644 index 174403bdd8..0000000000 --- a/files/es/mozilla/implementing_pontoon_in_a_mozilla_website/index.html +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Implementando Pontoon en un proyecto de Mozilla -slug: Mozilla/Implementing_Pontoon_in_a_Mozilla_website -tags: - - Localización -translation_of: Mozilla/Implementing_Pontoon_in_a_Mozilla_website ---- -

Pontoon Pontoon es una herramienta basada en web, WYSIWYG (localización de lo que se obtiene) y localización (l10n). En Mozilla, actualmente usamos Pontoon para localizar varios proyectos de Mozilla y la interfaz de la aplicación Firefox OS, conocida como Gaia. Pontoon es una herramienta muy simple e intuitiva que requiere poca o ninguna habilidad técnica para el uso de los localizadores, lo que disminuirá el tiempo de publicación de las versiones localizadas de su proyecto. Aquí discutiremos cómo puedes agregar Pontoon a tu proyecto de Mozilla.

- -
-

¿Te gustaría mejorar Pontoon? Aprende cómo involucrarte en GitHub.

-
- -
-

¿Empezando con tu proyecto l10n? Mira la wiki en haciendo que tu proyecto sea localizado.

-
- -

A. Haz tu proyecto localizable

- -

Nos damos cuenta de que estos ya se consideran estándar buenas practicas para localizar proyectos en Mozilla, pero creemos que es bueno agregarlos aquí como un pequeño recordatorio.

- -
    -
  1. Asegurate de que tu proyecto sea compatible con uno de los frameworks l10n (gettext, XLIFF, L20n, lang, properties, etc.).
  2. -
  3. Extrae cadenas localizables en archivos de recursos.
  4. -
  5. Envia archivos de recursos a un repositorio (SVN, HG, Git). -
      -
    • Las carpetas locales individuales deben ubicarse en el mismo nivel de anidamiento del árbol de directorios. La fuente de la fuente necesita ser llamadatemplates, en-US, en-us o en. Si existen varias carpetas con ese nombre en el repositorio y contienen archivos en un formato de archivo admitido, se usará el primero. Es posible que desees colocar todas las carpetas de configuración regional de forma dedicada locales carpeta para este propósito. El código de configuración regional no debe ser parte del nombre del archivo.
    • -
    • Patrón correcto: -
      /locales/{locale_code}/path/to/file.extension
      -
    • -
    • Patrón incorrecto: -
      /locales/{locale_code}/path/to/file.{locale_code}.extension
      -
    • -
    -
  6. -
  7. Asegúrate de que Pontoon tenga acceso de escritura al repositorio. - -
  8. -
- -

B. (opcional) Habilita la localización in-page de tu proyecto web

- -
    -
  1. Enlaza un script desde el elemento HTML <body> , por lo que Pontoon puede comunicarce con tu sitio, pueda detectar contenido y hacerlo localizable en su lugar. Solo necesitas hacer esto en el entorno que se usará para la localización in-page, p.ej. servidor de puesta en escena: - - -
  2. -
  3. Si tu sitio usa CSP,  por favor, asegurate de que lo siguiente está permitido para el dominio pontoon.mozilla.org: -
      -
    1. cargar dentro de iframe
    2. -
    3. cargar a distancia CSS
    4. -
    5. cargar imágenes remotas
    6. -
    -
  4. -
  5. Si tu sitio usa el X-Frame-Options Encabezado, asegurate que la carga dentro del iframe esté permitida para el dominio pontoon.mozilla.org.
  6. -
  7. Asegurate de que tu sitio sea compatible con HTTPS. Es gratis, automatizado y abierto. Vamos a encriptar!
  8. -
- -

C. Agrega tu proyecto a Pontoon

- -

Tu proyecto ahora está listo para ser configurado en Pontoon. Por favor presenta un error en Infraestructura de localización y herramientas :: Administración / Configuración y proporciona la siguiente información:

- - - -

Para más detalles,  por favor ponte en contacto con el Equipo de gestión de proyectos.

diff --git a/files/es/mozilla/instantbird/index.html b/files/es/mozilla/instantbird/index.html deleted file mode 100644 index 2a3d2a931d..0000000000 --- a/files/es/mozilla/instantbird/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Instantbird -slug: Mozilla/Instantbird -translation_of: Mozilla/Instantbird ---- -

Instantbird es una aplicación de mensajería con un estrecho vinculo con Mozilla. Estas páginas sirven como documentación de  Instantbird y también proveen enlaces a la documentación acerca del backend Chat Core que es utilizado también por Thunderbird.

- -

Instabirs está construido sobre la misma plataforma técnica que Firefox. Originalmente propuesto como un porjecto del Google Summer of Code para crear una interfaz XUL al rededor de libpurple (el backend de Pidgin). Instabird no fue aceptado, pero inicio de cualquier modo en 2007, desde entonces ha crecido más allá de ser un simple frontend para libpurple hasta tener protocolos propios.

- - - - - - - - -
-

Documentación

- -
-
Construyendo Instabird
-
Información acerca de cómo construir Instabird a partir del repositorio comm-central.
-
Chat Core
-
El código backend, incluyendo amplia documentación sobre protocolos de chat  ({{ Interface("prplIProtocol") }} y amigos).
-
Estilos de mensajes
-
Información acerca de aplicar temas a los mensajes mostrados.
-
Atajos de teclado
-
Lista de atajos de teclado
-
- -
-
Nightly builds más recientes
-
Estos son generalmente estables, pero espere que algo se rompa de vez en cuando y ocasione bugs.
-
- -

Ver todos...

-
-

Comunidad

- -
    -
  • #instantbird en irc.mozilla.org (para usuarios y desarrolladores)
  • -
  • El soporte es manejado por la lista de correo support-instabird o en IRC: {{ DiscussionList("support-instantbird", "mozilla.support.instantbird") }}
  • -
  • Las preguntas sobre extensiones pueden ser comentadas en el grupo dev-chat o en  IRC: {{ DiscussionList("dev-chat", "mozilla.dev.chat") }}
  • -
  • una lista de todos los Instantbird communication channels
  • -
- -

Herramientas

- - - - - - -
diff --git a/files/es/mozilla/javascript_code_modules/index.html b/files/es/mozilla/javascript_code_modules/index.html deleted file mode 100644 index 2099b4ca62..0000000000 --- a/files/es/mozilla/javascript_code_modules/index.html +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: JavaScript code modules -slug: Mozilla/JavaScript_code_modules -tags: - - Add-ons - - Extensions - - JavaScript - - Modules - - NeedsTranslation - - TopicStub - - XPCOM -translation_of: Mozilla/JavaScript_code_modules ---- -
- {{gecko_minversion_header("1.9")}}
-

JavaScript code modules let multiple privileged JavaScript scopes share code. For example, a module could be used by Firefox itself as well as by extensions, in order to avoid code duplication.

- - - - - - - -
-

General topics

-
-
- Using JavaScript code modules
-
- An introduction to how to use JavaScript code modules.
-
- Component.utils.import
-
- How to import a JavaScript code module.
-
- Component.utils.unload {{gecko_minversion_inline("7.0")}}
-
- How to unload a JavaScript code module.
-
- Code snippets: Modules
-
- Examples of how to use code modules.
-
- Mozilla Labs JS Modules
-
- This page features a list of JS modules, along with download links and documentation, that extension developers can use in their code.
-
-
-
-
-

Standard code modules

-
-
- AddonManager.jsm {{gecko_minversion_inline("2.0")}}
-
- Interface to install, manage, and uninstall add-ons.
-
- AddonRepository.jsm {{gecko_minversion_inline("2.0")}}
-
- Allows searching of the add-ons repository.
-
- ctypes.jsm {{fx_minversion_inline("3.6")}}
-
- Provides an interface that allows JavaScript code to call native libraries without requiring the development of an XPCOM component.
-
- DeferredTask.jsm {{gecko_minversion_inline("18.0")}}
-
- Run a task after a delay.
-
- Dict.jsm {{gecko_minversion_inline("5.0")}}
-
- Provides an API for key/value pair dictionaries.
-
- DownloadLastDir.jsm {{gecko_minversion_inline("2.0")}}
-
- Provides the path to the directory into which the last download occurred.
-
- Downloads.jsm {{gecko_minversion_inline("23.0")}}
-
- Provides a single entry point to interact with the downloading capabilities of the platform.
-
- FileUtils.jsm {{gecko_minversion_inline("1.9.2")}}
-
- Provides helpers for dealing with files.
-
- Geometry.jsm {{gecko_minversion_inline("2.0")}}
-
- Provides routines for performing basic geometric operations on points and rectangles.
-
- ISO8601DateUtils.jsm
-
- Provides routines to convert between JavaScript Date objects and ISO 8601 date strings.
-
- NetUtil.jsm
-
- Provides helpful networking utility functions, including the ability to easily copy data from an input stream to an output stream asynchronously.
-
- openLocationLastURL.jsm {{gecko_minversion_inline("1.9.1.4")}}
-
- Provides access to the last URL opened using the "Open Location" option in the File menu.
-
- osfile.jsm {{gecko_minversion_inline("16.0")}}
-
- JavaScript module OS.File contains primitives for manipulating files
-
- PerfMeasurement.jsm {{fx_minversion_inline("4.0")}}
-
- Provides access to low-level hardware and OS performance measurement tools.
-
- PluralForm.jsm
-
- Provides an easy way to get the correct plural forms for the current locale, as well as ways to localize to a specific plural rule.
-
- PopupNotifications.jsm {{gecko_minversion_inline("2.0")}}
-
- Provides an easy way to present non-modal notifications to users.
-
- Promise.jsm {{gecko_minversion_inline("25.0")}}
-
- Implements the Promises/A+ proposal as known in April 2013.
-
- Services.jsm {{gecko_minversion_inline("2.0")}}
-
- Provides getters for conveniently obtaining access to commonly-used services.
-
- source-editor.jsm {{fx_minversion_inline("11.0")}}
-
- The Source Editor is used by developer tools such as the Style Editor; this interface implements the editor and lets you interact with it.
-
- Sqlite.jsm {{gecko_minversion_inline("20.0")}}
-
- A Promise-based API to {{ interface("mozIStorage") }}/SQLite.
-
- Task.jsm {{gecko_minversion_inline("17.0")}}
-
- Implements a subset of Task.js to make sequential, asynchronous operations simple, using the power of JavaScript's yield operator.
-
- Timer.jsm {{gecko_minversion_inline("22.0")}}
-
- A pure JS implementation of window.setTimeout.
-
- XPCOMUtils.jsm
-
- Contains utilities for JavaScript components loaded by the JS component loader.
-
-
diff --git a/files/es/mozilla/javascript_code_modules/promise.jsm/index.html b/files/es/mozilla/javascript_code_modules/promise.jsm/index.html deleted file mode 100644 index 58806c841b..0000000000 --- a/files/es/mozilla/javascript_code_modules/promise.jsm/index.html +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: Promise.jsm -slug: Mozilla/JavaScript_code_modules/Promise.jsm -tags: - - NeedsTranslation - - TopicStub -translation_of: Mozilla/JavaScript_code_modules/Promise.jsm ---- -

{{ gecko_minversion_header("25") }}

- -

The Promise.jsm JavaScript code module implements the Promises/A+ proposal as known in April 2013. To use it, you first need to import the code module into your JavaScript scope:

- -
Components.utils.import("resource://gre/modules/Promise.jsm");
-
- -
-

Note: A preliminary promise module is also available starting from Gecko 17, though it didn't conform to the Promises/A+ proposal until Gecko 25:

- -
Components.utils.import("resource://gre/modules/commonjs/promise/core.js");     // Gecko 17 to 20
-Components.utils.import("resource://gre/modules/commonjs/sdk/core/promise.js"); // Gecko 21 to 24
-
- -

This implementation also includes helper functions that are specific to the Add-on SDK. While you may still import this module from the above paths, the recommended way for loading it is through the Add-on SDK loader.

-
- -

Introduction

- -

For an introduction to promises, you may start from the Add-on SDK documentation, keeping in mind that only the core subset is implemented in this module.

- -

A promise is an object representing a value that may not be available yet. Internally, a promise can be in one of three states:

- - - -

A reference to an existing promise may be received by different means, for example as the return value of a call into an asynchronous API. In this case, the state of the promise can be observed but not directly controlled.

- -

To observe the state of a promise, its then method must be used. This method registers callback functions that are called as soon as the promise is either fulfilled or rejected. The method returns a new promise, that in turn is fulfilled or rejected depending on the state of the original promise and on the behavior of the callbacks. For example, unhandled exceptions in the callbacks cause the new promise to be rejected, even if the original promise is fulfilled. See the documentation of the then method for details.

- -

Promises may also be created using the new Promise() constructor.

- -

Method overview

- - - - - - - - - - - - - -
Deferred defer(); {{ obsolete_inline("30") }}
Promise resolve([optional] aValue);
Promise reject([optional] aReason);
- -

Methods

- -

defer()

- -

Creates a new pending promise and provides methods to resolve or reject it.

- -
Deferred defer(); {{ obsolete_inline("30") }}
-
- -
Parameters
- -

None.

- -
Return value
- -

A new object, containing the new promise in the promise property, and the methods to change its state in the resolve and reject properties. See the Deferred documentation for details.

- -

resolve()

- -

Creates a new promise fulfilled with the specified value, or propagates the state of an existing promise.

- -
Promise resolve(
-  aValue
-);
-
- -
Parameters
- -
-
aValue {{ optional_inline() }}
-
If this value is not a promise, including undefined, it becomes the fulfillment value of the returned promise. If this value is a promise, then the returned promise will be resolved with the value, i.e. it will eventually assume the same state as the provided promise.
-
- -
Return value
- -

A promise that can be pending, fulfilled, or rejected.

- -

reject()

- -

Creates a new promise rejected with the specified reason.

- -
Promise reject(
-  aReason
-);
-
- -
Parameters
- -
-
aReason {{ optional_inline() }}
-
-

The rejection reason for the returned promise. Although the reason can be undefined, it is generally an Error object, like in exception handling.

- -
Note: This argument should not be a promise. Specifying a rejected promise would make the rejection reason equal to the rejected promise itself, and not its rejection reason.
-
-
- -
Return value
- -

A rejected promise.

- -

Examples

- -

See the examples page.

- -

See also

- - diff --git a/files/es/mozilla/javascript_code_modules/promise.jsm/promise/index.html b/files/es/mozilla/javascript_code_modules/promise.jsm/promise/index.html deleted file mode 100644 index d92d392972..0000000000 --- a/files/es/mozilla/javascript_code_modules/promise.jsm/promise/index.html +++ /dev/null @@ -1,218 +0,0 @@ ---- -title: Promise -slug: Mozilla/JavaScript_code_modules/Promise.jsm/Promise -tags: - - Firefox - - Módulos - - Promise - - Promise.jsm - - Referencia -translation_of: Mozilla/JavaScript_code_modules/Promise.jsm/Promise ---- -

Un objeto Promise  representa un valor que puede no estar disponible aún.

- -

Una referencia a un Promise existente puede ser recibida por diferentes medios, por ejemplo como el valor de retorno de una llamada a una API asíncrona. Una vez que tenga una referencia al objeto Promise, puede llamar a su método then() para ejecutar una acción cuando el valor esté disponible o cuando ocurra un error.

- -

Los objetos Promise también pueden ser creados usando el constructor new Promise(). No necesita importar el módulo Promise.jsm para usar un objeto Promise del que ya se tiene una referencia.

- -

Internamente, Promise puede encontrarse en uno de tres estados:

- - - -
-

Nota: siempre debería controlar, enviar o reportar errores (rejection reasons). Si ve el mensaje "A promise chain failed to handle a rejection", es posible que haya algo que corregir en el código. Vea manejo de errores y problemas comunes a continuación.

-
- -

Convenciones de la documentación

- -

En la documentación, el tipo de valor fulfillment es especificado normalmente entre corchetes angulados. Por ejemplo, la función OS.File.exists retorna un objeto Promise que eventualmente cumpla con un boolean:

- -
Promise<boolean> exists(string path);
-
- -

El motivo de rechazo (rejection reason) podrá especificarse por separado en la documentación de la función, y se considera que es un objeto Error a menos que se especifique lo contrario.

- -

Resumen del método

- - - - - - - - - - -
Promise then([opcional] Function onFulfill, [opcionalFunction onReject);
Promise catch([opcionalFunction onReject);
- -

Constructor

- -

Crea un nuevo objeto Promise, inicialmente con estado pendiente (pending) y proporciona referencias a las funciones de resolución que se puedan utilizar para cambiar su estado.

- -
new Promise(executor);
-
- -

Parámetros

- -
-
executor
-
-

Esta función se invoca inmediatamente con la resolución de funciones como sus dos argumentos:

- -
executor(resolve, reject);
-
- -

El constructor no retornará valor hasta que el executor haya terminado. Las funciones de resolución pueden ser usadas en cualquier momento, antes o despues que executor haya terminado, para controlar el estado final de Promise. Si executor lanza una excepción, su valor será pasado a la función de resolución reject .

-
-
- -

Funciones de resolución

- -

resolve()

- -

Cumple con el Promise asociado con el valor especificado, o propaga el estado de un objeto Promise existente. Si el Promise asociado ya ha sido resuelto, ya sea a un valor, un rechazo, o de otro Promise, este método no hace nada.

- -
Nota: llamar a este método con un Promise pendiente con el argumento aValue, y luego llamándolo con otro valor antes de que Promise se haya cumplido (fulfilled) o rechazado (rejected), no tendrá efecto la segunda vez, ya que el objeto Promise asociado ya está resuelto al objeto Promise pendiente.
- -
void resolve(
-  aValue
-);
-
- -
Parameters
- -
-
aValue Opcional
-
Si este valor no es un Promise, incluyendo undefined, se convierte en el valor de cumplimiento del Promise asociado. Si este valor es un objeto Promise, el Promise asociado será resuelto con el promise pasado, y seguirá el estado como la promesa proporcionada (incluyendo cualquier transición futura).
-
- -

reject()

- -

Rechaza el Promise asociada con la razón especificada. Si el Promise ya se ha resuelto, ya sea a un valor, un rechazo, o de otro Promise, este método no hace nada.

- -
void reject(
-  aReason
-);
-
- -
Parameters
- -
-
aReason Opcional
-
-

El motivo de rechazo de la promesa asociada. Aunque la razón puede ser undefined, por lo general es un objeto de Error, como en el manejo de excepciones.

- -
Nota: este argumento no debería ser un Promise. Especificar un Promise rechazado haría el motivo de rechazo igual al Promise rechazado en sí, y no a su razón de rechazo.
-
-
- -

Métodos

- -

then()

- -

Llama a una de las funciones previstas tan pronto como esta Promise se haya, bien cumplido, o bien rechazado.  Se retorna un nuevo promise, cuyo estado evoluciona dependiendo del promise y la funcion de devolución de llamada (callbacks) proporcionados.

- -

La devolución de llamada apropiada siempre se invoca después de devolver este método, incluso si esta Promise se ha cumplido o rechazado. Pude lamar al método then() muchas veces para el mismo Promise, y las funciones de devolución de llamada (callbacks) serán invocadas en el mismo orden en el cual fueron registradas.

- -
-

Advertencia: si la funcion de llamada onFulfill lanza una axcepción, onReject no se invocará y la excepción no será capturada, se muestra en la consola (verá una error de cadena promesa fallida). Puede registrar una función de llamada de rechazo en el promise retornado en su lugar (usando catch() o then()), para procesar cualquier excepción ocurrida en cualquiera de las devoluciones de llamada registradas para este promise.

-
- -
Nota: cuando llama al método then() multiples veces para el mismo promise, las funciones de devolución de llamada (callbacks) son siempre ejecutadas inmediatamente. Por ejemplo, si una acepción ocurre en un callback, no afecta al callback posterior. El comportamiento del callback sólo afecta al promise retornado por el método then() con el cual el callback fue registrado, esto es en realidad un promise diferente para cada invocación del método.
- -
Promise then(
-  Function onFulfill,
-  Function onReject
-);
-
- -
Parámetros
- -
-
onFulfill {{optional_inline()}}
-
Si el promise está cumplido (fulfilled), esta funciń es invokada con el valor de cumplimiento del promise como su único argumento, y elo resultado de la función determina el estado del nuevo promise retornado por el método then(). En caso este parámetro (usualmente null), el nuevo promise retornado por el método then() es cumplido (fulfilled) con el mismo valor del promise original.
-
onReject {{optional_inline()}}
-
-

Si el promise es rechazado (rejected), esta función es invocada con con el motivo de rechazo del promise como su único argumento, y el resultado del la función determina el nuevo estado del promise retornado por el método then(). En caso este parametro no es un función (Por lo general undefined), el nuevo promise retornado por el método then() es rechazado (rejected) con la misma razón que el promise original.

-
-
- -
Valor de retorno
- -

Un nuevo promise que es initialmente pendiente, luego asume un estado que depende del resultado de la función de devolución de llamada (callback):

- - - -

catch()

- -

Equivalente a then() con un valor undefined para el parámetro onFulfill. Si encadena then( onFulfill ).catch( onReject ), las excepciones lanzadas en onFulfill serán capturadas y pasadas a onReject, que no es el caso cuando pasa onReject a then().

- -
Promise catch(
-  Function onReject
-);
-
- -

Las siguientes llamadas son por lo tanto idénticas:

- -
p.then(undefined, logError);
-p.catch(logError);
-
- -

Depuración

- -

Por diseño, el estado instantáneo y el valor de un Promise no pueden ser inspeccionados de forma sincrónica, sin llamar al método then().

- -

PAra ayudar con la depuración,  sólo cuando inspeccione un objeto Promise manualmente,  puede ver información con propiedades especialesque son accesibles desde código (esto, actualmente, está implementado se implementa mediante la aleatorización del nombre de la propiedad, por la falta de un lenguaje más sofisticado o soporte depurador).

- -

Estas propiedades inspeccionables de código inaccesible son:

- - - -

Promise properties are visible in the debugger.Promise handlers can be watched from the Console.

- -

Ejemplos

- -

Ver la página de ejemplos.

- -

Gestión de errores y problemas comunes

- -

Debe reportar errores no controlados, a menos que de el relevo de Promise a una función de llamada u otra ruta de código que controlará el error.

- -
// ###### ERROR: Silenciando cualquier rechazo notificado por "OS.File.Exists".
-OS.File.exists(path).then(exists => { if (exists) myRead(path); });
-
-// ###### ERROR: Silenciando cualquier excepción planteado por "myRead".
-OS.File.exists(path).then(exists => { if (exists) myRead(path); }, Components.utils.reportError);
-
-// CORRECTO (por ejemplo, podria reportar la excepción "myRead ino está definido")
-OS.File.exists(path).then(exists => { if (exists) myRead(path); })
-                    .catch(Components.utils.reportError);
-
-// CORRECTO (La función retorna un Promise, y el caller se encargará del rechazo)
-function myReadIfExists(path)
-{
-  return OS.File.exists(path).then(exists => { if (exists) myRead(path); });
-}
- -

Ver también

- - diff --git a/files/es/mozilla/javascript_code_modules/source-editor.jsm/index.html b/files/es/mozilla/javascript_code_modules/source-editor.jsm/index.html deleted file mode 100644 index 1ec7e5477f..0000000000 --- a/files/es/mozilla/javascript_code_modules/source-editor.jsm/index.html +++ /dev/null @@ -1,1549 +0,0 @@ ---- -title: source-editor.jsm -slug: Mozilla/JavaScript_code_modules/source-editor.jsm -translation_of: Mozilla/JavaScript_code_modules/source-editor.jsm ---- -
-

This component has been removed from the platform in Firefox 28.

-
- -

{{ fx_minversion_header("11.0") }}

- -

The source-editor.jsm JavaScript code module implements an editor specifically tailored for editing source code; its primary purpose is to provide support for web developer tools to display and edit web site code. The editor provided is Eclipse Orion.

- -

To use it, you first need to import the code module into your JavaScript scope:

- -
Components.utils.import("resource:///modules/source-editor.jsm");
-
- -
Warning: Much of the functionality of the source editor is implemented by a secondary code module (by default, source-editor-orion.jsm). You must not directly import that code module; it is essentially an implementation detail. Its functionality is all exposed through source-editor.jsm.
- -

Method overview

- -

Initialization and destruction

- - - - - - - - - - -
void destroy();
void init({{ domxref("Element") }} aElement, Object aConfig, Function aCallback);
- -

Search operations

- - - - - - - - - - - - - -
Number find(String aString, [optional] Object options); {{ fx_minversion_inline("12.0") }}
Number findNext(Boolean aWrap); {{ fx_minversion_inline("12.0") }}
Number findPrevious(Boolean aWrap); {{ fx_minversion_inline("12.0") }}
- -

Event management

- - - - - - - - - - -
void addEventListener(String aEventType, Function aCallback);
void removeEventListener(String aEventType, Function aCallback);
- -

Undo stack operations

- - - - - - - - - - - - - - - - - - - - - - - - - -
Boolean canRedo();
Boolean canUndo();
void endCompoundChange();
Boolean redo();
void resetUndo(); {{ gecko_minversion_inline("12.0") }}
void startCompoundChange();
Boolean undo();
- -

Display management operations

- - - - - - - - - - - - - - - - -
void focus();
Number getTopIndex();
Boolean hasFocus();
void setTopIndex(Number aTopIndex);
- -

Content management operations

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Number getCharCount();
String getIndentationString(); {{ fx_minversion_inline("13") }}
String getLineDelimiter();
Number getLineCount();
Number getLineEnd(Number aLineIndex, Boolean aIncludeDelimiter); {{ fx_minversion_inline("14") }}
Number getLineStart(Number aLineIndex); {{ fx_minversion_inline("14") }}
String getMode();
String getText([optional] Number aStart, [optional] Number aEnd);
String getSelectedText();
void setMode(String aMode);
void setText(String aText, [optional] Number aStart, [optional] Number aEnd);
- -

Selection operations

- - - - - - - - - - - - - - - - - - - - - - - - - -
void dropSelection();
Number getCaretOffset();
Object getCaretPosition();
Object getSelection();
void setCaretOffset(Number aOffset);
void setCaretPosition(Number aLine, [optional] Number aColumn, [optional] Number aAlign);
void setSelection(Number aStart, Number aEnd);
- -

Breakpoint management

- - - - - - - - - - - - - -
void addBreakpoint(Number aLineIndex, [optional] String aCondition); {{ fx_minversion_inline("13") }}
Array getBreakpoints(); {{ fx_minversion_inline("13") }}
Boolean removeBreakpoint(Number aLineIndex); {{ fx_minversion_inline("13") }}
- -

Properties

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeTypeDescription
dirtyBooleanSet this value to false whenever you save the text; the editor will update it to true when the content is changed. You can then use this value to detect when the contents of the text are different from your most recent save. In addition, when this value changes, the "{{ anch("DirtyChanged") }}" event is sent. {{ gecko_minversion_inline("13.0") }}
editorElement{{ domxref("Element") }}The element containing the editor. When using the default Orion editor, this is a XUL {{ XULElem("iframe") }} element. Read only.
lastFindObject -

An object describing the result of the last find operation performed using the {{ manch("find") }}, {{ manch("findNext") }}, or {{ manch("findPrevious") }} method. Read only.

- -

This object has the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
strStringThe last string that was searched for.
indexNumberAn integer value indicating the result of the most recent find operation; this is the index into the text at which str was found, or -1 if the string wasn't found.
lastFoundNumberThe index of the previous location at which str was found, for multiple find operations (such as {{ manch("find") }} followed by {{ manch("findNext") }}). This can be -1 if the string was never found.
ignoreCaseBooleantrue if the search was case sensitive; otherwise false.
-
readOnlyBooleanSet this value to true to make the editor read only, thereby preventing the user from making changes. Set it to false to allow editing.
- -

Constants

- -

Preference name constants

- -

These constants define the names of preferences used by the source editor.

- - - - - - - - - - - - - - - - - - - - - - - - -
ConstantValueDescription
SourceEditor.PREFS.COMPONENT"devtools.editor.component"A string indicating the name of the source editor engine to use; this is "orion" by default. The source editor code module loads a module by the name "source-editor-<component>.jsm" and exposes its API as part of the SourceEditor object.
SourceEditor.PREFS.EXPAND_TAB"devtools.editor.expandtab"A Boolean value that indicates whether or not to automatically expand tabs out to a series of spaces.
SourceEditor.PREFS.TAB_SIZE"devtools.editor.tabsize"An integer value that specifies the number of spaces per tab.
- -

Editor mode constants

- -

These constants are used to set the syntax highlighting mode for the editor by calling its {{ manch("setMode") }} method, or in the configuration object when first initializing the editor using its {{ manch("init") }} method.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstantValueDescription
SourceEditor.MODES.CSS"css"Cascading Style Sheet.
SourceEditor.MODES.HTML"html"HTML document.
SourceEditor.MODES.JAVASCRIPT"js"JavaScript source code.
SourceEditor.MODES.TEXT"text"UTF-8 text document.
SourceEditor.MODES.XML"xml"XML document.
- -

Theme constants

- -

These constants are used to identify the available themes that can be used by the syntax highlighter. Only one is provided by default at this time.

- - - - - - - - - - - - - - -
ConstantValueDescription
SourceEditor.THEMES.MOZILLA"mozilla"The default Mozilla syntax highlighter theme.
- -

Configuration defaults constants

- -

These constants represent the default values for each of the available configuration options. See {{ anch("The editor configuration object") }} for details on configuring the editor.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstantValue
SourceEditor.DEFAULTS.contextMenu"sourceEditorContextMenu"
SourceEditor.DEFAULTS.expandTabtrue
SourceEditor.DEFAULTS.highlightCurrentLinetrue {{ fx_minversion_inline("13") }}
SourceEditor.DEFAULTS.initialText""
SourceEditor.DEFAULTS.keysnull
SourceEditor.DEFAULTS.modeSourceEditor.MODES.TEXT
SourceEditor.DEFAULTS.readOnlyfalse
SourceEditor.DEFAULTS.showAnnotationRulerfalse {{ fx_minversion_inline("13") }}
SourceEditor.DEFAULTS.showLineNumbersfalse {{ fx_minversion_inline("13") }}
SourceEditor.DEFAULTS.showOverviewRulerfalse
SourceEditor.DEFAULTS.tabSize4
SourceEditor.DEFAULTS.themeSourceEditor.THEMES.MOZILLA
SourceEditor.DEFAULTS.undoLimit200
- -

Event name constants

- -

These constants provide the names of the editor events for which you can listen.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstantValueDescription
SourceEditor.EVENTS.BLUR"{{ anch("Blur") }}"Fired when the editor loses focus. {{ fx_minversion_inline("13.0") }}
SourceEditor.EVENTS.BREAKPOINT_CHANGE"{{ anch("BreakpointChange") }}"Fired when a new breakpoint is added, or when an existing breakpoint is removed. This happens both when the API is used to make the change or when the UI is used to do it. {{ fx_minversion_inline("13.0") }}
SourceEditor.EVENTS.CONTEXT_MENU"{{ anch("ContextMenu") }}"Fired when the editor's context menu is invoked, but before it's opened.
SourceEditor.EVENTS.DIRTY_CHANGED"{{ anch("DirtyChanged") }}"Fired when the dirty state of the editor is changed. The dirty state indicates whether or not there are unsaved changes to the text. {{ fx_minversion_inline("13.0") }}
SourceEditor.EVENTS.FOCUS"{{ anch("Focus") }}"Fired when the editor gains focus. {{ fx_minversion_inline("13.0") }}
SourceEditor.EVENTS.MOUSE_MOVE"{{ anch("MouseMove") }}"Fired when the user moves the mouse over a line annotation. {{ fx_minversion_inline("13.0") }}
SourceEditor.EVENTS.MOUSE_OUT"{{ anch("MouseOut") }}"Fired when the mouse pointer leaves a line annotation. {{ fx_minversion_inline("13.0") }}
SourceEditor.EVENTS.MOUSE_OVER"{{ anch("MouseOver") }}"Fired when the mouse pointer enters a line annotation. {{ fx_minversion_inline("13.0") }}
SourceEditor.EVENTS.SELECTION"{{ anch("Selection") }}"Fired when the current selection in the editor changes.
SourceEditor.EVENTS.TEXT_CHANGED"{{ anch("TextChanged") }}"Fired when the editor's content changes.
- -

Methods

- -

addBreakpoint

- -

Adds a breakpoint to be triggered at a certain line in the code, under an optional condition.

- -
Note: Implementing actual support for debugger features such as breakpoints is up to you. The editor simply tracks their existence and marks them with annotations in the editor.
- -
void addBreakpoint(
-  Number aLineIndex,
-  [optional] String aCondition
-);
-
- -
Parameters
- -
-
aLineIndex
-
The 0-based line number at which to place the breakpoint.
-
aCondition {{ optional_inline() }}
-
A string describing the condition under which the breakpoint should be triggered. This information is simply recorded as part of the breakpoint annotation. NEED LINK TO TEXT ABOUT HANDLING BREAKPOINT CONDITIONS HERE.
-
- -

addEventListener()

- -

Adds a new event listener to the editor. You can listen for any of the events listed in {{ anch("Event name constants") }}. To stop listening for the event, call {{ manch("removeEventListener") }}.

- -
void addEventListener(
-  String aEventType,
-  Function aCallback
-);
-
- -
Parameters
- -
-
aEventType
-
The name of the event type to listen for; see {{ anch("Event name constants") }} for possible values.
-
aCallback
-
The function to call when the specified event occurs.
-
- -

canRedo()

- -

Determines whether or not there are changes that can be redone.

- -
Boolean canRedo();
-
- -
Parameters
- -

None.

- -
Return value
- -

true if there are changes that can be redone, otherwise false.

- -

canUndo()

- -

Determines whether or not there are changes that can be undone.

- -
Boolean canUndo();
-
- -
Parameters
- -

None.

- -
Return value
- -

true if there are changes that can be undone, otherwise false.

- -

destroy()

- -

Destroys the editor, releasing resource it's allocated and removing event handlers it's installed. You should call this method when you're done using the editor object.

- -
void destroy();
-
- -
Parameters
- -

None.

- -

dropSelection()

- -

Deselects the currently selected text.

- -
void dropSelection();
-
- -
Parameters
- -

None.

- -

endCompoundChange()

- -

Ends a compound change that was previously started by calling {{ manch("startCompoundChange") }}. All changes made to the text between the two calls is considered to be a single edit for the purposes of undo operations.

- -
void endCompoundChange();
-
- -
Parameters
- -

None.

- -

find()

- -

Finds a string in the editor's text.

- -
Number find(
-  [optional] String aString
-  [optional] Object aOptions
-);
-
- -
Parameters
- -
-
aString {{ optional_inline() }}
-
The string for which to search. If not specified, the currently selected text in the editor is used as the search string.
-
aOptions {{ optional_inline() }}
-
An optional object containing properties customizing the search operation. See {{ anch("Find options") }} for details.
-
- -
Return value
- -

Returns an integer indicating the offset into the text at which the first character of the found string is located, or -1 if the string wasn't found.

- -
Find options
- -

The aOptions object can customize the search operation. It may have the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
backwardsBooleanIf true, the search begins at start (or the end of the text, if start is not specified) and progresses toward the beginning of the text. Otherwise the search progresses forward. The default is false.
ignoreCaseBooleanIf true, the search is performed in a case-insensitive manner; otherwise case is considered. The default is false.
startNumberAn integer value indicating the offset into the text at which to begin the find operation. The default is 0 if backwards is false, or text.length if backwards is true.
- -

findNext()

- -

Finds the next occurrence of the search operation started by the last call to {{ manch("find") }}.

- -
Note: This ignores the value you specified for backwards in the original search; it always searches forward.
- -
Number findNext(
-  Boolean aWrap
-};
-
- -
Parameters
- -
-
aWrap
-
If true, the search operation will wrap around to the beginning of the text. Otherwise, the search stops if the end of the text is reached.
-
- -
Return value
- -

The offset into the text at which the next occurrence of the string begins, or -1 if the string isn't found.

- -

findPrevious()

- -

Finds the previous occurrence of the search operation started by the last call to {{ manch("find") }}.

- -
Note: This ignores the value you specified for backwards in the original search; it always searches backward.
- -
Number findNext(
-  Boolean aWrap
-};
-
- -
Parameters
- -
-
aWrap
-
If true, the search operation will wrap around to the end of the text. Otherwise, the search stops if the beginning of the text is reached.
-
- -
Return value
- -

The offset into the text at which the next occurrence of the string begins, or -1 if the string isn't found.

- -

focus()

- -

Makes the editor the focus for user input.

- -
void focus();
-
- -
Parameters
- -

None.

- -

getBreakpoints

- -

Returns an array of all of the breakpoints currently set on the code in the editor instance.

- -
Array getBreakpoints();
-
- -
Parameters
- -

None.

- -
Return value
- -

An Array of all of the breakpoints in the editor instance. Each breakpoint is an Object with the following properties:

- - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
lineNumberThe 0-based line number on which the breakpoint is set.
conditionStringThe condition string that was specified when the breakpoint was set.
- -

getCaretOffset()

- -

Returns the current caret position (insertion point) as an offset into the text.

- -
Number getCaretOffset();
-
- -
Parameters
- -

None.

- -
Return value
- -

The 0-based offset into the text at which newly-typed characters will be inserted.

- -

getCaretPosition()

- -

Returns an object describing the position of the caret (insertion point) in terms of its line number and column.

- -
Object getCaretPosition();
-
- -
Parameters
- -

None.

- -
Return value
- -

The returned object describes the caret position:

- - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
lineNumberThe 0-based line number on which the caret is located.
colNumberThe 0-based column number on which the caret is located.
- -

getCharCount()

- -

Returns the number of characters in the editor's content.

- -
Number getCharCount();
-
- -
Parameters
- -

None.

- -
Return value
- -

The number of characters in the editor's text.

- -

getIndentationString

- -

Returns a string containing the character or characters that are inserted when the user presses the tab key.

- -
String getIndentationString();
-
- -
Parameters
- -

None.

- -
Return value
- -

If tabs are configured to be expanded into spaces (that is, the expandTab property is true), the returned string is comprised of the number of spaces specified by the tabSize property when the editor was initialized by calling {{ manch("init") }}. Otherwise, the returned string is simply "\t".

- -

getLineCount()

- -

Returns the number of lines of text in the editor.

- -
Number getLineCount();
-
- -
Parameters
- -

None.

- -
Return value
- -

The number of lines of text in the document being edited.

- -

getLineDelimiter()

- -

Returns a string containing the character or characters that are used as the end of each line of text. This may be, for example, "\n", "\r", or "\r\n".

- -
String getLineDelimiter();
-
- -
Parameters
- -

None.

- -
Return value
- -

A string containing the character or characters that delineate lines of text.

- -

getLineEnd

- -

Returns the character offset of the character after the specified line number in the text.

- -
Number getLineEnd(
-  Number aLineIndex,
-  [optional] Boolean aIncludeDelimiter
-);
-
- -
Parameters
- -
-
aLineIndex
-
Zero-based offset to the line number to which to return the end offset.
-
aIncludeDelimiter {{ optional_inline() }}
-
If false, the returned offset is to the first character of the end-of-line delimiter if the specified line (this is the default). If true, the returned offset is the offset to the first character of the following line.
-
- -
Return value
- -

The offset to the last character in the specified line, or -1 if the specified line number is out of range.

- -

getLineStart

- -

Returns the character offset of the first character of the specified line in the text.

- -
Number getLineStart(
-  Number aLineIndex
-);
-
- -
Parameters
- -
-
aLineIndex
-
Zero-based offset to the line number to which to return the end offset.
-
- -
Return value
- -

The offset to the first character in the specified line, or -1 if the specified line number is out of range.

- -

getMode()

- -

Returns the current syntax highlighting mode for the document's contents.

- -
String getMode();
-
- -
Parameters
- -

None.

- -
Return value
- -

A string indicating the type of file being edited, as previously set using either the mode property when configuring the editor, or by a call to {{ manch("setMode") }}. See {{ anch("Editor mode constants") }} for possible values.

- -

getSelectedText()

- -

Returns the currently-selected text.

- -
String getSelectedText();
-
- -
Parameters
- -

None.

- -
Return value
- -

The currently-selected text in the editor.

- -

getSelection()

- -

Returns an object indicating the offsets to the first and last characters that are currently selected.

- -
Object getSelection();
-
- -
Parameters
- -

None.

- -
Return value
- -

An object describing the currently selected range of text in the editor:

- - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
startNumber0-based offset to the first character in the current selection.
endNumber0-based offset to the end of the current selection. The character at this offset is not included in the selection; it's essentially the first character after the selection.
- -

If there's no selection, the current caret position is returned for both start and end.

- -

getText()

- -

Returns the text in the specified range within the editor, or all of the editor's text if no range is given.

- -
String getText(
-  [optional] Number aStart,
-  [optional] Number aEnd
-);
-
- -
Parameters
- -
-
aStart {{ optional_inline() }}
-
The offset to the first character to retrieve.
-
aEnd {{ optional_inline() }}
-
The offset to the last character to retrieve. If this isn't provided, all text from aStart (or the beginning of the document, if that wasn't provided either) to the end of the text is returned.
-
- -
Return value
- -

A string containing the specified range of text (or all of the text, if a range wasn't provided).

- -

getTopIndex()

- -

Returns the line number of the first line currently visible in the editor, based on the current scroll position of the editor.

- -
Number getTopIndex();
-
- -
Parameters
- -

None.

- -
Return value
- -

The line number of the first visible line; this is a 0-based value, so the first line of the document is line number 0.

- -

init()

- -

Initializes the editor. You must call this, and wait until your callback is called, before calling any other Source Editor methods.

- -
void init(
-  Element aElement,
-  Object aConfig
-  Function aCallback
-);
-
- -
Parameters
- -
-
aElement
-
The DOM {{ domxref("element") }} in which to place the editor.
-
aConfig
-
An object containing a set of properties used to configure the editor. See {{ anch("The editor configuration object") }} for details.
-
aCallback
-
A function that will be called when the editor has been fully loaded and initialized.
-
- -

hasFocus()

- -

Determines whether or not the editor is currently focused.

- -
Boolean hasFocus();
-
- -
Parameters
- -

None.

- -
Return value
- -

true if the editor is currently focused, otherwise false.

- -

redo()

- -

Redoes the most recently undone change in the editor.

- -
Boolean redo();
-
- -
Parameters
- -

None.

- -
Return value
- -

true if a change was redone, otherwise false.

- -

removeBreakpoint

- -

Removes the breakpoint from the specified line of code.

- -
Boolean removeBreakpoint(
-  Number aLineIndex
-);
-
- -
Parameters
- -
-
aLineIndex
-
The 0-based line number from which to remove the breakpoint.
-
- -
Return value
- -

true if a breakpoint was removed, otherwise false.

- -

removeEventListener()

- -

Removes an event listener (previously established by calling {{ manch("addEventListener") }} from the editor.

- -
void removeEventListener(
-  String aEventType,
-  Function aCallback
-);
-
- -
Parameters
- -
-
aEventType
-
The name of the event type to stop listening for; see {{ anch("Event name constants") }} for possible values.
-
aCallback
-
The function to stop calling when the specified event occurs.
-
- -

resetUndo

- -

Resets the undo stack, removing all possible undo and redo operations from the stack.

- -
void resetUndo();
-
- -
Parameters
- -

None.

- -

setCaretOffset()

- -

Sets the current caret position (insertion point) for newly-entered text.

- -
void setCaretOffset(
-  Number aOffset
-);
-
- -
Parameters
- -
-
aOffset
-
The 0-based offset into the text at which to place the caret.
-
- -

setCaretPosition()

- -

Sets the current caret position given a line number and column number.

- -
void setCaretPosition(
-  Number aLine,
-  [optional] Number aColumn,
-  [optional] Number aAlign
-);
-
- -
Parameters
- -
-
aLine
-
The 0-based line number on which to place the caret.
-
aColumn {{ optional_inline() }}
-
The 0-based column number at which to place the caret; if you don't provide this parameter, the caret is placed at the beginning of the line specified by aLine.
-
aAlign {{ optional_inline() }}
-
How to position the line with respect to the viewport when scrolling the line into view. This may be one of SourceEditor.VERTICAL_ALIGN.TOP, SourceEditor.VERTICAL_ALIGN.CENTER, and SourceEditor.VERTICAL_ALIGN_BOTTOM. See {{ anch("Alignment constants") }} for details. The default is SourceEditor.VERTICAL_ALIGN.TOP.
-
- -

setMode()

- -

Sets the current syntax highlighting mode for the text being edited.

- -
void setMode(
-  String aMode
-);
-
- -
Parameters
- -
-
aMode
-
A string indicating the file type being edited. See {{ anch("Editor mode constants") }} for possible values.
-
- -

setSelection()

- -

Selects the specified range of text.

- -
void setSelection(
-  Number aStart,
-  Number aEnd
-);
-
- -
Parameters
- -
-
aStart
-
The 0-based offset to the first character to select in the text.
-
aEnd
-
The offset to the first character after the range you wish to select.
-
- -
Remarks
- -

It's important to note that the character at offset aEnd is not included in the selection.

- -

setText()

- -

Replaces a range of text in the editor with the specified string. If you don't specify a range, the entire text is replaced.

- -
void setText(
-  String aString,
-  [optional] Number aStart,
-  [optional] Number aEnd
-);
-
- -
Parameters
- -
-
aString
-
The text to put into the editor.
-
aStart {{ optional_inline() }}
-
The 0-based offset to the first character in the text to replace.
-
aEnd {{ optional_inline() }}
-
The offset to the last character to replace. If you don't specify this value, the entire string from aStart (or the first character in the text, if you don't specify aStart) to the end of the text is replaced.
-
- -

setTopIndex()

- -

Scrolls the text as necessary to place the specified line number at the top of the view.

- -
void setTopIndex(
-  Number aTopIndex
-);
-
- -
Parameters
- -
-
aTopIndex
-
The 0-based line number to place at the top of the editor's view.
-
- -

startCompoundChange()

- -

Begins a compound change in the editor. All changes made between a call to startCompoundChange() and its corresponding call to {{ manch("endCompoundChange") }} are considered to be a single operation on the undo stack.

- -
void startCompoundChange();
-
- -
Parameters
- -

None.

- -

undo()

- -

Undoes the most recent change made in the editor.

- -
Boolean undo();
-
- -
Parameters
- -

None.

- -
Return value
- -

true if a change was undone or false if there were no changes to undo.

- -

The editor configuration object

- -

When you call {{ manch("init") }} to initialize the editor, you pass in an object that contains properties configuring the editor's features. That object may contain any combination of the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstantTypeDescription
contextMenuString | {{ domxref("Element") }}A reference to the context menu to display when the user right-clicks in the editor. This may be either a string providing the ID of a XUL {{ XULElem("menupopup") }} or an {{ domxref("Element") }} object of type {{ XULElem("menupopup") }}. See XXXXX for details on how to work with the context menu. {{ fx_minversion_inline("13.0") }}
expandTabBooleanA Boolean value indicating whether or not tab characters should be expanded out to spaces. This value is overridden by the user preference named by SourceEditor.PREFS.EXPAND_TAB.
highlightCurrentLineBooleanA Boolean value indicating whether or not to highlight the line on which the text caret is currently located. {{ fx_minversion_inline("13.0") }}
initialTextStringThe default initial text to be in the editor when it's created. By default, this is the empty string, indicating there should be no text on startup. {{ fx_minversion_inline("13.0") }}
keysArrayAn array of objects defining custom keyboard bindings. See XXXXX for details. {{ fx_minversion_inline("13.0") }}
modeStringA string indicating the default syntax highlighting mode; by default, the content is assumed to be plain text. See {{ anch("Editor mode constants") }} for permitted values.
placeholderTextStringThe default initial text to be in the editor when it's created; by default, an empty string. This is deprecated starting in Firefox 13; use initialText instead. {{ deprecated_inline("13.0") }}
readOnlyBooleanA Boolean value indicating whether or not the source editor should be read only. {{ fx_minversion_inline("13.0") }}
showAnnotationRulerBooleanA Boolean value indicating whether or not to display the annotations gutter/ruler. See XXXXX for details. {{ fx_minversion_inline("13.0") }}
showLineNumbersBooleanA Boolean value indicating whether or not the line numbers gutter should be displayed. {{ fx_minversion_inline("13.0") }}
showOverviewRulerBooleanA Boolean value indicating whether or not to show the overview gutter/ruler. This presents an overview of the current annotations in the editor, such as the breakpoints. {{ fx_minversion_inline("13.0") }}
tabSizeNumberA number indicating how many spaces each tab character should occupy. This default can be overridden by the user preference named by SourceEditor.PREFS.TAB_SIZE.
themeStringA string indicating the default syntax highlighting theme to use; you may use one of the predefined values listed in {{ anch("Theme constants") }}, or you may provide your own CSS file reference.
undoLimitNumberA number indicating how many steps the undo stack should hold.
- -

See {{ anch("Configuration defaults constants") }} for a list of the default values for these configuration options.

- -

Events

- -

There are a number of events that can be sent by the source editor, as listed in {{ anch("Event name constants") }}. This section provides details on each of those events and their properties.

- -

ContextMenu

- -

The "ContextMenu" event is sent when the editor's context menu is invoked, and has the following properties.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
xNumberThe X-coordinate at which the mouse cursor was located when the context menu was invoked. This value is relative to the document being edited; that is, 0 is the top of the very first line of text in the document, regardless of vertical scroll position.
yNumberThe Y-coordinate at which the mouse cursor was located when the context menu was invoked. This value is relative to the document being edited; that is, 0 is the left edge of the document, regardless of horizontal scroll position.
screenXNumberThe X-coordinate at which the mouse cursor was located when the context menu was invoked, relative to the screen. This value comes from the DOM contextmenu's event.screenX property.
screenYNumberThe Y-coordinate at which the mouse cursor was located when the context menu was invoked, relative to the screen. This value comes from the DOM contextmenu's event.screenY property.
- -

TextChanged

- -

The "TextChanged" event is sent when the contents of the editor change. It has the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
startNumberThe character offset into the document at which the change occurred.
removedCharCountNumberThe number of characters removed from the document.
addCharCountNumberThe number of characters added to the document.
- -

Selection

- -

The "Selection" element is sent when the selection within the editor changes. It has the following properties:

- - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
oldValueObjectThe previously-selected range of text.
newValueObjectThe newly-selected range of text.
- -

The objects used for oldValue and newValue each have two properties of type Number: start and end, describing the start and end positions of the range of characters.

- -

The "Focus" event is sent when the editor is focused. It has no properties.

- -

The "Blur" event is sent when the editor loses focus. It has no properties.

- -

MouseMove

- -

The "MouseMove" event is sent when the user moves the mouse pointer over a line of text content. It has the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
event{{ domxref("MouseEvent") }}The DOM "mousemove" event.
xNumberThe X-coordinate of the mouse pointer relative to the document being edited; that is, 0 is the top of the very first line of text in the document, regardless of vertical scroll position..
yNumberThe Y-coordinate of the mouse pointer relative to the document being edited; that is, 0 is the left edge of the very first column of text in the document, regardless of horizontal scroll position.
- -

MouseOver

- -

The "MouseOver" event is sent when the user moves the mouse pointer enters a line of text content. It has the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
event{{ domxref("MouseEvent") }}The DOM "mouseover" event.
xNumberThe X-coordinate of the mouse pointer relative to the document being edited; that is, 0 is the top of the very first line of text in the document, regardless of vertical scroll position.
yNumberThe Y-coordinate of the mouse pointer relative to the document being edited; that is, 0 is the left edge of the very first column of text in the document, regardless of horizontal scroll position.
- -

MouseOut

- -

The "MouseOut" event is sent when the user moves the mouse pointer over a line of text content. It has the following properties:

- - - - - - - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
event{{ domxref("MouseEvent") }}The DOM "mouseout" event.
xNumberThe X-coordinate of the mouse pointer relative to the document being edited; that is, 0 is the top of the very first line of text in the document, regardless of vertical scroll position..
yNumberThe Y-coordinate of the mouse pointer relative to the document being edited; that is, 0 is the left edge of the very first column of text in the document, regardless of horizontal scroll position.
- -

The "BreakpointChange" event is sent when a breakpoint is changed. This can be any of the following changes:

- - - -

The event has the following properties:

- - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
addedArrayAn array of breakpoint objects representing all of the breakpoints that have been added; see {{ anch("Breakpoint objects") }} for details.
removedArrayAn array of breakpoint objects representing all of the breakpoints that have been removed; see {{ anch("Breakpoint objects") }} for details.
- -

The "DirtyChanged" event is sent when the dirty state of the editor changes. This state indicates whether or not there have been changes to the text since the last time the content was saved. This event has the following properties:

- - - - - - - - - - - - - - - - - - - -
PropertyTypeDescription
oldValueBooleanThe previous state of the dirty flag.
newValueBooleanThe new state of the dirty flag.
- -

If the dirty flag is true, the document has not been saved since the last time its text was changed. You can set the dirty state of the document by setting the value of the dirty attribute.

diff --git a/files/es/mozilla/javascript_code_modules/timer.jsm/index.html b/files/es/mozilla/javascript_code_modules/timer.jsm/index.html deleted file mode 100644 index 5b667e8c2b..0000000000 --- a/files/es/mozilla/javascript_code_modules/timer.jsm/index.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Timer.jsm -slug: Mozilla/JavaScript_code_modules/Timer.jsm -tags: - - Add-ons - - JavaScript - - JavaScript temporizador - - modulo - - temporizador -translation_of: Mozilla/JavaScript_code_modules/Timer.jsm ---- -

{{ gecko_minversion_header("22") }}

- -

El modulo de código JavaScript Timer.jsm contiene implementaciones puras de Javascript de setTimeout, clearTimeout, setInterval, y clearInterval Que son compatibles con las funciones de ventana DOM, pero que pueden ser usadas por código que no tiene acceso a la ventana DOM(por ejemplo, Los módulos de código de Javascript o los scripts de contenido de frames).

- -

Para usar Timer.jsm, primero impórtalo:

- -
Components.utils.import("resource://gre/modules/Timer.jsm");
-
- -

Entonces llama a setTimeout y a clearTimeout como lo harías en una ventana DOM, por ejemplo:

- -
let timeoutID = setTimeout(function() { console.log("¡Hola!"); }, 500);
-
-clearTimeout(timeoutID);
-
- -

De forma similar, puedes usar setInterval y clearInterval de la siguiente manera:

- -
let intervalID = setInterval(function() { console.log("¡Sucederá cada 500ms!"); }, 500);
-
-clearInterval(intervalID);
diff --git a/files/es/mozilla/localization/index.html b/files/es/mozilla/localization/index.html deleted file mode 100644 index 1a5f47f30a..0000000000 --- a/files/es/mozilla/localization/index.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: La Localización en Mozilla -slug: Mozilla/Localization -tags: - - Landing - - Localización - - Mozilla - - NeedsTranslation - - TopicStub - - Translation - - l10n -translation_of: Mozilla/Localization ---- -

Localizacíon (L10n) es el proceso por el cual se traduce la interfaz de usuario de un software desde un idioma a otro, realizando los cambios necesarios para que se adapte a la cultura de destino. Estos recursos están destinados a todos aquellos interesados en los aspectos técnicos de la Localización, ya sean programadores o contribuidores.

- - - -

Vease también

- -

Localización de MDN (Relacionado con la localización de documentos aquí en MDN)

- -

Localización de Apps Este conjunto de documentos aplica más específicamente a la localización de apps, incluyendo las apss de Firefox OS.

- -

L10n Documentos de referencia para el API de L10n que Mozilla usa para localizar Firefox OS.

diff --git a/files/es/mozilla/localization/l10n_style_guide/index.html b/files/es/mozilla/localization/l10n_style_guide/index.html deleted file mode 100644 index adde6a55af..0000000000 --- a/files/es/mozilla/localization/l10n_style_guide/index.html +++ /dev/null @@ -1,363 +0,0 @@ ---- -title: Mozilla L10n Style Guide -slug: Mozilla/Localization/L10n_Style_Guide -tags: - - Localization - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Localization/L10n_Style_Guide ---- -

Intro

- -
Style guides define the standard against which we determine a translation's quality. They contain rules that are both defined by Mozilla and by Mozilla's localization communities on how to best translate text in Mozilla products, websites, and other projects. Style guides are used to both translate and evaluate a translation's quality. By following these rules, a translator has a better chance of producing a high quality translation that represents Mozilla values and culture. Some examples of international style guides created by other organizations are:
- - - -
This style guide is broken up into two main parts: the first contains rules that are language-specific and must be defined by each Mozilla l10n community (covering language-specific style, terminology, and units); the second contains general rules that Mozilla has defined for translators of all languages that can help you translate well (covering principles of accuracy and fluency). Please adapt part one of this style guide to your l10n community's rules for style, terminology, and units. Wherever possible, refer to existing national standards for units, spelling, and grammar in your community's adaptation of the first part of this style guide.
- -

- -

Language-specific Mozilla style

- -
    -
- -

Style

- -
Your localization community's style is largely up to you to define. It is a part of your community's instructions and standards for translating strings within each project type. Style encompasses various elements, such as formality, tone, natural expression, handling cultural references, idioms, or slang, and maintaining consistency with Mozilla and 3rd party branding and style guides. Your localization community should define these style elements for localizing Mozilla projects into your language. Let's go through these main aspects of Style.
- -
- -
Formality and Tone
- -
When determining the formality or tone of a Mozilla l10n project in your language, ask yourself these questions:
- - - -
In fact, localization should not use a level of formality higher or lower than required by this community-defined style guideline. An example of this would be using "click here" (not formal) vs. "please click here" (more formal). Also, the tone employed throughout a l10n project(s) should stay consistent within itself. 
- -
- -
Natural expression
- -
Using natural expressions make your localization sound natural to a native speaker. If your translation does not follow the community defined language guidelines for translating content that contains local or natural expressions, this results in a mediocre and/or awkward translation. Teams should be careful to address those and keep them in mind while translating, which is why it is an important section to address in a Style Guide. An example of a natural expression in a translation would be translating the Spanish phrase, "En ocho días." In English, one might translate this as, "in eight days" or "in a week." The latter is the more natural translation, although both could be considered correct.
- -
- -
In this section, form guidelines for how to perform a natural sounding localization. This might take some time and experience to find the right examples to include or create the right guidelines for your language.
- -
- -
Handling cultural references, idioms, and slang
- -

Cultural references, idioms, and slang require a full understanding of these references between the cultures of your source and target languages. An example of a cultural reference in English would be the phrase, "kick-off meeting." This is a reference that uses an American football term. It means a meeting to begin a project. To translate it, you can follow one of two approaches:

- -
    -
  1. Find an equivalent reference phrase in your language.
  2. -
  3. Remove the cultural reference and translate the core meaning (e.g., "a commencement meeting") 
  4. -
- -

Define a policy for handling these cultural references, idioms, and slang that you can make standard across all projects. Consider resources you can refer back to in order to find cultural equivalents and list them in this section of your style guide (e.g., a slang dictionary in your language).  

- -
Style consistency
- -
Finally, adherence to Mozilla and third-party branding and style guides should be respected throughout a localization project. More information on Mozilla-specific branding rules can be found here: https://www.mozilla.org/en-US/styleguide/identity/firefox/branding/. For example, some brand names should never be translated, such as "Firefox".  For other brands that do not have any branding guidelines, your localization community must define whether to translate them. Be extra careful to check on branding rules before deciding to translate a name or not (whether for Mozilla or for a third-party) and to list them here in your community's l10n style guide.
- -
- -
-

Terminology

- -
Here are a few existing term bases we approve of for software/internet terminology and definitions (though not limited to):
- - - -
You should be consistent in the use of existing reliable appropriate term bases in your language.  These term bases could be developed and approved by the community, or leveraged from another party that adhere to national, international or local standards for software and internet terminology.  Avoid the following:
- - - -
Tips on translating difficult concepts
- -
Translating terms representing difficult concepts is a tricky task. Here are some ideas to help you translate terms that do not have equivalents in your language:
- - - -
Developing new term bases
- -
What is your community's process for identifying and creating a new termbase? Here are a few things to keep in mind:
- - - -

Units and Grammar 

- -
Many elements of unit or grammar do not exist or apply to all languages. If you find one of these elements that does not apply to your language, please remove it from your style guide. For those definitions of units and grammar that apply document the reference used or how it will be applied to the translation.
- -
- -
The translation should strive to achieve proper unit conversions for currency, measurements, etc. for the target audience.
- -
- -

Units and Unit Conversion

- -
Date Format
- -
How are the date formats for weeks and months expressed in the following forms:
- - - -
Reference material can be find here: https://en.wikipedia.org/wiki/Date_format_by_country
- -
- -
Calendar view: 
- - - -
Time Format
- -
How is time expressed in your language? Including 0-24 hr expression, hour, minute and second.
- -
- -
Numerals 
- -
How are numerals and percentages expressed in your language? 
- -
    Example: 1.23 (decimal separator) or 1,000 (thousand separator) using comma or period. 
- -
- -
Currency 
- -
What are other widely used currency and symbols used in your country/language for paid apps. 
- -
- -
Units
- -
Do you use the imperial, metric or nautical system for measuring weight, distance, etc.? Source strings will use the imperial system (e.g., miles, pounds, feet, gallons, etc.). Target translations should convert imperial metrics to their measurement system.
- -
- -
Names  
- -
What are the order of family name and given name in your language?  Do people use multiple family names? What about patronymics? (The W3C has an introduction to this topic here.)
- -
- -
Address and Postal Code Format 
- -
What is the format in your language?  
- -
    Example: most Asian countries start from big to small: [Country] [postal code][state/province][city][district][street number and name][building and suite numbers][addressee]
- -
    Countries of European languages start from small to big: [addressee][street number and name][building and suite numbers][district][city][state/province][postal code][Country]
- -
   
- -
Telephone Number format
- -
Space separators between digits can be different for area codes such as State (Province) and City,
- -
- -

Spelling And Grammar Checks

- -
Many languages have national or international standards that define spelling and grammar rules. When defining these rules for your community, make reference to those standards wherever possible. Do you have automated tests for spell checking and grammar? List those tools and dictionaries here and how regularly they should be used.
- -
- -
Tense
- -
Do you have standards for verb forms that indicate or express the time, such as past, present, or future, of the action or state? What is your policy on tense consistency for certain use cases? For example, for phrases that ask a user to make an action (like "Download Firefox"), do you use a future tense, a command tense, or a neutral tense?  (See: https://en.wikipedia.org/wiki/Grammatical_tense )
- -
- -

Word Forms

- -
Pluralization  
- -
What is the appropriate form of expressing pluralization in your language?  List all forms of plural forms and examples if there is more than one.  Additional discussions can be found Here. https://developer.mozilla.org/en-US/docs/Mozilla/Localization/Localization_and_Plurals and here:  http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html
- -
- -
Abbreviations  
- -

How are abbreviations expressed in your language?
-     Example, in English, abbreviations are made by removing most vowels and only using the first 3-5 consonants followed by a period (e.g., abbreviation = abbr.).  (see: https://en.wikipedia.org/wiki/Abbreviation)    

- -

If your language does not have a standard way of expressing abbreviations, do you simply leave them in English?

- -
Acronyms 
- -
-

Are there standard translations of widely accepted acronyms such as CD, DVD, MB in your language? If not, do they remain in English? (see: https://en.wikipedia.org/wiki/Acronym )

-
- -
Punctuation
- -
Do you use different punctuation rules in your Firefox localization than what your language standard defines?
- -
    Example: do you use a period at the end of every user interface element translation or only some? What is the international/national standard for punctuation in your language?
- -
- -
Emphasis
- -

Is there an international/national standard for capitalization in your language?

- - - -
Hyphens and compounds 
- -
What is the appropriate way of using hyphens and compounds in your language?  ( https://en.wikipedia.org/wiki/Compound_%28linguistics%29
- -
- -
Prepositions and articles 
- -
What is the appropriate form of expressing prepositions and articles in your language?
- -
- -
Diacritics and Special characters  
- -
Does your language use any special or accented characters and will they be applied and preserved in sort orders, and other aspects of the translation?  (see: https://en.wikipedia.org/wiki/Diacritic )
- -
- -
Quotes  
- -
-

Does your language have a standard use for quotation marks, parenthesis, or brackets?

-
- -
Whitespace 
- -
-

Does your language require the use of white space around words, sentences, paragraphs, etc.? If so, in what ways?  (see: https://en.wikipedia.org/wiki/Sentence_spacing_in_language_and_style_guides )

-
- -
User Interface Elements        
- -
- - -
- -

General Mozilla l10n style

- -

Accuracy

- -

Meaning-based translation

- -
When it comes to translation, meaning is everything. A translator needs to understand the source text's meaning exactly. You then find its most closely linked equivalent in your own language, without adding or subtracting meaning in your translation. Finding meaning-based equivalents between languages can be difficult. To help concentrate your thoughts, ask yourself questions like:
- - - -

Sometimes translation memory and machine translation tools can offer bad suggestions for a translation. If you use either as part of your translation workflow, make sure to correct the suggestions before submitting them. Avoid literal translation at all costs. Watch out for words that might sound or look the same between English and your language, but have a different meaning.

- -

Should not be translated

- -
Shortcuts and accesskeys
- -

In Firefox and other software it's possible to use keyboard shortcuts to invoke a specific command. For example, to open a file in Firefox you can press the combination of keys CTRL+O (Cmd+O on Mac). The accelerator key depends on the operative system, but the letter itself is normally localizable. This is what is called a shortcut, or commandkey. For example, the Open File… menu item is stored as

- -
<!ENTITY openFileCmd.label "Open File…">
-<!ENTITY openFileCmd.accesskey "O">
-<!ENTITY openFileCmd.commandkey "o">
- -

The commandkey is stored in openFileCmd.commandkey (sometimes the string has .key in the identifier). Normally you should not localize this key, since shortcuts are often common across the entire operative system (e.g. CTRL+S to Save) or similar products (CTRL+T to open a new tab in most browsers). But it needs to be localized if the letter is not available in your keyboard layout. For example, in Italian the character [ can be accessed through ALT+è, a command key [ would not work.

- -

In the code fragment above you see also an accesskey defined for Open File…. Accesskeys are used to access a UI element from the keyboard. Example: if File menu has an accesskey F, and the Open file… menu has O, you can press ALT+F to access the menu, and then O to open a file.

- -

If the label is File, and the accesskey is F, it will be displayed as "File" on Windows and Linux, with an underscored F. If the accesskey was "O", so a character not available in the original label, it will be displayed underlined between parenthesis: "File (O)".

- -

One important thing to determine is if, for your locale, it makes sense to have localized accesskeys: for example, if most users will use a keyboard with a different layout (English), it might make sense to keep the English original accesskey instead of using a letter available in your localization.

- -

Accesskeys, like commandkeys, have their own lines within .dtd and .properties files and are usually identified by .accesskey in the string ID.

- -
Variables
- -

Variables should never be translated. You can recognize a variable within a string by its beginning with a specific character (e.g., $, #, %, etc.) followed by a combination of words without spacing. For example, $BrandShortName and %S are variables.  You can move a variable around within a string, if the translation of the string requires it.

- - - -

Brand names, as well as copyright and trademarks should never be translated, nor transliterated into a non-Latin based script. See the Mozilla branding guide for more details.

- -

Translating culture-specific references

- -

At times there will be English content included in Mozilla products or web projects (e.g., marketing campaigns) that makes references to American culture and concepts. When translating these, it is best to find an equivalent cultural reference within your own culture that accurately conveys the meaning of the English reference. For example, an American might say, "Good job, home run!" A home run is a baseball reference for a successful outcome. An appropriate translation would be an equivalent metaphor within your culture. Using soccer as an example, you might translate "Good job, home run!" into "Good job, nice goal!" in your language.

- -

[Add a note about Mozilla culture.]

- - - -

Mozilla projects will often contain legal content in the form of user agreements, privacy statements, etc. When reviewing the translation of legal content, Mozilla localizers should do so according to the criteria concerning accuracy, fluency, style, and terminology found within this style guide and according to Mozilla culture and values.

- -

Fluency

- -
- -
To produce a fluent translation, not only should the translation follow the language's standard grammar, punctuation, and spelling rules, but it should avoid being ambiguous, incoherent, or inconsistent, and unintelligible.
- -
- -
To avoid ambiguity, the translator must thoroughly understand the meaning behind the source text, including any references that text might include. For example, if the English source text uses the word, "it", the translator must know what "it" is to avoid an ambiguous translation. Clearly understanding the source text will also allow a translator to make the source text's logical connections in their own translation. This helps to keep the translation coherent.
- -
- -
Inconsistency can pop up in many forms. A translator must be consistent in their use of abbreviations, references, and links within each localization project. They must also be consistent with Mozilla and the localization communities' style guides and approved terminology. Abbreviations, like terminology, should come from either a standard reference (like a dictionary of abbreviations) or should follow your language's rules for creating abbreviations. Once used, the abbreviation must remain consistent every place that it is used in the translation. Cross-references (or links) must also be consistently used within a translation. If a text contains a hyperlink URL to a support article in English, the translation should also contain a hyperlink to a translation of that support article (if available) or the English version. Links should not redirect to other pages nor should they be broken and unusable.
- -
- -
Finally, there are times that a translation simply doesn't make sense. It's hard to put your finger on what exactly is wrong with it, but you know it is unintelligible and not fluent. While this is uncommon, it's important to report these unintelligible translations and offer suggestions to correct them.
diff --git a/files/es/mozilla/localization/l10n_style_guide/your_language/index.html b/files/es/mozilla/localization/l10n_style_guide/your_language/index.html deleted file mode 100644 index 29ee4fc4b7..0000000000 --- a/files/es/mozilla/localization/l10n_style_guide/your_language/index.html +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Contenido de Mozilla localizado en tu idioma -slug: Mozilla/Localization/L10n_Style_Guide/Your_Language -tags: - - Guía de estilo -translation_of: Mozilla/Localization/L10n_Style_Guide/Your_Language ---- -

{{draft}}

- -
-
        Abreviaturas
-
            ¿Cómo se expresan las abreviaturas en tu idioma?
-
        Numerales y métricas
-
¿Cómo se expresan los numerales y métricas en tu idioma?
-
        Porcentajes
-
            ¿Cómo se expresan los porcentajes en tu idioma?
-
        Grupos de dígitos
-
            ¿Cómo se expresan los grupos de dígitos en tu idioma?
-
        Acrónimos
-
            Los acrónimos sólo deberían traducirse si existe un término oficial equivalente en tu idioma.
-
        Género
-
            ¿Cómo expresa el género tu idioma?
-
        Tono/Registro
-
            ¿cuál es el tono apropiado para tus traducciones? ¿Cambia según el producto y la audiencia objetivo? Si así fuera, ¿qué tonos deberían evitarse?
-
        Pronombres
-
            ¿Cuál es la forma apropiada de expresar pronombres en tu idioma?
-
        Uso de mayúsculas
-
            ¿Cuál es el uso de mayúsculas apropiado en tu idioma?
-
        Guiones y palabras compuestas
-
            ¿Cuál es la forma apropiada de usar guiones y escribir palabras compuestas en tu idioma?
-
        Preposiciones y artículos
-
            ¿Cuál es la forma apropiada de expresar preposiciones y artículos en tu idioma?
-
        Puntuación
-
            ¿Cuál es la forma apropiada de expresar la puntuación en tu idioma?
-
        Pluralización
-
            ¿Cuál es la forma apropiada de expresar plurales en tu idioma?
-
        Voz
-
            ¿Cuál es la forma apropiada de expresar la voz en tu idioma?
-
-
diff --git a/files/es/mozilla/localization/localizing_with_pontoon/index.html b/files/es/mozilla/localization/localizing_with_pontoon/index.html deleted file mode 100644 index 3c0d6cb5b0..0000000000 --- a/files/es/mozilla/localization/localizing_with_pontoon/index.html +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Localizando con Pontoon -slug: Mozilla/Localization/Localizing_with_Pontoon -tags: - - Localization -translation_of: Mozilla/Localization/Localizing_with_Pontoon ---- -

Pontoon es una herramienta de localización (l10n) basada en la web, del tipo "lo que ves es lo que obtienes" usada para localizar contenido web. En Mozilla, usamos Pontoon para localizar los sitios web de Mozilla y la interfaz de aplicación de Firefox OS, conocida como Gaia. Pontoon es una herramienta muy simple e intuitiva que requiere muy poco o nada de habilidades técnicas para el proceso de localización. Aquí discutiremos cómo usar Pontoon para localizar proyectos, desde el primer inicio de sesión hasta finalizar tus contribuciones. En el camino, señalaremos algunas agradables funciones que te harán más eficiente y facilitarán tus contribuciones de localización.

- -
-

¿Eres un desarrollador? Lee sobre cómo implementar Pontoon en tu sitio web (en inglés) o aprende sobre cómo involucrarte en GitHub.

-
- -

Primeros pasos

- -

La página de inicio de Pontoon es muy fácil de usar. Para empezar a localizar el proyecto, haz clic en el ícono de Persona y conéctate. A continuación, simplemente selecciona el proyecto en el que deseas trabajar y tu localización en los menús desplegables. Pontoon abrirá automáticamente el proyecto de esa localización para que puedas comenzar. Nótese que para el propósito de este tutorial, usaremos el sitio web de Firefox Affiliates para demostrar la funcionalidad y forma de trabajo de Pontoon. Y ahí está, abierto dentro de Pontoon:

- -

Browser app and workspace

- -

Barra de herramientas principal

- -

Como puedes ver, la mayor parte de la interfaz es tomada por el sitio siendo traducido. Solo la barra de herramientas de la parte superior pertenece a Pontoon, conteniendo los siguientes elementos (de izquierda a derecha):

- -

Main toolbar

- -

List of strings

- -

Abre una barra lateral con una lista de todas las cadenas a localizar.

- -

Project selector (Affiliates)

- -

Cambia entre proyectos a localizar.

- -

Resource selector (Homepage)

- -

Cambia entre recursos del proyecto a localizar, como subpáginas o archivos de localización. Oculto si no hay recursos disponibles para el proyecto.

- -

- -
-
- -

Locale selector (Slovenian)

- -

Cambia entre lenguajes a localizar.

- -

Go

- -

Abre la selección de proyecto-recurso-localización realizara en los desplegables.

- -

Progress indicator

- -

Muestra tu progreso en el recurso siendo localizado. Más detalles están disponibles en el cuadro emergente.

- -
-
- -

User menu

- -

Permite tareas específicas del usuario, como subir al repositorio, descargar archivos y desconectarse.

- -

Info menu

- -

Entega información importante, como la línea de tiempo anticipada del proyecto y una lista de atajos del teclado.

- -

Estamos listos, ¿te parece que hagamos algunas traducciones?

- -
-
- -

Alright, how about we do some translating now?

- -
-
- -

Traducir cadenas

- -

Al usar Pontoon para localizar, tienes un par de opciones para traducir tus cadenas. Puedes traducir en contexto, fuera de contexto o usar una combinación de ambas. Empezaremos viendo la traducción en contexto.

- -

En contexto

- -

El modo de traducción en contexto de Pontoon es lo que le destaca sobre otros. Esto abre una página web (o app web) y permite la edición en tiempo real de esa página. Aquí tienes cómo traducir tu primera cadena:

- -

In-context localization

- -
    -
  1. Colócate sobre el texto que deseas traducir con tu ratón.
  2. -
  3. Un botón de edición aparece sobre ese texto. Apriétalo para activar el modo de traducción.
  4. -
  5. Reemplaza el texto original con su traducción a tu lenguaje.
  6. -
  7. Apreta el botón guardar para dejar grabada tu traducción.
  8. -
- -
-

Fuera de contexto

- -

Algunas cadenas son imposibles de traducir en contexto, como por ejemplo los contenidos de la etiqeuta <title> en sitios web y cadenas con ubicadores o diferentes formas plurales. Haciendo clic en el ícono de hamburguesa en la barra de herramientas principal, una lista de todas las cadenas y traducciones disponibles se abrirá en la barra lateral. También puedes usar la barra lateral para localización fuera de contexto:

- -

Out-of-context localization: list Out-of-context localization: translate

- -
    -
  1. Aprieta en la cadena que deseas traducir.
  2. -
  3. El panel de traducción con la cadena original y sus detalles (por ejemplo con comentarios) se abre.
  4. -
  5. Traduce la cadena en el área de traducción de abajo.
  6. -
  7. Aprieta el botón "Save" para guardar tu traducción.
  8. -
- -

Mientras traduces cadenas fuera de contexto, las traducciones también aparecerán en el sitio web, si es que también pueden ser traducidas en contexto.

- -

Ayudas para la traducción

- -

Como puedes ver, sugerencias del historial, la memoria de traducción, traducciones de máquina y de otras localizaciones están disponibles en el panel de traducción fuera de contexto. Les llamamos Ayudas para la traducción y aquí tienes cómo cada una de ellas te ayudarán mientras traduces cadenas:

-
- -

Translation helpers: History Translation helpers: Machinery Translation helpers: Other locales Translation helpers: Search

- -

History

- -

Muestra traducciones sugeridas previamente, incluyendo las de otros usuarios.

- -

Machinery

- -

Muestra coincidencias de varios servicios: memoria de traducción interna, Mozilla Transvision, memoria de traducción de código abierto, terminología de Microsoft y traducción por máquina.

- -

Other locales

- -

Muestra las traducciones coincidentes realizadas por otras localizaciones.

- - - -

Casi como la opción "Máquina", pero utiliza la palabra clave proveída como parámetro de entrada en lugar de la cadena original.

- -

Al hacer clic en una sugerencia, esta es copiada al área de traducción.

- -
-
- -

Publicando tu localización

- -

Supón que ahora deseas publicar tu trabajo de localización subiéndolo a un repositorio. ¡Pontoon también te permite hacer eso! De hecho, lo hace por tí sincronizando de forma automática con los repositorios a cada hora. ¡Ahora puedes darte una palmadita en la espalda, bailar un poco, ir a dormir o hacer algo más para celebrar tu trabajo!

diff --git a/files/es/mozilla/localization/notas_de_localizacion/index.html b/files/es/mozilla/localization/notas_de_localizacion/index.html deleted file mode 100644 index 3c5936a2b9..0000000000 --- a/files/es/mozilla/localization/notas_de_localizacion/index.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Notas de Localizacion -slug: Mozilla/Localization/Notas_de_Localizacion -tags: - - Guía - - Internacionalizacion - - Localización - - Mozilla -translation_of: Mozilla/Localization/Localization_notes ---- -

Localizadores usualmente funcionan en el archivo localizable sin el contexto los archivos de fuente incluyendo las cadenas localizadas; es importante anadir comentarios en los archivos localizados, tambien. Generalmente, estos comentarios se conocen como notas de localizacion. Existe un formato especifico para estas notas, el cual es descrito en este documento.

- -

Es importante seguir el formato lo mas parecido posible. Existen muchas herramientas automaticas que analizan estos comentarios para acceso facil y son usados por los localizadores.

- -

Archivos DTD

- -
<!-- NOTA DE LOCALIZACION (nombre de entidad): comentario -->
-
- -

Archivos de Propiedades

- -
# NOTA DE LOCALIZACION (llave): comentario
-
- -

Comentarios atraves del archivo deben usar el mismo formato, al principio del archivo (pero despues de la informacion de licencia) y simplemente inserte la referencia (nombre de entidad/llave) .

diff --git a/files/es/mozilla/localization/quick_start_guide/fase_qa/index.html b/files/es/mozilla/localization/quick_start_guide/fase_qa/index.html deleted file mode 100644 index 3475c95e53..0000000000 --- a/files/es/mozilla/localization/quick_start_guide/fase_qa/index.html +++ /dev/null @@ -1,209 +0,0 @@ ---- -title: Fase de PR -slug: Mozilla/Localization/Quick_start_guide/fase_QA -translation_of: Mozilla/Localization/Quick_start_guide/QA_phase ---- -

Después de todo ese duro esfuerzo de localización estamos seguros que no sólo deseas ver tu trabajo funcionando, sino que quieres asegurarte que sea exacto y fiel. Si no tienes mucha experiencia con código, podrías incluso estar preocupado de que no se haya roto algo (Uuuy!). Ahora te guiaremos a través de la realización de algunas pruebas de control de calidad en tu trabajo para que te asegures de ir por buen camino.

- -

Si estás localizando sitios web de Mozilla, tu trabajo se desplegará poco después de realizarlo sin necesidad de construir un paquete de idioma. Si ese fuera el caso, esta parte de la guía podría no ser completamente aplicable para tí. De cualquier forma, siéntete libre de saltar a la siguiente sección dando click en el vínculo "Siguiente", ubicado en la parte inferior de la página.

- -

Para ver tu trabajo en Firefox (u otra aplicación de Mozilla), necesitarás tener un paquete de idioma construído para instalarlo en tu 'instancia' local.

- -

Construcción manual y automatizada

- -

Con sólo dar click en un botón, algunas herramientas de L10n (como Narro y Koala) automáticamente crearán paquetes de idiomas para tí. Si estás usando una de estas herramientas, no dudes en saltarte a la sección Probar tu L10n y ver tu trabajo. Si no estás usando una de esas herramientas, déjanos guiarte a través de la construcción manual de tu propio paquete de idioma.

- -
Nota: ¿Recuerdas todos esos requisitos previos de las herramientas que te preguntamos, y que eran necesarios para realizar la instalción en la configuración inicial?  Pues bien, los necesitararemos casi todos ellos. Si aún no los has instalado, este es el momento de hacerlo.
- -

Instrucciones preliminares

- -

Vamos a usar los siguientes directorios de archivo para este ejemplo:

- -
    Tu directorio de trabajo (root)/mozilla-aurora (fuente de en-US, tomado de http://hg.mozilla.org/releases/mozilla-aurora)/
-    l10n-central (directorio de archivos de L10n, uno por cada L10n; a menudo denominado "l10n base")/
-    tu-codigo-de-idioma (un directorio con tus archivos de L10n, en este ejemplo usaremos prueba-x)
-
-    Ejemplo: root/mozilla-aurora y root/l10n-central/prueba-x
-
- -

Además, necesitarás copiar y traducir el archivo toolkit/defines.inc directamente de en-US, antes de que puedas construir. Esto se debe a un fallo en la lógica de construcción.

- -

Por favor sigue la estructura de arriba de cerca o ajusta los comandos siguientes de acuerdo con tu instalación personalizada.

- -

Para copiar este archivo en el directorio apropiado, haz lo siguiente:

- -
    -
  1. Ve al directorio de trabajo desde tu terminal de linea de comandos (es decir, donde creaste la estructura de carpetas descrita anteriormente).
  2. -
  3. Ingresa los siguientes comandos:
  4. -
- -
mkdir -p l10n-central/prueba-x/toolkit/
-
-cp mozilla-aurora/toolkit/locales/en-US/defines.inc l10n-central/prueba-x/toolkit/defines.inc
-
- -

Tarán! Copiados!

- -

Para finalizar, necesitarás un archivo llamado .mozconfig para proceder con el manual de construcción. Este archivo contiene las instrucciones de construcción necesarias.

- -

Para crear y configurar este archivo, sigue estas insctrucciones:

- -
-

Hasta antes de la corrección del fallo 1063880 en mozilla-aurora y mozilla-beta, al construir los paquetes de idioma en contra de estos dos árboles, usted debía:

- -
    -
  1. -

    retirar  ac_add_options --disable-compile-environment  de .mozconfig en el paso 3

    -
  2. -
  3. -

    usar ./mach build config  después del paso 4

    -
  4. -
-
- -
    -
  1. Actualiza el código de fuente de Mozilla:
  2. -
- -

$ cd mozilla-aurora
- $ hg pull -u

- -
    -
  1. Inserta el siguiente comando para crear el archivo  .mozconfig : $ nano -w .mozconfig
  2. -
  3. Inserta las siguientes líneas en tu archivo .mozconfig :
  4. -
- -
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../firefox-build
-ac_add_options --disable-compile-environment
-ac_add_options --with-l10n-base=../l10n-central # path relative to MOZ_OBJDIR
-ac_add_options --enable-application=[browser or mail]
-
- -

Necesitarás especificar qué aplicación estás localizando en la cuarta línea (por ej. para Firefox sería browser, Thunderbird debería ser mail, etc).

- -
    -
  1. Inserta el siguiente comando para realizar la configuración: $ ./mach configure
  2. -
  3. Una vez tu línea de comandos finalice devolviendo la salida del 'comando de configuración', ve al directorio recientemente creado: $ cd ../firefox-build/browser/locales
  4. -
- -

Ahora estás listo para construir! En este punto puedes seleccionar entre dos opciones de construcción:

- - - -

Visita los enlaces de arriba para aprender cómo hacer estas pruebas de construcción.

- -

Probar tu L10n y observar tu trabajo

- -

Ahora que tienes tu paquete-de-idioma o L10n re-empaquetada, vamos a hablar de cómo ver tu trabajo y probarlo en tu aplicación.

- -

Al probar el paquete-de-idioma estarás un paso más cerca de tener tu L10n añadida a los lanzamientos oficiales. Sigue los pasos siguientes para probar tu localización

- -
    -
  1. Instala Aurora en tu lenguaje preferido.
  2. -
  3. Instala el paquete-de-idioma .xpi que acabas de crear (o exportar)
  4. -
  5. Selecciona tu lenguaje usando el Interruptor de Localización Rápida o la add-ons del Interruptor de Localización, yendo a Herramientas->Lenguaje->Tu código de localización del lenguaje.
  6. -
  7. Reinicia el navegador y comienza tus pruebas.
  8. -
- -

En este punto deberías estar en la capacidad de ver todo tu trabajo funcionando. Da click aquí para consultar las guías de cómo realizar pruebas para tu localización.

- -

¡No pierdas tu trabajo!

- -

¡Tu trabajo es MUY importante! Realmente odiaríamos ver que perdieras algo de él. Después de probar tu localización, debes enviarlo a un repositorio remoto, que servirá como una copia de seguridad de tu trabajo y permitirá a otros seguir tu progreso.  which will serve as a backup for your work and will let others follow your progress. Vamos a ir por el proceso más abajo.

- -

Los equipos oficiales de localización usan repositorios que se encuentran en hg.mozilla.org. Antes que un equipo se vuelva oficial, nos gusta hacer que los localizadores se sientan cómodos con los comangos Hg que permiten realizar el trabajo de cloning, pulling, committing, y pushing hacia un repositorio experimental.  Usamos un servicio web llamado Bit Bucket para empezar el proceso de aprendizaje.

- -
Nota: Debes tener Mercurial configurado antes de que comiences. Ese paso se encuentra en la página de instalación inicial. Si no la has completado aún, no te preocupes, ¡te experaremos!
- -

Haciendo push a tu repositorio

- -

Hay un par de cosas que debes tomar en cuenta antes de hacer push a tu repositorio:

- - - -

Las siguientes instrucciones te ayudarán a aprender cómo usar tu repositorio Hg.

- -
    -
  1. Después de que tu repositorio sea creado por los drivers l10n, por favor visita la URL para tu repositorio. We'll use x-testing here for our example. You can do this by entering the following URL into your browser: http://hg.mozilla.org/l10n-central/x-testing
  2. -
  3. Now, navigate to your locale's directory on your local machine.
  4. -
- -

If you're using Koala, this should be located at /path/to/your/koala.project/locale/3.6/x-testing, otherwise, it should be located at /path/to/your/working_dir/l10n_base/x-testing.

- -

In this directory, you should have an hg repository. You might have created it yourself by running hg init or hg clone or you might have had it created by Koala when you were setting up a new localization project. Also at this point, you shouldn't have any uncommitted changes (i.e., running the hg status command should show nothing). Let's see what the last revision in this repository is.

- -
    -
  1. Enter the following command: $ hg log -l 1
  2. -
- -

You should see an output similar to the one below:

- -
changeset:   0:7c543e8f3a6a
-tag:         tip
-user:        Your Name <email@example.com>
-date:        Mon Nov 23 18:08:25 2009 +0100
-summary:     Added search bar strings
-
- -
    -
  1. Now compare the local repository on your machine with the remote Hg repository by entering this command: $ hg outgoing http://hg.mozilla.org/l10n-central/x-testing
  2. -
- -

The hg outgoing command compares the two repositories and lists all changesets that are present locally, but not in the remote repository. These changesets will need to be "pushed" to the remote repository. You can expect to see output like this:

- -
comparing with http://hg.mozilla.org/l10n-central/x-testing
-searching for changes
-
-changeset:   0:7c543e8f3a6a
-tag:         tip
-user:        Your Name <email@example.com>
-date:        Mon Nov 23 18:08:25 2009 +0100
-summary:     Added search bar strings
-
- -
    -
  1. Let's now push this changeset. Enter the following command: hg push http://hg.mozilla.org/l10n-central/x-testing
  2. -
  3. Mercurial will connect to your repo and ask you to provide your account information (i.e., the username and the password).
  4. -
- -
real URL is http://hg.mozilla.org/l10n-central/x-testing
-pushing to http://hg.mozilla.org/l10n-central/x-testing
-searching for changes
-http authorization required
-realm: hg.mozilla.org HTTP
-user: your_id
-password:
-
- -

After you enter your account information, the changeset will be pushed.

- -
adding changesets
-adding manifests
-adding file changes
-added 1 changesets with 2 changes to 2 files
-bb/acl: your_id is allowed. accepted payload.
-quota: 979.7 KB in use, 150.0 MB available (0.64% used)
-
- -

Your changeset has been successfully pushed to your repository!

- -

As you begin to move through your translations, you should commit the changes locally and push your work to this experimental repository. For instance, if you have finished translating all the .dtd and .properties files in your x-testing/browser/chrome/browser/ directory, then you should run these commands:

- -
$ hg status
-$ hg commit -m "Translated browser/chrome/browser/"
-$ hg outgoing
-$ hg push http://hg.mozilla.org/l10n-central/x-testing
- -

Note that due to the distributed nature of Hg, hg commit saves the changes locally (i.e., in your computer's Hg repository). You can see the history of commits with hg log. After doing hg commit, you still need to send the changes to the remote repository. This is where hg push comes in. This sends your commits to the remote repository.

- -

Now you're ready to proceed to the release phase!

- -

 

- -

{{ PreviousNext("Localization_Quick_Start_Guide/Translation_phase", "Localization_Quick_Start_Guide/Release_phase") }}

diff --git a/files/es/mozilla/localization/quick_start_guide/index.html b/files/es/mozilla/localization/quick_start_guide/index.html deleted file mode 100644 index d437983005..0000000000 --- a/files/es/mozilla/localization/quick_start_guide/index.html +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Guía de inicio rápido a la Localización -slug: Mozilla/Localization/Quick_start_guide -tags: - - Localización -translation_of: Mozilla/Localization/Quick_start_guide ---- -

Bienvenido a la Localización de Mozilla (abreviado l10n)!

- -

Ya sea que estés aquí para poner en marcha tu propia Localización en el proyecto Mozilla o para unirte al proyecto de una Localización existente, has venido al lugar correcto. Esta guía está repleta con toda la información básica y técnica que necesitas para poder comprometerte con el programa Mozilla l10n. Te llevaremos a través una serie de pasos para introducirte, desde la organización del entorno inicial hasta incluso probar y lanzar tu propia localización. A lo largo de esta guía, conocerás los temas referidos a la variedad de proyectos en los que puedas contribuir y a las herramientas que necesitas para poder localizarlos.

- -

Cuando lleguemos a ejemplos específicos, los llevaremos del proyecto Firefox, ya que es el proyecto localizado más amplio dentro de Mozilla. Mientras más te acerques al final de esta guía, más apto estarás para poder cambiar Firefox en tu entorno local y después ver esos cambios en la interface del mismo. Por último, cuando termines esta guía, tendrás las herramientas necesarias para empezar a contribuir al proyecto.

- -

Recuerda que esta guía solo te enseñará los aspectos técnicos de Mozilla l10n. Visita la página L10n Process para conocer todo el proceso.

- -
-

 

- -

Organización inicial

-Trabajo de preparación técnica antes de localizar.
- -
-

 

- -

Fase de traducción

-Tutorial de herramientas l10n para la traducción
- -
-

 

- -

Fase QA

- -

Tutoriales para comprobar l10n.

-
- -
-

 

- -

Etapa de lanzamiento

- -

Pasos para enviar tu trabajo de localización

-
- -
-

 

- -


- Estas cuatro etapas constituyen el lado técnico del programa l10n. Para conocer más sobre alguna de estas, haga clic en cualquiera de los links de arriba. Antes de llegar al cuadro grande (Etapa de lanzamiento), sugerimos que empiece por la fase verde (Organización inicial) y de ahí hacia su derecha.

- -

 

-
- -

Nota: Esta guía está escrita para dos clases de colaboradores: Aquellos que se incorporan en una nueva localización y aquellos que comparten una localización existente. Es importante conocer qué información aplica a cada tipo de colaborador. Para ayudarte a conocer cuál es la información más relevante, presta atención al color de las fuentes utilizadas en el texto. Toda la información proveniente de aquellos que empiezan una nueva localización tendrá como fuente de letra el color naranja, y toda la información proveniente de aquellos que se incorporan con una localización existente tendrá como fuente de letra el color azul.

- -

{{ Next("Localization_Quick_Start_Guide/Initial_setup") }}

diff --git a/files/es/mozilla/localization/quick_start_guide/initial_setup/index.html b/files/es/mozilla/localization/quick_start_guide/initial_setup/index.html deleted file mode 100644 index 3f8a4874a7..0000000000 --- a/files/es/mozilla/localization/quick_start_guide/initial_setup/index.html +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: Configuración inicial -slug: Mozilla/Localization/Quick_start_guide/Initial_setup -tags: - - Localización -translation_of: Mozilla/Localization/Quick_start_guide/Initial_setup ---- -

Como pre-requisito para contribuir al programa de L10n, necesitas tener acceso a códigos, herramientas y un entorno local apropiadamente configurado (es decir, tu computadora personal). También necesitas determinar si ya existe en tu zona otro proyecto de localización. Aquí abordaremos temas relacionados con las cuentas necesarias, así como las herramientas y las respectivas configuraciones que necesitas montar antes de contribuir.

- -

Nuevo o existente

- -

Antes que nada, necesitas saber si crearás una nueva localización o si te unirás a una existente. Esto determinará qué información es más relevante para ti a lo largo de esta guía.

- -

Esto es lo que tendrás que hacer:

- -

Revisa el siguiente enlace para ver si ya existe una localización en tu zona: Directorio de la comunidad de localizacion.

- -

   a.    Si la comunidad ya existe, contáctalos y pregúntales cómo puedes ayudar.

- -

   b.   Si la comunidad no existe, envía un correo-e al new-locales newsgroup para recibir información adicional.

- -

Cuentas

- -

Hay un puñado de cuentas que necesitas tener en mente mientras empiezas. Estas no son necesarias para empezar a contribuir, pero las necesitarás cuando te estés preparando para producir un lanzamiento oficial. Por ahora, solamente ten en cuenta que estas serán importantes cuando tus esfuerzos progresen. Estas cuentas almacenarán tus códigos, contribuciones y te ayudarán a producir una localización oficial.

- -

Hg (Mercurial)

- -

Mercurial es el entorno de control de revisión que aloja el principal código fuente de Mozilla, así como el código localizado para cada localización oficial de Mozilla. Necesitarás esto para localizar las aplicaciones de Mozilla. El acceso de confirmación a Hg no es necesario para empezar a localizar. Después de tener un poco de experiencia con Hg, es posible que quieras tener el acceso de confirmación. En ese punto, tienes que visitar la página Mozilla Commiter y seguir el proceso descrito allí. Aquí hay un ejemplo de fallo que ilustra bien el proceso. Usa esta plantilla de fallo cuando se presente un fallo de registro en tu cuenta de Hg. Envía a new locales newsgroup una solicitud sobre crear tu repositorio de la zona.

- -

SVN

- -

SVN es un entorno de control de revisión que Mozilla utiliza para alojar las páginas web de la fuente de Mozilla y sus ubicaciones para cada localización oficial de Mozilla. Observa esta página wiki referida a cómo tener acceso a la SVN. La guía de localizadores para SVN, te ayudará a aprender los comandos de SVN más importantes para l10n. Envía a new locales newsgroup una solicitud sobre crear tu repositorio de la zona.

- -

Herramientas l10n basadas en la web

- -

 Hablaremos sobre esto más adelante. Por ahora, solo ten en cuenta que si decides usarlos, tal vez necesites crearte una cuenta personal.

- -

Mozilla LDAP

- -

Una vez que estés preparado para tener tu localización registrada en los repositorios principales de Mozilla, necesitarás una cuenta Mozilla LDAP. Envía a new locales newsgroup una solicitud sobre crear tu cuenta LDAP.

- -

Componente Bugzilla de una zona especifica
- Tener un componente Bugzilla específico para tu zona nos ayudará a seguir tu progreso en la localización desde los primeros pasos hasta su lanzamiento oficial. Además, nos notificará cuando estés teniendo problemas únicos de tus trabajos de equipo de localización. Envía a new locales newsgroup una solicitud sobre crear tu componente Bugzilla de la zona.

- -

Herramientas de entorno local

- -

Al igual que las cuentas, hay algunas herramientas de entorno que deberías instalar en tu computadora. Estas herramientas te ayudarán a almacenar tus contribuciones, aplicaciones de Mozilla, paquetes de lenguaje y a probar tu trabajo.

- -

Hg (Mercurial)

- -

Como notaste arriba, nosotros usamos Mercurial para mantener el código fuente de Mozilla y el código localizado. No solo necesitarás un repositorio de localización para almacenar tus localizaciones, sino también que lo tendrás que tener instalado y configurado en tu computadora. Puedes encontrar todo lo que necesites saber sobre instalar y configurar Mercurial para tu localización Aquí.

- -

compare-locales

- -

compare-locales es un script de Python que te ayuda a probar tu trabajo sin necesidad de ejecutar Firefox u otra aplicación. Las instrucciones de instalación se encuentran Aquí.

- -

L10n checks

- -

L10n checks es otro script de Python que te ayuda a probar tu trabajo sin necesidad de ejecutar una aplicación. Las instrucciones de instalación las puedes encontrar Aquí.

- -

           autoconf 2.13 

- -

autoconf es una utilidad fundamental para crear aplicaciones de Mozilla y paquetes de lenguaje. Para estos, usamos la versión 2.13 o una mayor. Puedes encontrar los archivos fuente y las instrucciones de instalación Aquí.

- -

wget

- -

wget es una utilidad de línea de comando que te permite recuperar archives usando protocolos de internet. Nosotros lo usamos para recuperar los datos de los repositorios. Puedes encontrar los archives fuente e instrucciones de instalación Aquí.

- -

Perl

- -

Perl es un lenguaje de programación que te ayudará a crear paquetes de lenguaje y aplicaciones de Mozilla. Puedes encontrar los archivos fuente y las instrucciones de instalación Aquí.

- -

Python

- -

Python es un lenguaje de programación en el cual muchos de nuestros script de pruebas l10n son escritos. Puedes encontrar los archivos fuente y las instrucciones de instalación Aquí.

- -

Locale Switcher o Quick Locale Switcher

- -

Ambos, tanto Locale Switcher como Quick Locale Switcher son add-ons para las aplicaciones de Mozilla. Cada uno es necesario para permitirte a ti ver tu trabajo dentro de la aplicación de Mozilla. Puedes instalar estos add-ons buscándolos en el administrador de add-ons de Firefox o siguiendo estos links: Locale Switcher, Quick Locale Switcher.

- -

Un sólido editor de texto basado en unicode

- -

Aquí hay algunas sugerencias:

- -

·         Windows: Notepad++ o Notepad2

- -

·         GNU/Linux: vimgedit o Kate

- -

·         Mac OS X: TextWrangler                                                          

- -

            GNU make

- -

Make es una herramienta que controla la generación de ejecutables. Puedes encontrar la versión 3.79.1 o una mayor aquí. Desafortunadamente, otras variedades de Make no lo harán.

- -

Fin de la organización inicial

- -

Ahora que has finalizado tu organización inicial, es momento de la mejor parte: ¡Traducir!

- -

{{ PreviousNext("Localization_Quick_Start_Guide", "Localization_Quick_Start_Guide/Translation_phase") }}

diff --git a/files/es/mozilla/localization/web_localizability/creating_localizable_web_content/index.html b/files/es/mozilla/localization/web_localizability/creating_localizable_web_content/index.html deleted file mode 100644 index 0b0c7402a8..0000000000 --- a/files/es/mozilla/localization/web_localizability/creating_localizable_web_content/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: Creating localizable web content -slug: Mozilla/Localization/Web_Localizability/Creating_localizable_web_content -tags: - - Desarrollo web - - Internacionalizacón - - Localizabilidad - - Localización -translation_of: Mozilla/Localization/Web_Localizability/Creating_localizable_web_content ---- -

Contenido del texto

- - - -

Customizaciones por local

- - - -

Imágenes

- - diff --git a/files/es/mozilla/marketplace/apis/index.html b/files/es/mozilla/marketplace/apis/index.html deleted file mode 100644 index 4736fa334f..0000000000 --- a/files/es/mozilla/marketplace/apis/index.html +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Bibliotecas de utilidad y APIs -slug: Mozilla/Marketplace/APIs -tags: - - Apps - - Firefox OS - - Guía - - Marketplace - - Principiante -translation_of: Archive/Mozilla/Marketplace/APIs ---- -
-

Cuando se trata de la codificación de funcionalidad para Firefox Marketplace en tus aplicaciones y páginas web, tendrás que usar las bibliotecas de utilidad del Marketplace, APIs de la web y APIs del Marketplace. Esta página presenta estas dos opciones, describe cuando las puedes usar y ofrece enlaces para obtener más información acerca de ellas.

-
- -

Bibliotecas de utilidad del Marketplace

- -

Las bibliotecas de utilidad del Marketplace están diseñadas para facilitar tus necesidades diarias de codificación protegiéndote de las complejidades de la APIs de la web y el Marketplace. Actualmente solo existe una biblioteca, pero otras estarán disponibles a medida que las propiedades del Marketplace se expandan.

- - - -

APIs de la web

- -

Tus aplicaciones del Marketplace necesitarán usar APIs de la web para ciertas funciones:

- - - -

APIs del Marketplace

- -

Para los requisitos más comunes de codificación de aplicaciones no deberías necesitar de las APIs del Marketplace. Algunas actividades, como crear tu propia tienda, si necesitan de su uso; pero donde tus requerimientos sean soportados, una biblioteca de utilidad del Marketplace probablemente sea mejor opción.

- -

La documentación para las APIs del Marketplace se encuentra en readthedocs.org aquí. Si necesitas de información mas detalla sobre estas APIs, por favor únete a la lista de correos de dev-marketplace

- -
-

La documentación de las APIs del Marketplace es usada para identificar las APIs del Marketplace que están en desarrollo. Por lo tanto, puede que incluya detalles de APIs que no están disponibles para el Marketplace público.

-
- -

 

diff --git a/files/es/mozilla/marketplace/faq/index.html b/files/es/mozilla/marketplace/faq/index.html deleted file mode 100644 index fa4c4a91cc..0000000000 --- a/files/es/mozilla/marketplace/faq/index.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Preguntas frecuentes del Marketplace de Firefox OS -slug: Mozilla/Marketplace/FAQ -translation_of: Archive/Mozilla/Marketplace/FAQ ---- -
-
- ¿Cómo puedo enviar una nueva aplicación?
-
- Ver Enviar una aplicación.
- -
- ¿Cuál es el proceso de aprobación?
-
- Para el Developer Preview, todas las aplicaciones con un manifiesto válido son aprobadas automáticamente.
-
- ¿Necesitan mis aplicaciones cumplir con una política de contenido?
-
- Las restricciones de conenido primarias del Marketplace de Firefox OS están para prevenir la actividad maliciosa o ilegal. La política será similar a la política de contenido para complementos de Firefox. Las políticas serán finalizadas antes de llegar al lanzamiento de la beta del Marketplace.
-
- ¿Cómo venderá mi aplicación el Marketplace de Firefox OS?
-
-
- Nota: Las aplicaciones pagas y los pagos dentro de las aplicaciones están actualmente deshabilitados en el Marketplace de Firefox OS (agosto de). Se espera que estén disponibles nuevamente en un futuro cercano.
-
-
- ¿Quién aloja la aplicación?
-
- Usted aloja todos los archivos de su aplicación en su propio servidor. Cuando envía una aplicación al Marketplace de Firefox OS, usted provee la URL del archivo de manifiesto de su aplicación, que el Marketplace lee y verifica. Puede subir íconos, capturas de pantalla, etc. para promover la aplicación en el Marketplace de Firefox OS.
-
diff --git a/files/es/mozilla/marketplace/index.html b/files/es/mozilla/marketplace/index.html deleted file mode 100644 index 1bb3d078b0..0000000000 --- a/files/es/mozilla/marketplace/index.html +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: Firefox Marketplace -slug: Mozilla/Marketplace -tags: - - Apps - - B2G - - Firefox OS - - Marketplace - - Mobile - - NeedsTranslation - - TopicStub -translation_of: Archive/Mozilla/Marketplace ---- -
-

El Firefox Marketplace es una tienda online, abierta y no-propietaria para aplicaciones web. En esta zona encontrarás toda la información necesaria para crear y publicar aplicaciones web en el Firefox Marketplace. Encuentra información acerca de cómo hacer aplicaciones exitosas, opciones de entrega, monetización, publicación y actualización de aplicaciones, y las librerías y APIs necesarias para aprovechar todas las características del Marketplace.

-
- -
-

Mozilla está trayendo sus valores fundamentalesla apertura, la libertad, la elección del usuario — al mundo de las apps.

- -

Usando tecnología estándar web, lenguajes y herramientas del Firefox Marketplace puedes publicar Open Web Apps (Aplicaciones de Web Abierta), de manera gratuita o de pago. Estas aplicaciones pueden ser empaquetadas, ejecutadas dentro de Firefox, o almacenadas en tu propio servidor web. Las aplicaciones publicadas están disponibles para los usuarios de Firefox en computadoras, dispositivos Android y teléfonos con sistema operativo Firefox donde sea que estén en el globo. Los usuarios descubren tus aplicaciones con facilidad en el Marketplace de Firefox usando la sección de aplicaciones destacadas, las diferentes categorías de aplicaciones y un poderoso motor de búsqueda. Los usuarios pueden acceder de manera instantánea a aplicaciones gratis, o comprar aplicaciones de pago mediante tarjeta de crédito o facturación por operadora.

-
- -
-
-

Publicación de tu app

- -
-
Publicando en el Firefox Marketplace
-
-
-
Documentos particulares para publicar una aplicación en el Firefox Marketplace.
-
-
-
Opciones de publicación de tu app
-
Una vez que hayas construido una Open Web App (Aplicación Web Abierta), hay difererentes opciones disponibles para publicar y que tu app salga al mundo. En este artículo se explica lo que está disponible.
-
Temas generales para la publicación de Aplicaciones
-
-

Información general y tips útiles para la publicación de aplicaciones de web abierta.

-
-
APIs del Firefox Marketplace
-
Enlace a la principal referencia de guías que cubren las APIs del Firefox Marketplace, las cuales puedes usar para configurar los métodos de pago de una aplicación, automatizar la presentación de aplicaciones, y mucho más.
-
-
- -
-

Monetización

- -
-
Haciendo dinero con tu app
-
Has trabajado muy duro haciendo funcionar el código de tu última app pero, ¿cómo puedes obtener algo a cambio cuando la publicas?. Esta sección avanza a través de toda la información que necesitarás para implementar los pagos en tu aplicación, ya sean pagos en el Marketplace o dentro de tu aplicación.
-
- -

Herramientas para desarrolladores de apps

- - - -

Creando tu propia tienda

- -
-
Creando una tienda
-
No es necesario que utilices el Marketplace de Firefox para lanzar o distribuir tu aplicación.
-
-
-
- - - -
    -
  1. Presentación y revisión de la aplicación - -
      -
    1. Enviar una aplicación al Firefox Marketplace
    2. -
    3. Obtener una clasificación para tu aplicación
    4. -
    5. Criterios de revisión de Marketplace
    6. -
    7. Captura de pantalla para la revisión de la aplicación en Marketplace
    8. -
    9. Política de privacidad
    10. -
    11. Pruebas de aplicación y resolución de problemas
    12. -
    -
  2. -
  3. Publicación de aplicaciones -
      -
    1. Opciones para la publicación
    2. -
    3. Aplicaciones empaquetadas
    4. -
    5. Actualización de aplicaciones
    6. -
    7. Aplicaciones Web Abiertas para Android
    8. -
    9. Aplicaciones Web Abiertas para Escritorio
    10. -
    11. Añadiendo un subdominio para la aplicación
    12. -
    13. Creación de una tienda
    14. -
    -
  4. -
  5. Monetización -
      -
    1. Sacando beneficio de tu aplicación
    2. -
    3. Guía de pagos de aplicaciones
    4. -
    5. Pagos en aplicación
    6. -
    7. Validando un recibo
    8. -
    9. Lista de precios de aplicación
    10. -
    11. Estado del pago
    12. -
    -
  6. -
  7. APIs del Marketplace -
      -
    1. Biblioteca de utilidades del Marketplace
    2. -
    3. API de presentación
    4. -
    5. API de pago
    6. -
    7. API del Marketplace
    8. -
    -
  8. -
  9. Preguntas frecuentes del Firefox Marketplace
  10. -
diff --git a/files/es/mozilla/marketplace/marketplace_apis/index.html b/files/es/mozilla/marketplace/marketplace_apis/index.html deleted file mode 100644 index fc8b78e53e..0000000000 --- a/files/es/mozilla/marketplace/marketplace_apis/index.html +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Firefox Marketplace APIs -slug: Mozilla/Marketplace/Marketplace_APIs -translation_of: Archive/Mozilla/Marketplace/Marketplace_APIs ---- -

Enlaces a las principales referencias que cubren las APIs de Marketplace de Mozilla Firefox, con las cuales usted puede manejar presentaciones de apps, configurar una cuenta de pago para una app, y más.

- -
-
Biblioteca de utilidades del Marketplace
-
Para ayudarle a trabajar con el Marketplace Firefox, proporcionamos una biblioteca JavaScript que usted puede usar en sus apps para hacer más fácil el manejo de pagos dentro de la aplicación y verficar la recepción de pagos.
-
API de Presentación
-
La API de Presentación le permite validar su app, actualizar su app, y dar información acerca de las apps que están disponibles para ser instaladas.
-
API de Pago
-
La API de Pago le permite hacer cosas tales como obtener información acerca de compras dentro de la aplicación y obtener información acerca de los níveles de precios de varios países.
-
Otras APIs de Marketplace
-
La documentación completa para las APIs de Marketplace de Firefox.
-
- -
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/es/mozilla/marketplace/monetization/estatus_de_pagos/index.html b/files/es/mozilla/marketplace/monetization/estatus_de_pagos/index.html deleted file mode 100644 index b9e56c49e1..0000000000 --- a/files/es/mozilla/marketplace/monetization/estatus_de_pagos/index.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Estatus de pagos -slug: Mozilla/Marketplace/Monetization/Estatus_de_pagos -tags: - - Pagos Web -translation_of: Archive/Marketplace/Monetization/App_pricing ---- -
-

Los pagos del Firefox Marketplace son procesados país por país según una base, con diferentes precios y metodos de pagos disponibles en cada país. Este artículo detalla qué países están apoyados por los pagos del mercado, y proporciona vínculos a información más específica sobre cada país.

-
-
-

Nota: Una lista de los puntos de precio se documenta en nuestra página de precios de App y esta disponible en la API.

-
-

Soporte de pagos por país

-

Estos son los paises que el Marketplace soporta para hacer pagos. Estamos trabajando en agregar soporte para mas paises todo el tiempo. Para una lista de los paises soportados, por favor ve la página de precios de App.

-

App payouts

-

Mira las páginas siguients para mas detalles sobre el pago según tu país. Ten en cuenta, si bien tomamos en cuenta la moneda local de facturación, los pagos de tarjeta de credito solo pueden ser manejados en libras esterlinas, dólares estadounidences y euros.

- -

Más información sobre tasas

-

Para obtener más información sobre tasas, ve al Firefox Marketplace y ve la pagina de tu app. Clikea en Compatibilidad y Pagos, luego Añadir manejar o ver transacciones de su cuenta de pago. A continuación haz click en el link Ver transacciones, como se muestra a continuación.

-

Transactions link

diff --git a/files/es/mozilla/marketplace/monetization/index.html b/files/es/mozilla/marketplace/monetization/index.html deleted file mode 100644 index 47dd53a78b..0000000000 --- a/files/es/mozilla/marketplace/monetization/index.html +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Monetización -slug: Mozilla/Marketplace/Monetization -tags: - - Apps - - Marketplace -translation_of: Archive/Marketplace/Monetization ---- -
-

Has trabajado duro programando tu ultima app, pero, ¿cómo puedes obtener algo de vuelta cuando la publiques? Esta sección muestra toda la informacion que necesitas para implementar los pagos de aplicaciones, si se trata de pagos del Marketplace o de pagos dentro de la aplicacion.

-
-
-
-
-
- Beneficiate de tu app
-
- Esta guía detallada contiene discusiones introductorias acerca de como monetizar tus apps, incluyendo apps de pago, precios y manejo de pagos.
-
- Guía de pagos de aplicaciones
-
- Este articulo cubre los tecnicismos de las apps de pago.
-
- Pagos dentro de las apps
-
- Una guía detallada de como implementar soporte para pagos dentro de las apps en tu Web app.
-
- Validar un recibo
-
- Una guía de cuando (y como) validar el recibo de compra de tu app, sí quieres implementar la validación tu mismo, o usar una libreria preexistente.
-
- Lista de precios de aplicaciones
-
- Una serie de puntos de precios fijos que puedes escoger para tus apps de pago y como estos varian a traves de diferentes monedas, junto con informacion útil de apoyo acerca de como ocuparse de los pagos de las apps.
-
- Estado de los pagos
-
- Un resumen rápido de que paises tienen nuestos servicios de pagos de apps configurados (básicamente, donde pueden ser distribuidas las apps de pago).
-
-
-
-
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/es/mozilla/marketplace/monetization/introduccion_monetizacion/index.html b/files/es/mozilla/marketplace/monetization/introduccion_monetizacion/index.html deleted file mode 100644 index e8a4733c9c..0000000000 --- a/files/es/mozilla/marketplace/monetization/introduccion_monetizacion/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Introducción — Monetizacion -slug: Mozilla/Marketplace/Monetization/Introduccion_Monetizacion -tags: - - Apps - - Firefox OS - - Marketplace - - Principiantes - - introducción -translation_of: Archive/Marketplace/Monetization/Introduction_Monetization ---- -
-

Has trabajado duro programando tu última app, pero, ¿cómo puedes obtener algo de vuelta cuando la publiques? Esta sección muestra toda la informacion que necesitas para implementar los pagos de aplicaciones, sí se trata de pagos del Marketplace o de pagos dentro de la aplicacion.

-
-
-
-
-
- Beneficiate de tu app
-
- Esta guía detallada contiene discusiones introductorias acerca de como monetizar tus apps, incluyendo apps de pago, precios y manejo de pagos.
-
- Guía de pagos de aplicaciones
-
- Este articulo cubre los tecnicismos de las apps de pago.
-
- Pagos dentro de las apps
-
- Una guía detallada de como implementar soporte para pagos dentro de las apps en tu Web app.
-
- Validar un recibo
-
- Una guía de cuando (y como) validar el recibo de compra de tu app, sí quieres implementar la validación tu mismo, o usar una libreria preexistente.
-
- Lista de precios de apps
-
- Una serie de puntos de precios fijos que puedes escoger para tus apps de pago y como estos varian a traves de diferentes monedas, junto con informacion útil de apoyo acerca de como ocuparse de los pagos de las apps.
-
- Estado de los pagos
-
- Un resumen rápido de que paises tienen nuestos servicios de pagos de apps configurados (básicamente, donde pueden ser distribuidas las apps de pago).
-
-
-
-
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/es/mozilla/marketplace/normas_valoracion_usuario/index.html b/files/es/mozilla/marketplace/normas_valoracion_usuario/index.html deleted file mode 100644 index c8dc291d92..0000000000 --- a/files/es/mozilla/marketplace/normas_valoracion_usuario/index.html +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Normas de valoración de usuario -slug: Mozilla/Marketplace/normas_valoracion_usuario -tags: - - Marketplace - - moderación de valoraciones - - normas de valoración - - valoraciones de usuario -translation_of: Archive/Mozilla/Marketplace/User_Review_Guidelines ---- -

La valoración de aplicaciones es una manera de que compartas tu opinión acerca de las aplicaciones que has instalado y usado. Nuestro equipo de moderación se reserva el derecho de borrar cualquier valoración que no cumpla con estas normas.

- -

Algunos consejos para escribir una buena valoración

- -

Cosas que hacer:

- - - -

Cosas que no hacer:

- - - -

Preguntas frecuentes sobre las Valoraciones

- -

¿Cómo puedo reportar una valoración problemática?

- -

Por favor reporta o marca cualquier valoración cuestionable haciendo clic en "Reportar esta valoración" y será enviada al sitio para moderación. Nuestro equipo de moderación utilizará las Normas de valoración para evaluar si borrar o no la valoración o restaurarla en el sitio web.

- -

¿Qué debo hacer si tengo problemas con una aplicación?

- -

Deberías contactar al desarrollador usando los botones "Correo de ayuda" o "Sitio de ayuda" para la aplicación en su página de listado en Marketplace.

- -

Soy un desarrollador de aplicaciones, ¿cómo puedo responder a una valoración?

- -

Actualmente, esto no es posible.

- -

Soy un desarrollador de aplicaciones, ¿puedo borrar valoraciones o puntuaciones no favorables?

- -

En general, no. Pero si la valoración no cumplió con las normas de valoración delineadas arriba, puedes hacer clic en "Reportar esta valoración" y hacer que la moderen. Si una valoración incluía una queja que ya no es válida por una nueva versión de tu aplicación, podemos considerar borrar la valoración. Envía tu solicitud detallada a mozilla.appreview.

diff --git "a/files/es/mozilla/marketplace/options/introducci\303\263n/index.html" "b/files/es/mozilla/marketplace/options/introducci\303\263n/index.html" deleted file mode 100644 index d1ab1399f5..0000000000 --- "a/files/es/mozilla/marketplace/options/introducci\303\263n/index.html" +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Introducción — Opciones de Publicación -slug: Mozilla/Marketplace/Options/Introducción -tags: - - Apps - - Firefox OS - - Marketplace - - Principiantes - - introducción -translation_of: Archive/Mozilla/Marketplace/Options/Introduction ---- -
-

Firefox Marketplace proporciona un canal a través del cual usted puede publicar sus aplicaciones y hacerlas fácilmente descubiertas por los usuarios de Firefox OS, Firefox para Android y Firefox para escritorio. Sin embargo, no es la única opción que tiene para hacer sus aplicaciones disponibles. En esta sección, usted descubrirá los formatos en los que se pueden entregar sus aplicaciones, los mecanimos que hay en los navegadores Firefox para habilitad sus aplicaciones para dispositivos Android y PC de escritorio, como también las opciones para la publicación de sus propias apps y las formas en que usted puede crear su propio Marketplace.

-
- -

Opciones de publicación

- -
-
Aplicaciones Empaquetadas
-
Infórmese sobre el método predilecto para subir sus aplicaciones - el que le ofrece acceso privilegiado y APIs seguras.
-
Aplicaciones alojada
-
Descubra cómo hacer que sus aplicaciones estén disponibles desde un servidor, mientras que le proporciona a los usuarios los beneficios de una aplicación instalada.
-
¿Empaquetada o Alojada?
-
Utilice este checklist para determinar qué formato de entrega se adapta mejor a sus aplicaciones.
-
Aplicaciones Web abiertas para Android
-
Tus aplicaciones del Marketplace están habilitadas para ser instaladas en Android como un APK. Permitiendo ser instaladas y utilizadas como los haría con cualquier otra Android ap. Descubre como se hace.
-
Aplicaciones Web abiertas para Desktop
-
Tus aplicaciones web abiertas ahora pueden ser instaladas en Windows, Mac y Linux PC desde Firefox, para escritorio. Permitiéndote utilizarlas como cualquier otra aplicación del Escritorio. Descubre como se hace.
-
Publicando tus propias apps
-
En ocaciones es posible que desees publicar tus aplicaciones fuera del Firefox Marketplace, tal vez para que estén disponibles para las pruebas o la distribución en su empresa. Infórmate sobre las opciones que tiene y la forma de ponerlas en práctica.
-
Creación de su propio Marketplace
-
Ya sea que usted publique sus aplicaciones en Firefox Marketplace, o puede publicarlas usted mismo, tiene un número de opciones para su presentación en una tienda. Esta sección examina las opciones y cómo ponerlas en práctica.
-
 
-
 
-
- -

 

diff --git a/files/es/mozilla/marketplace/publish/index.html b/files/es/mozilla/marketplace/publish/index.html deleted file mode 100644 index 95c6ab34f7..0000000000 --- a/files/es/mozilla/marketplace/publish/index.html +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: Publicando en el Firefox Marketplace -slug: Mozilla/Marketplace/Publish -translation_of: Archive/Mozilla/Marketplace/Publish ---- -
-

Documentos relacionados a la publicación de una aplicación en el Marketplace de Firefox.

-
-
-
-
-
- Prueba de aplicaciones y resolución de problemas
-
- Una ligera guía sobre pruebas y resolución de problemas que seguir antes de enviar tu aplicación al Marketplace de Firefox.
-
- Enviando una aplicación al Marketplace de Firefox
-
- Esta guía paso a paso te ayudará a enviar tu aplicación con éxito al Marketplace de Firefox.
-
- Normas de revisión del Marketplace
-
- Una explicación de los criterios que una aplicación debe reunir a fin de ser publicada en el Marketplace de Firefox; siguiendo las normas expuestas en este artículo, puedes facilitar el proceso y conseguir que tu aplicación sea publicada.
-
- Normas de capturas de pantalla en el Marketplace
-
- Normas para enviar capturas de pantalla junto a tu aplicación y maximizar su calidad e impacto en el Marketplace.
-
-
-
-
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/es/mozilla/marketplace/publishing/index.html b/files/es/mozilla/marketplace/publishing/index.html deleted file mode 100644 index e2b172a388..0000000000 --- a/files/es/mozilla/marketplace/publishing/index.html +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Publishing -slug: Mozilla/Marketplace/Publishing -tags: - - NeedsTranslation - - TopicStub -translation_of: Archive/Mozilla/Marketplace/Publishing/Introduction ---- -

Marketplace publishing

diff --git a/files/es/mozilla/marketplace/publishing/marketplace_screenshot_criteria/index.html b/files/es/mozilla/marketplace/publishing/marketplace_screenshot_criteria/index.html deleted file mode 100644 index 59d3e0ac04..0000000000 --- a/files/es/mozilla/marketplace/publishing/marketplace_screenshot_criteria/index.html +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Marketplace screenshot criteria -slug: Mozilla/Marketplace/Publishing/Marketplace_screenshot_criteria -translation_of: >- - Archive/Mozilla/Marketplace/Publishing/Policies_and_Guidelines/Marketplace_screenshot_criteria ---- -
-

Cuando submitting an app to the Firefox Marketplace, you will be asked to provide one or more screenshots as part of the submission process. The Marketplace has some basic criteria for such screenshots which, while not strictly enforced, should serve as a guideline. Apps which provide no screenshots that meet the criteria in this document may be asked to submit new screenshots.

-
-

Screenshot Overview

- -

Quality Guidelines

- -

In general, you should show the app, not its surroundings.

-

Sizes and Formats

-

Screenshots are accepted in JPG and PNG format, though PNG-24 is preferred because of its lossless properties. If JPG is used, the screenshot should use minimal compression and use the highest quality settings.

-

Suggested Sizes

- - - - - - - - - - - - - - - - - - - - - -
Form FactorSuggested Resolutions
Phonemultiples of 320x480, 720x1280, inverse/landscape ratios
Tabletmultiples of 1024x768, 1280x800
Desktopmultiples of 1280x800, 1440x900
-

Examples

-

Do not include grahical elements other than the app itself, including ads or logos.

-

-

Do not submit "hands-on" photos, or edit the screenshot onto a physical device.

-

-

Do not submit screenshots that use simulated device borders, unnecessary text, or other unnecessary features.

-

diff --git a/files/es/mozilla/marketplace/publishing/open_web_apps_for_android/index.html b/files/es/mozilla/marketplace/publishing/open_web_apps_for_android/index.html deleted file mode 100644 index c624a48e12..0000000000 --- a/files/es/mozilla/marketplace/publishing/open_web_apps_for_android/index.html +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: 'Open Web Apps for Android: Synthetic APKs' -slug: Mozilla/Marketplace/Publishing/Open_web_apps_for_android -translation_of: Archive/Marketplace/Options/Open_web_apps_for_android ---- -
-

Los usuarios pueden instalar sus aplicaciones de Marketplace en el navegador de Firefox o Firefox OS, obteniendo el beneficio potentes funciones de web abierta. Sin embargo, para los usuarios de Android puede resultar más cómodo instalar sus aplicaciones como aplicaciones de Android 'normales'. Ahora eres capaz de ofrecer esta característica a los usuarios usando Synthetic APKs (también conocido como tiempo de ejecución de Web para Android), una solución disponible en Firefox Marketplace que crea APKs nativas para la instalación en dispositivos Android.

-
-

¿Qué es una Synthetic APK?

-

Una Synthetic APK es una Open Web App contenida en un paquete de instalación de Android, que puede ser instalado y ejecutado del mismo modo que cualquier otra aplicación Android. El paquete APK consiste en contenido web (en el caso de aplicaciones empaquetadas) o un puntero a contenido web (en el caso de aplicaciones organizadas). Este contenido es después encerrado en una fina envoltura Java/Android que proporciona de integración en el Sistema Operativo nativo.

-

Estos paquetes son creados por el APK Factory Service que es ejecutado como un servicio web por Marketplace. El APK Factory Service hace uso del APK Factory Library para crear el paquete real y del APK Signer para firmar digitalmente el APK. Este servicio está disponible para su propio Marketplace, si decide crear uno.

-

Usted no necesita ningún conocimiento de desarrolo Android, o adoptar medidas de desarrollo adicionales, para usar Synthetic APK: usted simplemente selecciona la opción APK al enviar sus aplicaciones al Marketplace.

-
-

Nota: Synthetic APKs son soportadas por los dispositivos Android con Firefox 29 o superior instalado.

-
-

El tiempo de ejecución de Open Web App en Android sostiene 12 APIs para accedes a capacidades del dispositivo tales como vibración, geolocalización, estado de la batería, y más. Puede verse una lista completa de APIs soportadas aquí: las APIs que muestran una "A" bajo "Availability" son aquellas APIs disponibles en Android, con elementos verdes indicando que la API está disponible en su totalidad. Usted puede colocar el puntero del ratón sobre los elementos individuales para obtener mensajes con más información.

-

El tiempo de ejecución en Android continuará añadiendo soporte para otras APIs en futuras versiones. Algunas de las APIs planeadas son:

- -
-

Nota: Los usuarios de Android pueden estar usando dispositivos con mayores resoluciones (DPI) y  mayores tamaños de pantalla que aquellos encontrados en los dispositivos con Firefox OS. Las aplicaciones que no han usado un diseño de respuesta puede que por ello proporcionen una experiencia pobre, y puede que usted quiera diseñar sus aplicaciones teniendo esto en mente.

-
-

Uso de synthetic APKs

-

Esta sección proporciona detalles en el modo en que usted elija para hacer uso de synthetic APKs, cómo afectan a la experiencia de Marketplace, e información sobre actualizaciones de las aplicaciones. 

-

Activación de la opción synthetic APK 

-

Cuando usted envía una aplicación al Firefox Marketplace, usted tiene la opción de hacer que su aplicación esté disponible como una aplicación "nativa" para dispositivos Android usando una synthetic APK.

-

Envío una aplicación

-

Cuando usted envía una aplicación al al Marketplace el APK Factory Service es invocado para crear una synthetic APK firmada en modo de depuración de Android. Esta versión de la APK entonces se hace disponible para que los críticos de la aplicación completen el proceso normal de revisión. Una vez que la aplicación ha sido revisada y aprobada el APK Factory service es invocado de nuevo, esta vez para firmar la synthetic APK con una APK Signing Key única. La Synthetic APK firmada resultante es entonces almacenada en caché para la entrega cuando un usuario decide instalar la aplicación.

-

Instalación de una synthetic APK

-

Una vez que su aplicación ha sido aprobada, cuando un usuario selecciona su aplicación en el Marketplace en su dispositivo Android la instalación se diferencia ligeramente del proceso habitual, como sigue:

-
    -
  1. Firefox Marketplace muestra la información de la aplicación y el botón de instalación como normalmente.
  2. -
  3. Cuando el usuatio selecciona instalar se muestra el diálogo de confirmación de instalación estándar de Marketplace. El diálogo lista los permisos requeridos por aplicaciones privilegiadas e información acerca de la necesidad de habilitar la opción de instalar aplicaciones de "fuentes desconocidas"; el Marketplace incluirá redacción para explicar cualquien duda que los usuarios puedan tener.
  4. -
  5. Cuando el usuario confirma que quiere continuar con la instalación, {{ domxref("Apps.install") }} / {{ domxref("Apps.installPackage") }} son invocados como usted esperaría (dependiendo de si se trata de una aplicación alojada o empaquetada), sin embargo en vez del proceso normal por el cual la versión Open Web APP es instalada, se realiza una llamada al APK Factory Service para solicitar la APK almacenada en caché. La synthetic APK es entonces descargada al dispositivo Android y el proceso de instalación de aplicación estándar de Android es invocado.
  6. -
-

Una vez que la synthetic APK ha sido instalada, el usuario encontrará la aplicación en su menú de aplicaciones y el proceso para usar y eliminar las aplicaciones será el mismo que esperaría de otras aplicaciones Android.

-

Mantener las aplicaciones actualizadas

-

El Marketplace y la APK Factory también proporcionan un mecanismo para actualizar su aplicación e informar a los usuarios de que la actualización está disponible.

-

Si su aplicación está alojada, siempre que usted haga un cambio en su servidor los usuarios se enterarán de esos cambios la siguiente vez que ejecuten su aplicación. Si usted realiza un cambio visible en su aplicación. tal como realizar un cambio en el icono de la aplicación, tras detectar el número de versión actualizada en el manifiesto de la aplicación la APK Factory creará una APK actualizada y notificará a los usuarios de que una actualización está disponible.

-

Para aplicaciones empaquetadas usted actualiza el contenido de la aplicación y envía un nuevo archivo empaquetado en zip y el manifiesto actualizado. La APK Factory recogerá esos cambios e informará a sus usuarios de que una aplicación actualizada se encuentra disponible.

-

Como funciona la APK Factory 

-

Esta sección describe como la APK Factory crea synthetic APKs.

-
    -
  1. Cuando la APK factory es invocada, como se ha descrito anteriormente, detecta si la aplicación está alojada o empaquetada, entonces pide el archivo de manifiesto de la aplicación del servidor donde se halla alojada (el Firefox Marketplace, o cualquier otro lugar donde la aplicación está alojada): -
      -
    • El manifiesto principal en el caso de aplicaciones alojadas.
    • -
    • El manifiesto mini en el caso de aplicaciones empaquetadas.
    • -
    -
  2. -
  3. La APK factory ahora tiene la información que necesita acerca de la aplicación, y solicita: -
      -
    • La URL de almacenamiento de aplicaciones en el caso de aplicaciones alojadas.
    • -
    • El archivo zip de la aplicación del marketplace en el caso de aplicaciones empaquetadas.
    • -
    -
  4. -
  5. Ahora el APK Factory service crea la synthetic APK mediante la realización de la transcodificación de algunos metadatos para elementos tales como iconos y requerimientos de seguridad, entonces: -
      -
    • envolviendo la URL de alojamiento en un contenedor Android Java para aplicaciones alojadas.
    • -
    • envolviendo el contenido de la aplicación en un contenedor Android Java para aplicaciones empaquetadas.
    • -
    -
  6. -
  7. Una vez creada, la synthetic APK es firmada por un servicio APK Signer seguro: -
      -
    • Para "revisión" las APKs son firmadas en modo de depuración de Android.
    • -
    • For "lanzamiento" las APKs son firmadas con una APK signing key.
    • -
    -
  8. -
  9. Finalmente, la APK firmada es almacenada en caché para enviar a: -
      -
    • el proceso de revisión de aplicación.
    • -
    • un dispositivo Android cuando el usuario solicite su instalación desde Marketplace.
    • -
    -
  10. -
-

Los siguientes diagramas ofrecen una representación alternativa del flujo de trabajo de la APK Factory. Primero, una aplicación empaquetada:

-

-

Ahora, para una aplicación alojada:

-

-

Nombramiento de paquetes y claves de firma de APK

-

En la instalación de una synthetic APK el dispositivo Android comprueba el nombre y la firma del paquete Java. Verifica la firma la primera vez que una aplicación es instalada (no exixte una autoridad central con la que lo comprueba) y actualizaciones futuras deberán tener el mismo nombre y firma del paquete. Si el nombre y la firma del paquete no son los mismos el dispositivo Android no actualizará la instalación.

-

Nombramiento de paquetes

-

El nombre de paquete para una synthetic APK consiste en el sitio de alojamiento y un número de serie único, por ejemplo:

- -

Claves de firma de APK

-

Cada APK necesita ser identificada por una clave de firma de APK antes de poder ser instalada en un dispositivo Android. Las claves de firma APK son creadas y son propiedad del servicio APK Signer. Estas claves de firma son inestables en sistema, y almacenadas de manera segura en el APK Signer, que es por lo que se considera "seguro".

-

Este servicio crea una clave única para cada aplicación, aplicándola a la publicación inicial y a las actualizaciones subsiguientes. La reutilización de la clave en aplicaciones APK actualizadas es importante ya que sin una igualdad en el nombre del paquete y la clave Android no instalará una actualización sobre una versión anterior de la aplicación. Si usted crea su propia versión del Marketplace la APK conservará el mismo nombre y claves, por lo que cualquier versión podrá actualizar la otra.

-
-

Nota: Mozilla no asume ninguna responsabilidad acerca de la credibilidad de las claves de firma de APK, refiriéndose a que las claves no proporcionen ninguna información acerca de la autenticidad de la aplicación o el desarrollador más allá de que han sido aprobados para su lanzamiento en Marketplace. El servicio no está vinculado a Google o alguna otra autoridad central.

-
-

FAQ

-

Aquí se encuentran las respuestas a algunas preguntas relizadas frecuentemente acerca de Synthetic APKs.

-

¿Qué pasa con la reinstalación de aplicaciones instaladas como favoritas?

-

Esto no ha sido aún realizado totalmente, pero el comportamiento esperado es que el marcado de aplicaciones como favoritas dejará de funcionar cuando el usuario actualice a una versión de Firefox para Android con la implementación Synthetic APK (versión 29 o posterior). El usuario entonces tendrá que reinstalar sus aplicaciones para usarlas de nuevo.

-

¿Cómo funcionarán las compras in-app?

-

La APK tiene acceso a la interfaz de usuario de confianza, mozPay, y todos los procesos de pago para compras in-app, por lo que los pagos in-app funcionarán de manera normal.

-

¿Cómo puedo descargar una copia de la APK de mi aplicación?

-

Usted puede descargar una copia de su aplicación usando using wget y el siguiente comando:

-

https://controller.apk.firefox.com/application.apk?manifestUrl=ESCAPED_URL_TO_MANIFEST

-

donde ESCAPED_URL_TO_MANIFEST es una URL escapada el manifiesto de la aplicación o mini-manifiesto. Esta URL hace que la APK Factory devuelve la copia almacenada en caché de la APK, o crea una nueva si la aplicación no ha sido enviada al Marketplace. Si la aplicación no ha sido enviada al Marketplace la APK es firmada en modo de depuración.

-

Ejemplos

-

Para una aplicación alojada:

-

> wget https://controller.apk.firefox.com/application.apk?manifestUrl=http%3A%2F%2Fmykzilla.org%2Fapp%2Fmanifest.webapp -O mykzilla.apk
- > aapt dump --values badging mykzilla.apk
- package: name='org.mykzilla.p362b12c70d0556c124908a3c125d3d02' versionCode='1395692586' versionName=''

-

Para una aplicación empaquetada:

-

> wget https://controller.apk.firefox.com/application.apk?manifestUrl=https%3A%2F%2Fmarketplace.firefox.com%2Fapp%2Fa22e0277-35bc-434d-9371-1568c75fc726%2Fmanifest.webapp -O cuttherope.apk
- > aapt dump --values badging cuttherope.apk
- package: name='com.firefox.marketplace.p0604c71abc0d4091829d19be9a50453c' versionCode='1394154656' versionName='1.3'

-

¿Puedo generar una synthetic APK manualmente desde una URL diferente?

-

Sí puede, proporcionando la URL de cualquier ubicación de sus archivos de manifiesto o mini-manifiesto. No obstante, tenga cuidado con esto porque si la synthetic APK es generada desde una URL diferente el nombre de paquete será distinto del creado cuando usted envió la aplicación al Marketplace, por lo que la versión del Marketplace será instalada como una aplicación separada.

-

Si configuro mi propia versión de APK Factory ¿puedo usar la synthetic APK que genera?

-

Usted puede, pero tenga cuidado porque las claves de firma serán diferentes de las asignadas a una versión de la synthetic APK generada por el Marketplace. Como resultado Android rechazará instalar la versión que el usuario intente instalar en segundo lugar. (Ver Si también tengo una versión nativa de Android de mi aplicación, ¿pueden ambas ser instaladas en un dispositivo Android? para más información.)

-

¿Puedo enviar una synthetic APK a Google Play o a otra tienda de Android? 

-

Usted puede enviar una synthetic APK a Google Play o a una tienda alternativa de Android. Sin embargo, es su responsabilidad:

- -

¿Puedo emplear mis claves de firma Android para firmar la synthetic APK y elegir el nombre del paquete?

-

Actualmente usted no puede usar sus propias clavez de firma para firmar una synthetic APK o elegir el nombre del paquete. Esta opción está siendo considerada. Si esto es de su interés, únase a la discusión en el dev-marketplace mailing list, o el Marketplace IRC channel.

-

Si también tengo una versión nativa de Android de mi aplicación, ¿pueden ambas ser instaladas en un dispositivo Android?

-

A menos que usted elija usar el nombre de paquete de synthetic APK de su aplicación Android nativa, ambas pueden ser instaladas en un dispositivo Android. Si usted elige usar el mismo nombre de paquete para su aplicación Android nativa (la cual usted firmará con su propia clave) Android rechazará instalar la versión que el usuario intente instalar en segundo lugar. Esto es debido a que los nombres de paquete son iguales pero las claves de firma son diferentes, por lo que Android considera que las aplicaciones son la misma, pero de distintas fuentes. Por lo tanto Android rechazará actualizar una aplicación con la otra, ya que eso permitiría a un desarrollador anular la aplicación de otro. El usuario acabará con la primera versión instalada en su dispositivo.

-
-

Debido a los problemas que puede causar a los usuarios, es altamente recomendado que usted no reutilice el nombre de paquete que la APK Factory asigna a su aplicación para una versión Android nativa de su aplicación.

-
-

¿Cómo puedo testear/depurar APKs?

-

Estamos trabajando en una serie de herramientas para testear y depurar una aplicación en un dispositivo Adnroid. La versión inicial incluirá  una herramienta de línea de comandos basada en ndos para generar una APK que usted pueda instalar en el dispositivo y depurar usando Firefox's Remote Developer Tools.

diff --git a/files/es/mozilla/marketplace/publishing/packaged_apps/index.html b/files/es/mozilla/marketplace/publishing/packaged_apps/index.html deleted file mode 100644 index 7a76aa8d98..0000000000 --- a/files/es/mozilla/marketplace/publishing/packaged_apps/index.html +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: Aplicaciones empaquetadas -slug: Mozilla/Marketplace/Publishing/Packaged_apps -translation_of: Archive/Mozilla/Marketplace/Options/Packaged_apps ---- -

Una aplicación empaquetada es una Open Web App que tiene todos sus recursos (HTML, CSS, JavaScript, manifiesto y demás) empaquetados en un archivo zip, en lugar de tenerlos en un servidor web. Una aplicación empaquetada es simplemente un archivo zip con el manifiesto de la aplicacion en su directorio raíz. El manifiesto debe ser llamado manifest.webapp.

- -

Una direferencia de una aplicación alojada es que una aplicación empaquetada, es que debe especificar una ruta de arranque en el manifiesto en tanto que se trata de un campo opcional en una aplicación alojada.

- -
-

Nota: Actualmente (Enero 2013) Firefox Marketplace solamente soporta aplicaciones empaquetadas para Firefox OS.

-
- -

Propósito de las aplicaciones empaquetadas.

- -

El propósito de una aplicación empaquetada, es tener una forma viable de proveer aplicaciones que tengan acceso a APIs sensibles en el dispositivo. Las aplicaciones deben ser verificadas por la tienda donde es distribuida (como Firefox Markerplace). La tienda revisa la aplicación y si la encuentra aceptable, firma el archivo zip de la aplicación con su llave privada. Esto da a los usuarios de la aplicación más seguridad de que han sido revisados problemas potenciales de seguridad, privacidad y capacidad.

- -

Tipos de aplicaciones empaquetadas.

- -

Aplicaciones privilegiadas

- -
-
Una aplicación privilegiada es aprobada por la Firefox Marketplace usando un proceso especial. Esto significa que provee más seguridad a los usuarios cuando la aplicación quiere accesar a ciertas APIs sensibles del dispositivo. Esto equivale a las aplicaciones nativas en plataformas como iOS o Android. Para especificar que se trata de una aplicación privilegiada agregue el campo type a su archivo manifest.webapp  y establezca el valor de privileged.
-
Una aplicación privilegiada tiene las siguientes características : -
    -
  • Es aprobada por una tienda de aplicaciones después de la revisión de código o equivalente.
  • -
  • Los recursos de la aplicación son firmados por la tienda de aplicaciones.
  • -
  • Permite usar ciertas APIs Web sensibles a las que contenido no confiable no puede accesar.
  • -
  • Aplica Politicas de seguridad de contenido (CSP). Una aplicacion con privilegios utiliza estas CSP: -
    "default-src *; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'"
    -
  • -
  • Implementa otros requisitos relacionados con la seguridad. Vea Seguridad para mas informacion.
  • -
-
-
Aplicación certificada
-
Una aplicacion certificada está destinada a una función crítica del sistema como el marcado por defecto o la configuración del sistema en un teléfono inteligente. Este tipo de aplicación podría ser usada para funciones críticas en un teléfono con Firefox OS. No está destinada para aplicaciones de terceros por lo que la mayoría de desarrolladores no pueden utilizarlas. Una aplicación certificada es una aplicación empaquetada similar a una con privilegios, excepto que todos los permisos del dispositivos son implícitos, lo que significa que son habilitados sin la aprobación explícita del usuario. A Una aplicación certificada debe ser aprovada por el fabricante (OEM) o compañía (carrier) para tener la aprobación implícta para usar APIs críticas. Para especificar que una aplicación es certificada, agregue el campo type a su archivo manifest.webapp y establecer su valor a certified.
-
Las siguientes son las CSP de una aplicación certificada, las cuales, son lígeramente direfentes de las de una con privilegios: -
"default-src *; script-src 'self'; object-src 'none'; style-src 'self'"
- Esto hace parecer que las reglas en las CSP son ligeramente más flexibles para las aplicaciones con privilegios que en las aplicaciones certificadas. Si quiere saber las razones de esto, vea las Políticas CSP por defecto y Bug 768029.
-
Aplicaciones empaquetadas planas
-
Usted también puede hacer una simple aplicación empaquetada en un archivo zip. La tienda la firma, pero no implementa el proceso especial de autenticación como en las aplicaciones certificadas o con privilegios. Estas aplicaciones no pueden usar ciertas Web APIs sensibles. Tampoco está sujeta a las CSP como las aplicaciones certificadas o con privilegios. Este tipo de aplicación puede ser útil si quiere que todos los recursos de su aplicación estén disponibles cuando el usuario la usa por primera vez sin descargarlos. Este tipo de aplicación empaquetada no requiere el campo type en su archivo manifest.webapp por que el valor por defecto para type (web) es correcto.
-
- -

Diferencias con las aplicaciones hospedadas

- -

Las aplicaciones empaquetadas tienen las mismas capacidades que las aplicaciones web de código abierto normales (aplicaciones "alojadas"), pero las aplicaciones empaquetadas tienen algunas diferencias:

- - - -

Las aplicaciones empaquetadas también pueden hacer cosas como acceder a bases de datos en un servidor web como una aplicación hospedada.

- -

Usando APIs Web sensibles

- -

Hay Web APIs que pueden ser usadas maliciosamente por lo que el acceso a estas debe ser controlado. Para cada API sensible a la que se quiera acceder, ustede debe agregar una entrada al campo permissions en el  manifiesto de la aplicación.

- -

Algunas APIs sensibles pueden ser accedidas por aplicaciones hospedadas normales, pero otras APIs requieren que usted use una aplicación empaquetada (con privilegios o certificada). Vea Permisos de aplicaciones para una tabla que describe los requisitos..

- -

Aplicaciones empaquetadas de la tienda de Firefox (Firefox Marketplace).

- -

La tienda de Firefox (Firefox Marketplace) maneja a las aplicaciones empaquetadas de forma diferente que las aplicaciones hospedadas. Cuando usted manda una aplicación empaquetada, su archivo zip es almacenado en los servidores de la Tienda y genera un nuevo manifiesto llamado el "mini-manifiesto" que está basado en el manifiesto de la aplicación que se encuentra en el archivo zip. Cuando un usuario installa su aplicación, el mini-manifiesto es pasado a la función installPackage() en la aplicación instalada. El mini-manifiesto existe para propósitos de instalación y actualización y no es usado cuando la aplicación se ejecuta.

- -

Prueba de instalación de una aplicación empaquetada (con Simulador)

- -

Para instalar una aplicación empaquetada en un dispositivo Firefox OS usando el simulador, vea la  sección "Push to Device" en la guía del Simulador.

- -

Prueba de instalación de una aplicación empaquetada (sin Simulador)

- -

Si quieres probar localmente la instalación de tu aplicación empaquetada, aquí hay otra forma de hacerlo. Usa los siguietnes pasos para instalar una aplicación empaquetada en un teléfono usando un servidor Web que está en tu red local. Puede ser un servidor local que se ejecute en la computadora en la que estás desarrollandol. Esto también de dará una idea de cómo funciona la instalación de aplicaciones empaquetadas.

- -

Requisitos

- - - -

Pasos

- -
    -
  1. Tenga su aplicación empaquetada disponible y dele el nombre de package.zip. Este archivo tiene todos los recursos, incluyendo el archivo del manifiesto.
  2. -
  3. Cree un archivo llamado package.manifest y agregue el siguiente contenido. Este es un mini-manifiesto usado por aplicaciones empaquetadas dentro del archivo zip. Vea Campos del mini-manifiesto si quiere más información acerca de los mini-manifiestos. -
    {
    -  "name": "My App",
    -  "package_path": "http://<server-ip>/package.zip",
    -  "version": "1.0"
    -}
    -
  4. -
  5. Cree un archivo llamado install.html con el siguiente contenido . Este contiene el código JavaScript que llama a la aplicación empaquetada (installPackage()) y a las funciones callbacks para las notificaciones de éxito o falla. -
    <html>
    -  <body>
    -    <p>Packaged app installation page</p>
    -    <script>
    -      // This URL must be a full url.
    -      var manifestUrl = 'http://<server-ip>/package.manifest';
    -      var req = navigator.mozApps.installPackage(manifestUrl);
    -      req.onsuccess = function() {
    -        alert(this.result.origin);
    -      };
    -      req.onerror = function() {
    -        alert(this.error.name);
    -      };
    -    </script>
    -  </body>
    -</html>
    -
  6. -
  7. Copie el archivo package.zip, package.manifest, e install.html dentro de la carpeta raíz del documento en el servidor.
  8. -
  9. Utilice el navegador en el teléfono para abrir  http://<server-ip>/install.html y confirme la entrada para instalar la aplicación. El script le dará una la indicación de que la instalación fue exitosa o falló.
  10. -
- -
-

Nota: Si usted quiere probar aplicaciones certificadas (descritas anteriormente) encienda el "modo de desarrolador" ("developer mode")  en el dispositivo que quiera instalar la aplicación (con Firefox OS) y asegúrese de especificar el type correcto en su archivo manifest.webapp.

-
- -

Campos del mini-manifiesto

- -

Aqui hay un ejemplo de los campos del mini-manifiesto (mini-manifest):

- -
{
-  "name": "My app",
-  "package_path": "http://thisdomaindoesnotexist.org/myapp.zip",
-  "version": "1.0",
-  "size": 172496,
-  "release_notes": "First release",
-  "developer": {
-    "name": "Developer Name",
-    "url": "http://thisdomaindoesnotexist.org/"
-  },
-  "locales": {
-    "fr_FR": {
-      "name": "Mon application"
-    },
-    "se_SE": {
-      "name": "Min balla app"
-    }
-  },
-  "icons": {
-    "16": "/icons/16.png",
-    "32": "/icons/32.png",
-    "256": "/icons/256.png"
-  }
-}
-
- -

Cuando el Firefox Marketplace genera un mini-manifiesto para tu aplicacion,  extrae informacion desde tu manifiesto de la aplicacion para algunos campos. Usted puede encontrar documentación para estos campos en el  manifiesto de la aplicación. Los campos únicos del mini-manifiesto son package_path, release_notes, y size. Los campos name, version, developer, y locales en su manifiesto de la aplicación deben ser exactamente los mismos que en su mini-manifiesto.

- -

Aquí hay información sobre el mini-manifiesto que se relaciona con su uso a nivel local para sus propias pruebas::

- -
-
name
-
(requerido) El nombre de la aplicación. La longitud máxima es de 128 caracteres.
-
package_path
-
(Requerido) Una URL completa donde el zip de la aplicación puede ser encontrado.
-
version
-
La versión de la aplicación.
-
size
-
El tamaño del zip de la aplicación en bytes. No es necesario para las pruebas locales pero se utiliza para mostrar una barra de progreso durante la instalación.
-
release_notes
-
Información acerca del lanzamiento de la aplicación. En el Marketplace esta información proviene de la página web que es parte del proceso de envío..
-
developer
-
Información acerca del desarrolador, contiene los campos name y url.
-
locales
-
Información de localización.
-
icons
-
Iconos usados por la aplicación.
-
- -

Actualizando aplicaciones empaquetadas

- -

Para información sobre actualizar aplicaciones, vea Actualizando aplicaciones.

- -

Ejemplo de aplicación empaquetada

- -

Firefox OS Boilerplate App

diff --git a/files/es/mozilla/marketplace/publishing/publish_options/index.html b/files/es/mozilla/marketplace/publishing/publish_options/index.html deleted file mode 100644 index fbe32dff00..0000000000 --- a/files/es/mozilla/marketplace/publishing/publish_options/index.html +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: Opciones para la publicación de aplicaciones -slug: Mozilla/Marketplace/Publishing/Publish_options -tags: - - Apps - - Marketplace -translation_of: Archive/Mozilla/Marketplace/Options/Self_publishing ---- -
-

Una vez usted ha finalizado su aplicación es necesario publicarla para que este disponible para el usuario final (sin importar que se utilice como una página Web desde el navegador o sea descargada y utilizada en un dispositivo como un teléfono con Firefox OS), suministrando información de soporte  como instrucciones de uso y otros recursos. Este articulo muestra brevemente las diferentes opciones disponibles para usted.

-
-

Publicando en el Marketplace de Firefox

-

El Marketplace de Firefox es nuestra tienda para distribuir aplicaciones tanto gratuitas como de pago. Enviar una aplicación al Marketplace de Firefox es un proceso simple, la carga a la tienda implica la subida de la aplicación conjuntamente con su información complementaria, luego espere mientras su aplicación pasa a través del proceso de revisión para segurar su calidad y que no contenga código malicioso. El envió al Marketplace de Firefox también confiere una serie de ventajas como el incremento de publicidad, tampoco es necesario implementar APIs especiales en su sitio Web, y la posibilidad de publicar aplicaciones de pago. Usted puede enviar tanto aplicaciones empaquetadas como aplicaciones hosteadas al Marketplace de Firefox.

-

Aplicaciones hosteadas

-

Una aplicación hosteada es básicamente una página almacenada en un servidor Web que puede utilizarse como una aplicación (el termino hosteada viene del ingles hosting). Si usted quiere permitir a las personas instalar su aplicación directamente desde su Web, usted debe implementar  algo de código JavaScript en su sitio Web para administrar la instalación y/o actualización de la aplicación en el navegador de los usuarios, asegúrese también que el código de su aplicación incluya un archivo de manifiesto válido. Por favor vea nuestros archivos de manifiesto y nuestras  APIs de instalación para ver los pasos para implementar estas funciones.

-

El lugar que usted escoja para almacenar su aplicación queda enteramente a su conveniencia, pero las dos opciones que mostraremos a continuación son las mas comunes y convenientes.

-

GitHub

-

Si tu aplicación Web es puramente estática (HTML/CSS/JavaScript, pero sin procesamiento del lado del servidor), GitHub Pages es una opción bastante confiable. si usted usa una extensión .webapp esta plataforma entregara su manifiesto con correspondiente tipo de MIME.

-

Soluciones genéricas de hosting

-

Para sitios Web dinámicos use la opción de hosting genérico (como un servidor Web de su propiedad o uno al que tenga acceso) con las capacidades necesarias o un proveedor de hosting  específicamente adaptado a las necesidades de su aplicación, como por ejemplo Heroku o Google App Engine.

-
-

Nota: Las aplicaciones Web instalables tienen una política de seguridad llamada "una aplicación por origen" ; básicamente usted no puede almacenar mas de una aplicación por origen. Esto hace el proceso de pruebas un poco mas difícil, pero siempre podrá crear un sub-dominio para cada aplicación y utilizar el simulador de Firefox OS o Firefox Aurora (que permites instalar aplicaciones Web el en escritorio) para probarlas. Vea las FAQs acerca del manifiesto de aplicaciones para mas información sobre los orígenes.

-
-

Aplicaciones empaquetadas

-

Una aplicación empaquetada es una Web que tiene todos sus recursos (HTML, CSS, JavaScript, manifiesto, etc.) contenidos en un archivo zip en lugar de tener esos recursos alojados en un servidor Web. Una aplicación empaquetada es simplemente un archivo zip con el manifiesto de la aplicación en su directorio raíz. El manifiesto debe llamarse manifest.webapp.

-

Una diferencia con las aplicaciones hosteadas es que usted debe especificar un launch_path en el manifiesto, y en las aplicaciones hosteadas esto es un campo opcional. Para mayor información vea nuestro articulo sobre Aplicaciones empaquetadas.

-

Aplicaciones auto-publicadas

-

Usted además puede elegir la opción de auto-publicar. Para aplicaciones hosteadas, esto solo involucra colocarla en un hosting como se indica a continuación.

-

Usted puede auto-publicar una aplicación empaquetada solo colocándola en un servidor conjuntamente con un mini manifiesto en el mismo directorio donde se encuentra y que será usado al instalar la aplicación. Veamos este proceso:

-
    -
  1. Tener el zip de la aplicación empaquetada con el nombre package.zip. Este archivo contiene todos los recursos de la aplicación así como también su manifiesto.
  2. -
  3. Cree un archivo llamado package.manifest con el siguiente contenido. Este es un mini manifiesto usado para la instalación de aplicaciones empaquetadas. No es el manifiesto principal, el cual se encuentra dentro del archivo zip.
    -
    {
    -    "name": "My sample app",
    -    "package_path" : "http://my-server.com/my-app-directory/my-app.zip",
    -    "version": "1",
    -    "developer": {
    -        "name": "Chris Mills",
    -        "url": "http://my-server.com"
    -    }
    -}
    -
  4. -
  5. Cree un archivo llamado index.html con el siguiente contenido. Este contiene un ejemplo del JavaScript que llama a la aplicación empaquetada (installPackage()) y devuelve la llamada en caso de éxito y notificación de errores. -
    <html>
    -  <body>
    -    <p>Packaged app installation page</p>
    -    <script>
    -      // This URL must be a full url.
    -      var manifestUrl = 'http://my-server.com/my-app-directory/package.manifest';
    -      var req = navigator.mozApps.installPackage(manifestUrl);
    -      req.onsuccess = function() {
    -        alert(this.result.origin);
    -      };
    -      req.onerror = function() {
    -        alert(this.error.name);
    -      };
    -    </script>
    -  </body>
    -</html>
    -
  6. -
  7. Copie package.zip, package.manifest, y index.html en la raíz del directorio de su aplicación (my-app-directory en este ejemplo).
  8. -
  9. Utilizando un dispositivo compatible (como un teléfono con Firefox OS), navegue hasta la localización en su servidor donde usted coloco los archivos de ejemplo y confirme cuando se le pregunte para completar la instalación. El script le dará una indicación en caso de completarse exitosamente o de una falla.
  10. -
-
-

Nota: Usted no puede instalar aplicaciones privilegiadas o certificadas desde paquetes auto-publicados ya que ellas necesitan ser firmadas durante el proceso de publicación del Marketplace de Firefox.

-
-
-

Nota: Usted incluso puede crear su propia tienda de aplicaciones, ya que dispone de una serie de opciones para hacerlo.

-
-

 

diff --git a/files/es/mozilla/marketplace/publishing/submit/index.html b/files/es/mozilla/marketplace/publishing/submit/index.html deleted file mode 100644 index 265a1ad776..0000000000 --- a/files/es/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/es/mozilla/marketplace/publishing/submit/overview/index.html b/files/es/mozilla/marketplace/publishing/submit/overview/index.html deleted file mode 100644 index 5c2877d8f6..0000000000 --- a/files/es/mozilla/marketplace/publishing/submit/overview/index.html +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: Overview -slug: Mozilla/Marketplace/Publishing/Submit/Overview -translation_of: Archive/Mozilla/Marketplace/Publishing/Submit/Overview ---- -
-

To make your apps available on Firefox Marketplace, each one needs to be submitted to Marketplace and reviewed before it's published. This page provides an overview to the processes involved in submitting an app to Firefox Marketplace. Subsequent pages provide additional detail on each step.

-
- -
-

For more details on each step of the process, please follow the links on the step heading or start the process from step 1. A diagrammatic representation of the steps is offered at the bottom of this page.

-
- -

You can also follow the submission process in this video: http://vid.ly/8k2n4w

- -

The process

- -

So you want to submit your app to Firefox Marketplace, let's get started:

- -
-
Step 1 - Sign in to your Developer account
-
- -
-
Step 2 - Load your app
-
On the Submit an app page: -
    -
  • Select whether the app is free or paid.
  • -
  • Select the platforms the app will be available on.
  • -
  • Select whether the app is hosted or packaged then: -
      -
    • For a hosted app, provide the link to its manifest file.
    • -
    • For a packaged app, upload the package.zip file, and once it has been validated, identify the minimum API requirements.
    • -
    -
  • -
  • Click Continue.
  • -
-
-
Step 3 - Enter your app's details
-
-

On the Edit App Details page:

- -
    -
  • Modify the app URL if you wish.
  • -
  • Modify the description (provided in the manifest) if you wish.
  • -
  • Select one or two categories.
  • -
  • Provide a Privacy Policy.
  • -
  • Defined a home page and support website if you have them.
  • -
  • Provide a support email address.
  • -
  • Indicate whether the app requires Flash support.
  • -
  • Add at least one screenshot or video.
  • -
  • Provide additional comments for the app reviewer (such as sign in details if the app requires them) - note you'll only be able to modify these notes by submitting a new version of the app.
  • -
  • Select whether the app will be published as soon as approved - note you'll only be able to modify this setting by submitting a new version of the app.
  • -
  • Click Continue.
  • -
-
-
Step 4 - See details of the next steps
-
On the Next Steps page click Continue.
-
Step 5 - Obtain a content rating
-
On the Content Ratings page: -
    -
  • to obtain a new rating click Create an IARC Ratings Certificate and on the IARC Web site, complete the ratings questionnaire.
  • -
  • to enter a rating you've already obtained provide its Submission ID and Security Code.
  • -
-
-
Step 6 - Update availability and payment details
-
Step 6a - If the app is free (and doesn't include in-app purchases):
-
On the left hand menu, click Compatibility. Change the countries the app will be available in if you wish.
-
Step 6b - If the app is paid (or free, but includes in app payments):
-
On the left hand menu, click Compatibility & Payments -
    -
  • Setup your payment provider accounts, such as Bango and Boku.
  • -
  • Set the price, identify whether the app includes in-app products and select the countries the app will be available in.
  • -
  • If the app is being offered as a premium upgrade to a free app, identify the free app.
  • -
-
-
Step 6c - If the app includes in-app products:
-
-
    -
  • On the left hand menu click In-App Payments and obtain your API key and secret. (Note that you'll have to submit an update to your app once the API key and secret have been added to it, for more details see In-app payments.)
  • -
  • If you're using fxPay, on the left hand menu click In-App Products and define each of your in-app products.
  • -
-
-
Step 7 - Setup team member (optional)
-
On the left hand menu, click Team Members and add any additional team member if you wish.
-
Step 8 - View the listing (optional)
-
On the left hand menu, click View Listing and view your app's Marketplace listing if you wish.
-
Step 9 - Edit other localization listings (optional)
-
On the left hand menu click Edit Listing and modify the app URL, description, and categories for any of the app's localizations or add details for any other locale supported by Firefox Marketplace.
-
- -

Your app is now in the review queue. You can monitor its progress through the review process by clicking Status and Version on the left hand menu. Remember that if your app makes use of in-app payments you will need to code in the API Key and submit an update before the app can be published.

- -

Flow chart

- -

Flow chart showing the app submission process

- -

What next?

- -

Having completed your app submission your might want to:

- - diff --git a/files/es/mozilla/marketplace/publishing/updating_apps/index.html b/files/es/mozilla/marketplace/publishing/updating_apps/index.html deleted file mode 100644 index f75be357b6..0000000000 --- a/files/es/mozilla/marketplace/publishing/updating_apps/index.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Actualización de aplicaciones -slug: Mozilla/Marketplace/Publishing/Updating_apps -translation_of: Archive/Mozilla/Marketplace/Publishing/Updating_apps ---- -
-

Nota: Si cambias el nombre de tu aplicacion despues de que haya sido aprobada por el Marketplace, tendrás que volver a enviarla para que sea aprobada.

-
-

Actualización de aplicaciones alojadas

-

Una aplicación respeta las reglas habituales de almacenamiento en caché y, tal vez en ocasiones, utilice mecanismos más avanzados para una mejora en el inicio, como HTML5 AppCache. Una vez dicho esto, no hay nada especial a tener en cuenta cuando actualicemos los recursos normales que utiliza una aplicación.

-

Sin embargo, las aplicaciones de código abierto son diferentes por el modo de manejar el manifiesto (manifest). Podría ser que ciertos cambios en el manifiesto requieran aprobación del usuario. Dependiendo de la implementación del tiempo de ejecución de la Web, puede resultar confuso si ha habido alguna actualización o no.

-

Una forma sencilla de manejar este asunto consiste en añadir un campo version en el manifiesto de la aplicación. Más adelante podrás comprobar la versión examinando el valor de retorno de la función navigator.mozApps.getInstalled(). Si la versión que el usuario tiene instalada no está actualizada, podrás lanzar una actualización utilizando navigator.mozApps.install().

-

El tiempo de ejecución de la Web no utiliza el valor version, de modo que puedes utilizar cualquier esquema de versión que desees.

-

Ten también en cuenta que se detectarán los cambios que hagas a un manifest que provoquen errores u otros daños si subes el manifest a Firefox Marketplace. Aquellos errores graves provocarán que se la aplicación desaparezca del listado. Los errores menos graves marcarán la aplicación para que sea revisada de nuevo.

-

Actualización de aplicaciones empaquetadas

-

Las aplicaciones empaquetadas tienen un proceso de actualización diferente al de las aplicaciones alojadas. Para actualizar una aplicación empaquetada, debes subir una nueva versión del archivo zip de la aplicación a Firefox Marketplace. Entonces, la aplicación actualizada se revisa y se publica en Marketplace. Este proceso lanza una actualización en el teléfono Firefox OS. El usario del teléfono también puede solicitar una actualización utilizando la aplicación de Configuración.

-

Si quieres más detalles sobre el proceso de actualización de una aplicación empaquetada, continúa leyendo.

-

Más detalles sobre la actualización de aplicaciones empaquetadas

-

Aquí tienes más detalles sobre el proceso de actualización de las aplicaciones empaquetadas. Puede que necesites esta información si vas a implementar un mercado de aplicaciones.

- diff --git a/files/es/mozilla/marketplace/submission/index.html b/files/es/mozilla/marketplace/submission/index.html deleted file mode 100644 index 1c01f1e00d..0000000000 --- a/files/es/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/es/mozilla/marketplace/submission/marketplace_review_criteria/index.html b/files/es/mozilla/marketplace/submission/marketplace_review_criteria/index.html deleted file mode 100644 index f33f1e743a..0000000000 --- a/files/es/mozilla/marketplace/submission/marketplace_review_criteria/index.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Marketplace review criteria -slug: Mozilla/Marketplace/Submission/Marketplace_review_criteria -tags: - - test -translation_of: Archive/Mozilla/Marketplace/Publishing/Marketplace_review_criteria ---- -
-

Este artículo describe el conjunto de requerimientos que una aplicación debe cumplir para ser distribuida a través de Firefox Marketplace. Los requerimientos están diseñados para equilibrar las necesidades entre desarrolladores y usuarios de aplicaciones de Firefox Marketplace. Los desarrolladores persiguen requerimientos equitativos, consistentes y no draconianos que puedan ser confiables para así construir un negocio sobre ello. Por otro lado, los usuarios necesitan asegurarse que las aplicaciones sean seguras, que funcionarán en su dispositivo, y que harán lo que indica que harán. Los requerimientos que se mencionan a continuación, aspiran un equilibro entre estas necesidades.

-
-

Aquí se mencionan las expectativas de Mozilla sobre lo que una reseña de aplicación es y no es:

- -

Seguridad

-

Todos los detalles sobre la arquitectura de seguridad de las aplicaciones está disponible aquí: https://wiki.mozilla.org/Apps/Security

- -

Privacidad

- -

Contenido

- -

Pautas de contenido

-

Esta lista describe los tipos de contenidos que son inapropiados para Firefox Marketplace. Esta lista es ilustrativa, no definitiva, y puede ser actualizada. Si una aplicación se encuentra que está violando el contenido de estas pautas, Mozilla tiene el derecho de remover inmediatamente la aplicación del Firefox Marketplace.

- -

Funcionalidad

- -

Usabilidad

- -

Políticas para listas de bloqueo

-

Esperamos que nunca tengamos que usarlas, pero nos reservamos el derecho de remover ("blocklist") cualquier aplicación publicada que posteriormente se encuentre que viola cualquier requerimiento de seguridad, privacidad o contenido, o aplicaciones que seriamente degraden el sistema o el rendimiento de la red. Desarrolladores serán informados de la situación antes de que su aplicación esté en la lista de bloqueo, se asumirá que es un buen ciudadano a menos que encontremos evidencias que demuestren lo contrario y recibirá completa asistencia del equipo revisor de aplicaciones para comunicar lo que está pasando y sea así resulto el problema. Ejemplos específicos de situaciones donde listas de bloqueo se justifican, incluyen:

- diff --git a/files/es/mozilla/marketplace/submission/rating_your_content/index.html b/files/es/mozilla/marketplace/submission/rating_your_content/index.html deleted file mode 100644 index ad57d6ee06..0000000000 --- a/files/es/mozilla/marketplace/submission/rating_your_content/index.html +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: Obtener una clasificación para tu aplicación -slug: Mozilla/Marketplace/Submission/Rating_Your_Content -translation_of: Archive/Mozilla/Marketplace/Publishing/Submit/Rating_Your_Content ---- -
-

Mozilla se ha aliado con la International Age Rating Coalition (IARC) para incluir la clasificación de contenido por edades en todas las aplicaciones. Porque Mozilla se preocupa por los usuarios y cree que deberían tener la oportunidad de decidir qué contenido es apropiado para ellos, desde el 15 de Abril de 2014, todas las aplicaciones del Firefox Marketplace tendrán que tener una clasificación IARC. Aunque amamos todas nuestras aplicaciones, nuestro compromiso con esta iniciativa requiere que cualquier aplicación o juego que no tenga esta clasificación, sea eliminado después de la fecha límite del 15 de Abril de 2014. La IARC dispone de una herramienta gratuita para crear tu clasificación.

-
- -

Sobre la herramienta de clasificación de la IARC

- -

IARC, un esfuerzo colaborativo entre varias plataformas internacionales de clasificación, ha introducido una herramienta de de clasificación como solución para asignar clasificación de contenido de manera global a juegos y aplicaciones.
- Rellenando un simple formulario, puedes recibir una clasificación instantánea para todas las plataformas participantes. Esto no solo ayuda a educar a los usuarios acerca del contenido, sino que reduce dramáticamente los costes y complicaciones de obtener la clasificación en varias plataformas de manera individual.

- -

Sistemas de clasificación internacionales soportados

- -

Usando un asistente de clasificacion, se generan las clasificaciones para multiples sistemas, países y regiones.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sistema de clasificaciónPaíses soportados
Classificação Indicativa Brasil
ESRBCanada, México, Estados Unidos
PEGIAustria, Dinamarca, Hungría, Letonia, Noruega, Eslovenia, Bélgica, Estonia, Islandia, Lituania, Polonia, España, Bulgaria, Finlandia, Irlanda, Luxemburgo, Portugal, Suecia, Chipre, Francia, Israel, Malta, Rumania, Suiza, República Checa, Grecia, Italia, Holanda, Eslovaquia, Reino Unido.
USKAlemania
GenericUsado para todos los demás paises
- -

¿Qué hay en una clasificación de contenido?

- -

El sistema de clasificación le proporciona a los usuarios tres tipos de información:

- - - -

El proceso de clasificación es gratuito para los usuarios, solo lleva unos minutos y está integrado con el proceso de envío del Firefox Marketplace y el escritorio de desarrollador. Antes de que se revise una aplicación, debe estar clasificada. Los usuarios ven la clasificación de una aplicación según su región en la página de detalles de la aplicación y pueden ver más información si desean saber más.

- -

Obtener una clasificación de contenido para tu aplicación

- -

IARC proporciona una herramienta de clasificación muy sencilla y que para la mayoría de las aplicaciones, debería llevar menos de cinco minutos. En esta sección, vamos a repasar el proceso.

- -
-

Nota: Desafortunadamente, no podemos aceptar clasificaciones de otros sistemas; si tu aplicación tiene una clasificación de otro sistema, sigues necesitando pasar por el proceso de certificación de IARC.

-
- -
    -
  1. Ingresa en el sitio de desarrolladores de Firefox Marketplace; la herramienta de clasificación solo está visible si accedes como desarrollador.
  2. -
  3. -

    Accede a la herramienta de clasificación IARC durante el proceso de envío:

    - -

    Demonstrates where in the app submission flow where ratings can be entered.

    - -

    o desde el Escritorio de desarrolladores:

    - -

    -
  4. -
  5. -

    Comienza el proceso de clasificación:

    - -

    - -

    o introduce la información para una clasificación existente:

    - -

    -
  6. -
  7. -

    Rellena el breve cuestionario:

    - -

    -
  8. -
  9. -

    Añade información adicional sobre tu aplicación:

    - -

    -
  10. -
  11. -

    Previsualiza y confirma la información de tu clasificación:

    - -

    -
  12. -
  13. -

    Vuelve al escritorio de desarrollador y deberías ver tu información de clasificación. ¡Y ya estás listo!

    -
  14. -
- -
-

Nota: Recibirás un correo electrónico con tu certificado de clasificación y código de seguridad. Por favor, conserva una copia para tus archivos.

-
- -

Más información

- -

Si tienes preguntas sobre el proceso de clasificación, cómo responder el cuestionario, o si piensas que tu clasificación es incorrecta, por favor escribe un correo electrónico al equipo de IARC, a dev-questions@globalratings.com. También hay información adicional en la página web de clasificaciones globales.

- -

Si tienes alguna otra pregunta, puedes ponerte en contacto con el equipo de revisión de aplicaciones de Mozilla en mozilla.appreview.

diff --git a/files/es/mozilla/marketplace/submission/testing_and_troubleshooting/index.html b/files/es/mozilla/marketplace/submission/testing_and_troubleshooting/index.html deleted file mode 100644 index 5b3d7bf716..0000000000 --- a/files/es/mozilla/marketplace/submission/testing_and_troubleshooting/index.html +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: 'Apps, pruebas y solución de problemas' -slug: Mozilla/Marketplace/Submission/Testing_and_troubleshooting -translation_of: >- - Archive/Mozilla/Marketplace/Publishing/Policies_and_Guidelines/Testing_and_troubleshooting ---- -
-

Este articulo engloba todo lo que se necesita para probar y solucionar los problemas de las apps.

-
-

Configura tu entorno de pruebas

-

Hay un número de herramientas que puedes instalar que realizan pruebas de funciones útiles para Firefox OS/open web apps. Te recomendamos al menos instalar las siguientes.

- -

Idelamente deberás también tener algún dispositivo para propósitos de pruebas. Para más detalles, mira nuestra guía de desarrollo para celulares.

-

Pruebas

-

Incluso a través de las Open Web Apps se usa la misma tecnología métodos de entrega como las páginas web, la experiencia de usuario para las aplicaciónes is diferente dado que el entorno de la aplicación no contiene un navegador ni tampoco una barra de direcciones o un botón de retroceso, y lo celulares con Firefox OS no tendran un botón físico en su hardware como los celulares Android tienen. Estos pasos te ayudarán a asegurarte que te aplicación provée una gran experiencia de usuario.

-
    -
  1. Instala la aplicación. Asegúrate que los íconos se muestran en la ventana de inicio y el nombre de la aplicación no tiene palabras cortadas o escondidas.
  2. -
  3. Inicia la aplicación. Asegúrate que el tamaño de la pantalla y la orientacion son detectadas apropiadamente.
  4. -
  5. Asegúrate de que el usuario vea rápidamente tu aplicación, no tu pantalla de inicio. Recuerda, los usuarios que instalan tu app mediante el Firefox Marketplace ya han estado enterados en las características que ofrece tu aplicación. No hay necesidad de hacerlos brincar a otra pantalla envíandolos a una página de lanzamiento que enlista las características de tu aplicación otra vez. La primer experiencia ideal empieza un una página de inicio o de entrada.
  6. -
  7. Enfócate en las principales caracterísitcas que ofrece tu app. Específicamente presta atención a las opciones de navegación que no tengan opciones para regresar a otra pantalla y contenidos con posibles problemas ascendentes.
  8. -
  9. Asegúrate que los enlaces a contenido exterior a tu aplicación, como los enlaces a otras páginas web o Twitter, se abran en una nueva ventana o marco que le de la opción al usuario la posibilidad de volver a tu aplicación fácilmente.
  10. -
  11. En el navegador de escritorio, usa la Vista de Diseño Responsivo  para poder utilizar tu aplicación en diferentes tamaños de pantalla. Te recomendamos utilizar resoluciones desde 320x480 a 1260x800.
  12. -
-

Resolución de problemas

- diff --git a/files/es/mozilla/mathml_project/basics/index.html b/files/es/mozilla/mathml_project/basics/index.html deleted file mode 100644 index 2a9031c69d..0000000000 --- a/files/es/mozilla/mathml_project/basics/index.html +++ /dev/null @@ -1,821 +0,0 @@ ---- -title: Bases de MathML -slug: Mozilla/MathML_Project/Basics -translation_of: Mozilla/MathML_Project/Basics ---- -

Bases de MathML

-

Este documento muestra algunas de las construcciones básicas de MathML. Está confeccionado para mostrarse correctamente con la tipografía/fuente Symbol. Puedes ver su fuente. No obstante,  los documentos de MathML tienden a ser verborrágicos y puede ser que te extravíes intentando localizar fragmentos de MathML con la vista usual de código fuente. Se ha hecho esta demo con el fin de ilustrar los siguientes aspectos. Puedes hacer un clic derecho sobre cualquier fragmento matemático de interés a lo largo de este documento. El menú contextual no aparecerá. En realidad, el fragmento matemático hará zoom y, si haces clic una segunda vez, verás el WYSIWYG de lenguaje de marcado de MathML; y, si tu haces clic por tercera vez, el fragmento regresará a su estado original. Este modo de tres estados busca limitar los conflictos con otros agentes que compitan por el mouse.

-

Con MathML se puede construir conjuntos tales como (procede a hacer clic sobre cualquiera de estas ecuaciones para probar el zoom) { 0 , 1 , 2 , 3 , 4 } o { a b | a 2 + b 2 3 } , escribir el cálculo d y d x = 1 y 2 , formar expresiones complejas lim n N ( 1 + 1 n ) n e N , k = 2 z x 2 2 z y 2 - ( 2 z x y ) 2 ( 1 + ( z x ) 2 + ( z y ) 2 ) 2 , escribir ecuaciones de vectores Y = a X + b , etcétera.

-

Nota cómo las anotaciones matemáticas aparecen en el flujo de texto principal y responden a medida de que reajustas la ventana. También puedes escribir ecuaciones representadas como la siguiente

-

x mapea a y = f n ( x ) = ( 1 + 1 x n ) n a b f ( x ) d x = b - a 6 [ f ( a ) + 4 f ( a + b 2 ) + f ( b ) ] - ( b - a ) 5 4 ! 5 ! f ( 4 ) ( η ) , a η b | x | = { - x si x < 0 x de lo contrario Tambien puedes escribir construcciones matemáticas bidimensionales [2D] como las matrices. El ejemplo siguiente muestra el - - paso i - -th de la multiplicación de una  matriz - - A - por un a vector - - x - (nota cómo ai1 , ... , ain , x1  están en la misma línea de base, otros alineamientos son posibles): i-th row [ a11 a12 a13 ... a1n : : : ... : ai1 ai2 ai3 ... ain : : : : an1 an2 an3 ... a n n ] [ x1 x2 x3 : xn ]

-

En Mozilla, MathML corre dentro del navegador principal por lo tanto responde a otras operaciones del navegador tales como el zoom (intenta Ver -> Ampliación/Zoom de texto), y puedes hacer hiperenlaces a 2 + b 2 = c 2 , aplicar estilos con effectos a 2 + b 2 = c 2 , o usar colores a 2 + b 2 = c 2 en formas variadas. p(x) q(x) = a0 + a1x + a2 x2 + ... + an-1 xn-1 b0 + b1x + b2 x2 + ... + bn-1 xn-1 .

-

También puedes hacer otras cosas extrañas y riesgosas que no son adaptables, advierte Bongo, tales como mezclar MathML con otros markups. Lagartija + Bongo = logo-star mozilla-16 a b d x + mathboard

-
-

MathML and Javascript

-

HTML Content

-
<p>
-And you can turn to JavaScript and the DOM for dynamic operations.
-</p>
-
-<div style="text-align:center">
-Fill the gaps in this matrix with resizable input fields.
-</div>
-<math class="inputmath" display="block">
-<mrow>
-<mi>A</mi>
-<mo>=</mo>
-<mo>[</mo>
-<mtable>
-<mtr>
-<mtd><mn>1</mn></mtd>
-<mtd>
-<mtext><input id="input12" value="?" size="1"/></mtext>
-</mtd>
-</mtr>
-<mtr>
-<mtd>
-<mtext><input id="input21" value="?" size="1"/></mtext>
-</mtd>
-<mtd><mn>4</mn></mtd>
-</mtr>
-</mtable>
-<mo>]</mo>
-</mrow>
-</math>
-<div style="text-align:center">
-Left size:
-<a class="control" href="javascript:incrementInput('input21', 1);" title="increase input">+</a>
-<a class="control" href="javascript:incrementInput('input21',-1);" title="decrease input">-</a>
-
- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
-
- Right size:
-<a class="control" href="javascript:incrementInput('input12', 1);" title="increase input">+</a>
-<a class="control" href="javascript:incrementInput('input12',-1);" title="decrease input">-</a>
-<br/>
- (click these control buttons to see their effects.)
- </div>
-
-<p>
-Each entry of the following matrix represents
-<math>
-<msup><mrow><mo>(</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>)</mo></mrow><mi>n</mi></msup>
-</math> for some <i>n</i>.
-When you left-click any individual entry, it should toggle between its expanded and
-unexpanded forms. You can also <a href="javascript:unexpand();">unexpand all</a> or
-<a href="javascript:expand();">expand all</a>.
-</p>
-
-<div>
-<math display="block">
-<mtable>
-<mtr>
-<mtd>
-<mtable align="axis" columnalign="left left left">
-<mtr>
-<mtd>
-<maction id="a11" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>0</mn>
-</msup>
-<mn>1</mn>
-</maction>
-</mtd>
-<mtd>
-<maction id="a12" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>1</mn>
-</msup>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-</maction>
-</mtd>
-<mtd>
-<maction id="a13" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>2</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>2</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-</mtr>
-<mtr>
-<mtd>
-<maction id="a21" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>1</mn>
-</msup>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-</maction>
-</mtd>
-<mtd>
-<maction id="a22" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>2</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>2</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-<mtd>
-<maction id="a23" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>3</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>3</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>3</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>3</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>3</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-</mtr>
-<mtr>
-<mtd>
-<maction id="a31" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>2</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>2</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-<mtd>
-<maction id="a32" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>3</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>3</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>3</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>3</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>3</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-<mtd>
-<maction id="a33" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>4</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>4</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>4</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>3</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>6</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>4</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>3</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>4</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-</mtr>
-<mtr>
-<mtd>
-<maction id="a41" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>3</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>3</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>3</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>3</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>3</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-<mtd>
-<maction id="a42" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>4</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>4</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>4</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>3</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>6</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>4</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>3</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>4</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-<mtd>
-<maction id="a43" actiontype="toggle" selection="2">
-<msup>
-<mrow>
-<mo>(</mo>
-<mrow>
-<mi>x</mi>
-<mo>+</mo>
-<mi>y</mi>
-</mrow>
-<mo>)</mo>
-</mrow>
-<mn>5</mn>
-</msup>
-<mrow>
-<msup>
-<mi>x</mi>
-<mn>5</mn>
-</msup>
-<mo>+</mo>
-<mrow>
-<mn>5</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>4</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<mi>y</mi>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>10</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>3</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>2</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>10</mn>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>x</mi>
-<mn>2</mn>
-</msup>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>3</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<mrow>
-<mn>5</mn>
-<mo>&InvisibleTimes;</mo>
-<mi>x</mi>
-<mo>&InvisibleTimes;</mo>
-<msup>
-<mi>y</mi>
-<mn>4</mn>
-</msup>
-</mrow>
-<mo>+</mo>
-<msup>
-<mi>y</mi>
-<mn>5</mn>
-</msup>
-</mrow>
-</maction>
-</mtd>
-</mtr>
-</mtable>
-</mtd>
-</mtr>
-</mtable>
-</math>
-</div>
-
-
-

CSS Content

-
.control {
-text-decoration: none;
-font-weight: bold;
-font-size: 200%;
-}
-input {
-color: red;
-}
-[class="inputmath"] {
-border: 1px dotted;
-}
-
-

JavaScript Content

-
function setSelection(id,value) {
-document.getElementById(id).setAttribute("selection",value);
-}
-function expand()
-{
-  setSelection("a11","2");  setSelection("a12","2");  setSelection("a13","2");
-  setSelection("a21","2");  setSelection("a22","2");  setSelection("a23","2");
-  setSelection("a31","2");  setSelection("a32","2");  setSelection("a33","2");
-  setSelection("a41","2");  setSelection("a42","2");  setSelection("a43","2");
-}
-function unexpand()
-{
-  setSelection("a11","1");  setSelection("a12","1");  setSelection("a13","1");
-  setSelection("a21","1");  setSelection("a22","1");  setSelection("a23","1");
-  setSelection("a31","1");  setSelection("a32","1");  setSelection("a33","1");
-  setSelection("a41","1");  setSelection("a42","1");  setSelection("a43","1");
-}
-
-function incrementInput(inputID, increment)
-{
-  var inputElement = document.getElementById(inputID);
-  var size = parseInt(inputElement.size) + increment;
-  if (size <= 0)
-    size = 1
-  inputElement.size = size;
-}
-
-

{{ EmbedLiveSample('MathML_and_Javascript', '100%', '400px') }}

-

Y podría haber más cosas...

-
-

MathML Button

-

HTML Content

-
<div style="text-align: center">
-  <button style="white-space: normal;">
-     <span style="color: brown;">
-
-       For example, <b>click</b> this MathML continued fraction<br/>
-       inside this HTML button<br />
-     </span>
-<math>
-<mrow>
-<mfrac>
-<mi>&pi;</mi>
-<mn>4</mn>
-</mfrac>
-<mo>=</mo>
-<mfrac numalign="left">
-<mstyle scriptlevel="0">
-<mn>1</mn>
-</mstyle>
-<mstyle scriptlevel="0">
-<mrow>
-<mn>2</mn>
-<mo>+</mo>
-<mfrac numalign="left">
-<mstyle scriptlevel="0">
-<msup><mn>1</mn><mn>2</mn></msup>
-</mstyle>
-<mstyle scriptlevel="0">
-<mrow>
-<mn>2</mn>
-<mo>+</mo>
-<mfrac numalign="left">
-<mstyle scriptlevel="0">
-<msup><mn>3</mn><mn>2</mn></msup>
-</mstyle>
-<mstyle scriptlevel="0">
-<mrow>
-<mn>2</mn>
-<mo>+</mo>
-<mfrac numalign="left">
-<mstyle scriptlevel="0">
-<msup><mn>5</mn><mn>2</mn></msup>
-</mstyle>
-<mstyle scriptlevel="0">
-<mrow>
-<mn>2</mn>
-<mo>+</mo>
-<mfrac numalign="left">
-<mstyle scriptlevel="0">
-<msup><mn>7</mn><mn>2</mn></msup>
-</mstyle>
-<mstyle scriptlevel="0">
-<mn>2</mn><mo>+</mo><mo mathvariant="bold">...</mo>
-</mstyle>
-</mfrac>
-</mrow>
-</mstyle>
-</mfrac>
-</mrow>
-</mstyle>
-</mfrac>
-</mrow>
-</mstyle>
-</mfrac>
-</mrow>
-</mstyle>
-</mfrac>
-</mrow>
-</math>
-  </button>
-</div>
-
-
-

{{ EmbedLiveSample('MathML_Button', '100%', '300px') }}

-

Para más información sobre MathML en Mozilla, mira la página del Proyecto MathML. Hay enlaces a más ejemplos, capturas de pantalla e instrucciones sobre cómo descargar fuentes tipográficas para varias plataformas. Dichas fuentes son requeridas para visualizar otros ejemplos además de las construcciones básicas mostradas aquí.

-
-

MathML Background Image

-

HTML Content

-
<div class="background"></div>
-<math display="block">
-<mrow>
-<msub>
-<mi>Z</mi>
-<mi>&alpha;</mi>
-</msub>
-<mrow>
-<mo>(</mo>
-<mi>f</mi>
-<mo>)</mo>
-</mrow>
-<mo>=</mo>
-
-<mfrac>
-<mn>1</mn>
-<mrow>
-<mn>2</mn>
-<mi>i</mi>
-<mo>&ThinSpace;</mo>
-<mi>cos</mi>
-<mo>(</mo>
-<mfrac>
-<mrow>
-<mi>&alpha;</mi>
-<mi>&pi;</mi>
-</mrow>
-<mn>2</mn>
-</mfrac>
-<mo>)</mo>
-</mrow>
-</mfrac>
-
-<mrow>
-<msub>
-<mo>&int;</mo>
-<mi>C</mi>
-</msub>
-<mfrac>
-<mrow>
-<mi>f</mi>
-<mo stretchy='false'>(</mo>
-<mi>i</mi>
-<mi>z</mi>
-<mo stretchy='false'>)</mo>
-<msup>
-<mrow>
-<mo>(</mo>
-<mo>-</mo>
-<mi>z</mi>
-<mo>)</mo>
-</mrow>
-<mi>&alpha;</mi>
-</msup>
-</mrow>
-<mrow>
-<msup>
-<mi>e</mi>
-<mrow>
-<mn>2</mn>
-<mi>&pi;</mi>
-<mi>z</mi>
-</mrow>
-</msup>
-<mo>-</mo>
-<mn>1</mn>
-</mrow>
-</mfrac>
-</mrow>
-<mi>d</mi>
-<mi>z</mi>
-</mrow>
-</math>
-

CSS Content

-
[class="background"] {
-  background-image: url(http://www.mozilla.org/images/mozilla-banner.gif);
-  opacity: 0.2;
-  position: absolute;
-  left: 0;
-  width: 100%;
-  height: 58px;
-}
-
-
-

{{ EmbedLiveSample('MathML_Background_Image', '100%', '300px') }}

diff --git a/files/es/mozilla/mathml_project/extras/index.html b/files/es/mozilla/mathml_project/extras/index.html deleted file mode 100644 index 39f1f13d7f..0000000000 --- a/files/es/mozilla/mathml_project/extras/index.html +++ /dev/null @@ -1,307 +0,0 @@ ---- -title: Extras -slug: Mozilla/MathML_Project/Extras -tags: - - MathML -translation_of: Mozilla/MathML_Project/Extras ---- -

MathML Extras

-

Esta es una demostración técnica de algunos extras de Mozilla que aun no han sido definidos en la especificación MathML, pero que no se impide su uso por parte de otra especificación. No son portables , solo fueron creados para mostrar algunas características interesantes de usar código nativo desde el entorno del navegador. Se espera que otros renderizadores ignoren los atributos que no pueden comprender mientras estos extras permanezcan indefinidos.

-

El atributo - - title - como una descripción emergente (desde XHTML)

-
-

HTML Content

-
<p>Mouse over either log to see a tooltip showing the title
-
-<math display="block">
-<mrow>
-<mrow>
-<msub title="Base-a log">
-<mi>log</mi>
-<mi>a</mi>
-</msub>
-<mo>&ApplyFunction;</mo>
-<mi>x</mi>
-</mrow>
-<mo>=</mo>
-<mfrac>
-<mrow>
-<mi title="Natural log">ln</mi>
-<mo>&ApplyFunction;</mo>
-<mi>x</mi>
-</mrow>
-<mrow>
-<mi title="Natural log">ln</mi>
-<mo>&ApplyFunction;</mo>
-<mi>a</mi>
-</mrow>
-</mfrac>
-</mrow>
-</math>
-
-Rather than repeating the instructions,
-some CSS might be used to provide a visual cue. For example
-with the style rule: <code style="white-space: nowrap;">*[title] { color: blue; }</code>
-
-<math class="cue" display="block">
-<mrow>
-<mrow>
-<msub title="Base-a log">
-<mi>log</mi>
-<mi>a</mi>
-</msub>
-<mo>&ApplyFunction;</mo>
-<mi>x</mi>
-</mrow>
-<mo>=</mo>
-<mfrac>
-<mrow>
-<mi title="Natural log">ln</mi>
-<mo>&ApplyFunction;</mo>
-<mi>x</mi>
-</mrow>
-<mrow>
-<mi title="Natural log">ln</mi>
-<mo>&ApplyFunction;</mo>
-<mi>a</mi>
-</mrow>
-</mfrac>
-</mrow>
-</math>
-</p>
-
-
-

CSS Content

-
math.cue *[title] { color: blue; }
-
-

{{ EmbedLiveSample('MathML_Tooltip', '100%', '250px') }}

-

Mezclando con otras marcas

-
-

HTML Content

-
<math display="block">
-<mrow>
-<mi>A</mi>
-<mo>=</mo>
-<mo>[</mo>
-<mtable>
-<mtr>
-<mtd><mn>1</mn></mtd>
-<mtd>
-<mtext>
-<img width="16" height="16"
-src="http://www.mozilla.org/images/mozilla-16.png"
-alt="mozilla-16" />
-</mtext>
-</mtd>
-</mtr>
-<mtr>
-<mtd>
-<mtext><input value="type" size="4"/></mtext>
-</mtd>
-<mtd><mn>4</mn></mtd>
-</mtr>
-</mtable>
-<mo>]</mo>
-</mrow>
-</math>
-
-<math display="block">
-<msqrt>
-<mpadded width="30px" height="15px" depth="15px" voffset="-15px">
-<mtext>
-<svg width="30px" height="30px">
-<defs>
-<radialGradient id="radGrad1" cx="50%" cy="50%" r="50%"
-                            fx="50%" fy="50%">
-<stop offset="0%"
-                    style="stop-color:rgb(255,255,255); stop-opacity:1;"/>
-<stop offset="100%"
-                    style="stop-color:rgb(255,0,0); stop-opacity:.8;"/>
-</radialGradient>
-</defs>
-<g transform="translate(15,15)">
-<g>
-<animateTransform attributeName="transform"
-                                attributeType="XML" type="rotate"
-                                from="360" to="0"
-                                dur="15s" repeatCount="indefinite"/>
-<g transform="translate(-15, -15)">
-<path fill="url(#radGrad1)"
-                      d="M 15 0 L 20 10 L 30 15 L 20 20 L 15 30
-                         L 10 20 L 0 15 L 10 10"/>
-</g>
-</g>
-</g>
-</svg>
-</mtext>
-</mpadded>
-</msqrt>
-<mo>=</mo>
-<msubsup>
-<mo>∫</mo>
-<mn>0</mn>
-<mfrac>
-<mi>π</mi>
-<mn>2</mn>
-</mfrac>
-</msubsup>
-<msup>
-<mi>θ</mi>
-<mtext>
-<svg width="15px" height="15px">
-<defs>
-<radialGradient id="radGrad2" cx="50%" cy="50%" r="50%"
-                          fx="50%" fy="50%">
-<stop offset="0%"
-                  style="stop-color:rgb(255,255,255); stop-opacity:1;"/>
-<stop offset="100%"
-                  style="stop-color:rgb(0,0,255); stop-opacity:.9;"/>
-</radialGradient>
-</defs>
-<g>
-<animateMotion path="M0,0 L3,0 L2,5 L5,5 L0,4 L5,2 z"
-                         begin="0s" dur="0.5s" repeatCount="indefinite"/>
-<circle fill="url(#radGrad2)" r="5px" cx="5px" cy="5px"/>
-</g>
-</svg>
-</mtext>
-</msup>
-<mrow>
-<mo>ⅆ</mo>
-<mi>θ</mi>
-</mrow>
-</math>
-
-<div style="width: 300px; margin-left: auto; margin-right: auto;">
-<svg width="300px" height="250px">
-<defs>
-<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
-<stop offset="0%" style="stop-color:rgb(0,0,255);stop-opacity:1"/>
-<stop offset="100%" style="stop-color:rgb(0,255,0);stop-opacity:1"/>
-</linearGradient>
-
-<linearGradient id="grad2" x1="0%" y1="0%" x2="0%" y2="100%">
-<stop offset="0%" style="stop-color:rgb(255,0,0);stop-opacity:1"/>
-<stop offset="100%" style="stop-color:rgb(255,255,0);stop-opacity:1"/>
-</linearGradient>
-
-<radialGradient id="grad3" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
-<stop offset="0%" style="stop-color:rgb(0,255,255);stop-opacity:1"/>
-<stop offset="100%" style="stop-color:rgb(255,255,255);stop-opacity:.8"/>
-</radialGradient>
-</defs>
-
-<rect width="300" height="250" fill="url(#grad1)"/>
-
-<g transform="translate(150,125)">
-<g>
-<animateTransform attributeName="transform"
-                          attributeType="XML" type="rotate" from="0" to="360"
-                          dur="6s" repeatCount="indefinite"/>
-
-<g transform="translate(-50,-35)">
-<rect width="100" height="70" fill="url(#grad2)"/>
-<switch>
-<foreignObject width="100" height="70"
-                           requiredExtensions="http://www.w3.org/1998/Math/MathML">
-<math display="block">
-<mrow>
-<mo>(</mo>
-<mtable>
-<mtr>
-<mtd><mi>cos</mi><mi>θ</mi></mtd>
-<mtd><mo>−</mo><mi>sin</mi><mi>θ</mi></mtd>
-</mtr>
-<mtr>
-<mtd><mi>sin</mi><mi>θ</mi></mtd>
-<mtd><mi>cos</mi><mi>θ</mi></mtd>
-</mtr>
-</mtable>
-<mo>)</mo>
-</mrow>
-</math>
-</foreignObject>
-<text>rotation matrix</text>
-</switch>
-</g></g></g>
-<g>
-<animateMotion path="M 32,69 C 64,121 100,27 152,42 203,56 239,257 275,161 295,109 144,221 88,214 -2,202 11,35 32,69 z"
-                     begin="0s" dur="20s" repeatCount="indefinite"/>
-<animateTransform attributeName="transform"
-                        attributeType="XML" type="scale"
-            values="1;2;.5;1" keyTimes="0;.25;.75;1" dur="20s"
-            repeatCount="indefinite"/>
-<circle fill="url(#grad3)" r="30"/>
-<g transform="translate(-30,-30)">
-<switch>
-<foreignObject width="60" height="60"
-requiredExtensions="http://www.w3.org/1998/Math/MathML">
-<math display="block">
-<mrow>
-<munderover>
-<mo>∑</mo>
-<mrow>
-<mi>n</mi>
-<mo>=</mo>
-<mn>0</mn>
-</mrow>
-<mrow>
-<mo>+</mo>
-<mi>∞</mi>
-</mrow>
-</munderover>
-<mfrac>
-<msup>
-<mi>α</mi>
-<mi>n</mi>
-</msup>
-<mrow>
-<mi>n</mi>
-<mo>!</mo>
-</mrow>
-</mfrac>
-</mrow>
-</math>
-</foreignObject>
-<text>exp(α)</text>
-</switch>
-</g>
-</g>
-</svg>
-</div>
-
-
-
-

{{ EmbedLiveSample('Mixing_with_other_markups', '100%', '500px') }}

-

 

-

JavaScript Incorporado

-
-

HTML Content

-
<math display="block">
-<mfrac>
-<mtext id="num">Mouse</mtext>
-<mtext id="denum">Over</mtext>
-</mfrac>
-</math>
-

JavaScript Content

-
function whoIsThereAlert(evt)
-{
-  alert("Who is there?");
-}
-function attachListener(id)
-{
-  document.getElementById(id).addEventListener("mouseover", whoIsThereAlert);
-}
-function init()
-{
-  attachListener("num");
-  attachListener("denum");
-}
-
-window.addEventListener("load", init);
-
-
-

{{ EmbedLiveSample('Inline_JavaScript', '100%', '200px') }}

-

 

diff --git a/files/es/mozilla/mathml_project/fonts/index.html b/files/es/mozilla/mathml_project/fonts/index.html deleted file mode 100644 index c1fb8a094e..0000000000 --- a/files/es/mozilla/mathml_project/fonts/index.html +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Fuentes para el motor Mozilla MathML -slug: Mozilla/MathML_Project/Fonts -translation_of: Mozilla/MathML_Project/Fonts ---- -
Nota: Estas instrucciones son para Gecko 2.0 (Firefox 4) y posteriores. Para versiones anteriores ver Fonts for Mozilla 1.8, Fonts for Mozilla 1.9 o Fonts for Mozilla 2.0
- -

Instrucciones rápidas

- - - -

Resumen

- -

Las fórmulas matemáticas hacen uso de numerosos símbolos representados por caracteres Unicode específicos. Mozilla puede mostrar cualquiera de estos símbolos si están instaladas las fuentes Unicode adecuadas. Además, de acuerdo con las  recomendaciones de la W3C sobre funetes en CSS2 , los autores pueden especificar una lista concreta de fuentes que prefieren (utilizando la propiedad font-family de CSS), con la seguridad de que el motor de fuentes de Mozilla's buscará una fuente alternativa cuando las especificadas no se encuentren en el sistema de un usario en particular. Si en último caso no se encontrase un fuente adecuada para un caracter en particular, Mozilla mostrará en su lugar una caja con la representación hexadecimal  del código Unicode que apunta al caracter.

- -

Algunos operadores matemáticos se dibujan también usando glifos para variantes más largas del caracter ( e.j. el símbolo de la suma )  o montanto glifos para algunas partes del carcater ( e.j. llaves ). En general estas variantes o partes de glifos no tienen asignación Unicode y se necesita soporte soporte específico de la fuente para esos caracteres. Mozilla tiene soporte general para los delimitadores y flechas comunes que tienen las asignaciones Unicode necesarias. Para otros caracteres, Mozilla tiene soporte específico de fuentes. En general, si los glifos necesarios no están disponibles en el sistema, Mozilla intenta estirar los símbolos usando transformaciones de escalado, pero el resuntado del renderizado puede no resultar menos satisfactorio.

- -

Para ver MathML como se pretende, necesitas tener apoyo de fuentes suficiente, lo que puede significar tener que instalar algunas fuentes. En ese caso, verás el renderizado correcto si usas Geko 15.0 {{ geckoRelease("15.0") }}o superior.

- -

Fuentes principales

- -

El STIX Fonts Project ha desarrollado un conjunto de fuentes comprensible que cubre todos los símbolos en MathML y también contiene glifos para estirar los operadores matemáticos. Están disponibles bajo licencia SIL Open Font License y se deberían instalar para un mejor renderizado de MathML. Ten en cuenta que actualmente, solo las fuente en /Fonts/STIX-General/ se utilizan para estirar operadores matemáticos con fuentes STIX. Asana Math  también está disponible de manera gratuita bajo licencia SIL Open Font License y tiene buen soporte para caracteres matemáticos. Empezando en Geko 7.0 {{ geckoRelease("7.0") }}, Mozilla también puede usar glifos contenidos en esa fuente para operadores alargados. Desde Gecko 13.0 {{ geckoRelease("13.0") }}, MathJax fonts se utiliza como fuente por defecto para textos matemáticos y estirado de símbolos. Estas fuentes están disponibles gratuitamente bajo licencia Apache License. Se asemejan al renderizado de LaTeX y deberían resultarle más familiares a los científicos. Las funetes MathJax también mejoran el soporte para el atributo mathvariant (  ej. para escribir el doble tachado, el guión y el texto fraktur ).

- -

Todas las fuentes arriba mencionadas pueden estar ya instaladas por defecto en tu sistema o pueden ser instaladas fácilmente vía gestor de software. Por conveniencia, proporcionamos un archivo zip con la funtens de MathML. Las fuentes pueden ser instaladas extrayendo los archivos ( que tienen la extensión  .otf ) del archivo zip y siguiendo después las  in instrucciones para Microsoft Windows o copiando los archivos a ~/Library/Fonts folder en Mac OS X, o a al directorio ~/.fonts/ (que puede no estar creado) en sistemas Unix/Linux. De manera alternativa, siga las instrucciones de dafont's "How to install a font". Estas fuentes son OpenType PostScript,  que son soportadas por la mayoría de sistemas operativos modernos. Sin embargo, algunos sistemas operativos puede que no las soporten. En esos sistemas, será necesario convertir esas fuentes a un formato que esté soportado. Por ejemplo Asana Math está disponible en formato TrueType y hay una conversión no oficial TrueType para fuentes STIX.

- -

Otras fuentes

- -

Las siguientes fuentes no son necesarias si las fuentes de arriba están instaladas, pero cabe señalarlas por su soporte para Unicode para muchos caracteres matemáticos.

- -

 

- -

DejaVu Serif y DejaVu Sans están  disponibles gratuitamente e instalafas con muchas distribuciones Linux. Contienen soporte para muchos caracteres matemáticos y Mozilla mostrará MathML de manera razonable en sistemas con estas fuentes instaladas, incluso sin fuentes STIX. La copia de la fuente, contiene glifos para operadores elásticos con asignación Unicode.

- -

Cambira Math está preinstalada en Microsoft Windows Vista, y también viene con Microsoft Office 2007 o Microsoft PowerPoint Viewer 2007. La fuente tuene buen soporte para caracteres matemáticos y por tanto, con cualquiera de estos productos instalados, Mozilla será capaz de mostrar MathML razonablemente incluso sin fuentes STIX. La fuente contiene los glifos necesarios para operadores elásticos, pero Mozilla aun no hace uso de todos ellos. La licencia permite que "uses esta según lo permitido por la EULA para el producto en el cual la fuente se incluye para mostrar e imprimir contenido",  así que conviene una consulta legal si estás considerando instalarla en sistemas sin los productos asociados.

- -

Futuro trabajo (¡Ayuda, por favor!)

- -

Algunas fuentes OpenType incluyen una tabla MATH como un a extensión OpenType permitiría glifos para operadores flexibles en una manera "no tan específica para fuentes", pero Mozilla aun no hace uso de esto. Esto incluye Cambria Math, Neo Euler, STIX 1.1, LM Math, Lucida fonts, Asana Math y probablemente más.
- Un instalador experimental para Mac OS X está disponible en {{ Bug("770005") }}.

- -

Implementar una UI para descargar automáticamente las fuentes. Están disponibles algunos parches en {{ Bug("295193") }}.

- -

Para distribuciones Linux, uno puede usar el PackageKit DBUS API ({{ Bug("467729") }}).
- Para plataformas móviles, ver {{ Bug("648548") }} y para  Firefox OS {{ Bug("775060") }}

- -

Otros bugs relacionados: suggest MathJax/Asana on Debian, Math fonts on Android.

- -

Reajustar viejas preferencias

- -

Si los usuarios han cambiado previamente la preferencia "font.mathfont-family" en una versión previa de Mozilla, entonces es mejor resetearlo al valor por defecto. Para hacerlos, escribe la url "about:config", "Filter" para "mathfont", and "Reset" al valor por defecto a través del menú contextual en preferencias.

- -
 
diff --git a/files/es/mozilla/mathml_project/index.html b/files/es/mozilla/mathml_project/index.html deleted file mode 100644 index 21b436807f..0000000000 --- a/files/es/mozilla/mathml_project/index.html +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Proyecto Mozilla MathML -slug: Mozilla/MathML_Project -tags: - - MathML - - MathML Project - - NeedsTranslation - - TopicStub -translation_of: Mozilla/MathML_Project ---- -

El proyecto Mozilla MathML es un proyecto de Mozilla para crear y mejorar el soporte de MathML en Firefox y otras aplicaciones de Mozilla.

- -

Actualizaciones

- -

mathboard.png

- - - -

3 de Mayo de 2013

- -

Firefox Nightly pasa el test MathML Acid2 ; Artículo en Slashdot ; Artículo en ghacks .

- -

10 de Enero de 2013

- -

Chrome 24 ha sido lanzado con soporte básico para MathML.

- -

actualización: MathML deshabilitado de nuevo en Chrome 25 :-(

- -

1 de Diciembre de 2012

- -

¡Todas las páginas de Mozilla MathML Project han sido migradas a MDN!

- -

26 de Noviembre de 2012

- -

Math typesetting - ¿Por qué estamos dejando un asunto tan importante en manos de voluntarios con escasos recursos y pequeñas organizaciones?

- -

Comunidad

- - - -

Enlaces

- - - -

Documentos de MathML

- - - -

Crear documentos MathML

- - - -
-

Información del documento original

- - -
diff --git a/files/es/mozilla/mathml_project/mathml3testsuite/index.html b/files/es/mozilla/mathml_project/mathml3testsuite/index.html deleted file mode 100644 index fd25091d3b..0000000000 --- a/files/es/mozilla/mathml_project/mathml3testsuite/index.html +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: MathML3 Testsuite -slug: Mozilla/MathML_Project/MathML3Testsuite -tags: - - MathML - - MathML Testsuite -translation_of: Mozilla/MathML_Project/MathML3Testsuite ---- -

Las siguientes páginas contienen los resultados obtenidos al realizar el MathML 3 full testsuite para la presentación de MathML. Las secciones están marcadas con paso, fallo, no-probado o probado-en-parte,  mostrando así el estado de las construcciones con la correspondiente fuente instalada. Cuando el marcador es intencionalmente erróneo, el comportamiento correcto no esta definido por la recomendación y por lo tanto la prueba se considera "pasada" sí, no hay errores fatales. Esta excepción también se cumple para funciones obsoletas (como por ejemplo macro, mode, etc.) o para otros comportamientos aun no definidos  (attribute, href por ejemplo).

-

Note que en general comparando con el "ejemplo de renderizado" no es suficiente para concluir que una prueba fue aprobada o fallida. Así que por favor no edite estas páginas si usted no es capaz de explicar el proceso de renderizado de Gecko. Sin embargo, cualquier reporte es bienvenido en la web de Rastreo de bug para MathML testsuite.

- -
-

Información del Documento Original

- -
-

 

diff --git a/files/es/mozilla/mathml_project/screenshots/index.html b/files/es/mozilla/mathml_project/screenshots/index.html deleted file mode 100644 index a6b868e20e..0000000000 --- a/files/es/mozilla/mathml_project/screenshots/index.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Pantallas MathML -slug: Mozilla/MathML_Project/Screenshots -translation_of: Mozilla/MathML_Project/Screenshots ---- - diff --git a/files/es/mozilla/mathml_project/start/index.html b/files/es/mozilla/mathml_project/start/index.html deleted file mode 100644 index 78534ad6cd..0000000000 --- a/files/es/mozilla/mathml_project/start/index.html +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: MathML en acción -slug: Mozilla/MathML_Project/Start -tags: - - MathML -translation_of: Mozilla/MathML_Project/Start ---- -

MathML en  acción

-

¿Ves elegantes ecuaciones a lo largo de esta página? ¿No? Que mal, aquí tienes una captura de pantalla  de lo que te estás perdiendo. Descarga una versión de Mozilla habilitada para usar MathML para remediar esta situación.

-

¿Ahora ya tienes una versión de Mozilla habilitada para usar MathML pero lo que ves en las capturas de pantalla no es lo que obtienes? En ese caso, probablemente te faltan algunas fuentes MathML importantes.

-

Ahora que estas bien equipado, deberías poder ver esta ecuación incorporada con varios acentos: x ^ + xy ^ + xyz ^ . Al lado de esta tienes esta pequeña fórmula,  det | a c b d | = a d - b c , la cual también puede ser compuesta en displaystyle como det | a b c d | = a d - b c .

-

La composición matemática es difícil. MathML en Mozilla busca cumplir con las especificaciones MathML de modo que - - What - - You See Is What You Markup - (Lo Que Ves Es Lo Que Marcas), o dicho de otra manera - - What - - You See Is What You Made - (Lo Que Ves Es Lo Que Haces), o de forma más corta "WYSIWYM". ¡La diferencia entre estas dos es el marcado! ( ... ( ( a 0 + a 1 ) n 1 + a 2 ) n 2 + ... + a p ) n p ( ... ( ( a 0 + a 1 ) n 1 + a 2 ) n 2 + ... + a p ) n p

-

Las raíces de esta ecuación en negrita  y 3 + p y + q = 0 también están en negrita y = - q 2 + q 2 4 + p 3 27 2 3 + - q 2 - q 2 4 + p 3 27 2 3 .

-

Mientras que las raíces de la ecuación a x 2 + b x + c = 0 , haz clic en cualquier parte del área amarilla para acercar y alejar:

-
-

Zoomable Math

-

HTML Content

-
    <p>
-      <math display="block">
-        <mstyle id="zoomableMath" mathbackground="yellow">
-          <mrow>
-            <mi>x</mi>
-            <mo>=</mo>
-            <mfrac>
-              <mrow>
-                <mrow>
-                  <mo>-</mo>
-                  <mi>b</mi>
-                </mrow>
-                <mo>&#xB1;</mo>
-                <msqrt>
-                  <mrow>
-                    <msup>
-                      <mi>b</mi>
-                      <mn>2</mn>
-                    </msup>
-                    <mo>-</mo>
-                    <mrow>
-                      <mn>4</mn>
-                      <mi>a</mi>
-                      <mi>c</mi>
-                    </mrow>
-                  </mrow>
-                </msqrt>
-              </mrow>
-              <mrow>
-                <mn>2</mn>
-                <mi>a</mi>
-              </mrow>
-            </mfrac>
-          </mrow>
-        </mstyle>
-      </math>
-    </p>
-
-
-

JavaScript Content

-
      function zoomToggle()
-      {
-      if (this.hasAttribute("mathsize")) {
-      this.removeAttribute("mathsize");
-      } else {
-      this.setAttribute("mathsize", "200%");
-      }
-      }
-
-      function load()
-      {
-      document.getElementById("zoomableMath").
-      addEventListener("click", zoomToggle, false);
-      }
-
-      window.addEventListener("load", load, false);
-
-

{{ EmbedLiveSample('Zoomable_Math') }}

-

Considere un marcado interesante como este { u t + f ( u ) x = 0 u ( 0 , x ) = { u - if  x < 0 u + if  x > 0 u otros marcados complejos como estos Ell ^ Y ( Z ; z , τ ) := Y ( l ( y l 2 π i ) θ ( y l 2 π i - z ) θ ( 0 ) θ ( - z ) θ ( y l 2 π i ) ) × ( k θ ( e k 2 π i - ( α k + 1 ) z ) θ ( - z ) θ ( e k 2 π i - z ) θ ( - ( α k + 1 ) z ) ) π ( n ) = m = 2 n ( k = 1 m - 1 ( m / k ) / m / k ) - 1 ϕ W s k ( Ω g ) ( | α | k α ϕ ξ α L s ( Ω g ) s ) 1 / s

-

Para más ejemplos, ve a los enlaces en le página del Proyecto MathML, y sí estás construyendo tu propio binario de Mozilla, ve el directorio - - mozilla - - /layout/mathml/tests - .

-

Ahora, ¿Qué sigue? Mientras pruebas MathML en Mozilla, ¿Qué hacer con esas cosas que parecen no funcionar según la especificación MathML? ¿O con esas cosas que simplemente parecen molestas, y que desearías poder hacer un poco mejor? ¿O con esas cosas que antes funcionaban y ya no funcionan mas (regresiones)? En cualquiera de las casos, dirígete a Bugzilla para reportar las anomalías. Bugzilla tiene gran memoria para estas cosas, además, ¿cómo serían tus problemas solucionados si no son reportados?

-

Involucrarse es parte de tu contribución al enriquecimiento de Gecko con un procesador de MathML de estándares elegantes y obediente. Tu puedes dar tu opinión colocando contenido con MathML en la web, reportando bugs en Bugzilla, y, sí puedes ayudar con código, inspeccionando o mejorando el código existente y/o escogiendo un elemento en la lista de tareas pendientes.

-
-  
diff --git a/files/es/mozilla/mathml_project/status/index.html b/files/es/mozilla/mathml_project/status/index.html deleted file mode 100644 index bee65af721..0000000000 --- a/files/es/mozilla/mathml_project/status/index.html +++ /dev/null @@ -1,325 +0,0 @@ ---- -title: Estado de Mozilla MathML -slug: Mozilla/MathML_Project/Status -translation_of: Mozilla/MathML_Project/Status ---- -

Resumen de los elementos y/o atributos de MathML 3 (excluyendo elementos sin uso) y estado actual del soporte nativo. Se muestran referencias a MathML 3. Las secciones están marcadas con su correspondiente estado: soportado, en progreso, y no soportado actualmente. Las secciones relacionadas a semántica/contenido, MathML o funciones irrelevantes se dejan en blanco o no se muestran en la lista. Si solo la función principal de un elemento esta implementado, esa sección sera marcada como soportado pero los detalles de los atributos no soportados se especifican después.

-

Elementos de nivel superior de Math

-

Vea § 2.2.

- - - - - - - - - - - - - - - - - - - - - - - -
AtributoNotas
displayImplementado.
maxwidth, overflowNo Implementado. Ver {{ Bug("534962") }}.
altimg, altimg-width, altimg-height, altimg-valign, alttextMathML esta siempre activado, por lo que soportar estos atributos es irrelevante. Vea {{ Bug("660762") }}.
cdgroup 
-

Atributos Compartidos por todos los elementos MathML

-

Vea § 2.1.6 y § 3.1.10.

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoNotas
id, class, styleImplementado.
xref 
hrefImplementado en Gecko.  Nota: la interfaz de usuario funciona correctamente en Seamonkey pero no en Firefox. Ver {{ Bug("534968") }}.
mathcolorImplementado.
mathbackgroundImplementado.
-

Elementos de Señalización

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Elemento [- atributo]Notas
miImplementado.
mi - mathvariantParcialmente Implementado. Ver {{ Bug("114365") }}.
mnImplementado.
moImplementado.
mo - linebreaking attributes, indentation attributesNo Implementado. Ver {{ Bug("534962") }}.
mtextImplementado.
mspaceImplementado.
mspace - linebreakNo Implementado. Ver {{ Bug("380266") }}.
msImplementado.
-

Esquema de Diseño General

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Elemento [- atributo]Notas
mrowImplementado.
mfracImplementado.
msqrtImplementado.
mrootImplementado.
mstyleImplementado.
mstyle - lquote, rquoteNo Implementado. Ver {{ Bug("560100") }}.
mstyle - infixlinebreakstyleNo Implementado. Ver {{ Bug("534962") }}.
mstyle - decimalpointNo Implementado.
merrorImplementado.
mpaddedImplementado.
mphantomImplementado.
mfencedImplementado.
mencloseImplementado.
-

Script y Limites esquemáticos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Elemento [- atributo]Notas
msubImplementado.
msupImplementado.
msubsupImplementado.
munderImplementado.
moverImplementado.
munderoverImplementado.
mmultiscriptsImplementado.
-

Cálculos en Tablas

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Elemento [- atributo]Notas
mtableImplementado.
mtable - alignmentscopeNo Implementado. Ver {{ Bug("122253") }}.
mtable - columnspacing, rowspacingNo Implementado. Ver {{ Bug("330964") }}.
mtable - columnwidth, framespacing, equalrows, equalcolumnsNo Implementado.
mtable - side, minlabelspacingNo Implementado. Ver {{ Bug("356870") }}.
mtrImplementado.
mtdImplementado.
* - groupalign.No Implementado. Ver {{ Bug("122253") }}.
maligngroupNo Implementado. Ver {{ Bug("122253") }}.
malignmarkNo Implementado. Ver {{ Bug("122253") }}.
-

Cálculos Elementales

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Elemento [- atributo]Notas
mstackNo Implementado. Ver {{ Bug("534967") }}.
mlongdivNo Implementado. Ver {{ Bug("534967") }}.
msgroupNo Implementado. Ver {{ Bug("534967") }}.
msrowNo Implementado. Ver {{ Bug("534967") }}.
mscarriesNo Implementado. Ver {{ Bug("534967") }}.
mscarryNo Implementado. Ver {{ Bug("534967") }}.
mslineNo Implementado. Ver {{ Bug("534967") }}.
-

Otros Elementos

- - - - - - - - - - - - - - - - - - - - - - - -
Elemento [- atributo]Notas
mglyphNo Implementado. Ver {{ Bug("297465") }}.
mactionImplementado.
maction - tooltipNo Implementado. Ver {{ Bug("544001") }}.
semanticsImplementado en {{geckoRelease("23.0")}}.
-
-

Información Original del Documento

- -
-

 

diff --git a/files/es/mozilla/mathml_project/student_projects/index.html b/files/es/mozilla/mathml_project/student_projects/index.html deleted file mode 100644 index bff715a243..0000000000 --- a/files/es/mozilla/mathml_project/student_projects/index.html +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Proyectos Estudiantiles -slug: Mozilla/MathML_Project/Student_Projects -tags: - - MathML -translation_of: Mozilla/MathML_Project/Student_Projects ---- -

Verano 2012

-

Ver "Como me involucre con Mozilla y mi intento de traer nuevos contribuidores" en el blog de Frédéric para una revisión de contribuciones.

-

MathML Dinámico (Andrii Zui)

-

Andrii ha sido aceptada para el "Google Summer of Code" de 2012.

- -

reconstrucción de mtable (Quentin Headen)

- -

Verano 2011

-

Implantación de nuevas funciones de MathML en el motor de Mozilla (Jonathan Hage)

-

Durante un internado de dos meses, Jonathan trabajó en los siguientes bugs

- -

También agregó soporte para el atributo mpadded@voffset {{ Bug("557474") }} y trabajó también en los elementos munderover:

- -

Finalmente empezó a trabajar en algunos

- -

Los parches Jonathan seran integrados en Firefox 7 u 8. El trabajo restante será finalizado por Frédéric después. Actualmente Jonathan no se encuentra involucrado en el proyecto Mozilla MathML.

-

Verano 2007

-

Mejorar el soporte MathML en Mozilla (Vladimir Sukhoy)

-

El plan de Vladimir's era unir MathML al tronco principal pero era demasiado trabajo para un proyecto de verano, el quería empezar implementando MathML DOM para familiarizarse con el código.

- -

Desafortunadamente la mayoria de sus cambios no han sido integrados al tronco del proyecto. Algunas de las fallas en las que trabajo han sido corregidas por otras personas. Notablemente Karl ha restaurado el soporte MathML en el tronco. DOM fue removido de MathML 3 y no tenemos planes de implementarlo. Vladimir no se encuentra activo en el proyecto Mozilla MathML.

diff --git a/files/es/mozilla/mathml_project/various/index.html b/files/es/mozilla/mathml_project/various/index.html deleted file mode 100644 index b0ae4a4337..0000000000 --- a/files/es/mozilla/mathml_project/various/index.html +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Various MathML Tests -slug: Mozilla/MathML_Project/Various -translation_of: Mozilla/MathML_Project/Various ---- -

Visión en conjunto de la Presentación de los elementos de MathML

- -

Teoría de la dispersión de Thomson

-

d 2 P d Ω s d ω s = r e 2 V < S i > d 3 r | e ^ . Π . e ^ | 2 κ 2 f δ ( k . v - ω ) d 3 v = r e 2 V < S i > d 3 r | 1 - ( 1 - s ^ . ı ^ ) ( 1 - β i ) ( 1 - β s ) β e 2 | 2 | 1 - β i 1 - β s | 2 × ( 1 - β 2 ) f δ ( k . v - ω ) d 3 v

-

Ecuaciones de Maxwell

-

{ × B - 1 c E t = 4 π c j ċ E = 4 π ρ × E + 1 c B t = 0 ċ B = 0

-

Ecuaciones de campo de Einstein

-

R μ ν - 1 2 g μ ν R = 8 π G c 4 T μ ν

diff --git a/files/es/mozilla/opciones_de_linea_de_comandos/index.html b/files/es/mozilla/opciones_de_linea_de_comandos/index.html deleted file mode 100644 index f6873fbb6c..0000000000 --- a/files/es/mozilla/opciones_de_linea_de_comandos/index.html +++ /dev/null @@ -1,448 +0,0 @@ ---- -title: Opciones de línea de comandos -slug: Mozilla/Opciones_de_linea_de_Comandos -tags: - - Administración - - Documentación - - Linea de Comandos - - Preguntas y Respuestas - - extensiones -translation_of: Mozilla/Command_Line_Options ---- -

Las opciones de la línea de comandos se utilizan para especificar opciones de arranque para las aplicaciones de Mozilla. Por ejemplo, es posible utilizar una opcion de la linea de comandos para saltearse el Administrador de Perfiles y abrir un perfil específico (en el caso de tener varios perfiles). También es posible controlar la manera en que las aplicaciones de Mozilla se inician, que componentes se abren inicialmente y que es lo que estos hacen cuando se abren. Esta página describe las opciones mas utilizadas y la manera de usarlas.

- -

Reglas de Sintaxis

- -

Primero vamos a describir las reglas de sintaxis que aplican a todas las opciones.

- - - -

Usando las opciones de linea de comandos

- -

Las opciones de linea de comando son introducidas posteriormente al comando para iniciar la aplicación. Algunas opciones tienen argumentos. Estos son añadidos como opciones de la linea de comandos. Algunas opciones tienen abreviaturas.  Por ejemplo, la opción de linea de comandos "-editor" puede ser abreviada como "-edit". (Cuando las abreviaturas estan habilitada, tal y como esta expuesto mas abajo). En algunos casos sera necesario que los argumentos vayan entrecomillados. (Tal y como se puede contemplar el recuadro inferior.) Se pueden especificar muchas opciones de linea de comandos .  Por lo general la sintaxis es como la que sigue:

- -
application -option -option "argument" -option argument
-
- -

Ejemplos

- -

Los suiguientes ejemplos muestran el uso del comando "-ProfileManager" , esta opción de linea de comando abre el gestor de perfiles de Firefox o Thunderbird:

- -

Windows

- -

Seleccione ejecutar en el menú de inicio y escriba:

- -
firefox -ProfileManager
-
- -

Mac OS X

- -

Vaya a Aplicaciones> Utilidades. Abra un emulador de terminal y tecleé:

- -
cd /Applications/Firefox.app/Contents/MacOS
-./firefox -ProfileManager
-
- -

Linux

- -

Abra un terminal y escriba:

- -
cd Thunderbird installation directory
-./thunderbird -ProfileManager
-
- -

El ejemplo anterior invoca  la opción de linea de comando"-ProfileManager" en el cliente de correo Mozilla Thunderbird.

- -

User Profile

- -

-CreateProfile profile_name

- -

Create a new profile in the default directory, but do not start application. The profile will be named profile_name in the profile manager. profile_name must not contain spaces ( ).

- -
firefox -CreateProfile JoelUser
-
- -

-CreateProfile "profile_name profile_dir"

- -

Creates a new profile in the profile_dir directory, but do not start application. The profile will be named profile_name in the profile manager. Note profile_name and profile_dir are quoted together, and are separated by exactly 1 space (as with the previous syntax, profile_name must not contain spaces).

- -

NOTE: profile_dir must not exist and you must not already have a profile called profile_name.

- -
firefox -CreateProfile "JoelUser c:\internet\joelusers-moz-profile"
-
- -

-ProfileManager

- -

Start with Profile Manager. Short form: -P without a profile name.

- -

-P "profile_name"

- -

Bypass Profile Manager and launch application with the profile named profile_name. Useful for dealing with multiple profiles. Note profile_name is case sensitive. If you don't specify a profile name then the profile manager is opened instead. You must use an upper case P on Linux with versions older than 7.x, as there lower case invokes Purify mode (memory and leak detection). Other platforms accept both upper and lower case.

- -
firefox -P "Joel User"
-
- -

-profile "profile_path"

- -

Start with the profile with the given path. Firefox, Thunderbird and SeaMonkey2.x only.

- -

"profile_path" can either be an absolute path ("/path/to/profile") or a relative path ("path/to/profile").

- -
Note: On Mac OS X specifying a relative path is not supported anymore from Firefox 4.0 and up due to a regression, see {{ bug(673955) }}.
- -

-no-remote

- -

Allows multiple copies of application to be open at a time.

- -
firefox -no-remote -P "Another Profile"
-
- -
Note: Since Firefox 9, this does really mean what its name implies on all platforms, i.e. instances created with this parameter do not accept or send remote commands, see {{ bug(650078) }}. That means that such instances won't be re-used. Also when using this argument a new instance is created in any case.
- -

-migration

- -

Start with Import Wizard.

- -

-override /path/to/override.ini

- -

Load the specified override.ini file to override application.ini ({{ Source("browser/app/application.ini") }}). This can be used to suppress the Migration Wizard at startup by loading the following override.ini. Firefox only.

- -
[XRE]
-EnableProfileMigrator=0
-
- -

Browser

- -

-browser

- -

Start with the browser component. Firefox and SeaMonkey only.

- -

-url URL

- -

Open URL in a new tab or window, depend on the browser option. -url can be omitted. You may list multiple URLs, separated by spaces. Firefox and SeaMonkey only.

- -
Note: When opening multiple URLs, Firefox always opens them as tabs in a new window.
- -
firefox www.mozilla.com
-firefox www.mozilla.com developer.mozilla.org
-
- -

-private

- -

Opens Firefox in permanent private browsing mode. Firefox 3.6 and later only.

- -

Not Applicable in Ubuntu for Firefox 20 and later.

- -

-private-window

- -

Opens a new private browsing window in an existing instance of Firefox. Firefox 20 and later only.

- -

-private-window URL

- -

Open URL in a new private browsing window. If a private browsing window is already open, a new tab is opened in the existing window. Firefox 29 and later only. Does not work in Firefox 31 on linux mint 17 - results in page being opened in non-private window.

- -

-new-tab URL

- -

Open URL in a new tab. Firefox and SeaMonkey2.x only.

- -

-new-window URL

- -

Open URL in a new window. Firefox and SeaMonkey2.x only.

- -

-search term

- -

Search term with your default search engine. Firefox and SeaMonkey 2.1 and later only.

- -

-preferences

- -

Open Options/Preferences window. Firefox and SeaMonkey2.x only.

- -

-setDefaultBrowser

- -

Set the application as the default browser. Firefox only.

- -

Mail/News

- -

-mail

- -

Start with the mail client. Thunderbird and SeaMonkey only.

- -

-news news_URL

- -

Start with the news client. If news_URL (optional) is given, open the specified newsgroup. Thunderbird and SeaMonkey only.

- -
thunderbird -news news://server/group
-
- -

-compose message_options

- -

Start with mail composer. See syntax rules. Thunderbird and SeaMonkey only.

- -
thunderbird -compose "to=foo@nowhere.net"
-
- -

-addressbook

- -

Start with address book. Thunderbird and SeaMonkey only.

- -

-options

- -

Open Options/Preferences window. Thunderbird only.

- -

-offline

- -

Start with the offline mode. Thunderbird and SeaMonkey only.

- -

-setDefaultMail

- -

Set the application as the default email client. Thunderbird only.

- -

Calendar

- -

-calendar

- -

Start with the calendar client. Sunbird only.

- -

-subscribe URL or -url URL

- -

Subscribe to the given URL. Sunbird only.

- -

-showdate date

- -

Show your schedule of the given date. Sunbird only.

- -
sunbird -showdate 08/04/2008
-
- -

Other Components

- -

-editor URL or -edit URL

- -

Start with editor (Composer) for the given URL (where URL is optional). SeaMonkey only.

- -
seamonkey -edit www.mozilla.org
-
- -

-jsdebugger

- -

Start application with Browser Toolbox (formerly Browser Debugger). That is different to Venkman debugger (see option -venkman).

- -


- -jsconsole

- -

Start application with the Error Console.

- -
-

The Error Console is deprecated in Firefox, and is now only made available if you set the devtools.errorconsole.enabled preference to true. Use the Web Console instead, for web content, or the Browser Console for chrome content.

- -

Beginning with Firefox 28, -jsconsole will start Firefox with Browser Console instead.

-
- -

-inspector URL

- -

Start with the DOM Inspector, if installed, and inspect the given URL (where URL is optional).

- -

-venkman

- -

Start with the JavaScript debugger, Venkman, if installed.

- -

-purgecaches

- -

Gecko (layout engine) has a javascript cache, which is not reset on startup. This clears it.

- -

-chat

- -

Start with the IRC client, ChatZilla, if installed.

- -

XULRunner

- -

-app /path/to/application.ini

- -

Start a new process running the XULRunner application at path/to. Also works with Firefox version 3 and above.

- -

--register-global

- -

Registers XULRunner on the system for all users. Must be run as admin / root.

- -

--register-user

- -

Registers XULRunner for a single user.

- -

--unregister-global

- -

Unregisters XULRunner for all users.

- -

--unregister-user

- -

Unregisters XULRunner for a single user.

- -

--install-app path/to/myapplication.(xpi|xulapp)

- -

Installs the XULRunner application at path/to onto the system. Applications are installed into the default location for your system (program files|Applications|usr/lib) at vendorname/applicationName.  Applications may be uninstalled per usual methods for your system.

- -
"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

- -

Load the specified chrome.

- -
firefox -chrome chrome://inspector/content
-
- -

-register chrome_URL

- -

Register the specified chrome, but do not start application.

- -

Add-ons

- -

{{ gecko_minversion_note("1.9.2", "-install-global-extension and -install-global-theme have been removed from Gecko 1.9.2 and upwards.") }}

- -

-install-global-extension /path/to/extension

- -

Installs the extension into the application directory. The parameter is the path to the extension. You must have administrative privileges.

- -

-install-global-theme /path/to/theme

- -

Same as above, but for themes. You must have administrative privileges.

- -
-

Note: Since Firefox 2.0.0.7, use of the -install-global-extension and -install-global-theme command line arguments have been restricted to only allow installing add-ons that are on local disks or mapped drives. Installing from a network share directly will no longer succeed.

-
- -

-safe-mode

- -

Launches the application with all extensions disabled, for that launch only. (Extensions are not loaded, but are not permanently disabled in the Extension Manager data source).

- -

Locale

- -

-UILocale locale

- -

Start with locale resources as UI Locale.

- -
firefox -UILocale en-US
-
- -

Remote Control

- -

-remote remote_command

- -

Execute remote_command in an already running application process (see remote control).

- -
firefox -remote "openURL(www.mozilla.org, new-tab)"
-
- -

Miscellaneous

- -

-tray

- -

Start application minimized to system tray. Useful with autorun.

- -

-silent

- -

Don't open default windows. Useful with those command-line arguments that open their own windows but don't already prevent default windows from opening. Firefox, Thunderbird3.x and SeaMonkey2.x only.

- -

-console

- -

Start application with a debugging console. Note: Windows only.

- -
-

If you would like the console messages to appear in the console you used to launch the application, you can use the Gecko Console Redirector. Precompiled binaries are available in the zipped archive https://github.com/matthewkastor/Redirector/archive/master.zip under Redirector-master\Gecko\Console Redirector\bin\Release Copy all the dll's and the exe to wherever you want. Then run Console Redirector.exe /?

-
- -

-h or -help or -?

- -

Print the list of all available command line options. Note that on Windows this only works with a redirection such as |more ({{ Bug(355889) }}). This option is available only in a command console.

- -

-v or -version

- -

Print application version. Note that on Windows this only works with a redirection such as |more ({{ Bug(355889) }}). This option is available only in a command console.

- -

-osint

- -

Tells the application that it is being launched by the OS shell. This should not be specified unless the caller provides all of the functionality provided by the OS shell when launching the application ({{ Bug(384384) }}).

- -

-requestPending

- -

Tells the application that there will be a Windows DDE request to open the same url specified on the command line. This should not be specified unless the caller provides all of the functionality provided by the OS shell when launching the application ({{ Bug(354005) }}).

- -

X11 options

- -

These options are only available for an application build for and running atop the X11/X.org display and window system to be found on Linux and other Unix-based systems.

- -

--display=DISPLAY

- -

Set the X display to use

- -

--class=WM_CLASS

- -

Set the WM_CLASS resource class of the X11 windows created by the application.

- -

--sync

- -

Make X calls synchronous

- -

--g-fatal-warnings

- -

Make all warnings fatal

- -

Other options need to be documented

- - - -

References

- - - -
-

Original Document Information

- - -
- -


- ciones

diff --git a/files/es/mozilla/participating_in_the_mozilla_project/index.html b/files/es/mozilla/participating_in_the_mozilla_project/index.html deleted file mode 100644 index 846070a7e3..0000000000 --- a/files/es/mozilla/participating_in_the_mozilla_project/index.html +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: Participating in the Mozilla project -slug: Mozilla/Participating_in_the_Mozilla_project -tags: - - bug-840092 -translation_of: Mozilla/Participating_in_the_Mozilla_project ---- -

Si usted esta interesado en ayudar a reparar bugs y  trabajar de otra manera  con el codigo subyacente de la plataforma de Mozilla, este es el lugar para encontrar la documentación que te orientará en la dirección correcta.

- - - - - - - - - - - -
-

Temas Generales

-
-
- Guía para desarrolladores de Mozilla
-
- Consejos de desarrollo y guías para contribuir al código base de Mozilla.
-
- Código fuente de Mozilla
-
- Información sobre cómo obtener el código de Mozilla, ya se mediante descarga o mediante el control de versiones, y cómo obtener el código en el árbol.
-
- Construir Documentación
-
- Información sobre cómo contruir los proyectos de Mozilla, como Firefox y Thunderbird. Esta página necesita limpieza.
-
- La plataforma de Mozilla
-
- Información sobre la plataforma de Mozilla, incluyendo la totalidad de su APIs y tecnologías, así como la forma de utilizarlos en sus propios proyectos.
-
- Documentación de Mozilla
-
- Ayudanos a crear y mejorar nuestra documentación para Mozilla y la Web Abierta.
-
- Depuración
-
- Consejos útiles y directrices a seguir para depurar el código de Mozilla.
-
- Aseguramiento de la calidad
-
- Información sobre pruebas y bug tracking.
-
- Localización
-
- Documentación sobre tradución de los  proyectos de Mozilla, documentación y otros contendos en multiples idiomas.
-
- Glosario
-
- Terminos y definiciones usado por los hackers de Mozilla.
-
-

Páginas del proyecto

-
-
- Thunderbird
-
- Cliente de correo electrónico de Mozilla
-
- Sunbird
-
- Proyecto de calendario de Mozilla
-
-
-

Herramientas

-
-
- Bugzilla
-
- Bugzilla es la base de datos utilizado para rastrear temas para proyectos de Mozilla.
-
- MXR
-
- Examinar y buscar el repositorio de código fuente de Mozilla en la web.
-
- Bonsai
-
- Bonsai la herramienta que permite saber quíen cambió qué archivo en el repositorio, y cuando lo hicieron.
-
- (Esto  es para Firefox 3.0 en adelante.)
-
- Tinderbox
-
- Tinderbox muestra el estado de el árbol (si es o no actualmente se genera correctamente). Comprueba esto antes del registro de salida, para asegurarse de que está funcionando con el árbol de trabajo.
-
- Seguimiento de accidente
-
- Informacion sobre el sistema de notificaciones de accidente Socorro.
-
- Seguimiento del rendimiento
-
- Ver la información del rendimiento para los proyectos de Mozilla.
-
- Foros para Desarroladores
-
- Una lista de temas especificos de los foros de discusión donde se pueda hablar de los temas de desarrollo de Mozilla.
-
-
  
-

 

diff --git a/files/es/mozilla/persona/branding/index.html b/files/es/mozilla/persona/branding/index.html deleted file mode 100644 index 5b8b5255ea..0000000000 --- a/files/es/mozilla/persona/branding/index.html +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Recursos de marca -slug: Mozilla/Persona/branding -translation_of: Archive/Mozilla/Persona/User_interface_guidelines ---- -

Inicia sesión con los botones de Persona

-

Imágenes

-

Los botones de "Inicio de sesión" están disponibles en tres versiones, y tres colores:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Iniciar sesión con tu correoIniciar sesión con PersonaIniciar sesión
Negro
Azul
Red
-

Basados en CSS

-

Sawyer Hollenshead ha creado un conjunto de excelentes botones basados en CSS. Descarga (.zip)

-

Más información

-

Puedes encontrar más información sobre el diseño visual de Persona en manual de estilo de Sean Martell.

diff --git a/files/es/mozilla/persona/browser_compatibility/index.html b/files/es/mozilla/persona/browser_compatibility/index.html deleted file mode 100644 index f9e916c23c..0000000000 --- a/files/es/mozilla/persona/browser_compatibility/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Compatibilidad de navegadores -slug: Mozilla/Persona/Browser_compatibility -translation_of: Archive/Mozilla/Persona/Browser_compatibility ---- - -

Persona está desarrollado, probado y es compatible con los siguientes navegadores. Gracias a la biblioteca JavaScript multiplataforma de Persona, los usuarios no necesitan complementos para poderlo usar.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Navegadores de escritorio
Internet Explorer8.0*, 9.0
FirefoxActual estable, Beta, Aurora, Nightly, y versiones ESR
- Versión anterior estable
ChromeÚltima versión estable
SafariÚltima versión estable
OperaÚltima versión estable
Navegadores en iOS
Mobile SafariiOS 5.x — 6.x
Navegadores en Android
Navegador predeterminado2.x — 4.x
FirefoxActual estable, Beta, Aurora, y versiones
- Versión anterior estable
ChromeÚltima versión estable
-

*: En Windows XP. : En Windows Vista y Windows 7. : Siempre que se pueda.

- - -

Otros navegadores

-

Aunque no se indique explicitamente, cualquier navegador que incluya tanto {{ domxref("window.postMessage()") }} y {{ domxref("Storage", "localStorage") }} debería funcionar. Estas APIs están disponibles en la mayoría de los navegadores desde marzo de 2010.

-

Problemas conocidos

- diff --git a/files/es/mozilla/persona/faq/index.html b/files/es/mozilla/persona/faq/index.html deleted file mode 100644 index b015db56ef..0000000000 --- a/files/es/mozilla/persona/faq/index.html +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Preguntas más frecuentes -slug: Mozilla/Persona/FAQ -tags: - - Persona -translation_of: Archive/Mozilla/Persona/FAQ ---- -

¿Cuál es la diferencia entre Mozilla Persona y BrowserID?

-

Persona es una implementación completa de un nuevo sistema de acceso distribuido de Mozilla.

-

BrowserID es el protocolo abierto que rige el funcionamiento de Persona.

-

Como una analogía: Persona permite a los usuarios iniciar sesión en los sitios que implementan BrowserID. De la misma manera, Firefox permite a los usuarios navegar por la web implementando HTTP.

-

¿Cómo se compara Persona con OpenID?

-

Persona y OpenID tienen objetivos muy similares y una arquitectura similar. Ambos sistemas reducen el número de contraseñas que un usuario necesita, y ambos están diseñados para ser descentralizados. Esto quiere decir que cualquier dominio puede presentarse como proveedor de identidad sin depender de una autoridad central.

-

A pesar de estas similitudes, Persona es más fácil de usar y más fácil de añadir a los sitios web. Persona también protege mejor la privacidad de los usuarios. En concreto:

-
-
- Persona es más fácil para los usuarios
-
- Persona identifica los usuarios basándose en las direcciones de correo electrónico, que los usuarios ya conocen, comprenden y asocian naturalmente con las identidades en línea. Con OpenID, los usuarios se ven obligados a aprender un nuevo nombre de usuario: una URL que no es intuitiva.
-
- Iniciar sesión mediante Persona también es fácil: después de haberse configurado la primera vez, sólo son necesarios 2 clics para autenticarse.
-
- Persona es más fácil para los desarrolladores
-
- Persona tiene una {{ domxref("navigator.id", "API simple") }} que sólo toma una tarde para entender y empezar a usar.
-
- Las identidades Persona son direcciones de correo electrónico, por lo tanto, los sitios web no necesitan pedir a los usuarios más información de contacto durante el registro.
-
- Dado que los usuarios conocen y entienden su dirección de correo electrónico, los desarrolladores no tienen que construir páginas complejas con botones de inicio de sesión para todos los proveedores populares de OpenID.
-
- Persona protege mejor la privacidad del usuario
-
- Por su diseño, OpenID permite a los proveedores de identidad rastrear a sus usuarios en la web: cada vez que un usuario inicia sesión en un sitio web, el navegador se redireccionado al proveedor de identidad del usuario, y luego se redirecciona otra vez al sitio. Estas redirecciones exponen completamente al proveedor de identidad la información de a donde va el usuario.
-
- En contraste, el protocolo BrowserID nunca filtra información de seguimiento hacia el proveedor de identidad. Más bien, se comporta de una manera similar al de una tarjeta de identificación: los usuarios obtienen credenciales firmadas de sus proveedores de identidad, que se pueden presentar a los sitios web como prueba de identidad. Los sitios web pueden comprobar la validez de las credenciales sin tener que revelar la identidad de un usuario a su proveedor de identidad.
-
-

¿Por qué Persona requiere JavaScript?

-

Persona requiere JavaScript, pero algunos usuarios optan por bloquear selectivamente desactivar el JavaScript mediante el uso de complementos del navegador como NoScript. Muchos de estos usuarios están preocupados por las implicaciones de privacidad de tener habilitado JavaScript, ya que este se utiliza a menudo para rastrear a los visitantes a través de sitios web.

-

Sin embargo, en el caso de Persona, el JavaScript se utiliza realmente para mejorar la privacidad del usuario, ya que permite al navegador realizar operaciones criptográficas en el lado del cliente. Al hacer estas operaciones en el cliente, Persona evita la necesidad de almacenar las claves privadas en otro lugar que no sea en el propio navegador del usuario.

-

¿Persona garantiza la obtención de una dirección de correo electrónico válida para mis usuarios?

-

 

-

No, Persona sólo garantiza la asociación del usuario con una dirección. Al igual que con cualquier dirección de correo electrónico en cualquier sistema de inicio de sesión, es posible que la dirección ya no funcione o no sea comprobada regularmente por el usuario. Para la mayoría de los usuarios, la dirección de correo electrónico será funcional.

-

¿Como verifica Persona la asociación de un usuario con una dirección?

-

Persona le hace una petición al dominio de la dirección, y este es libre de verificar sus usuarios de la manera que elija. Si el dominio no es un proveedor de identidad nativo, y por tanto, no puede verificar sus propios usuarios, el navegador solicita la verificación al proveedor de identidad de reserva (fallback) de Persona a https://login.persona.org. Antes de certificar la identidad de un usuario, el proveedor de identidad de reserva prueba la dirección, enviándole un correo electrónico, y pídiendole al usuario que haga clic en el enlace que éste contiene.

-

¿Cómo manejar la recuperación de la cuenta si los usuarios pierden el control de su correo electrónico?

-

La mejor manera de hacerlo es permitir a los usuarios añadir una dirección de correo electrónico secundaria en su cuenta. Ver "Adición de direcciones de correo electrónico adicionales con Persona".

-

¿Puedo alojar yo mismo include.js, o la tengo que incluir desde https://login.persona.org?

-

El código a include.js aún está sujeto a cambios. No se recomienda que se aloje en ningún servidor propio.

-

¿Puedo verificar las afirmaciones a nivel local, o tengo que usar el servicio de verificación remoto?

-

Para garantizar la privacidad de los usuarios, es importante que las aserciones de identidad se verifiquen a nivel local, y no con el servicio de verificación remota. Sin embargo, el formato de las afirmaciones aún está sujeta a cambios, por lo que la verificación local aún no es recomendable. Aun con la verificación remota, Persona protege al usuario de seguimiento con su proveedor de identidad.

-

Una vez que el protocolo se haya estabilizado, las bibliotecas estarán disponibles para simplificar la verificación local. Siga el Blog de Identity para saber cuándo es recomendable la verificación local.

-

¿Qué consejos hay para la migración de los usuarios que actualmente utilizan otros métodos de inicio de sesión?

-

A pesar de los beneficios de Persona, nunca es fácil mover todos los usuarios a un nuevo sistema de inicio de sesión. Convenientemente, el enfoque que hace Persona con las direcciones de correo electrónico hace que sea fácil de usar junto con los sistemas de acceso ya existentes, por lo que no hace falta cambiar a todos a la vez.

-

Un enfoque particular de baja fricción es sugerir Persona a usuarios que no recuerden su contraseña. En lugar de restablecer las contraseñas, los usuarios sólo tienen que acceder con Persona.

-

¿Como he de señalar que "Sign In" también permite la creación de cuentas nuevas?

-

¿Cómo puedo obtener información sobre cambios importantes en BrowserID, como APIs nuevas u obsoletas?

-

Cuando un cambio que rompe la compatibilidad hacia atrás o una función queda obsoleta, se anuncia a la lista de correo persona-notices. Suscríbete.

-

Para obtener información sobre las nuevas funciones y mejoras, sigue el blog del equipo identity.

-

Para la discusión de desarrollo, suscríbete a la lista de correo dev-identity.

diff --git a/files/es/mozilla/persona/glosario/index.html b/files/es/mozilla/persona/glosario/index.html deleted file mode 100644 index 41f36a0f20..0000000000 --- a/files/es/mozilla/persona/glosario/index.html +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Glosario -slug: Mozilla/Persona/Glosario -translation_of: Archive/Mozilla/Persona/Glossary ---- -

"Persona" vs. "BrowserID"

-

Persona es una implementación completa de un nuevo sistema de acceso distribuido, desde Mozilla.

-

BrowserID es el protocolo abierto que rige cómo funciona Persona.

-

Terminología Común De Persona

-
-
- BrowserID
-
-
-
- Un protocolo descentralizado abierto para autenticar a los usuarios sobre la base de direcciones de correo electrónico.
-
-
-
- Proveedor de identidad ("IdP")
-
-
-
- Servicios que expiden credenciales a sus usuarios.
-
-
-
- Los proveedores de correo electrónico pueden convertirse en proveedores de identidad de sus usuarios mediante la adición de soporte para el protocolo de autenticación BrowserID a su servicio. Si un proveedor de correo electrónico no admite Persona, Mozilla cuenta con un proveedor de identidad de reserva en login.persona.org.
-
- login.persona.org
-
- Un proveedor de identidad de reserva dirigido por el equipo de Identidad de Mozilla.
-
- Persona
-
- El nombre de cara al usuario de una suite completa de servicios relacionados con la identidad de Mozilla, entre ellos el proveedor de identidad de reserva operada por Mozilla. Los usuarios finales no deben ver el término "BrowserID."
-
- Persona puede eventualmente incluir características más allá del protocolo BrowserID, como partes de Firefox Sync o un cuadro de mandos para Open Web Apps.
-
-

Parte Dependiente ("RP")
-      Cualquier sitio web, aplicación o servicio que permite a los usuarios iniciar sesión a través de Persona.

-

Proyecto Codenames

-
-
- BigTent
-
- Un conjunto de tres proveedores de identidad de repliegue que avalan a los usuarios de Hotmail, Gmail y Yahoo Mail, respectivamente. BigTent opera cerrando el protocolo BrowserID con OpenID o OAuth para cada proveedor de correo electrónico. Fuente disponible en https://github.com/mozilla/browserid-bigtent.
-
- Vinz Clortho
-
- Un proveedor de identidad de direcciones de correo electrónico para @mozilla.com y @mozilla.org . Funciona mediante la consulta LDAP. Fuente disponible en https://github.com/mozilla/vinz-clortho. El nombre es una referencia de una película de 1984 llamada Ghostbusters.
-
-

Terminología Persona Poco Frecuente

-
-
- Autoridad Primaria ("Principal")
-
- Término en desuso para los proveedores de correo electrónico que también son capaces de actuar como proveedores de identidad.
-
- Autoridad Secundaria ("Secundario")
-
- Término en desuso para un repliegue de proveedores de identidad que pueden dar fe de los usuarios, cuyos proveedores de correo electrónico no son proveedores de identidad. Mozilla cuenta con un proveedor de identidad de reserva en login.persona.org.
-
- Verificador De Protocolo De Email
-
- Un viejo nombre, difunto para el protocolo BrowserID.
-
diff --git a/files/es/mozilla/persona/index.html b/files/es/mozilla/persona/index.html deleted file mode 100644 index 66c9c3a1e2..0000000000 --- a/files/es/mozilla/persona/index.html +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: Persona -slug: Mozilla/Persona -tags: - - Individuo - - Objeto - - Persona -translation_of: Archive/Mozilla/Persona ---- -
-

Contacta o pide ayuda

- -

Sigue nuestro blog, únete a nuestra lista de correo, o encuéntranos en #identity en IRC.

-
- -

Mozilla Persona es un sistema de autenticación para la web completamente descentralizado y seguro basado en el protocolo abierto de BrowserID. Para asegurarse que Mozilla Persona trabaja en cualquier lugar y que puede ser usado por cualquiera, Mozilla actualmente opera con una pequeña suite de servicios optativos y centralizados relacionados con Mozilla Persona.

- -

¿Por qué deberías usar Mozilla Persona en tu sitio web?

- -
    -
  1. Mozilla Persona elimina por completo las contraseñas específicas para los sitios web, lo que libera a los usuarios y a las páginas web de tener que crear, administrar y guardar de manera segura las contraseñas.
  2. -
  3. Mozilla Persona es fácil de usar. Con tan solo dos clics un usuario de Mozilla Persona puede identificarse en un sitio web nuevo como Voost o The Times Crossword,  lo que elimina la fricción que se asocia a la creación de nuevas cuentas.
  4. -
  5. Mozilla Persona es fácil de implementar. Cualquier desarrollador puede agregar Mozilla Persona a una página web en una tarde.
  6. -
  7. Y lo mejor de todo, no tiene un efecto candado. Los desarrolladores obtienen una dirección de correo verificada para todos sus usuarios y, a su vez, los usuarios pueden utilizar cualquier dirección de correo que deseen con Mozilla Persona
  8. -
- -

¡Sigue leyendo para saber cómo comenzar!

- -
Nota: Persona está actualmente en desarrollo activo. Sigue nuestro blog para descubrir nuevas características, o ¡únete a nuestra lista de correo y danos tu opinión!
- -

Usar Mozilla Persona en tu sitio

- - - - - - - - - - - - -
-

Comenzar

- -
-
¿Por qué Mozilla Persona?
-
Descubre los motivos para implementar Mozilla Persona en tu web, así como las diferencias con otros sistemas de identidad y autenticación.
-
Inicio rápido
-
Un paseo rápido para mostrar cómo añadir Mozilla Persona a tu sitio web.
-
-
-

Referencia a la API Mozilla Persona

- -
-
The navigator.id API reference
-
Referencia al objeto navigator.id, el cual pueden utilizar los desarrolladores web para integrar Persona en sus sitios web.
-
Verification API reference
-
Referencia para la API de verificación remota alojada en https://verifier.login.persona.org/verify.
-
-
-

Guías

- -
-
Consideraciones de seguridad
-
Prácticas y técnicas para asegurar un despliegue seguro de Persona.
-
Compatibilidad de navegadores
-
Descubre qué navegadores son compatibles con Persona.
-
Internacionalización
-
Descubre cómo Persona maneja diferentes idiomas.
-
-
-

Recursos

- -
-
Bibliotecas y complementos
-
Encuentra la biblioteca para tu lenguaje de programación favorito, framework web, blog o sistema de gestión de contenido (CMS).
-
The Persona cookbook
-
Ejemplos de código fuente para sitios con Persona. Incluye snippets en PHP, Node.JS y más.
-
Branding resources
-
Botones de inicio de sesión y otros gráficos para ayudarte a presentar Persona a tus usuarios.
-
-
- -

 

- - - - - - - - -
-

Información para proveedores de identidad

- -

Si usted es un proveedor de correo u otro proveedor de servicios de identidad, vea los siguientes enlaces para aprender acerca de convertirse en un Proveedor de Identidad Persona.

- -
-
Informaciòn general deIdP
-
Una vista de alto nivel de los Proveedores de Identidad Persona.
-
Implementando un IdP
-
Una guía detallada sobre los detalles técnicos de convertirse en IdP.
-
Consejos de desarrollo
-
Un conjunto de consejos y trucos útiles para el desarrollo de un nuevo Proveedor de Identidad.
-
.well-known/browserid
-
Información general de la estructura y propósito del archivo de .well-known/browserid, el cual IdPs usa para anunciar el soporte para el protocolo.
-
-
-

El proyecto Mozilla Persona

- -
-
Glosario
-
Definición de los términos BrowserID y Persona.
-
FAQ
-
Respuestas a preguntas frecuentes.
-
Información general del protocolo
-
Descripción técnica a nivel medio del protocolo Persona subyacente
-
Crypto
-
Una mirada a los conceptos criptográficos detrás de Persona y BrowserID.
-
La especificación
-
Profundos detalles técnicos viven aquí.
-
El sitio web de Persona
-
Para hacer funcionar a Persona, estamos hosteando trés servicios en https://login.persona.org: un Proveedor de Identidad en caso de fallos, una implementación portable de las APIs de {{ domxref("navigator.id") }} y un servicio de verificación de afirmación de identidad.
-
El código fuente de Persona
-
El código detrás del sitio web de Persona vive en un repositorio de GitHub. Los pedidos de pull son bienvenidos!
-
-
- -

 

diff --git "a/files/es/mozilla/persona/informaci\303\263n_general_idp/index.html" "b/files/es/mozilla/persona/informaci\303\263n_general_idp/index.html" deleted file mode 100644 index 1befe0db1a..0000000000 --- "a/files/es/mozilla/persona/informaci\303\263n_general_idp/index.html" +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Información general del Proveedor de Identidad -slug: Mozilla/Persona/Información_general_IdP -tags: - - Persona -translation_of: Archive/Mozilla/Persona/Identity_Provider_Overview ---- -

Un proveedor de identidad Persona (IdP) es un dominio que firma y certifica directamente la identidad de sus usuarios. Como las identidades Persona están basadas en direcciones de correo electrónico, es un paso natural para cualquier dominio que ofrezca correo electrónico convertirse en IdP.

-

Si usted tiene un nombre de dominio, puede convertirse en un IdP de Persona implementando el soporte para el protocolo BrowserID.

-

El documento de apoyo IdP

-

Los dominios anuncian su capacidad de actuar como IDPs mediante la publicación de un documento de apoyo en /.well-known/browserid. Este documento formateado con JSON contiene tres valores:

- -

Los sitios web utilizan la clave pública para verificar la autenticidad de las aserciones de identidad de los usuarios.

-

Los navegadores utilizan los valores autenticación y aprovisionamiento para obtener la certificación de identidad de los usuarios.

-

Para obtener más información, incluyendo cómo los dominios pueden delegar en otros IdP, véase la /.well-known/browserid documentation.

-

Cómo interactúan los navegadores con los IDPs

-

Para demostrar cómo los navegadores y los IDPs interactúan, veamos qué pasa la primera vez que alice@example.com utiliza Persona para iniciar sesión en un sitio web.

-
    -
  1. El navegador de Alice obtiene el documento de soporte de https://example.com/.well-known/browserid.
  2. -
  3. El navegador de Alice carga de manera invisible la página de aprovisionamiento d'example.com, pidiéndole que firme una clave pública certificando la identidad de Alice.
  4. -
  5. Antes de firmar la clave, example.com necesita pruebas de que el usuario realmente es Alice, así que le indica al navegador que ella necesita autenticarse.
  6. -
  7. El navegador de Alice le muestra a Alice la página de autenticación de example.com y ella inicia sesión, estableciendo una nueva sesión a example.com.
  8. -
  9. El navegador de Alice vuelve a cargar la página de aprovisionamiento y de nuevo le pide que firme la clave pública que certifica la identidad de Alice.
  10. -
  11. La página de aprovisionamiento puede verificar la identidad de Alice inspeccionando la sesión recién creada. Satisfecha, firma un certificado que contiene la clave pública de Alice, su dirección de correo electrónico, y una fecha de caducidad del certificado.
  12. -
-

Durante la vigencia del certificado firmado, el navegador de Alice puede crear aserciones de identidad válidos para alice@example.com cada vez que quiere acceder a un sitio web con Persona.

-

Los pasos 3-5 pueden ser omitidos si Alice ya tiene una sesión válida con example.com, por ejemplo, si ha iniciado sesión en el correo web o un portal de intranet.

-

Cómo interactúan los sitios web con los IDPs

-

Supongamos que Alice quiere acceder a 123done.org. Su navegador genera y firma una aserción de identidad que contiene el certificado de más arriba y que presenta como prueba de su identidad.

-

Al comparar la firma de la aserción de identidad de Alice con la clave pública en el interior del certificado firmado, 123done puede estar seguro de que el certificado ha sido emitido para la misma persona que ha generado la aserción de identidad. Sin embargo, 123done aún debe comprobar que el certificado es válido examinando la firma.

-

Como el certificado ha sido emitido para alice@example.com, 123done coge el documento de soporte de https://example.com/.well-known/browserid. Extrae la clave pública y la compara con la firma del certificado de Alice. Si la clave coincide con la firma, 123done sabe que el certificado es legítimo y puede finalmente permitir que Alice inicie sesión.

-

Tenga en cuenta que 123done no "ha llamado nunca por teléfono a casa" o ha revelado de ninguna otra manera la identidad de Alice cuando ella ha iniciado sesión. Tan sólo ha necesitado pedir un simple documento a example.com que además puede ser guardado en la memoria caché.

-

Seguridad y confianza

-

El protocolo BrowserID, y por tanto Persona, se basan en técnicas estándar de criptografía de clave pública.

-

Puede consultar nuestra documentación sobre los conceptos criptográficos que hay detrás de cómo funcionan los IdP de Persona o puede leer los detalles sobre cómo están implementados los IDPs.

diff --git a/files/es/mozilla/persona/quick_setup/index.html b/files/es/mozilla/persona/quick_setup/index.html deleted file mode 100644 index c12d2000d4..0000000000 --- a/files/es/mozilla/persona/quick_setup/index.html +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: Configuración rápida -slug: Mozilla/Persona/Quick_Setup -translation_of: Archive/Mozilla/Persona/Quick_Setup ---- -

Agregar el sistema de identificación de Mozilla Persona a tu sitio web solo requiere seguir estos cinco pasos:

- -
    -
  1. Incluye en tus páginas la biblioteca JavaScript de Mozilla Persona.
  2. -
  3. Agrega los botones "conectar" y "desconectar".
  4. -
  5. Presta atención a las acciones de conexión y desconexión.
  6. -
  7. Comprueba las credenciales de los usuarios.
  8. -
  9. Revisa las buenas prácticas.
  10. -
- -

Con esto deberías poder ponerlo en funcionamiento en una sola tarde, pero lo primero es lo primero: si vas a usar Mozilla Persona en tu sitio, por favor, dedica unos minutos a suscribirte a la lista de correo de Mozilla Persona. Tiene muy poco tráfico ya que solo se usa para anunciar cambios o cuestiones relacionadas con la seguridad que pueden tener un impacto negativo sobre tu sitio.

- -

Paso 1: Incluye la biblioteca de Persona

- -

Persona está diseñado para no depender del navegador y funciona correctamente con la todos los naveadores de escritorio y móviles modernos. Esto es posible gracias a la biblioteca JavaScript multiplataforma de Persona. Una vez que se carga ésta biblioteca en tu página, las funciones de Persona que necesitas ({{ domxref("navigator.id.watch()", "watch()") }}, {{ domxref("navigator.id.request()", "request()") }}, y {{ domxref("navigator.id.logout()", "logout()") }}) estarán disponibles en el objeto global navigator.id.

- -

Para incluir la biblioteca JavaScript de Persona, puedes colocar ésta etiqueta script en el head de tu página:

- -
<script src="https://login.persona.org/include.js"></script>
-
- -

Debes incluir esto en todas las páginas que usen las funciones {{ domxref("navigator.id") }}. Debido a que Persona está aún en desarrollo, no debes alojar en tu servidor el archivo include.js.

- -

Paso 2: Añadir botones de inicio  y cierre de sesión

- -

Debido a que Persona está diseñado como una API DOM, debes ejecutar funciones cuando un usuario haga clic en los botones de inicio y cierre de sesión en tu web. Para abrir un diálogo de Persona y pedir que el usuario inicie sesión, debes ejecutar {{ domxref("navigator.id.request()") }}. Para cerrar sesión, ejecuta {{ domxref("navigator.id.logout()") }}.

- -

Por ejemplo:

- -
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(); };
-};
-
- -

¿Cómo deben ser esos botones? Da un vistazo a nuestra página de recursos de marca para conseguir imágenes y botones css predefinidos.

- -

Paso 3: Vigilar las acciones de inicio y cierre de  sesión

- -

Para que Persona funcione, necesitas indicarle qué hacer cuando un usuario inicia o cierra sesión. Este se puede realizar llamando a la función {{ domxref("navigator.id.watch()") }} y pasandole tres parámetros:

- -
    -
  1. -

    El loggedInEmail del actual usuario de tu sitio, o null si no existe. Deberías generar esto dinámicamente cuando la página es pintada.

    -
  2. -
  3. -

    Una función a la que invocar cuando la acción onlogin es desencadenada. Esta función se pasa como un parámetro único, una "afirmación de identidad", que debe ser verificada.

    -
  4. -
  5. -

    Una función a la que invocar cuando la acción onlogout es desencadenada. En esta función no se pasa ningún parámetro.

    -
  6. -
- -
-

Nota: Siempre tienes que incluir ambas funciones, onlogin y onlogout, cuando llames a {{ domxref("navigator.id.watch()") }}.

-
- -

Por ejemplo, si actulamente crees que Bob ha iniciado sesión en tu sitio, puedes hacer esto:

- -
var currentUser = 'bob@example.com';
-
-navigator.id.watch({
-  loggedInEmail: currentUser,
-  onlogin: function(assertion) {
-    // Un usuario ha iniciado sesión!  Aquí necesitas:
-    // 1. Enviar la verificación a tu servidor para verificar y crear la sesión.
-    // 2. Actualizar la interfaz de usuario.
-    $.ajax({ /* <-- Este ejemplo utiliza Jquery, pero usar lo que más te guste */
-      type: 'POST',
-      url: '/auth/login', // Esta es la URL de tu servidor.
-      data: {assertion: assertion},
-      success: function(res, status, xhr) { window.location.reload(); },
-      error: function(res, status, xhr) { alert("login failure" + res); }
-    });
-  },
-  onlogout: function() {
-    // Un usuario ha cerrado sesión. Aqui necesitas:   // Salir de la sesión redirigiendo al usuario o haciendo una llamada a tu servidor.
-    $.ajax({
-      type: 'POST',
-      url: '/auth/logout', // Esta es la URL de tu servidor.
-      success: function(res, status, xhr) { window.location.reload(); },
-      error: function(res, status, xhr) { alert("logout failure" + res); }
-    });
-  }
-});
-
- -

En este ejemplo, ambas funciones, onlogin y onlogout,  son implementeadas por una petición asíncrona POST al servidor del sitio. El servidor registra la entrada o salida del usuario usualmente ajustando o eliminando información de la cookie de sesión. Entonces, si todo ha sido verificado, la página recargará para acceder al nuevo estado de sesión de la cuenta.

- -

Puedes usar AJAX para implementar esto sin necesidad de recargar o redirigir la página, pero eso queda fuera del alcance de este tutorial.

- -

Tienes que llamar a esta función en cada página con un botón de inicio o cierre de sesión. Para dar soporte a mejoras de Persona, como el inicio de sesión automático y el cierre de sesión global para los usuarios, deberás llamar a esta función en cada página de tu sitio.

- -

Paso 4: Comprueba las credenciales de los usuarios

- -

En lugar de contraseñas, Persona utiliza "declaraciones de identidad", que son algo así como contraseñas de un solo uso y un solo sitio combinadas con la dirección de correo electrónico del usuario. Cuando un ususario desea iniciar sesión, tu función de retorno onlogin será invocada con una declaración de ese usuario. Antes de que le inicies sesión, debes verificar que la declaración es válida.

- -

Es extremadamente importante que verifiques la declaración en tu servidor, y no en el código JavaScript ejecutándose en el navegador del usuario, debido a que podría ser fácil de falsificar. El ejemplo de arriba envió la declaración al servidor del sitio utilizando la función $.ajax() de jQuery para hacer POST en /api/login.

- -

Una vez que tu servidor tiene la declaración, ¿cómo la verificas? La manera más fácil es utilizando un servicio de ayuda provisto por Mozilla. Simplemente envía una solicitud POST a https://verifier.login.persona.org/verify con dos parámetros:

- -
    -
  1. assertion: La declaración de identidad provista por el usuario.
  2. -
  3. audience: El nombre y puerto de tu sitio. Debes establecer rígidamente este valor en tu código de servidor; no lo derives de ningún dato suministrado por el usuario.
  4. -
- -

Por ejemplo, si eres example.com, puedes utilizar la línea de comandos para probar una declaración con:

- -
$ curl -d "assertion=<ASSERTION>&audience=https://example.com:443" "https://verifier.login.persona.org/verify"
-
- -

Si es válida, obtendrás una respuesta JSON como la siguiente:

- -
{
-  "status": "okay",
-  "email": "bob@eyedee.me",
-  "audience": "https://example.com:443",
-  "expires": 1308859352261,
-  "issuer": "eyedee.me"
-}
-
- -

Puedes aprender mas acerca del servicio de verificación leyendo La API del Servicio de Verificación. Un ejemplo la implementación de /api/login, utilizando Python, el framework web Flask, y la librería Requests HTTP se vería así:

- -
@app.route('/api/login', methods=['POST'])
-def login():
-    # The request has to have an assertion for us to verify
-    if 'assertion' not in request.form:
-        abort(400)
-
-    # Send the assertion to Mozilla's verifier service.
-    data = {'assertion': request.form['assertion'], 'audience': 'https://example.com:443'}
-    resp = requests.post('https://verifier.login.persona.org/verify', data=data)
-
-    # Did the verifier respond?
-    if resp.ok:
-        # Parse the response
-        verification_data = json.loads(resp.content)
-
-        # Check if the assertion was valid
-        if verification_data['status'] == 'okay':
-            # Log the user in by setting a secure session cookie
-            session.update({'email': verification_data['email']})
-            return resp.content
-
-    # Oops, something failed. Abort.
-    abort(500)
-
- -

El manejo de sesiones es probablemente muy similar a tu sistema actual de login. El primer gran cambio está en la verificación de la identidad del usuario revisando una aserción en vez de revisar un password. El otro gran cambio es asegurarse que la dirección de email del usuario está disponible para usarse en el parametro loggedInEmail para {{ domxref("navigator.id.watch()") }}.

- -

El Logout es simple: Solo necesitas remover la cookie de la sesión del usuario.

- -

Paso 5: Revisa las mejores prácticas

- -

Una vez que todo funciona y has logrado iniciar y cerrar sesion satisfactoriamente en tu sitio, debes de tomarte un momento para revisar las mejores prácticas para usar Persona de forma segura.

- -

Si estás  haciendo un sitio listo para producción, tal vez quieras hacer pruebas de integración que simulan un usuario entrando y saliendo de tu sitio utilizando BrowserID. Para facilitar esta acción en Selenium, considera la librería bidpom. Los sitios mockmyid.com y personatestuser.org también son útiles.

- -

Por último, no olvides enrolarte en la lista de correos de Noticias de Persona para que seas notificado de cualquier problema de seguridad o cambios de incopatibilidad con versiones anteriores de la API de persona. La lista es extremadamente de poco tráfico: es solo utilizada para anunciar cambios que pueden impactar en tu sitio.

diff --git a/files/es/mozilla/persona/remote_verification_api/index.html b/files/es/mozilla/persona/remote_verification_api/index.html deleted file mode 100644 index e2a00c4856..0000000000 --- a/files/es/mozilla/persona/remote_verification_api/index.html +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: Remote Verification API -slug: Mozilla/Persona/Remote_Verification_API -tags: - - Ochoa -translation_of: Archive/Mozilla/Persona/Remote_Verification_API ---- -

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

- -

Summary

- -

When a user tries to log into a website, their browser generates a data structure called an assertion, which is essentially a cryptographically signed email address. The browser sends this assertion to the website, which must verify that the assertion is valid before logging the user in.

- -

Assertions can be verified locally, or with an API hosted at https://verifier.login.persona.org/verify. This page describes how to use the API.

- -

Method

- -

HTTP POST request to https://verifier.login.persona.org/verify.

- -

Parameters

- -
-
assertion
-
The assertion supplied by the user. Available as the first parameter passed to the onlogin function in navigator.id.watch().
-
audience
-
The protocol, domain name, and port of your site. For example, "https://example.com:443".
-
- -

Return values

- -

The call returns a JSON structure containing a status element, which may be either "okay" or "failure". Depending on the value of status, the structure contains additional elements listed below.

- -

"okay"

- -

The assertion is valid.

- -

In this case the JSON structure contains the following additional elements:

- - - - - - - - - - - - - - - - - - - - -
"email"The address contained in the assertion, for the intended person being logged in.
"audience"The audience value contained in the assertion. Expected to be your own website URL.
"expires"The date the assertion expires, expressed as the primitive value of a Date object: that is, the number of milliseconds since midnight 01 January, 1970 UTC.
"issuer"The hostname of the identity provider that issued the assertion.
- -

"failure"

- -

The assertion is invalid. In this case, the JSON structure contains one additional element:

- - - - - - - - -
"reason"A string explaining why verification failed.
- -

Examples

- -

node.js

- -

This example uses a node.js server using express.js

- -
var express = require("express"),
-    app = express.createServer(),
-    https = require("https"),
-    querystring = require("querystring");
-/* ... */
-
-// The audience must match what your browser's address bar shows,
-// including protocol, hostname, and port
-var audience = "http://localhost:8888";
-
-app.post("/authenticate", function(req, res) {
-  var vreq = https.request({
-    host: "verifier.login.persona.org",
-    path: "/verify",
-    method: "POST"
-  }, function(vres) {
-    var body = "";
-    vres.on('data', function(chunk) { body+=chunk; } )
-        .on('end', function() {
-          try {
-            var verifierResp = JSON.parse(body);
-            var valid = verifierResp && verifierResp.status === "okay";
-            var email = valid ? verifierResp.email : null;
-            req.session.email = email;
-            if (valid) {
-              console.log("assertion verified successfully for email:", email);
-              res.json(email);
-            } else {
-              console.log("failed to verify assertion:", verifierResp.reason);
-              res.send(verifierResp.reason, 403);
-            }
-          } catch(e) {
-            console.log("non-JSON response from verifier");
-            // bogus response from verifier!
-            res.send("bogus response from verifier!", 403);
-
-          }
-        });
-  });
-
-  vreq.setHeader('Content-Type', 'application/x-www-form-urlencoded');
-
-  var data = querystring.stringify({
-    assertion: req.body.assertion,
-    audience: audience
-  });
-
-  vreq.setHeader('Content-Length', data.length);
-  vreq.write(data);
-  vreq.end();
-
-  console.log("verifying assertion!");
-});
-
-
- -

via Lloyd Hilaiel

- -

PHP

- -
$url = 'https://verifier.login.persona.org/verify';
-$assert = filter_input(
-    INPUT_POST,
-    'assertion',
-    FILTER_UNSAFE_RAW,
-    FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH
-);
-//Use the $_POST superglobal array for PHP < 5.2 and write your own filter
-$params = 'assertion=' . urlencode($assert) . '&audience=' .
-           urlencode('http://localhost:8888');
-$ch = curl_init();
-$options = array(
-    CURLOPT_URL => $url,
-    CURLOPT_RETURNTRANSFER => TRUE,
-    CURLOPT_POST => 2,
-    //CURLOPT_SSL_VERIFYPEER => true,   //This currently blocks connection to 'https://verifier.login.persona.org/verify'
-    CURLOPT_SSL_VERIFYPEER => 0,
-
-    CURLOPT_SSL_VERIFYHOST => 2,
-    CURLOPT_POSTFIELDS => $params
-);
-curl_setopt_array($ch, $options);
-$result = curl_exec($ch);
-curl_close($ch);
-echo $result;
- -

Via Christian Heilmann

- -

Java

- -
@Override
-protected void doPost(final HttpServletRequest req,
-   final HttpServletResponse resp) throws ServletException,
-   IOException {
-
-   final String audience = req.getServerName();
-   final String assertion = req.getParameter("assertion");
-   final Verifier verifier = new Verifier();
-   final BrowserIDResponse personaResponse = verifier.verify(assertion,audience);
-   final Status status = personaResponse.getStatus();
-
-   if (status == Status.OK) {
-     /* Authentication with Persona was successful */
-     String email = personaResponse.getEmail();
-     log.info("{} has sucessfully signed in", email);
-     HttpSession session = req.getSession(true);
-     session.setAttribute("email", email);
-
-   } else {
-     /* Authentication with Persona failed */
-     log.info("Sign in failed...");
-
-   }
-}
-
- -

Via Javier

- -

 

- -

Note: If you send the assertion and audience parameters as a JSON-object, they must not be URL-encoded. If they are sent as regular HTTP POST parameters, as in the example above, they must be URL-encoded.

diff --git a/files/es/mozilla/persona/security_considerations/index.html b/files/es/mozilla/persona/security_considerations/index.html deleted file mode 100644 index 023bd98164..0000000000 --- a/files/es/mozilla/persona/security_considerations/index.html +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Consideraciones de Seguridad -slug: Mozilla/Persona/Security_Considerations -tags: - - Persona -translation_of: Archive/Mozilla/Persona/Security_Considerations ---- -

Cuando agregas soporte para Persona en tu sitio web, ella toma tantas medidas de seguridad como puede. Sin embargo, algunas medidas de seguridad solo pueden ser manejadas por tu sitio web. Estas son listadas a continuación.

-

Prácticas Esenciales

-

Verificar la confirmación en tu servidor

-

Cuando utilizas Persona, las declaraciones de identidad son pasadas dentro de la función onlogin a través de

-

{{ domxref("navigator.id.watch()") }}

-

Siempre debes pasar la aserción a tu servidor para verificarla, y solo tu servidor debe decidir si autoriza al usuario permisos adicionales en base al resultado de la verificación:

-
// Inside navigator.id.watch({ ...
-onlogin: function(assertion) {
-  // A user wants to log in! Here you need to:
-  // 1. Send the assertion to your backend for verification and to create a session.
-  // 2. Update your UI.
-},
-
-

Si trata de verificar la aserción usando JavaScript ejecutándose en el navegador del usuario, algún usuario malicioso podría suplantar por otro usuario legítimo de su sitio inyectando código bloqueando tu código JavaScript. Esto es posible debido a que no se tiene control del navegador del usuario, donde se ejecuta el código.

-

Como mencionamos lineas arriba, siempre debe pasar la aserción a su servidor para la verificación. Incluso si está usando la API de verificación remota.

-

Especifique explícitamente el parámetro audience

-

Para verificar la aserción, debe realizar un pedido POST a https://verifier.login.persona.org/verify. El pedido incluye el parámetro llamado audience:

-
assertion=<ASSERTION>&audience=https://mysite.com:443"
-

El parámetro audience es requerido. Siempre debe especificar explícitamente audience en el código, o en la configuración del código. Específicamente:

- -

Si dejas que el navegador del usuario te envíe el parámetro audience, esto deja la posibilidad de que un sitio web malicioso pueda reusar las declaraciones de su sitio web para autenticarse en tu sitio web.

-

Verifica los certificados SSL

-

Para verificar una aserción, debes realizar un petición POST a https://verifier.login.persona.org/verify. Debes asegurarte que tu petición HTTPS verifique el certificado enviado desde el servidor contra un certificado raíz confiable. Si no lo haces, un atacante podría presentarse como verifer.login.persona.org y realizar verificaciones falsas.

-

Revisa que la libreria que usas para hacer el pedido verifique los certificados correctamente, y que has iniciado esto con un certificado de administrador apropiado.

-

Por ejemplo, el modulo urllib2 estándar de Python 2.7 no valida certificados del servidor. En lugar de ello, recomendamos utilizar los módulos "requests" o "urllib3" en Python 2.x, o la clase estándar http.client.HTTPSConnection en Python 3.x. Para Perl, asegúrate que usas al menos la versión 6.0 de libwww-perl. Dependiendo del lenguaje, librería, y sistema operativo que estés usando, vas a necesitar utilizar algún CA (Certificate Authority) confiable o el CA simple usado por verifier.login.persona.org.

-

Implementar protección CSRF

-

En un ataque de inicio de sesión por CSRF (Cross-Site Request Forgery), el atacante utiliza CSRF para iniciar la sesión del usuario dentro del sitio web usando las credenciales del atacante.

-

Por ejemplo: un usuario visita una web maliciosa que contiene un elemento form. El atributo action del form está configurado para hacer una petición HTTP POST a http://www.google.com/login, dándole el username y password del atacante. Cuando el usuario envía el form, el pedido es enviado a Google, se inicia sesión y el servidor de Google configura una cookie en el navegador del usuario. Ahora el usuario sin saberlo ha iniciado sesión con la cuenta Google del atacante.

-

El ataque puede ser usado para reunir información sensible del usuario. Por ejemplo, Web History de Google tiene la característica de registrar todos los términos de búsqueda del usuario. Si el usuario inicia sesión dentro de la cuenta Google del atacante y el atacante tiene la característica Web History activada, el usuario le estará enviando toda su información al atacante.

-

Los ataques de inicio de sesión CSRF, y defensas potenciales contra éstos son documentados con mayor detalle en Robust Defenses for Cross-Site Request Forgery (PDF). Estos ataques no son específicos de Persona: la mayoría de mecanismos de inicio de sesión son potencialmente vulnerables a ellos.

-

Existen una variedad de técnicas, las cuales pueden ser usadas para proteger un sitio de ataques de inicio de sesión CSRF, las cuales son documentadas con mayor detalle en el estudio antes mencionado.

-

Una propuesta es crear un identificador secreto en el servidor, compartido con el navegador, y requerir al navegador que lo proporcione cuando realice un pedido de inicio de sesión. Por ejemplo:

-
    -
  1. Tan pronto como el usuario visite su sitio, antes de intentar iniciar sesión cree una sesión para él en el servidor. Almacene el ID de la sesión en una cookie del navegador.
  2. -
  3. En el servidor, genere un texto aleatorio de al menos 10 caracteres alfanuméricos. un UUID generado aleatoriamente es una buena opción. Esto es un token CSRF. Almacene esto en la sesión.
  4. -
  5. Envie el CSRF token al navegador a través de JavaScript embebido o HTML como una variable oculta del formulario.
  6. -
  7. Asegurese que el envio AJAX o la petición POST del formulario incluya el token CSRF.
  8. -
  9. En el lado del servidor, antes de aceptar la aserción, revise que el token CSRF enviado concuerde con el almacenado en la sesión.
  10. -
-

Mejoras

-

Politicas de seguridad del contenido (Content Security Policy o CSP)

-

Content Security Policy (CSP) es una capa extra de seguridad que ayuda a detectar y mitigar ciertos tipos de ataques, incluyendo Cross Site Scripting (XSS) y ataques de inyección de datos. Estos ataques son usados para todo desde robo de datos a desconfiguración del sitio o distribución de malware.

-

SI utilizas CSP en tu siitio, es posible que necesites modificar tu politica para permitir Persona. Dependiendo de tu política, puedes necesitar:

- -

Un ejemplo de la configuración de Apache puede incluir:

-
Header set X-Content-Security-Policy: "default-src 'self'; frame-src 'self' https://login.persona.org ; script-src 'self' https://login.persona.org"
diff --git a/files/es/mozilla/persona/why_persona/index.html b/files/es/mozilla/persona/why_persona/index.html deleted file mode 100644 index 48ce47f155..0000000000 --- a/files/es/mozilla/persona/why_persona/index.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: ¿Por qué Mozilla Persona? -slug: Mozilla/Persona/Why_Persona -translation_of: Archive/Mozilla/Persona/Why_Persona ---- -

El sistema de nombres de  usuarios y contraseñas que prevalece es insostenible: los usuarios están obligados a crear y recordar una nueva, y compleja contraseña para cada sitio y servicio que utilizan, y cada sitio tiene que almacenar dichas contraseñas de manera segura. Sin embargo, brechas recientes demuestran que inclusive las compañías más prominentes tienen fallos de seguridad al almacenar las contraseñas, lo cual expone la información del usuario.

-

"Persona" es un sistema de identificación abierto, distribuído, a escala web que reemplaza las contraseñas para cada sitio. Aborda las deficiencias relacionadas a la usabilidad y privacidad de sistemas tales como OpenID sin recurrir a una infraestructura centralizada como Facebook connect.

-

Persona se deshace de las contraseñas para cada sitio

-

En lugar de contraseñas para cada sitio, Persona permite que los usuarios se autentiquen en los diferentes sitios con tan sólo dos clics después de completar un proceso sencillo, que se realiza una sola vez para cada una de sus identidades. Esto es seguro, y está respaldado por un sistema de cifrado de clave pública. En lugar de una contraseña, el navegador web del usuario genera una confirmación de identidad cifrada que expira después de unos pocos minutos y es únicamente válido para un solo sitio. Debido a que no existen contraseñas específicas por sitio, los sitios web que utilizan Persona no tienen que preocuparse sobre el almacenamiento seguro o de pérdidas de las contraseñas en su base de datos.

-

Este proceso de registro rápido también reduce la desavenencia a los usuarios cada vez que visiten sitios nuevos.

-

Las identidades Persona son los correos electrónicos

-

Lejos de utilizar nombres de usuario de manera libre, Persona utiliza los correos electrónicos como identidades. Esto ofrece muchos beneficios tanto para los usuarios como para los desarrolladores:

-

El usuario se beneficia al utilizar direcciones de correo electrónico

- -

Los desarrolladores se benefician al utilizar direcciones de correo electrónico

- -

Sin mencionar que los correos electrónicos ya son sistemas distribuídos con billones de cuentas a través de diferentes proveedores.

-

¿Qué diferencia a Persona de otros proveedores de acceso sencillo?

-

"Persona" es seguro, y fácil. Protege la privacidad del usuario, control del usuario, y elección del usuario de formas que los otros proveedores no hacen o no pueden:

-

Muchas redes sociales tales como Facebook y Google+ obligan a que los usuarios utilicen sus nombres verdaderos, y limitan a los usuarios a una sola cuenta. Al estar construida encima de direcciones de correo electrónico, Persona permite que los usuarios mantengas sus identidades separadas, ya sea de trabajo, hogar, escuela u otras.

-

"Persona" es abierta y distribuída: cualquiera con un correo electrónico puede registrarse en sitios que utilicen Persona. Y no es sólo eso, cualquiera puede alojar su propio proveedor de identidad o delegar a otras autoridades, al igual que con el correo electrónico. Esto difiere a los servicios de acceso que ofrecen los sitios sociales, los cuales requieren una cuenta en un servicio único y centralizado.

-

"Persona" también toma un alcance novedoso para proteger la privacidad del usuario al colocar el navegador web del usuario en medio del proceso de autenticación: el navegador obtiene las credenciales del proveedor de correo electrónico que utiliza el usuario, y luego presenta esas credenciales al sitio web. El proveedor de correo electrónico no puede rastrear al usuario, pero los sitios web pueden seguir confiando en la identidad del usuario al verificar dichas credenciales de manera cifrada. La mayoría de otros sistemas, inclusive aquellas que son distribuídas como el OpenID, requiere que los sitios "llamen a casa" antes de permitir que un usuario ingrese.

diff --git a/files/es/mozilla/preferences/index.html b/files/es/mozilla/preferences/index.html deleted file mode 100644 index 1169ecabf1..0000000000 --- a/files/es/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/es/mozilla/projects/index.html b/files/es/mozilla/projects/index.html deleted file mode 100644 index 6291137b31..0000000000 --- a/files/es/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() }}

-

This page needs to become a pretty index to Mozilla projects whose documentation is located under it.

-

{{ LandingPageListSubpages() }}

diff --git a/files/es/mozilla/projects/nspr/reference/index.html b/files/es/mozilla/projects/nspr/reference/index.html deleted file mode 100644 index d53b3eed23..0000000000 --- a/files/es/mozilla/projects/nspr/reference/index.html +++ /dev/null @@ -1,770 +0,0 @@ ---- -title: NSPR API Reference -slug: Mozilla/Projects/NSPR/Reference -tags: - - NSPR - - NSPR_API_Reference - - NeedsTranslation - - TopicStub -translation_of: Mozilla/Projects/NSPR/Reference ---- - - -

Introduction to NSPR

- - - -

NSPR Types

- - - -

Threads

- - - -

Process Initialization

- - - -

Locks

- - - -

Condition Variables

- - - -

Monitors

- - - -

Cached Monitors

- - - -

I/O Types

- - - -

I/O Functions

- - - -

Network Addresses

- - - -

Atomic Operations

- - - -

Interval Timing

- - - -

Date and Time

- - - -

Memory Management Operations

- - - -

String Operations

- - - -

Floating Point Number to String Conversion

- - - -

Long Long (64-bit) Integers

- -

BitMaps

- -

Formatted Printing

- -

Linked Lists

- - - -

Dynamic Library Linking

- - - -

Process Management and Interprocess Communication

- - - -

Multiwait Receive

- -

System Information and Environment Variables

- -

Logging

- - - -

Instrumentation Counters

- -

Named Shared Memory

- - - -

Anonymous Shared Memory

- - - -

IPC Semaphores

- - - -

Thread Pools

- - - -

Random Number Generator

- - - -

Hash Tables

- - - -

NSPR Error Handling

- - diff --git a/files/es/mozilla/projects/psm/index.html b/files/es/mozilla/projects/psm/index.html deleted file mode 100644 index 5251e19a4b..0000000000 --- a/files/es/mozilla/projects/psm/index.html +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Administrador de seguridad personal -slug: Mozilla/Projects/PSM -translation_of: Mozilla/Projects/PSM ---- -

Administrador de seguridad personal consiste de un conjunto de librerías que realizan operaciones de criptografía en nombre de una aplicación instalada. Estas operaciones incluyen la creación de una conexión SSL, objeto de firmas y verificación de firmas, la administración de certificados (incluye la emisión y revocación), y otras funciones de PKI.

-

Notas:

- diff --git a/files/es/mozilla/rendimiento/index.html b/files/es/mozilla/rendimiento/index.html deleted file mode 100644 index 33c54bd649..0000000000 --- a/files/es/mozilla/rendimiento/index.html +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Rendimiento -slug: Mozilla/Rendimiento -translation_of: Mozilla/Performance ---- -

Los artículos vinculados desde aquí te ayudarán a mejorar el rendimiento, ya sea que estés desarrollando un código de Mozilla central o un complemento.

- - - - - - - - -
-

Documentation

- -
-
Reportar un Problema de rendimiento
-
Una guía fácil de usar para reportar un problema de rendimiento. No se requiere un entorno de desarrollo.
-
Benchmarking
-
Consejos para generar métricas de rendimiento válidas.
-
Mejores prácticas de rendimiento en extensiones
-
Una guía de rendimiento de "mejores prácticas" para desarrolladores de extensiones.
-
Measuring Add-on Startup Performance
-
A guide for add-on developers on how to set up a performance testing environment.
-
XUL School: Add-on Performance
-
Tips for add-on developers to help them avoid impairing application performance.
-
GPU performance
-
Tips for profiling and improving performance when using a GPU.
-
Scroll-Linked Effects
-
Information on scroll-linked effects, their effect on performance, related tools, and possible mitigation techniques.
-
Automated Performance Testing and Sheriffing
-
Information on automated performance testing and sheriffing at Mozilla.
-
- -

View all pages tagged with "Performance"...

- -

Memory profiling and leak detection tools

- -
-
The Developer Tools "Memory" panel
-
The memory panel in the devtools supports taking heap snapshots, diffing them, computing dominator trees to surface "heavy retainers", and recording allocation stacks.
-
- -
-
about:memory
-
about:memory is the easiest-to-use tool for measuring memory usage in Mozilla code, and is the best place to start. It also lets you do other memory-related operations like trigger GC and CC, dump GC & CC logs, and dump DMD reports. about:memory is built on top of Firefox's memory reporting infrastructure.
-
DMD
-
DMD is a tool that identifies shortcomings in about:memory's measurements, and can also do multiple kinds of general heap profiling.
-
Are We Slim Yet
-
areweslimyet.com (a.k.a. AWSY) is a memory usage and regression tracker.
-
BloatView
-
BloatView prints per-class statistics on allocations and refcounts, and provides gross numbers on the amount of memory being leaked broken down by class. It is used as part of Mozilla's continuous integration testing.
-
Refcount tracing and balancing
-
Refcount tracing and balancing are ways to track down leaks caused by incorrect uses of reference counting. They are slow and not particular easy to use, and thus most suitable for use by expert developers.
-
GC and CC logs
-
GC and CC logs can be generated and analyzed to in various ways. In particular, they can help you understand why a particular object is being kept alive.
-
Valgrind
-
Valgrind is a tool that detects various memory-related problems at runtime, including leaks. Valgrind is used as part of Mozilla's continuous integration testing, though the coverage is limited because Valgrind is slow.
-
LeakSanitizer
-
LeakSanitizer (a.k.a. LSAN) is similar to Valgrind, but it runs faster because it uses static source code instrumentation. LSAN is part of Mozilla's continuous integration testing, with most tests running through it as part of the AddressSanitizer (a.k.a. ASAN) test jobs.
-
Apple tools
-
Apple provides some tools for Mac OS X that report similar problems to those reported by LSAN and Valgrind. The "leaks" tool is not recommended for use with SpiderMonkey or Firefox, because it gets confused by tagged pointers and thinks objects have leaked when they have not (see bug 390944).
-
Leak Gauge
-
Leak Gauge is a tool that can be used to detect certain kinds of leaks in Gecko, including those involving documents, window objects, and docshells.
-
LogAlloc
-
LogAlloc is a tool that dumps a log of memory allocations in Gecko. That log can then be replayed against Firefox's default memory allocator independently or through another replace-malloc library, allowing the testing of other allocators under the exact same workload.
-
Memory Profiler
-
The memory profiler samples allocation events and provides different views to analyze the allocation characteristic.
-
- -

See also the documentation on Leak-hunting strategies and tips.

-
-

Profiling and performance tools

- -
-
Profiling with the Developer Tools Profiler
-
The profiler built into the developer tools has a high-level waterfall, detailed call tree, allocations and GC profiling, and flame graphs. It is available on all platforms and release channels, and also supports remote profiling b2g and Fennec.
-
- -
-
Profiling with the Gecko Profiler {{ gecko_minversion_inline("16.0") }}
-
The Gecko Profiler is a good tool to start with, particularly for understanding where time is spent within C++ code in Firefox.
-
Profiling with Instruments
-
How to use Apple's Instruments tool to profile Mozilla code.
-
Profiling with Xperf
-
How to use Microsoft's Xperf tool to profile Mozilla code.
-
Profiling with Concurrency Visualizer
-
How to use Visual Studio's Concurrency Visualizer tool to profile Mozilla code.
-
Profiling with Zoom
-
Zoom is a profiler for Linux done by the people who made Shark
-
Measuring performance using the PerfMeasurement.jsm code module {{ gecko_minversion_inline("2.0") }}
-
Using PerfMeasurement.jsm to measure performance data in your JavaScript code.
-
Adding a new Telemetry probe
-
Information on how to add a new measurement to the Telemetry performance-reporting system
-
Profiling JavaScript with Shark (obsolete - replaced by Instruments)
-
How to use the Mac OS X Shark profiler to profile JavaScript code in Firefox 3.5 or later.
-
Profiling with Shark (obsolete - replaced by Instruments)
-
How to use Apple's Shark tool to profile Mozilla code.
-
Investigating CSS Performance
-
How to figure out why restyle is taking so long
-
- -

Power profiling

- -
-
Power profiling overview
-
This page provides an overview of relevant information, including details about hardware, what can be measured, and recommended approaches. It should be the starting point for anybody new to power profiling.
-
tools/power/rapl (Mac, Linux)
-
tools/power/rapl is a command-line utility in the Mozilla codebase that uses the Intel RAPL interface to gather direct power estimates for the package, cores, GPU and memory.
-
powermetrics (Mac-only)
-
powermetrics is a command-line utility that gathers and displays a wide range of global and per-process measurements, including CPU usage, GPU usage, and various wakeups frequencies.
-
TimerFirings logging (All platforms)
-
TimerFirings logging is a built-in logging mechanism that prints data on every time fired.
-
Activity Monitor, Battery Status Menu and top (Mac-only)
-
The battery status menu, Activity Monitor and top are three related Mac tools that have major flaws but often consulted by users, and so are worth understanding.
-
Intel Power Gadget (Windows, Mac, Linux)
-
Intel Power Gadget provides real-time graphs for package and processor RAPL estimates. It also provides an API through which those estimates can be obtained.
-
perf (Linux-only)
-
perf is a powerful command-line utility that can measure many different things, including energy estimates and high-context measurements of things such as wakeups.
-
turbostat (Linux-only)
-
turbostat is a command-line utility that gathers and displays various power-related measurements, with a focus on per-CPU measurements such as frequencies and C-states.
-
powertop (Linux-only)
-
powertop is an interactive command-line utility that gathers and displays various power-related measurements.
-
- - - -
-
JavaScript, XPCOM, Developing Mozilla, Extensions, Addons
-
-
- -

 

diff --git a/files/es/mozilla/rust/index.html b/files/es/mozilla/rust/index.html deleted file mode 100644 index 3454ab434b..0000000000 --- a/files/es/mozilla/rust/index.html +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: The Rust programming language -slug: Mozilla/Rust -tags: - - Desarrollo web - - lenguajes - - paralelización - - systemas -translation_of: Mozilla/Rust ---- -

Rust logoRust es un nuevo lenguaje de programación de código libre, creado por Mozilla y una comunidad de voluntarios, diseñado para ayudar a los desarrolladores a crear rápidamente aplicaciones seguras que puedan tener todas las ventajas de los modernos procesadores de varios núcleos. Evita los accesos de memoria incorrectos, garantiza hilos de procesamiento seguros y además tiene una sintaxis fácil de aprender.

- -

Además Rust ofrece abstracciones a coste cero, semántica de movimientos, y garantiza memoria segura,  hilos sin condiciones de carreras, genéricos basados en propiedades, identificación de patrones, deducciones de tipos, y uniones eficientes a C, con unos tamaños en ejecución mínimos. 

- -

Para aprender más de Rust, puede:

- - - -

Rust and the future of systems programming

- -

{{EmbedYouTube("8EPsnf_ZYU0")}}

- -

Unlocking the power of parallelism with Rust

- -

{{EmbedYouTube("cNeIOt8ZdAY")}}

- -

Rust for web developers

- -

{{EmbedYouTube("FfoXFnzZbBM")}}

- -

Safe systems programming with Rust

- -

{{EmbedYouTube("P3sfNGtpuxc")}}

- -

Growing the Rust community

- -

{{EmbedYouTube("duv0tuPAnO0")}}

- -

Putting Rust into production at Mozilla

- -

{{EmbedYouTube("2RhbYpgVpg0")}}

diff --git a/files/es/mozilla/security/index.html b/files/es/mozilla/security/index.html deleted file mode 100644 index bf7933d35b..0000000000 --- a/files/es/mozilla/security/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Browser security -slug: Mozilla/Security -tags: - - Developing Mozilla - - Firefox - - Landing - - Mozilla - - NeedsTranslation - - Security - - TopicStub -translation_of: Mozilla/Security ---- -

An important aspect of developing code for any browser, including Firefox, as well as any Web-oriented project, is its security. These articles provide important guides and references to ensuring the code you write is secure, including both design recommendations and testing guidelines.

- -

{{LandingPageListSubpages}}

- - diff --git a/files/es/mozilla/security/x509_certificates/index.html b/files/es/mozilla/security/x509_certificates/index.html deleted file mode 100644 index cdad565f6d..0000000000 --- a/files/es/mozilla/security/x509_certificates/index.html +++ /dev/null @@ -1,386 +0,0 @@ ---- -title: A Web PKI x509 certificate primer -slug: Mozilla/Security/x509_Certificates -translation_of: Mozilla/Security/x509_Certificates ---- -

X.509 (in this document referred as x509) is an ITU standard to describe certificates. This article provides an overview of what these are and how they work.

- -

Three versions of the x509 standard have been defined for web-pki. In this document we will be referring to the current standard in use for web pki: x509 v3, which is described in detail in {{rfc(5280)}}. In general, x509 certificates bind a signature to a validity period, a public key, a subject, an issuer, and a set of extensions. The extensions define extra properties of the certificate such as extra attributes of the certificate or constraints on the use of the certificate. In order for a certificate to be valid these three requirements must be met:

- -
    -
  1. There is a verification path from the site certificate to a trusted certificate of the user agent (ie if you follow the issuer path you will end on a self-signed certificate that is considered trusted by the browser).
  2. -
  3. The attributes of the certificates in the verification path have valid parameters for that verification (for example the validity period of all the certificates are valid for the time the verification is being done)
  4. -
  5. Revocation checks are considered OK for that particular validation.
  6. -
- -

One issue that is not commonly known is that the x509 trust graph is not a forest (a bunch of trees where each root is a trusted root) but a cyclic graph, where the same key/issuer can be a root or an intermediate for another root in the browsers key store (when roots create intermediates for each other it is called cross-signing).

- -

Extensions

- -

While {{rfc(5280)}} defines 16 extensions for webpki in this document we will be describing the six extensions we considered critical for understanding. Certificates can have other extensions not described on {{rfc(5280)}}, but that is out of the scope of this document. Extensions can be marked as critical or non-critical, conforming certificate verification libraries should stop processing verification when encountering a critical extension that they do not understand ( and should continue processing if the extension is marked as non-critical) mozila::pkix has this behavior.

- -

Subject alternate name

- -

This extension defines what other names (such as DNS names) are valid for this certificate. This allows for a certificate to be used for more than one FQDN, for example you can have a certificate that is valid for both a.example.com and b.example.com

- -

Basic constraints

- -

This allows certificates to be asserted as issuing certificates (it is mandatory for CA certificates). It can also be used to express the maximum depth of the trust path from the CA.

- -

Key usage

- -

This extension is used to constrain the purpose for the key in the certificate. More than one key usage can be asserted. Examples of key usages are: digitalSignature, keyEncipherment, dataEncipherment, keyCertSign, and cRLSign. For CA certificates the keyCertSign bit must be set.

- -

Extended key usages

- -

This is another bitfield to constrain the usages of the key of the certificate. Its is directed mostly at what type of application the certificate was issued for. Examples of extended key usages are: serverAuth, clientAuth, and OCSPSigning. For end-entity certificates for PKI this extension is required to exist with the serverAuth bit asserted.

- -

Name constraints

- -

This is an extension exclusive for CA and indicates limits on the name space for its children. This is one of the most powerful extensions for businesses to have to help limit risk imposed by losing the private key of the CA.

- -

Authority information access

- -

This extension is primarily used to to describe the OCSP location for revocation checking. It is mandatory for certificates that chain up to a root in the Mozilla CA program.

- -

Self-signed certificates

- -

These are the steps to generate a certificate for www.example.com. Replace this value with the actual server name in the steps below.
- 1. Generate the key using the following command:

- - - -
-
- -

2. Generate CSR using this command:

- - - -
-
- -

3. Write extensions file by creating a new file with name openssl.ss.cnf with the following contents:

- - - -
-
- -

4. Self-sign csr (using SHA256) and append the extensions described in the file

- - - -
-
- -

You can now use example.pem as your certfile

- -

CAs included in Firefox

- -

When you visit a secure website, Firefox will validate the website’s certificate by checking that the certificate that signed it is valid, and checking that the certificate that signed the parent certificate is valid and so forth up to a root certificate that is known to be valid. This chain of certificates is called the Certificate Hierarchy.

- -

If your certificates will only be used to verify one domain (e.g. *.yourcompany.com) but you want others outside of your organization to be able to browse to your website using https without having to manually import a root certificate, then you can get an SSL certificate from one of the CAs who already have a root certificate included in the major browsers.

- -

Firefox uses a default set of X.509v3 root certificates for various Certification Authorities (CAs). The root certificates included by default have their "trust bits" set to indicate if the CA's root certificates may be used to verify certificates for SSL servers, S/MIME email users, and/or digitally-signed code objects without having to ask users for further permission or information.

- -

CAs apply to have their root certificates included by default in Mozilla products by following the Mozilla CA Certificate Policy and applying for inclusion as per CA:How_to_apply. Users may override the default root certificate settings using the Certificate Manager.

- -

Some organizations make use of the set of CAs included in Mozilla's products. If you wish to do this, you should read the relevant part of the Mozilla CA FAQ before doing so.

- -

Running your Own CA

- -

If you are going to have your own CA, we recommend building 3 certificates: a long term root cert, a medium term intermediate cert, and a short term end-entity cert. This type of hierarchy allows for a relatively simple long term root to be distributed to clients, and some flexibility on the intermediate cert so that you can change parameters based on best practices and security research.

- -

Generate your CA Root

- -

Update *.example.com and *.example.net below to match your domains.

- -

Assumptions:

- - - -

Steps to generate your CA root certificate:

- -
    -
  1. Generate key -
      -
    • "openssl genpkey -algorithm RSA -out rootkey.pem -pkeyopt rsa_keygen_bits:4096"
    • -
    • 4096 is considered secure for the next 15 years.
    • -
    -
  2. -
  3. Generate csr -
      -
    • "openssl req -new -key rootkey.pem -days 5480 -extensions v3_ca -batch -out root.csr -utf8 -subj '/C=US/O=Orgname/OU=SomeInternalName'
    • -
    • Make a new Certificate Signing Request (CSR) that will be valid for 15 years.
    • -
    -
  4. -
  5. Write extensions File (openssl.root.cnf) -
      -
    • basicConstraints = critical, CA:TRUE
    • -
    • keyUsage = keyCertSign, cRLSign
    • -
    • subjectKeyIdentifier = hash
    • -
    • nameConstraints = permitted;DNS:example.com,permitted;DNS:example.net
    • -
    -
  6. -
  7. Self-sign csr (using SHA256) and append the extensions described in the file -
      -
    • "openssl x509 -req -sha256 -days 3650 -in root.csr -signkey rootkey.pem -set_serial $ANY_SMALL_INTEGER -extfile openssl.root.cnf -out root.pem"
    • -
    -
  8. -
- -

Now you have CA pem file with its associated key.

- -

Generate your Intermediate cert

- -

The following steps create an intermediate cert that is valid for 8 years.

- -
    -
  1. Generate key -
      -
    • "openssl genpkey -algorithm RSA -out r=intkey.pem -pkeyopt rsa_keygen_bits: 3072"
    • -
    • A 3072 bit key is considered secure for the next 8 years.
    • -
    -
  2. -
  3. Generate csr -
      -
    • "openssl req -new -key intkey.pem -days 2922 -extensions v3_ca -batch -out int.csr - utf8 -subj '/C=US/O=Orgname/OU=SomeInternalName2'
    • -
    • Make a new Certificate Signing Request (CSR) that will be valid for 8 years.
    • -
    -
  4. -
  5. Write extensions File (openssl.int.cnf) -
      -
    • basicConstraints = critical, CA:TRUE
    • -
    • authorityKeyIdentifier = keyid, issuer
    • -
    • subjectKeyIdentifier = hash
    • -
    • keyUsage = keyCertSign, cRLSign
    • -
    • extendedKeyUsage =serverAuth
    • -
    • authorityInfoAccess = OCSP;URI:http://ocsp.example.com:8888/
    • -
    -
  6. -
  7. Sign the intermediate csr with the root key and the intermediate extensions -
      -
    • "openssl x509 -req -sha256 -days 2922 -in int.csr -CAkey rootkey.pem -CA root.pem -set_serial $SOME_LARGE_INTEGER -out int.pem -extfile openssl.int.cnf"
    • -
    -
  8. -
- -

Generate the end entity certificate

- -

Update www.example.com below to match your domain.

- -
    -
  1. Generate key -
      -
    • "openssl genpkey -algorithm RSA -out eekey.pem -pkeyopt rsa_keygen_bits: 2048"
    • -
    • 2048 is considered secure for the next 4 years.
    • -
    -
  2. -
  3. Generate csr -
      -
    • "openssl req -new -key key.pem -days 1096 -extensions v3_ca -batch -out example.csr - utf8 -subj '/CN=www.example.com'
    • -
    • Make a new Certificate Signing Request (CSR) that will be valid for 3 years.
    • -
    -
  4. -
  5. Write extensions file (make a new file with name openssl.ss.cnf with the following contents) -
      -
    • basicConstraints = CA:FALSE
    • -
    • subjectAltName =DNS:www.example.com
    • -
    • extendedKeyUsage =serverAuth
    • -
    • authorityInfoAccess = OCSP;URI:http://ocsp.example.com:80/
    • -
    -
  6. -
  7. Intermediate sings the csr (using SHA256) and appends the extensions described in the file -
      -
    • "openssl x509 -req -sha256 -days 1096 -in example.csr -CAkey intkey.pem -CA int.pem -set_serial $SOME_LARGE_INTEGER -out www.example.com.pem -extfile openssl.int.cnf"
    • -
    -
  8. -
- -

Security Notes

- -

There are several organizations that provide recommendations regarding the security parameters for key/hash sizes given current computational power. For the end date of the root cert created following the instructions in this page (year 2017). These are the recomendations of bit sizes (from http://www.keylength.com/):

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AsymmetricECC(Key)Hash
Linestra(2004)1902172172
Ecrypt 20122432224224
NIST 20122048224224
ANSSI 20104096200256
RFC 37662358200---
BSI1976256256
- -

In other words, SHA1 is now deprecated for new uses. We should use at least 3072 key sizes and at least a 256 ECC curve. Thus the recommendation here is for the root to be 4096 if using RSA and p384 for the root key. (p384 also chosen for compatibility as most SSL/TLS implementations support this part of suite B).

- -

Error Codes in Firefox

- -

Here are some common errors that might be encountered when working with certificates in Firefox.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Error CodeWhat It MeansWhat Can I Do
SEC_ERROR_BAD_DERA certificate is not properly encoded according to ASN.1 (DER) encodingRe-generate the improperly-encoded certificate
SEC_ERROR_CA_CERT_INVALIDAn end-entity certificate is being used to issue another certificateEnsure that any certificate intended to issue certificates has a basic constraints extension with cA: TRUE
SEC_ERROR_BAD_SIGNATUREA signature on a certificate is improperly formatted or the certificate has been tampered withRe-issue the certificate with the bad signature
SEC_ERROR_CERT_BAD_ACCESS_LOCATIONThe OCSP URI in the authorityInformationAccess extension is improperly formedRe-generate the certificate with a well-formed OCSP URI
SEC_ERROR_CERT_NOT_IN_NAME_SPACEA certificate has a common name or subject alternative name that is not in the namespace of an issuing certificateRe-issue the certificate with names that are within the namespace of all certificates in the chain
SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLEDA certificate has been signed with an obsolete algorithmRe-sign the certificate using a modern algorithm
SEC_ERROR_EXPIRED_CERTIFICATEA certificate is too old to be usedRe-generate the certificate
SEC_ERROR_EXTENSION_VALUE_INVALIDA certificate has an extension with an empty valueRe-generate the certificate without the extension, or re-generate it with a non-empty value
SEC_ERROR_INADEQUATE_CERT_TYPEA certificate has an extended key usage extension that does not assert a required usage, or an end-entity certificate asserts the id-kp-OCSPSigning usage when it shouldn'tRe-generate the certificate with the appropriate extended key usage values
SEC_ERROR_INADEQUATE_KEY_USAGEA certificate has a key usage extension that does not assert a required usageRe-generate the certificate with the appropriate key usage values
SEC_ERROR_INVALID_ALGORITHMA certificate has been signed with an unknown algorithmRe-sign the certificate with a standardized certificate signing algorithm
SEC_ERROR_INVALID_TIMEA time field in a certificate has an invalid valueRe-generate the certificate with valid encodings for time fields
MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE
SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID
SEC_ERROR_UNKNOWN_CRITICAL_EXTENSIONA certificate contains an extension marked as critical that is not handled by mozilla::pkixRe-generate the certificate without the extension or with it not marked as critical
SEC_ERROR_UNKNOWN_ISSUEREither a missing intermediate or root certificate is necessary to verify the certificateImport the root certificate into Firefox or have the server send the intermediate
SEC_ERROR_INVALID_KEY
SEC_ERROR_UNSUPPORTED_KEYALG
SEC_ERROR_EXPIRED_ISSUER_CERTIFICATEAn issuer certificate is too oldRe-issue the issuer certificate
MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITYA certificate with a basic constraints extension with cA:TRUE is being used as an end-entity certificateRe-generate the end-entity certificate without the basic constraints extension
MOZILLA_PKIX_ERROR_INADEQUATE_KEY_SIZEA certificate has a key that is too small to be secureRe-generate a larger key and issue a certificate using that key
diff --git a/files/es/mozilla/tech/index.html b/files/es/mozilla/tech/index.html deleted file mode 100644 index f9682e62e1..0000000000 --- a/files/es/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/es/mozilla/tech/toolkit_api/smile/index.html b/files/es/mozilla/tech/toolkit_api/smile/index.html deleted file mode 100644 index 20b37a8659..0000000000 --- a/files/es/mozilla/tech/toolkit_api/smile/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: SMILE -slug: Mozilla/Tech/Toolkit_API/SMILE -tags: - - Interfaces - - NeedsTranslation - - SMILE - - SeaMonkey - - TopicStub - - XPCOM - - XPCOM API Reference -translation_of: Mozilla/Tech/Toolkit_API/SMILE ---- -

 

- -
-

This article covers features introduced in SeaMonkey 2

-
- -

 

- -

SMILE is a JavaScript library designed to help developers build extensions using terminology and interfaces that are familiar to them.

- -

SMILE is about making it easier for extension developers to be productive, by minimizing some of the XPCOM formality and adding some "modern" JavaScript ideas. We want to start with areas that will provide the most benefit.

- -

SMILE has a smileIApplication interface that implements all the functions of extIApplication. The library has also been implemented in Firefox ("FUEL") and in Thunderbird ("STEEL").

- -

Objects

- -

extIApplication Objects

- - - -

smileIApplication Objects

- - - -

XPCOM

- -

Although the extIApplication object is preloaded into XUL scripts, it is not preloaded into JavaScript XPCOM code. The object needs to be accessed like any other XPCOM service:

- -
var Application = Components.classes["@mozilla.org/smile/application;1"].getService(Components.interfaces.smileIApplication);
-
diff --git a/files/es/mozilla/tech/xpcom/guide/index.html b/files/es/mozilla/tech/xpcom/guide/index.html deleted file mode 100644 index 7afb1c9cd1..0000000000 --- a/files/es/mozilla/tech/xpcom/guide/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: XPCOM guide -slug: Mozilla/Tech/XPCOM/Guide -tags: - - Landing - - Mozilla - - NeedsTranslation - - TopicStub - - XPCOM -translation_of: Mozilla/Tech/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.

-

- - -

diff --git a/files/es/mozilla/tech/xpcom/language_bindings/index.html b/files/es/mozilla/tech/xpcom/language_bindings/index.html deleted file mode 100644 index 727c397d50..0000000000 --- a/files/es/mozilla/tech/xpcom/language_bindings/index.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Language bindings -slug: Mozilla/Tech/XPCOM/Language_Bindings -tags: - - Embedding - - Landing - - Mozilla - - NeedsTranslation - - TopicStub - - XPCOM - - 'XPCOM:Language Bindings' -translation_of: Mozilla/Tech/XPCOM/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.

-

More specifically, an XPCOM language binding:

- -

Since the XPCOM layer itself is written in C/C++, its API can be accessed out-of-the-box using C or C++. In order to allow any other language to use the XPCOM API, a bridging layer is required.

-

The following bridging layers are currently available:

-

-
-
Components.utils.import
Este método fue introducido en Firefox 3 y es usado para compartir código entre diferentes alcances(scopes) de forma sencilla. Por ejemplo, puedes importar XPCOMUtils.jsm para evitar copiar y pegar grandes porciones comunes de código de registración de componentes XPCOM en tus archivos de compomentes.
-

diff --git a/files/es/mozilla/tech/xpcom/reference/index.html b/files/es/mozilla/tech/xpcom/reference/index.html deleted file mode 100644 index 9fcb623f1b..0000000000 --- a/files/es/mozilla/tech/xpcom/reference/index.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: XPCOM reference -slug: Mozilla/Tech/XPCOM/Reference -tags: - - Add-ons - - Extensions - - 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.

- -
-

WebExtensions are becoming the new standard for creating add-ons. Eventually support for XPCOM add-ons will be deprecated, so you should begin to investigate porting your add-ons to use the WebExtensions API, and report any missing functionality so we can be sure to address your concerns. Work is ongoing on WebExtension capabilities, so your input will help prioritize and plan the work. To learn more about the kinds of changes that will be needed, see Comparison with XUL/XPCOM extensions. In addition, any binaries you use will then need to be converted for use with the WebExtensions native messaging API, or compiled using WebAssembly or Emscripten.

-
- -
-

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/es/mozilla/tech/xpidl/index.html b/files/es/mozilla/tech/xpidl/index.html deleted file mode 100644 index c091484d6f..0000000000 --- a/files/es/mozilla/tech/xpidl/index.html +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: XPIDL -slug: Mozilla/Tech/XPIDL -tags: - - Todas_las_Categorías - - XPCOM - - xpidl -translation_of: Mozilla/Tech/XPIDL ---- -

-

XPIDL es un lenguaje de descripción de interface usado para especificar clases en la interface XPCOM. -

Los lenguajes de descripción de interface (IDL, por Interface Description Languages) son usados para describir interfaces independientemente del lenguaje y de la máquina. Los IDLs permiten definir interfaces que pueden luego ser procesadas por herramientas para autogenerar especificaciones de interface dependientes del lenguaje. -

Una de estas herramientas es xpidl, que es usada para generar archivos de encabezado para C++ (.h), información 'typelib', y mucho más. -

-

Escribiendo archivos de interfaz XPIDL

-

XPIDL se asemeja bastante a OMG IDL, con sintaxis extendida para manejar IIDs y tipos adicionales. Hay algunos ejemplos en la xpcom/base y en los directorios xpcom/ds del árbol Mozilla. -

- -

Recursos

- -{{ languages( { "fr": "fr/XPIDL", "ja": "ja/XPIDL", "en": "en/XPIDL" } ) }} diff --git "a/files/es/mozilla/tech/xul/escuela_xul/agregar_barras_de_herramientas_y_botones_para_\303\251stas/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/agregar_barras_de_herramientas_y_botones_para_\303\251stas/index.html" deleted file mode 100644 index efb5adcff9..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/agregar_barras_de_herramientas_y_botones_para_\303\251stas/index.html" +++ /dev/null @@ -1,291 +0,0 @@ ---- -title: Agregar barras de herramientas y botones para éstas -slug: >- - Mozilla/Tech/XUL/Escuela_XUL/Agregar_barras_de_herramientas_y_botones_para_éstas -translation_of: >- - Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_Toolbars_and_Toolbar_Buttons ---- -

{{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}}

- -

{{ PreviousNext("Escuela_XUL/Agregar_menus_y_submenus", "Escuela_XUL/Agregar_eventos_y_comandos") }}

- -

Adding a new toolbar

- -

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/hellow-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.

- -

Let's add our own toolbar. This is done in the overlay as well.

- -
<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>
-
- -

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.

- -

Toolbar buttons

- -

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.

-
- -

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.

- -

Toolbar button icons

- -

Making the icons and CSS rules for toolbar buttons is one of the most difficult tasks when making extensions. It is not too hard to come up with some graphics for the buttons, but it can be hard to make them blend in with Firefox on all operating systems. These are the icon sets for Firefox 3.0 on Windows XP, Windows Vista, Mac OS X and Linux:

- -

Windows XP and older

- -

Toolbar-win.png

- -

Windows Vista and 7 (Aero)

- -

Toolbar-aero.png

- -

Mac OS X

- -

Toolbar-mac.png

- -

Linux (Gnome)

- -

- -
-

Note: the images above are probably not distributable under the same CC license, unlike the rest of this material.

-
- -

There are lots of differences there, right? Let's look at the most important ones:

- - - -

Now let's look at the CSS work involved in a toolbar that works on the 4 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 jar:chrome/xulschoolhello.jar!/skin/unix/
-skin xulschoolhello classic/1.0 jar:chrome/xulschoolhello.jar!/skin/win/    os=WINNT
-skin xulschoolhello classic/1.0 jar:chrome/xulschoolhello.jar!/skin/winaero/ os=WINNT osversion>=6
-skin xulschoolhello classic/1.0 jar:chrome/xulschoolhello.jar!/skin/mac/    os=Darwin
-
- -

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 4 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 extension is getting too big, you should look into reducing image size.

-
- -

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 jar:chrome/xulschoolhello.jar!/skin/all/
-skin xulschoolhello-os classic/1.0 jar:chrome/xulschoolhello.jar!/skin/unix/
-skin xulschoolhello-os classic/1.0 jar:chrome/xulschoolhello.jar!/skin/win/    os=WINNT
-skin xulschoolhello-os classic/1.0 jar:chrome/xulschoolhello.jar!/skin/winaero/ os=WINNT osversion>=6
-skin xulschoolhello-os classic/1.0 jar:chrome/xulschoolhello.jar!/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 state of 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, 24px, 24px, 0px);
-}
-
-#xulschoolhello-hello-world-button:not([disabled="true"]):hover {
-  -moz-image-region: rect(24px, 24px, 48px, 0px);
-}
-
-#xulschoolhello-hello-world-button[disabled="true"] {
-  -moz-image-region: rect(48px, 24px, 72px, 0px);
-}
-
-#xulschoolhello-hello-world-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(72px, 24px, 96px, 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, 36px, 23px, 0px);
-}
-
-#xulschoolhello-hello-world-button[disabled="true"] {
-  -moz-image-region: rect(23px, 36px, 46px, 0px);
-}
-
-#xulschoolhello-hello-world-button:not([disabled="true"]):hover:active {
-  -moz-image-region: rect(46px, 36px, 69px, 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,
-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, 24px, 24px, 0px);
-  /* Or: list-style-image: url("moz-icon://stock/gtk-some-icon?size=menu"); */
-}
-
-#xulschoolhello-hello-world-button[disabled="true"] {
-  -moz-image-region: rect(24px, 24px, 48px, 0px);
-}
-
- -

The Windows and Linux themes have several CSS rules that 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 (and we don't recommend doing it), 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.

- -

Adding toolbar buttons to existing toolbars

- -

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(extensions);
-else
-    Application.getExtensions(firstRun);
-
- -

The FUEL library currently only works on Firefox 3 and above.

- -

{{ PreviousNext("Escuela_XUL/Agregar_menus_y_submenus", "Escuela_XUL/Agregar_eventos_y_comandos") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/agregar_barras_laterales/index.html b/files/es/mozilla/tech/xul/escuela_xul/agregar_barras_laterales/index.html deleted file mode 100644 index 64b2aea74a..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/agregar_barras_laterales/index.html +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Agregar barras laterales -slug: Mozilla/Tech/XUL/Escuela_XUL/Agregar_barras_laterales -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_sidebars ---- -
-

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("Escuela_XUL/Agregar_ventanas_y_dialogos", "Escuela_XUL/Uso_de_objetos_en_JavaScript") }}

- -

The sidebar in Firefox is a relatively large and flexible space to add rich interfaces without requiring new windows or complicated overlays. Sidebars take as much space as the user wants them to, and provide a frame where you can add elaborate data and controls. You're probably familiar with the Bookmarks and History sidebars. If not, you can open either one from the View > Sidebar menu. They also have shortcuts to open or close them using the keyboard.

- -

The code required to add a sidebar is very simple, as explained in Creating a Firefox Sidebar. It's even simpler than that. All you need is to overlay the View Sidebar menu.

- -
-
-
<menupopup id="viewSidebarMenu">
-  <menuitem id="xulschoolhello-sidebar"
-    label="&xulschoolhello.sidebar.title;"
-    accesskey="&xulschoolhello.sidebar.accesskey;"
-    type="checkbox" autoCheck="false" group="sidebar"
-    sidebarurl="chrome://xulschoolhello/content/sidebar.xul"
-    sidebartitle="&xulschoolhello.sidebar.title;"
-    oncommand="toggleSidebar('xulschoolhello-sidebar');" />
-</menupopup>
-
-
- -

The example in the MDC page includes a shortcut key combination to toggle the new sidebar. Keyboard shortcuts are an essential feature of Firefox, and you can add your own into your extensions, which is also great. The problem is that choosing the right keyboard shortcuts is very, very hard, as explained by the creator of AdBlock Plus, and the Mozilla Keyboard Reference. To sum up both of these references: you can choose an obscure key combination that won't conflict with Firefox, such as Ctrl+Shift+(some letter), but there's no way of knowing if any other extension uses that same combination as well. Shortcut keys can be very valuable for advanced users, but don't rely on them.

- -

The XUL page for the sidebar can hold any content you want and it's no different from other XUL windows or overlays. One minor difference is that the XUL sidebar should be defined using the page root element instead of window or dialog. The load event is fired every time the sidebar is opened, and unload every time it's closed, so you can use those for initialization and clean up .

- -

Another, more important difference to take into account is that users can resize the sidebar to their liking, and in most cases, the sidebar is going to be fairly narrow. You should design the content of your sidebar carefully, so that it is usable and appealing regardless of width. There are ways to limit the size boundaries of your sidebar with CSS or even disable resizing altogether, but none of those are good practices. Forcing sidebars to have a fixed size can cause accessibility and usability problems.

- -

You can still have plenty of content available in your sidebar, you just need to organize it in a way that doesn't take too much space. For this purpose we'll also look at some handy XUL elements in this section. They allow you to stack content on top of other content and switch between different sections easily.

- -

The tabbox Element

- -

The tabbox element creates a tabbed view of one or more tabpanel elements. You can see an example of a tabbox element if you open the Firefox Preferences window and select the Advanced section. The tabs are styled to match the operating system you're using, so you should avoid changing the CSS in tab boxes. On the other hand, if you need UI that behaves like a tabbox but doesn't look like one, you should still favor using a tabbox and use CSS to change its look. Using custom-made elements are likely to cause accessibility and functional problems.

- -

Creating a tabbed view is simple:

- -
-
-
<tabbox id="xulschoolhello-tabbox">
-  <tabs>
-    <tab label="&xulschoolhello.mainTab.label;" />
-    <tab label="&xulschoolhello.advancedTab.label;" />
-  </tabs>
-  <tabpanels>
-    <tabpanel>
-      <!-- Content for the main panel. -->
-    </tabpanel>
-    <tabpanel>
-      <!-- Content for the advanced panel. -->
-    </tabpanel>
-  </tabpanels>
-</tabbox>
-
-
- -

The first tab is selected by default, but you can change the default selection by setting the selected attribute to true in the tab element.

- -

A tabpanel can hold any kind of content. You should take into account that the whole tab box is going to be as large as the tab strip on the top and the content of the largest panel. You should try to balance the content in the tab panels so that you don't end up with uneven an  mostly empty panels.

- -

Decks and stacks

- -

Sometimes you'll need finer grained control than the one provided by a tabbox. In these cases the deck and stack elements are probably what you're looking for. They are extremely useful, and you'll find yourself using them in many situations besides sidebars.

- -

A deck is like a tabbbox without the tabs. It only displays one of its child nodes at a time, depending on its selectedIndex value. In the following example, the second child will be displayed, not the first which would be the default.

- -
-
-
<deck selectedIndex="2">
-  <hbox>
-    <!-- Content for the first child. -->
-  </hbox>
-  <hbox>
-    <!-- Content for the second child. -->
-  </hbox>
-</deck>
-
-
- -
-
-
Note how this is one of the few cases where an attribute of an element is named using camel case instead of all small caps.
-
-
- -

 The size of the deck depends on the size of the largest child node, just like in a tabbox.

- -
-
-
We recommend that you use hbox or vbox elements as children of a deck or stack. The code is easier to read and maintain this way.
-
-
- -

A deck can be very useful when you have a large piece of XUL code that only changes in a small way depending on different circumstances. For instance, you could have a window that is used for two different purposes, and the only difference between the two cases is a label that has a value in one case and something else in another. Using a .properties file and a string bundle is a viable option, but it involves a lot of code for something so simple, specially if that's the only case where you need dynamic text. The alternative is to use a deck with the two labels, and change the selected index depending on the purpose of the window. This way you can still use DTD, and the code remains simple.

- -

A stack is like a deck, except that all of its children are always on display, one of top of the other. It allows you to decompose complex UI into individual layers, broadening the layout possibilities. One common use for a stack is to have an image background that stretches horizontally and vertically depending on the size of the foreground object:

- -
-
-
<stack>
-  <hbox flex="1">
-    <image src="chrome://xulschoolhello/skin/stack-bg.png" flex="1" />
-  </hbox>
-  <hbox>
-    <!-- Some content here. -->
-  </hbox>
-</stack>
-
-
- -

This workaround is necessary because you can't have an background image stretch using CSS.

- -

A less common use for the stack element is to use the left and top attributes on its children in order to have absolute positioning for the content on the layers. This kind of positioning can be useful for various artistic effects, as well as some type of desktop-like or Dashboard-like interface, where items are located in positions determined by the user, and they can overlap with each other. This can become complicated very easily, though.

- -
Remember that you can't have flexibility and absolute positioning at the same time.
- -

Trees

- -

The bookmarks and history sidebars in Firefox use the tree element to show their content. Trees are another strong option when you need to show a great amount of information in a compact presentation. With a tree you can show a rather small amount of root nodes, giving the user the possibility to expand whichever ones are needed. Trees are specially powerful when combined with data templates, a topic that will be covered later on. You can also read much more about trees in the XUL Tutorial page.

- -

The tree element is possibly the most complex element in XUL. It is meant to be very versatile and malleable, but it can require a good amount of work before it fits your specific needs. It is in reality a hierarchical table view, so its content is defined in terms of rows and columns. Here's an example of a simple tree:

- -
-
-
<tree flex="1">
-  <treecols>
-    <treecol label="&xulschoolhello.nameColumn.label;" flex="1" />
-    <treecol label="&xulschoolhello.greetingColumn.label;" flex="3" />
-  </treecols>
-  <treechildren>
-    <treeitem>
-      <treerow>
-        <treecell label="Peter" />
-        <treecell label="Hey, what's up?" />
-      </treerow>
-    </treeitem>
-    <treeitem>
-      <treerow>
-        <treecell label="John"/>
-        <treecell label="Good evening, how are you doing?" />
-      </treerow>
-    </treeitem>
-  </treechildren>
-</tree>
-
-
- -

The text in the rows of the tree is hardcoded because we wouldn't generally use text from locale files. We would use data from a datasource such as a database or a remote API. This tree is not much of a tree because it only has one level of depth. A more elaborate tree would look like this:

- -
-
-
<tree flex="1">
-  <treecols>
-    <treecol label="&xulschoolhello.nameColumn.label;" flex="1" />
-    <treecol label="&xulschoolhello.greetingColumn.label;" flex="3" />
-  </treecols>
-  <treechildren>
-    <treeitem>
-      <treerow>
-        <treecell label="Peter" />
-        <treecell label="Hey, what's up?" />
-      </treerow>
-    </treeitem>
-    <!-- Notice that you need to specify the container attribute. -->
-    <treeitem container="true" open="true">
-      <treerow>
-        <treecell label="John"/>
-        <treecell label="Good evening, how are you doing?" />
-      </treerow>
-      <treechildren>
-        <treeitem>
-          <treerow>
-            <treecell label="John Jr."/>
-            <treecell label="Bah, bah!" />
-          </treerow>
-        </treeitem>
-      </treechildren>
-    </treeitem>
-  </treechildren>
-</tree>
-
-
- -

In this case, the row for "John" has a child row for "John Jr.". The treechildren element is placed as a child for John's treeitem element, and the container attribute must be set.

- -

It should be evident at this point that hand-coding a tree would take quite some time and yields a great deal of XML code that is hard to follow. This is why most of the uses of the tree element are for displaying data from an external datasource. Even handling the construction of a tree using Javascript and DOM functions can become very convoluted, which is why trees are better used along with templates. This topic will be covered later when we look at different kinds of datasources and templates.

- -

Adding style to a tree can also be challenging, which is why there's a guide at MDC specifically covering how to Style a Tree. Looking at the Bookmarks and History sidebars should make it clear that trees are quite customizable with CSS.

- -

{{ PreviousNext("Escuela_XUL/Agregar_ventanas_y_dialogos", "Escuela_XUL/Uso_de_objetos_en_JavaScript") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/agregar_eventos_y_comandos/index.html b/files/es/mozilla/tech/xul/escuela_xul/agregar_eventos_y_comandos/index.html deleted file mode 100644 index 8d1771e21a..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/agregar_eventos_y_comandos/index.html +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Agregar eventos y comandos -slug: Mozilla/Tech/XUL/Escuela_XUL/Agregar_eventos_y_comandos -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_Events_and_Commands ---- -

{{LegacyAddonsNotice}}{{AddonSidebar}}

- -

{{ PreviousNext("Escuela_XUL/Agregar_barras_de_herramientas_y_botones_para_éstas", "Escuela_XUL/El_modelo_de_caja") }}

- -

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("Escuela_XUL/Agregar_barras_de_herramientas_y_botones_para_éstas", "Escuela_XUL/El_modelo_de_caja") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/agregar_menus_y_submenus/index.html b/files/es/mozilla/tech/xul/escuela_xul/agregar_menus_y_submenus/index.html deleted file mode 100644 index e39f36363a..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/agregar_menus_y_submenus/index.html +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Agregar menus y submenus -slug: Mozilla/Tech/XUL/Escuela_XUL/Agregar_menus_y_submenus -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_menus_and_submenus ---- -
-

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("Escuela_XUL/Montando_un_ambiente_de_desarrollo", "Escuela_XUL/Agregar_barras_de_herramientas_y_botones_para_éstas") }}

- -

The Hello World example in the previous sections shows the two most common ways to add menus: adding them to the Tools menu (recommended) and adding them to the main menu bar (not recommended). 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 full of options, though, because too many options are confusing for most users.

- -

If your extension requires new 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. On those systems you can move toolbar controls to the menu bar when you're customizing your toolbars.

- -
-

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 at the beginning 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.

- -
-

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 unified 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("Escuela_XUL/Montando_un_ambiente_de_desarrollo", "Escuela_XUL/Agregar_barras_de_herramientas_y_botones_para_éstas") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/agregar_ventanas_y_dialogos/index.html b/files/es/mozilla/tech/xul/escuela_xul/agregar_ventanas_y_dialogos/index.html deleted file mode 100644 index 030ed3c918..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/agregar_ventanas_y_dialogos/index.html +++ /dev/null @@ -1,197 +0,0 @@ ---- -title: Agregar ventanas y dialogos -slug: Mozilla/Tech/XUL/Escuela_XUL/Agregar_ventanas_y_dialogos -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Adding_windows_and_dialogs ---- -

{{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}}

- -

{{ PreviousNext("Escuela_XUL/El_modelo_de_caja", "Escuela_XUL/Agregar_barras_laterales") }}

- -

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.

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/almacenamiento_local/index.html b/files/es/mozilla/tech/xul/escuela_xul/almacenamiento_local/index.html deleted file mode 100644 index 888f350c16..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/almacenamiento_local/index.html +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: Almacenamiento local -slug: Mozilla/Tech/XUL/Escuela_XUL/Almacenamiento_local -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Local_Storage ---- -

{{LegacyAddonsNotice}}{{AddonSidebar}}

-

{{ PreviousNext("Escuela_XUL/Manejo_de_preferencias", "Escuela_XUL/Interceptando_cargas_de_página") }}

- -

It is very common for an extension to require some kind of local persistent storage. We recommend that you at least keep an error log, so that you can request error data from your users when you encounter problems that are hard to debug. We'll discuss logging in this section, but first let's look at the right (or at least, common and scalable) way of managing local files.

- -

It is strongly recommended that you keep your local files inside the Firefox profile directory. Otherwise you may run into problems if the same extension is installed in multiple profiles. The common practice is to create a directory with the name of your project at the root of the profile folder, and keep your files inside. The structure could be something like this:

- - - -

The Directory Service and the {{ interface("nsIFile") }} interface are used to create the local directory. Here's what we usually do: we have a function that returns a reference to our root directory and creates it if necessary.

- -
getLocalDirectory : function() {
-  let directoryService =
-    Cc["@mozilla.org/file/directory_service;1"].
-      getService(Ci.nsIProperties);
-  // this is a reference to the profile dir (ProfD) now.
-  let localDir = directoryService.get("ProfD", Ci.nsIFile);
-
-  localDir.append("XULSchool");
-
-  if (!localDir.exists() || !localDir.isDirectory()) {
-    // read and write permissions to owner and group, read-only for others.
-    localDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0774);
-  }
-
-  return localDir;
-},
-
- -

ProfD is a special identifier for the profile directory that exists so that you don't need to figure out its location. In general this is the only directory flag you'll need, but sometimes you'll need access to other system directories, and you don't want to have to worry about which operating system or system language your extension is running on. A {{ source("xpcom/io/nsDirectoryServiceDefs.h","full list of these flags") }} can be found in the Firefox source.
- Having that function in place, we do something like the following:

- -
let myFile = XULSchool.getLocalDirectory();
-
-myFile.append("someFile.txt");
-// do stuff with the file.
- -

Files are handled with the {{ interface("nsIFile") }} interface. An {{ interface("nsIFile") }} doesn't necessarily represent an existing file, as in the previous examples. You first specify the file using {{ interface("nsIFile") }} and then use {{ ifmethod("nsIFile","create") }} to actually write it out to disk. You can also check if an {{ interface("nsIFile") }} exists using {{ ifmethod("nsIFile","exists") }}.

- -

To read and write information in files, you need to use stream objects. You can read more about reading and writing files here. In general you won't need to do this directly, but it's always useful to know.

- -

Finally, there's the issue of deleting local files when the extension is going to be uninstalled. Whether this is necessary or not is a matter of preference. Some extension developers prefer to leave the data there, so that if the user chooses to install the extension again, all the previous data will be recovered. This is the default behavior when Firefox is uninstalled: the profile information remains intact and it will be there waiting for you if Firefox is installed again. Others feel concerned about privacy and storing private information locally without deleting it. A good argument can be done for both, so it is up to you to choose what to do in this case. The FUEL library has an uninstall event you can use to perform these operations.

- -

Logging

- -

Good logging is essential in all kinds of software projects. Any extension that is more complex than a Hello World needs some way to log errors and trace execution without having to fire up a debugger.

- -

It used to be the case that custom logging solutions were necessary, but Mozilla Labs have come up with a JavaScript implementation of a logger similar to the Log4J logger used in Java projects. The logger is called Log4Moz and it is implemented as a JavaScript Code Module, so it only works on Firefox 3 and above.

- -

To use this logger, you need to copy the log4moz.js file to your modules directory. In the initialization method of your one of your "common" or startup objects, add the following code:

- -
let formatter = new Log4Moz.BasicFormatter();
-let root = Log4Moz.repository.rootLogger;
-let logFile = this.getLocalDirectory(); // remember this?
-let appender;
-
-logFile.append("log.txt");
-
-// Loggers are hierarchical, lowering this log level will affect all
-// output.
-root.level = Log4Moz.Level["All"];
-
-// this appender will log to the file system.
-appender = new Log4Moz.RotatingFileAppender(logFile, formatter);
-appender.level = Log4Moz.Level["All"];
-root.addAppender(appender);
-
- -

After that, you can create a logger object for any object in your project like this:

- -
this._logger = Log4Moz.repository.getLogger("XULSchool.SomeObject");
-
-this._logger.level = Log4Moz.Level["All"];
-
- -

{{ note("We recommend that you create a logger instance in the constructor of every object and store it in a private variable.") }}

- -

And then logging is done with any of the following methods, depending on the kind of message being logged:

- -
this._logger.fatal("This is a fatal message.");
-this._logger.error("This is an error message.");
-this._logger.warn("This is a warning message.");
-this._logger.info("This is an info message.");
-this._logger.config("This is a config message.");
-this._logger.debug("This is a debug message.");
-this._logger.trace("This is a trace message.");
-
- -

You can filter the output of the global logger or any specific logger instance by setting the level property. During development you should use the "All" level, but for release versions it's usually better to move the level up to "Warn", so that the log is compact and execution is more efficient.

- -
Note: We recommend that all exception catch blocks include some logging at the error or warn levels, and in general you should use logging freely in order to have as much information as possible to fix bugs and know what is going on. Don't log inside functions that are called too often, such as mouseover event handlers, or certain HTTP activity listeners. This impacts performance and fills the log with useless messages. We normally add a comment that indicates that logging is not done there for performance reasons.
- -

SQLite

- -

SQLite storage was introduced in Firefox 2, and it's the preferred storage mechanism in Firefox. It is the storage system used for the Places API that manages bookmarks and history. It's also used for storing cookies, form inputs, and others.

- -

SQLite is a lightweight SQL based storage system. It is ideal for embedding in other programs, and is currently in use in several popular applications. It's also the storage system we recommend for local storage in extensions.

- -

The Storage page has a good explanation on how to use the SQLite API, so we won't go over that again. If you're unfamiliar with SQL or if you're interested in knowing the restrictions in the syntax used by SQLite, you can read more at the SQLite site.

- -

You should carefully design your database structure, taking into account features you're planning on adding in the future. Adding or removing columns, or making other changes to your DB structure from one version of your extension to the next will probably cause breakage of user data in older versions. You'll need to carefully add migration code that moves the data from the old DB format to the new, and this becomes increasingly complex as you add new versions and new structure changes. So, be careful and plan for the future.

- -

There are two paths you can take when creating the local database you'll be using for your extension:

- - - -

RDF

- -

RDF used to be the preferred storage mechanism for Firefox. If was used for most of its datasources, and you can still see it in use here and there, like in the install.rdf file. It is being phased out, with SQLite taking its place in most cases. The RDF API may be removed at some point in the future because it requires a great deal of code even for the simplest tasks, and it currently sees little maintenance, so we don't recommend using it unless you really have to.

- -

You'll still need to understand at least a little about RDF when you read the documentation about templates.

- -

Templates

- -

Templates are a very powerful tool in Firefox. They allow you to automatically generate XUL content using information from a datasource, and automatically update the content once the datasource changes. They were designed with RDF datasources in mind, but since Firefox 3 they have been extended to support SQLite datasources as well.

- -

Handling templates can also be complicated, but it is worth the effort if you need to display long lists or trees with complex data. If you manage to get your display code to use templates, you will have saved a lot of coding. Since templates are not necessary for most extensions and they're a complicated subject, it's better that you read it from the experts. There's a very detailed XUL Template Guide here. As mentioned before, it revolves around RDF, so you may need to take some time to understand how RDF works. There's a section about SQLite Templates in the guide, but there are some concepts in it that will require you to read at least some of the rest of it.

- -

{{ PreviousNext("Escuela_XUL/Manejo_de_preferencias", "Escuela_XUL/Interceptando_cargas_de_página") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_a_colon__rendimiento_de_los_add-ons/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_a_colon__rendimiento_de_los_add-ons/index.html" deleted file mode 100644 index 74a50cf7a2..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_a_colon__rendimiento_de_los_add-ons/index.html" +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: 'Apéndice A: Rendimiento de los Add-ons' -slug: 'Mozilla/Tech/XUL/Escuela_XUL/Apéndice_A:_Rendimiento_de_los_Add-ons' -translation_of: 'Archive/Add-ons/Overlay_Extensions/XUL_School/Appendix_A:_Add-on_Performance' ---- -
-

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}}

- -
Note: See the newer article Performance best practices in extensions for more up-to-date information about how to optimize the performance of your add-on.
- -

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.

- -

Startup

- -

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.

- -

Page Loads

- -

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.

- -

Other Recommendations

- - diff --git "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_b_colon__instalar_y_desinstalar_scripts/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_b_colon__instalar_y_desinstalar_scripts/index.html" deleted file mode 100644 index 4ee95d992b..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_b_colon__instalar_y_desinstalar_scripts/index.html" +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: 'Apéndice B: Instalar y desinstalar Scripts' -slug: 'Mozilla/Tech/XUL/Escuela_XUL/Apéndice_B:_Instalar_y_desinstalar_Scripts' -translation_of: >- - Archive/Add-ons/Overlay_Extensions/XUL_School/Appendix_B:_Install_and_Uninstall_Scripts ---- -
-

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}}

- -

Add-ons normally run code at startup, and as it is covered in the main tutorial, all you need is a load event handler and a little code. It is also common for an add-on to require to run a script only when it is installed for the first time, or every time it is updated. It can be used to write or copy necessary files to the profile folder, like the initial DB the add-on will use for storage. A few others require cleanup code to be run after the add-on is uninstalled. This appendix covers these cases with simple code that should work for most add-ons.

- -

Install Scripts

- -

Just like with a regular initialization function, we want a load event handler:

- -
// rest of overlay code goes here.
-window.addEventListener(
-  "load", function() { XulSchoolChrome.BrowserOverlay.init(); }, false);
-
- -

Then all we need is some persistent flag that ensures that the first run code is only run once. The best approach in this case is to use a preference, as explained in the Handling Preferences section. So, if we were to use FUEL, we can do the following in the init function:

- -
init : function() {
-  let firstRunPref =
-    Application.prefs.get("extensions.xulschoolhello.firstRunDone");
-
-  if (!firstRunPref.value) {
-    firstRunPref.value = true;
-    // all the rest of the first run code goes here.
-  }
-}
-
- -

In this case you would need to declare the first run preference in your default preferences file, with a default value of false. You should also change the preference value before you run any other first run code. Keep in mind that the user could have set multiple Firefox windows to open at startup, so there's a race condition on which window will run the first run code.

- -

If you need to run code on every update, or some of them, the code would be very similar. Instead of a boolean preference, it would be best to use a string preference with the last-installed add-on version. And then do a version comparison to decide which code to run. The current version number can be hard-coded in the first run function, or you can use the Add-on Manager to dynamically get it. This can get tricky with the Firefox 4 AddonManager, so it's probably best to keep it simple.

- -

Uninstall Scripts

- -

There are two common cases for needing these: cleaning up local data and presenting an uninstall feedback form. Regarding local data, it is debatable if it is good practice to remove it or not. If an add-on is uninstalled and later installed again, it might be desirable for preferences and other settings to be kept. Another argument in favor of keeping that data is that Firefox doesn't delete its profile folders after it is uninstalled, so it would be consistent to keep it. On the other hand, local data that is no longer needed takes unnecessary disk space and can contain private information that users forget is there. It's up to the developer's discretion.

- -

Uninstalling an add-on happens in 2 stages: first the add-on is flagged to be uninstalled, and then the add-on is actually removed. In the case of Bootstrapped Extensions, both steps happen at the same time. In the case of "traditional" extensions, like those explained in the tutorial, both steps happen at different times. In this case the user is told that Firefox needs to restart in order for the extension to be completely removed. Then the user has the option to restart right away, wait to restart whenever is convenient, or even cancel the uninstall operation. The add-on will not be completely removed until the browser is restarted.

- -

So, in order to detect the first stage, you'll need to add an event listener using the addAddonListener method. The data parameter explains the action being performed.

- -

If you detect your add-on is going to be uninstalled at this stage, it's a good time to show the uninstall feedback form. It is not a good time to clean up your files, at least not without prior user consent. Remember that the user can revert this decision. So, you should listen to other events, like canceling the operation, to make sure that you know what is going on. Set a boolean flag that indicates if your add-on is set to be uninstalled or not, and reset it when necessary.

- -

The second stage is knowing when the application is actually going to be closed. Then you'll have reasonable certainty that the add-on will be removed and you can perform any cleanup operations safely. For this, you need to add an observer for the quit-application topic. This is when you'll know the application will close. Then you can check the flag you set up on the first stage and perform any necessary deletions. You shouldn't perform very time-consuming operations here, at least not without telling users what is going on.

diff --git "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_c_colon__evitar_usar_eval_en_los_add-ons/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_c_colon__evitar_usar_eval_en_los_add-ons/index.html" deleted file mode 100644 index 1fb0b53d94..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_c_colon__evitar_usar_eval_en_los_add-ons/index.html" +++ /dev/null @@ -1,210 +0,0 @@ ---- -title: 'Apéndice C: Evitar usar eval en los Add-ons' -slug: 'Mozilla/Tech/XUL/Escuela_XUL/Apéndice_C:_Evitar_usar_eval_en_los_Add-ons' -translation_of: >- - Archive/Add-ons/Overlay_Extensions/XUL_School/Appendix_C:_Avoid_using_eval_in_Add-ons ---- -
-

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}}

- -

Using eval in extensions is almost always unnecessary, and many times even a security vulnerability. Moreover, code using eval is harder to parse for a human mind, is often pretty complex, and relies on assumptions that are not necessarily true in the future or even now.

- -

This article is aimed at presenting alternatives to common eval uses in add-ons and other Javascript code.

- -

Add-on authors are strongly encouraged to update their code to eliminate all use of eval, no matter if the add-on is to be hosted in the Mozilla Add-ons Gallery or not. In order to host your add-on with Mozilla it is crucial to minimize or completely eliminate eval use in order to receive a positive review and have your add-on made public.

- -

Parsing JSON

- -

Mozilla provides native JSON support since Firefox 3. There is simply no need to parse JSON using eval. Additionally, parsing JSON retrieved from a remote location becomes a security vulnerability when parsed with the eval function. Basically, you are executing remote code with full chrome access; that is, introducing a remote code execution vulnerability. Even if you trust the remote server; for example, because it is one you rent and administer yourself, there is a huge security risk, because of, but not limited to:

- - - -

Use Native JSON

- -

Since Firefox 3.5 you should use native JSON. In Firefox 3.0, you may take a look at {{ Interface("nsIJSON") }} instead. Using native JSON has the added benefit that it is better when validating the input and also a lot faster.

- -
Note: Do not use JSON parsers implemented in Javascript. These implementations are less efficient and often also contain serious security vulnerabilities. Such implementations are meant to be used within a very different security context, namely a website, where the origin of the data is usually known in all instances and where vulnerabilities would have a much smaller impact.
- -

Passing around functions/code as strings

- -

Often you'll want to pass functions or code to other functions, most notoriously setTimeout and addEventListener. Often this is achieved by a hack "function/code as string" technique.

- -
// DO NOT USE
-setTimeout("doSomething();", 100);
-addEventListener("load", "myAddon.init(); myAddon.onLoad();", true);
-setInterval(am_I_a_string_or_function_reference_qmark, 100);
-
- -

That in itself is certainly not elegant, but it may also become a security issue if you construct the passed code with externally provided data:

- -
// DO NOT USE
-setTimeout("alert('" + xhr.responseText + "');", 100);
-// Attacker manipulated responseText to contain "attack!'); format_computer(); alert('done"
-setTimeout("alert('attack!'); format_computer(); alert('done');", 100);
-
- -

As a general rule of thumb, just don't pass code around as strings and execute it by calling eval, setTimeout and friends.

- -

Alternative: Use (anonymous) functions

- -

You can always create a small anonymous function to pass around instead. Closures will ensure the code is still valid, even if your outer function already returned from execution.

- -
addEventListener("load", function() { myAddon.init(); myAddon.onLoad(); }, true);
-function doXHR() {
-  //...
-  var response = xhr.responseText;
-  setTimeout(function() { alert(response); }, 100);
-}
-
- -

Alternative: Use Function.bind

- -

Function.bind is a new utility function that you may use to (partially) bind parameters to functions.

- -
addEventListener("load", myAddon.init.bind(myAddon), true);
-setTimeout(alert.bind(null, xhr.responseText), 100);
-
- -

Overriding/Extending existing functions

- -

A common thing add-ons do during their initialization is overriding/extending existing browser functions by using Function.toString/Function.toSource and eval to "string-patch" the function body.

- -
// DO NOT USE
-var functionBody = gBrowser.addTab.toSource();
-var afterBracket = functionBody.indexOf("{"} + 1;
-functionBody = functionBody.substring(0, afterBracket) + "myAddon.onAddTab(aURI);" + functionBody.substring(afterBracket);
-eval("gBrowser.addTab = " + functionBody);
-
- -

Of course, this not only looks messy, but can be quite error prone.

- - - -

Like with "Passing functions/code as strings" above, patching function to include some external data will create security vulnerabilities.

- -

Alternative: Replace + Function.apply

- -

You may replace the original function with a new function, keeping a reference to the original function which you then call from the new one.

- -
(function() {
-  var _original = gBrowser.addTab; // Reference to the original function
-  gBrowser.addTab = function() {
-    // Execute before
-    try {
-        myAddon.onAddTab(arguments[0]);
-    } catch (ex) { /* might handle this */ }
-    // Execute original function
-    var rv = _original.apply(gBrowser, arguments);
-    // execute afterwards
-    try {
-      myAddon.doneAddTab(rv);
-    } catch (ex) { /* might handle this */ }
-
-    // return the original result
-    return rv;
-  };
-})();
-
- -

This is admittedly more verbose, but at the same time it should be easier to understand.

- - - -
Note: It is not safe to remove such an override again, as this method constitutes in a single-linked function chain. If you want to disable your overrides again, then use a flag indicating that, or similar. At the same time, it is also not safe to "un-string-patch" a function, for the exact same reason.
- -
Note: There are still some scenarios where incompatibilities may arise, such as trying to cancel the function call under a certain set of conditions when other Add-ons have overridden the same function. Again, this is a problem with the "string-patch" method, too. How to handle this is inter-Add-on specific and not addressed in this article.
- -

Triggering event handlers

- -

Sometimes scripts might want to manually trigger an event handler that is defined directly in the XUL document. Consider the following XUL fragment throughout the rest of this section.

- -
<menuitem id="mymenu" oncommand="executeSomething; executeSomethingElse();"/>
-<label id="mylabel" onclick="executeSomething; executeSomethingElse();"/>
-
- -

Add-on authors commonly use eval to trigger the handlers.

- -
// DO NOT USE
-eval(document.getElementById("mymenu").getAttribute("oncommand"));
-eval(document.getElementById("mylabel").getAttribute("onclick"));
-
- -

Alternative: Dispatch real events

- -

Dispatching real events has the added bonus that all other event listeners for that Element (and the corresponding bubbling/capturing chain) will fire as well, so this method will have the closed resemblance to a real user event.

- -
// Fake a command event
-var event = document.createEvent("Events");
-event.initEvent("command", true, true);
-document.getElementById("mymenu").dispatchEvent(event);
-
-// Fake a mouse click
-var mouseEvent = document.createEvent("MouseEvents");
-event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
-document.getElementById("mylabel").dispatchEvent(mouseEvent);
-
- -

Please see the corresponding documentation on how to use and initialize particular event types.

- -

Alternative: Element.doCommand()

- -

Elements that have a command (oncommand) assigned will also have a working doCommand method.

- -
document.getElementById("mymenu").doCommand();
-
- -

Accessing properties via computed names

- -

Not that common anymore, but still existing, are Add-Ons or other Javascript programs that access object properties using eval when the property name is not a literal, but computed on the fly.

- -
//DO NOT USE
-eval("myAddon.phrases.word" + word + " = '" + phrase + "';");
- -

Again, this is not only unnecessarily hard to parse for a human, but may also contain security vulnerabilities if you compute the names using external data.

- -

Alternative: Using bracket-access to object properties

- -

Object properties can always accessed using the bracket syntax:

- -
obj["property"] === obj.property
-
- -

Hence the following will just work without having to resort to eval.

- -
myAddon.phrases["word" + word] = "phrase";
-
- -

Special thanks

- -

Special thanks goes to Wladimir Palant of Adblock Plus, who wrote an article years back which heavily inspired this one.

- -

See also

- - diff --git "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_d_colon__cargar_scripts/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_d_colon__cargar_scripts/index.html" deleted file mode 100644 index e282486a46..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_d_colon__cargar_scripts/index.html" +++ /dev/null @@ -1,304 +0,0 @@ ---- -title: 'Apéndice D: Cargar Scripts' -slug: 'Mozilla/Tech/XUL/Escuela_XUL/Apéndice_D:_Cargar_Scripts' -translation_of: 'Archive/Add-ons/Overlay_Extensions/XUL_School/Appendix_D:_Loading_Scripts' ---- -
-

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}}

- -

Most add-ons and XUL Runner applications provide their primary functionality by loading and executing JavaScript code. Because there are such a diverse array of add-ons, and because the needs of developers have grown organically over time, the Gecko runtime provides a number of means to dynamically load and execute JavaScript files. Each of these means has its own advantages and disadvantages, as well as its own quirks which may trap the unwary. Below is an overview of the more common means of loading scripts, along with some of their primary advantages, disadvantages, quirks, and use cases.

- -

The examples below which make use of the Services global assume that you're previously imported the Services.jsm module. As this module only exists on Firefox 4 and other Gecko 2-based platforms, the services in question will have to be manually loaded on other platforms.

- -

 

- -

<script> tags

- -

 

- -

XUL script tags are traditionally the primary means of loading scripts for extension developers. These tags are generally inserted into XUL overlay files or other XUL documents, after which they are automatically loaded into the context of the XUL window in question and executed immediately and synchronously.

- -

Advantages

- - - -

Disadvantages

- - - -

Example

- -

The following overlay will load the script “overlay.js” from the same directory as the overlay file into the window which it overlays. The script will be read with the UTF-8 encoding, based on the encoding of the overlay, and will execute as JavaScript version 1.8, based on the version specified in the script tag.

- -
<?xml version="1.0" encoding="UTF-8"?>
-
-<!DOCTYPE overlay>
-
-<overlay id="script-overlay"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-    <script type="application/javascript;version=1.8" src="overlay.js"/>
-
-</overlay>
- -

evalInSandbox

- -

The Components.utils.evalInSandbox method may be used to load arbitrary code into Components.utils.Sandbox objects. JavaScript files or URLs may be loaded in this manner by first retrieving their contents into memory using an XMLHttpRequest. This is the method used by Jetpack's securable module system to load nearly all executable code.

- -

Advantages

- - - -

Disadvantages

- - - -

Examples

- -

The following code will execute a simple script in a Sandbox with the privilege level of the current content page. The globals of the current content window will be available in the scripts global scope. In stack traces, the script will appear to have been loaded from the file "zz-9://plural/zed/alpha", line 42.

- -
// Use the current content window as the execution context.
-// To make properties defined by scripts executing on the page
-// available to your sandbox script, use content.wrappedJSObject
-// instead.
-let context = content;
-
-// Create the Sandbox
-let sandbox = Components.utils.Sandbox(context, {
-    // Make properties of the context object available via the
-    // script's global scope
-    sandboxPrototype: context,
-    // Wrap objects retrieved from the sandbox in XPCNativeWrappers.
-    // This is the default action.
-    wantXrays: true
-});
-
-// The script that will be executed:
-let script = String();
-
-// Evaluate the script:
-Components.utils.evalInSandbox(script, sandbox,
-                               // The JavaScript version
-                               "1.8",
-                               // The apparent script filename:
-                               "zz-9://plural/zed/alpha",
-                               // The apparent script starting line number:
-                               42);
-
- -

The following code will execute a simple script loaded from a local file in the same directory as the current script. The script will execute in the same security context as the current script and will have access to the same globals, but any new globals it creates will be accessible only to the script itself. Objects passed out of the sandbox will not be wrapped in XPCNativeWrappers but will still be wrapped in inter-compartment proxies.

- -
const XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1",
-                                              "nsIXMLHttpRequest",
-                                              "open");
-
-function loadScript(name, context) {
-    // Create the Sandbox
-    let sandbox = Components.utils.Sandbox(context, {
-        sandboxPrototype: context,
-        wantXrays: false
-    });
-
-    // Get the caller's filename
-    let file = Components.caller.stack.filename;
-    // Strip off any prefixes added by the sub-script loader
-    // and the trailing filename
-    let directory = file.replace(/.* -> |[^\/]+$/g, "");
-    let scriptName = directory + name;
-
-    // Read the script
-    let xmlhttp = XMLHttpRequest("GET", scriptName, false);
-    xmlhttp.overrideMimeType("text/plain");
-    xmlhttp.send();
-    let script = xmlhttp.textContent;
-
-    // Evaluate the script:
-    Components.utils.evalInSandbox(script, sandbox,
-                                   "1.8", scriptName, 0);
-}
-
-
-// Use the current global object.
-// The following may be used instead at the top-level:
-//
-// let context = this
-if (Components.utils.getGlobalForObject)
-    // Gecko 2.x
-    var context = Components.utils.getGlobalForObject({});
-else
-    // Gecko 1.x
-    context = {}.__parent__;
-
-loadScript("script.js", context);
-
- -

The Sub-Script Loader

- -

The {{ interface("mozIJSSubScriptLoader") }} can be used to load local scripts from the chrome:, resource:, and file: protocols into any JavaScript object. Any new globals created by this script are defined as properties of this object. Additionally, any properties of the target object are available as variables in the script's global namespace, along with as any properties of the global associated with the target object. These scripts execute with the same privileges and restrictions of the global associated with the target object, and this method can therefore also be used when with Sandbox objects with the same effect as evalInSandbox and into content windows with the same effect as injecting script tags into their documents.

- -

Advantages

- - - -

Disadvantages

- - - -

Examples

- -

The following code will load a script into its own context. The script will execute with the security principal of and have access to the global properties of the current global.

- -
let context = {};
-Services.scriptloader.loadSubScript("chrome://my-package/content/foo-script.js",
-                                    context, "UTF-8" /* The script's encoding */);
-
- -

The following code will execute a simple script loaded from a local file in the same directory as the current script. The script will execute in the same security context as the current script and will have access to the same globals, but any new globals it creates will be accessible only to the script itself. Objects passed out of the sandbox will not be wrapped in XPCNativeWrappers but will still be wrapped in inter-compartment proxies.

- -
function loadScript(name, context) {
-    // Create the Sandbox
-    let sandbox = Components.utils.Sandbox(context, {
-        sandboxPrototype: context,
-        wantXrays: false
-    });
-
-    // Get the caller's filename
-    let file = Components.caller.stack.filename;
-    // Strip off any prefixes added by the sub-script loader
-    // and the trailing filename
-    let directory = file.replace(/.* -> |[^\/]+$/g, "");
-
-    Services.scriptloader.loadSubScript(directory + name,
-                                        sandbox, "UTF-8");
-}
-
-loadScript("foo.js", this);
-
- -

JavaScript modules

- -

JavaScript modules are used to efficiently load scripts into their own global namespaces. Because these scripts are loaded from a bytecode cache, and the same scripts are loaded only once per session no matter how many times they are imported, this is one of the most performant methods of script loading.

- -

Advantages

- - - -

Disadvantages

- - - -

Examples

- -

The following code will import a module into the current global scope. All variables named in the target script's EXPORTED_SYMBOLS global array will be copied into the current execution context.

- -
Components.utils.import("resource://my-package/my-module.jsm");
-
- -

The following function will import an arbitrary module into a singleton object, which it returns. If the argument is not an absolute path, the module is imported relative to the caller's filename.

- -
function module(uri) {
-    if (!/^[a-z-]+:/.exec(uri))
-        uri = /([^ ]+\/)[^\/]+$/.exec(Components.stack.caller.filename)[1] + uri + ".jsm";
-
-    let obj = {};
-    Components.utils.import(uri, obj);
-    return obj;
-}
-
- -

Given the above code, the following code will import the module "my-module.jsm" from the current directory and define the symbols foo and bar from that module in the current scope. It will also import the symbol Services from the standard Services.jsm module.

- -
const { Services } = module("resource://gre/modules/Services.jsm");
-const { bar, foo } = module("my-module");
-
- -

DOM Workers: Worker and ChromeWorker

- -

DOM Workers can be used to load scripts into their own global contexts which run in their own threads. In order to ensure thread safety, these contexts are extremely limited, can't be passed JavaScript objects, and have no access to the DOM. All communication between these contexts and outer contexts is marshalled through JSON encoding and decoding. ChromeWorkers also have access to ctypes and a limited number of thread safe XPCOM classes, but are otherwise limited to simple computation based on data passed via messages and XMLHttpRequests.

- -

Advantages

- - - -

Disadvantages

- - - -

Jetpack Processes

- -

nsIJetpack classes are very similar to DOM workers, except that modules execute in entirely separate processes rather than separate threads. Additionally, rather than directly loading files, scripts are executed by evaluating strings.

- -

Advantages

- - - -

Disadvantages

- - diff --git "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_e_colon__dom_e_inserci\303\263n_html/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_e_colon__dom_e_inserci\303\263n_html/index.html" deleted file mode 100644 index 66073bcc6b..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/ap\303\251ndice_e_colon__dom_e_inserci\303\263n_html/index.html" +++ /dev/null @@ -1,244 +0,0 @@ ---- -title: 'Apéndice E: DOM e inserción HTML' -slug: 'Mozilla/Tech/XUL/Escuela_XUL/Apéndice_E:_DOM_e_inserción_HTML' -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/DOM_Building_and_HTML_Insertion ---- -
-

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}}

- -

Many add-ons need to dynamically generate DOM content, either XUL or HTML, from their scripts. For security reasons, and to prevent errors, care needs to be taken to avoid evaluating arbitrary text as HTML. Failure to do so can lead to execution or remote scripts, and in the worst cases to privilege escalation which can leave a user's PC open to remote attack.

- -

Building DOM Trees

- -

In most cases, DOM trees should be built exclusively with DOM creation methods. The following methods will all safely create a DOM tree without risk of remote execution.

- -

E4X Templating

- -

The following function can be used to generate DOM nodes from E4X XML objects. It has the advantage of appearing identical to ordinary HTML, but the disadvantage of being nearly exclusive to Firefox.

- -
var HTML = Namespace("html", "http://www.w3.org/1999/xhtml");
-var XUL = Namespace("xul", "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
-
-default xml namespace = HTML;
-function xmlToDOM(xml, doc, nodes) {
-   if (xml.length() != 1) {
-       let domnode = doc.createDocumentFragment();
-       for each (let child in xml)
-           domnode.appendChild(xmlToDOM(child, doc, nodes));
-       return domnode;
-   }
-   switch (xml.nodeKind()) {
-   case "text":
-       return doc.createTextNode(String(xml));
-   case "element":
-       let domnode = doc.createElementNS(xml.namespace(), xml.localName());
-       for each (let attr in xml.@*::*)
-           domnode.setAttributeNS(attr.namespace(), attr.localName(), String(attr));
-
-       for each (let child in xml.*::*)
-           domnode.appendChild(xmlToDOM(child, doc, nodes));
-       if (nodes && "@key" in xml)
-           nodes[xml.@key] = domnode;
-       return domnode;
-   default:
-       return null;
-   }
-}
- -

When passed an XML literal and a document, it returns the DOM tree corresponding to the XML for that document. If passed a third argument, the DOM node created for any element with a "key" attribute, is stored in a property of the given object named for the "key" attribute's value.

- -
default xml namespace = XUL;
-
-var href = "http://www.google.com/";
-var text = "Google";
-var nodes = {};
-document.documentElement.appendChild(
-    xmlToDOM(<hbox xmlns:html={HTML}>
-            <html:div>
-                <a href={href} target="_top" key="link">{text}</a>
-            </html:div>
-        </hhox>,
-        document, nodes);
-
-    nodes.link.addEventListener("click", function (event) { alert(event.target.href); }, false);
- -

JSON Templating

- -

For code which needs to be cross-browser compatible, a similar templating system can be used, based on JSON objects rather than E4X. It also has the advantage of being slightly more concise than the E4X variant, though no easier to read.

- -
var namespaces = {
-    html: "http://www.w3.org/1999/xhtml",
-    xul: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-};
-
-jsonToDOM.defaultNamespace = namespaces.html;
-function jsonToDOM(xml, doc, nodes) {
-    function namespace(name) {
-       var m = /^(?:(.*):)?(.*)$/.exec(name);
-       return [namespaces[m[1]], m[2]];
-    }
-
-   function tag(name, attr) {
-       if (isArray(name)) {
-           var frag = doc.createDocumentFragment();
-           Array.forEach(arguments, function (arg) {
-               if (!isArray(arg[0]))
-                   frag.appendChild(tag.apply(null, arg));
-               else
-                   arg.forEach(function (arg) {
-                       frag.appendChild(tag.apply(null, name[i]));
-                   });
-           });
-           return frag;
-       }
-
-       var args = Array.slice(arguments, 2);
-       var vals = namespace(name);
-       var elem = doc.createElementNS(vals[0] || jsonToDOM.defaultNamespace,
-                                      vals[1]);
-
-       for (var key in attr) {
-           var val = attr[key];
-           if (nodes && key == "key")
-               nodes[val] = elem;
-
-           vals = namespace(key);
-           if (typeof val == "function")
-               elem.addEventListener(key.replace(/^on/, ""), val, false);
-           else
-               elem.setAttributeNS(vals[0] || "", vals[1], val);
-       }
-       args.forEach(function(e) {
-           elem.appendChild(typeof e == "object" ? tag.apply(null, e) :
-                            e instanceof Node    ? e : doc.createTextNode(e));
-       });
-       return elem;
-   }
-   return tag.apply(null, xml);
-}
- -

In the above, the namespaces object defines the namespace prefixes which can be used in the given DOM tree. Event listeners can be defined on the given nodes by passing functions rather than strings to on* attributes.

- -
var href = "http://www.google.com/";
-var text = "Google";
-var nodes = {};
-document.documentElement.appendChild(
-    jsonToDOM(["xul:hbox", {},
-        ["div", {},
-            ["a", { href: href, key: "link",
-                    onclick: function (event) { alert(event.target.href); } },
-                text],
-            ["span", { class: "stuff" },
-                "stuff"]]],
-        document, nodes));
-
-alert(nodes.link);
- -

jQuery Templating

- -

For extensions which already use jQuery, it is possible to use its builtin DOM building functions for templating, though care must be taken when passing non-static strings to methods such as .append() and .html(). In most cases, .text() should be used instead of the latter. When using the jQuery constructor, only empty tags should be specified in order to avoid invoking the DOM parser.

- -
var href = "http://www.google.com/";
-var text = "Google";
- $("body").append(
-    $("<div>", { class: "foo" })
-        .append($("<a>", { href: href, text: text })
-                    .click(function (event) { alert(event.target.href) }))
-        .append($("<span>").text("Foo")));
- -

innerHTML with HTML Escaping

- -

This method is a last resort which should be used only as a temporary measure in established code bases. It is safe, though inefficient, to assign dynamic values to innerHTML if any dynamic content in the value is escaped with the following function:

- -
function escapeHTML(str) str.replace(/[&"<>]/g, function (m) "&" + ({ "&": "amp", '"': "quot", "<": "lt", ">": "gt" })[m] + ";");
- -

Note that quotation marks must be escaped in order to prevent fragments escaping attribute values, and that single quotes may not be used to quote attribute values in the fragment.

- -
var href = "http://www.google.com/";
-var text = "Google";
-
-document.getElementById("target-div").innerHTML = '<div>\
-        <a href="' + escapeHTML(href) '" target="_top">' + escapeHTML(text) + '</a>\
-    </div>'
- -

It needs to be stressed that this method should not be used in new code and is only a temporary measure to shore up legacy code bases.

- -

Safely Generating Event Listeners and Scripts

- -

It is occasionally necessary to generate event listeners and script fragments from dynamic content. Great care must be taken in these situations. Under no circumstances should code resembling 'callback("' + str + '")' appear anywhere in your add-on.

- -

Closures

- -

By far the best way to create dynamic event listeners is to use closures. The following two code fragments are roughly equivalent:

- -
function clickify(elem, address) {
-    elem.addEventListener("click", function (event) { openWindow(address) }, false);
-}
-
-function clickify(elem, address) {
-    elem.onclick = function (event) { openWindow(address) };
-}
- -

Multiple Attributes

- -

Sometimes there is a need for event listeners to appear as attributes in the DOM. In these cases, multiple attributes should be used, one for each variable:

- -
function clickify(elem, address) {
-    elem.setAttribute("href", address);
-    elem.setAttribute("onclick", "openWindow(this.getAttribute('href'))");
-}
- -

Escaping Functions

- -

When the code fragment in question is not an event handler attribute and there is no feasible way to pass the data through other means, they must be escaped with functions such as uneval, String.quote, JSON.stringify, or Number. Generating scripts in this matter is deprecated and should be avoided wherever possible, but is relatively safe and sometimes acceptable.

- -
function createScript(href, otherStuff) {
-    var script = function (href, otherStuff) {
-        doStuffWith(href);
-        doOtherStuff();
-        for (var someStuff in otherStuff)
-            doSomeMoreStuffWith(someStuff);
-    }
-
-    return script.toSource() + "(" + [String.quote(href), uneval(otherStuff)] + ")";
-}
- -

Safely Using Remote HTML

- -

In the above cases, we're working with text content that needs to appear in generated DOM. There are cases, however, where we need to safely display formatted HTML sent by a remote server. Fortunately, there is a safe and simple way to do this. The {{ ifmethod("nsIScriptableUnescapeHTML","parseFragment") }} method will convert a string to a document fragment while removing any scripts or other unsafe content in the process.

- -
function ParseHTML(doc, html) {
-    return Components.classes["@mozilla.org/feed-unescapehtml;1"]
-                     .getService(Components.interfaces.nsIScriptableUnescapeHTML)
-                     .parseFragment(html, false, null, doc.documentElement);
-}
- -

The returned fragment may be appended to any element in the given document.

- -
document.body.appendChild(ParseHTML(document, xhr.responseText, xhr.channel.name);
- -

See Also

- - - -
-

Original Document Information

- - -
- -

 

diff --git "a/files/es/mozilla/tech/xul/escuela_xul/documentaci\303\263n_de_mozilla/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/documentaci\303\263n_de_mozilla/index.html" deleted file mode 100644 index 0928dec065..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/documentaci\303\263n_de_mozilla/index.html" +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Documentación de Mozilla -slug: Mozilla/Tech/XUL/Escuela_XUL/Documentación_de_Mozilla -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Mozilla_Documentation_Roadmap ---- -
-

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("Notificaciones_de_usuario_y_alertas", "Escuela_XUL/Sitios_útiles_de_la_comunidad_Mozilla") }}

- -

Mozilla Documentation

- -

Firefox extension development is still an immature discipline, with a developer base consisting mostly of hobbyists and just a few organized development groups. There's a great deal of free online documentation available on XUL and extension development, but finding it and turning it into useful information can be a daunting task. Knowing where to look is critical and non trivial. This tutorial was aimed at compiling all the right resources for extension development and putting them in the right context, but there's much more to learn, and knowing how to find it is part of what we felt was necessary to teach.

- -

Let's look into the resources that have helped us the most.

- -

The Mozilla Developer Center

- -

This is the official and most extensive guide to everything related to Mozilla. MDC is where this tutorial is hosted, and where most of its links point to. It encompasses Firefox, other Mozilla products, Javascript, CSS, XUL, web and extension development guidelines, accessibility, usability, best practices... The list goes on. It's incredibly comprehensive, and its underlying Wiki technology makes it easy to expand and evolve with the help of the community.

- -

Having said that, there are a few problems with it. First of all, the in-site search is not reliable, so we recommend using a search engine like Google, with queries such as "MDC Javascript Code Modules" or "Javascript code modules site:developer.mozilla.org". Secondly, there are several important articles that are very lacking in information, like the Preferences System page. And finally, what we mentioned in our XPCOM section: almost no documentation on XPCOM components. The documentation on interfaces is very complete, but it isn't nearly as useful as the documentation that existed at XULPlanet and was later taken down. XULPlanet allowed you to navigate between interfaces and their related components, which makes locating components very easy. Hopefully this will be corrected in the future. In the meantime, you can still navigate XULPlanet using the Wayback Machine.

- -

MDC should be your first stop when looking for documentation. If you find it lacking or missing some piece of information, please consider adding it once you've found it. Everyone looking for it later will thank you for it.

- -

The AMO Developer Hub

- -

The AMO Developer Hub is a great guide for add-on developers. It includes links to tutorials and documentation, development tools, and most notably, the Mozilla Add-ons Forum. This is a great place to ask questions and have them answered by experienced developers. It also includes discussions on add-on monetization, job postings and a long list of add-on ideas waiting to be developed.

- -

The Mozilla Source

- -

Sometimes you need more than just a tutorial. There are various tricks that you can't learn anywhere, but you know that Firefox implements them in some way. In these cases you should dive into Mozilla's source code and try to locate the code you need. One way to do this is to look into your Firefox installation directory, maybe unpack a few JARs and see what's inside. But this is very awkward and limited. It would be much better to be able to search and navigate through the huge code base with some ease.

- -

Luckily, Mozilla provides exactly that in the Mozilla Cross-Reference. The main index in this page gives you options to look into the different product branches in development at Mozilla. Make sure you pick the one that matches your target versions.

- -

All of these provide advanced search capabilities, including regular expression search and file path search. You'll be able to navigate the full source tree, inspect the change history for all files, and link to specific code lines. It takes a little getting used to, specially learning how to choose the best search queries, but it's an invaluable resource of information.

- -

Mozilla Blogs

- -

Several Mozilla community members maintain blogs that are updated frequently, often including information on API changes, bug fixes, useful tools and future release plans. Many of the tips and tricks included in this tutorial were discovered by reading these blogs.

- -

There are several useful feeds that you can follow using a feed reader, such as Thunderbird. Here are some important feeds you should consider following:

- - - -

IRC and newsgroups

- -

Mozilla developers use their IRC channels heavily. There are several help and development channels where you can discuss problems and other topics in real time with the people that have the answers. You'll need an IRC client in order to do this, and the Chatzilla extension works well for this purpose. Problems using IRC include: finding help when you have a big timezone difference with the United States, and no records of previously asked questions and their answers.

- -

Another somewhat obscure communication channel is the Mozilla Newsgroups. They are also very diverse and active, and there's a good chance you'll get your queries answered. Thunderbird also comes in handy for reading and posting to the newsgroups. Another advantage is that discussions are archived and searchable through Google Groups.

- -

Other

- -

And finally, a couple resources you should also keep in mind:

- - - -

Good luck!

- -

{{ PreviousNext("Notificaciones_de_usuario_y_alertas", "Escuela_XUL/Sitios_útiles_de_la_comunidad_Mozilla") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/es/mozilla/tech/xul/escuela_xul/elementos_esenciales_de_una_extensi\303\263n/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/elementos_esenciales_de_una_extensi\303\263n/index.html" deleted file mode 100644 index 9fdbda1f36..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/elementos_esenciales_de_una_extensi\303\263n/index.html" +++ /dev/null @@ -1,417 +0,0 @@ ---- -title: Elementos esenciales de una extensión -slug: Mozilla/Tech/XUL/Escuela_XUL/Elementos_esenciales_de_una_extensión -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("Escuela_XUL/Introducción_a_las_extensiones_de_Firefox", "Escuela_XUL/Montando_un_ambiente_de_desarrollo") }}

- -

El archivo install.rdf

- -

En la última sección miramos a los contenidos de la extensión Hola Mundo. Ahora, miraremos sus archivos y su código, comenzando con el archivo install.rdf. Puedes abrirlo con cualquier editor de texto.

- -

El archivo tiene un formato distinto del XML tradicional, llamado RDF. RDF solía ser el mecanismo central de almacenamiento para Firefox, pero está siendo reemplazado por un sistema de bases de datos más sencillo. Hablaremos de ambos más adelante en este tutorial.

- -

Ahora, miremos a las partes importantes  del archivo.

- -
-
-
<em:id>holamundo@xulschool.com</em:id>
-
-
- -

Este es el identificador único para la extensión. Firefox necesita esto para distinguir tu extensión de otras extensiones, así que se requiere que tengas una ID única.

- -

Hay dos estándares aceptados para las ids de las extensiones. Una es el formato email presente en el ejemplo de Hola Mundo, que sería algo como <nombreproyecto-name>@<tudominio>. El otro estándar es usar una cadena de texto UUID, la cuál es extremadamente única, y es muy improbable que sea duplicada. Los sistemas basados en Unix tienen una herramienta desde la línea de comandos llamada uuidgen que genera UUIDs. Estas también se pueden crear utilizando herramientas específicas para todos los sistemas. Los paréntesis que cierran son simplemente notación, y son una práctica común. Siempre y cuando tu id sea única, está bien usar cualquiera de las formas.

- -
-
-
<em:name>XUL School Hello Worldem: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>
-
-
- -

Esta será la información que será mostrada antes y después de la que la extensión sea instalada, la que puedes ver en la ventana de Extensiones. La URL de la página principal puede ser visitada haciendo clic derecho en la extensión y eligiendo Visitar página principal. Hay muchas otras etiquetas que pueden ser añadidas, para contribuidores y traductores. La especificación completa del archivo install.rdf tiene todos los detalles.

- -

Ya que las extensiones pueden ser traducidas en múltiples idiomas, suele ser necesario traducir la descripción de la extensión, o incluso su nombre. A partir de Firefox 3 y superior, una descripción y nombres con localización específica se puede añadir de la siguiente manera:

- -
-
-
<em:localized>
-  <Description>
-    <em:locale>es-ES</em:locale>
-    <em:name>XUL School Hola Mundo</em:name>
-    <em:description>¡Bienvenido a XUL School!</em:description>
-  </Description>
-</em:localized>
-
-
- -

La cadena de texto es-ES indica que esta es la localización para española (es) para España (ES). Puedes añadir tantos <em:localized> como necesites Para Firefox 2, localizar este archivo es un poco más complicado. Hablaremos de la localizacion más adelante en esta sección.

- -
-
-
<em:type>2</em:type>
-
-
- -

Esto especifica que la extensión se instala como una extensión (y no como un tema, por ejemplo). Puedes leer los distintos tipos disponibles en la  especificación de install.rdf.

- -
-
-
<em:targetApplication>
-  <Description>
-    <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-    <em:minVersion>3.0</em:minVersion>
-    <em:maxVersion>6.0a1</em:maxVersion>
-  </Description>
-</em:targetApplication>
-
-
- -

Este nodo especifica a qué versiones apunta la extensión, especialmente Firefox, desde la versión 3.0 hasta las versiones experimentales de Firefox 6. La UUID es la ID única de Firefox. Otras aplicaciones y aplicaciones basadas en Mozilla como Thunderbird o Seamonkey tienen las suyas propias. Puedes tener una extensión que funcione en múltiples aplicaciones y versiones. Por ejemplo, si creas una extensión para Firefox, normalmente se debería hacer el pequeño esfuerzo para portarla a Flock o SeaMonkey, los cuáles tienen funciones y UI similares.

- -

La versión mínima y máxima especifica el rango en el cuál la extensión puede ser instalada. Aquí hay más sobre el formato de la versión. Si la aplicación o el rango de versiones no coinciden, no podrás instalar la aplicación, o la aplicación se instalará desactivada. Los usuarios pueden desactivar la comprobación de versiones a través de las preferencias o a través de extensiones como Add-on Compatibility Reporter.

- -

Esta es toda la información que Firefox y otras aplicaciones de Mozilla necesitan para instalar una extensión. Cualquier error o información omitida causará un error en el proceso de instalación, o la extensión se instalará como desactivada.

- -

El archivo chrome.manifest

- -
-

Chrome es el conjunto de elementos gráficos para el usuario de la ventana de la aplicación que están fuera del contenido de la ventana. Barras de herramientas, de menús, de progreso y de título son ejemplos de elementos que son parte de chrome.

-
- -

Extraído de Chrome Registration.

- -

En otras palabras, el chrome es todo lo que ves en Firefox. Todas las ventanas de Firefox pueden verse en dos partes: (1) la chrome y (2) la posible área de contenido, como aquella que muestra las páginas web en una pestaña de Firefox. Las ventanas como el administrador de extensiones o la ventana de descargas son puro chrome. La mayoría del código reside en la carpeta chrome, como en el ejemplo de Hola Mundo.

- -

Los archivos chrome están empacados en un archivo JAR, normalmente nombrados tras la extensión. No es necesario empacar los archivos chrome, pero es una práctica común y recomendada por razones de rendimiento.

- -

 

- -

Como hemos visto en la estructura de directorios de la extensión desempacada, la chrome está compuesta de 3 secciones: content, locale y skin. Estas 3 son necesarias para la mayoría de las extensiones. Si abrimos el archivo chrome.manifest (de nuevo, cualquier editor de texto servirá), veremos que las 3 secciones se mencionan:

- -
-
-
content   xulschoolhello              jar:chrome/xulschoolhello.jar!/content/
-skin      xulschoolhello  classic/1.0 jar:chrome/xulschoolhello.jar!/skin/
-locale    xulschoolhello  en-US       jar:chrome/xulschoolhello.jar!/locale/en-US/
-
-
- -

El archivo chrome.manifest le dice a Firefox donde mirar para los archivos chrome. El texto contiene varios espacios para que parezca una tabla, pero no es necesario. El parseador ignorará los espacios repetidos.

- -

La pimera línea le dice a Firefox que está siendo declarado (content, skin, locale, u otros que veremos más adelante). La segunda es el nombre del paquete, el cuál explicaremos en breve. Los paquetes skin y locale tienen un tercer valor para especificar que localización o tema están extendiendo. Puede haber múltiples temas y entradas de localización en relación a distintos temas y localizaciones. El caso más común es tener una entrada skin para el skin global, classic/1.0, y múltiples entradas locale, una para cada traducción. Finalmente, la localización es especificada.
- Nótese del esquema jar; le dice a Firefox que mire dentro del archivo JAR y lea los archivos del camino correcto. Si quieres tener una extensión con un directorio chrome desempacado, sólo necesitas cambiar los lugares a algo como chrome/content/.

- -

 

- -

Hay algunas opciones adicionales que pueden ser incluidas en las entradas del archivo chrome.manifest. Están documentadas en la página de Chrome Registration. Notablemente, podemos tener distintas entradas que sean específicas para cada SO. Esto es importante, especialmente en Firefox 3 y versiones superiores, donde la apariencia del navegador es muy diferente para cada sistema operativo. Si nuestra extensión necesitase parecer diferente en los sistemas mayoritarios, podríamos cambiar el archivo de manifiesto para que incluyese esto:

- -
-
-
content   xulschoolhello              jar:chrome/xulschoolhello.jar!/content/
-skin      xulschoolhello  classic/1.0 jar:chrome/xulschoolhello.jar!/skin/unix/
-skin      xulschoolhello  classic/1.0 jar:chrome/xulschoolhello.jar!/skin/mac/ os=Darwin
-skin      xulschoolhello  classic/1.0 jar:chrome/xulschoolhello.jar!/skin/win/ os=WinNT
-locale    xulschoolhello  en-US       jar:chrome/xulschoolhello.jar!/locale/en-US/
-
-
- -

De esta manera podemos tener temas distintos para Windows, Mac OS X, y Linux (además de otros sistemas similares a unix), cada uno definido en un directorio separado. Ya que la mayoría de los sistemas están basados en Unix, el tema "unix" es el utilizado por defecto, sin banderas.

- -

El Chrome

- -

Como se ha mencionado antes, el chrome se compone de 3 secciones: contenido, localizaciones y temas. El contenido es la sección mas importante, ya que tiene la interfaz de usuario (XUL) y archivos de scripts (JS). La sección de temas contiene los archivos que definen la mayoría del aspecto y la sensación de la UI (incluyendo CSS e imágenes, como las páginas web). Finalmente, la sección de localización incluye todos los textos utilizados en la extensión, en DTD y archivos de propiedades. Esta división permite a otros desarrolladores crear temas que reemplacen pieles, y traductores para crear localizaciones en distintos idiomas, todo esto sin tener que cambiar tu extensión o tu código. Esto le da a las extensiones de Firefox gran flexibilidad.

- -

Se accede a los archivos chrome  a través del protocolo chrome. Las URIs chrome se definen así:

- -
-
-
chrome://packagename/section/path/to/file
-
-
- -

Así que, por ejemplo, si quiero acceder al archivo browserOverlay.xul en la extensión, la URI chrome sería chrome://xulschoolhello/content/browserOverlay.xul. Si tienes demasiados archivos en el contenido y quieres organizarlos en subdirectorios, no necesitas cambiar nada en chrome.manifest, todo lo que necesitas es añadir el camino correcto tras content en la URI. Los temas y localizaciones funcionan de la misma manera, y no necesitas especificar sus nombre. Así que, para acceder al archivo DTD en la extensión Hola Mundo, el camino chrome es chrome://xulschoolhello/locale/browserOverlay.dtd. Firefox sabe qué localización buscar.

- -

Aquí tenemos un experimento interesante. Abre una pestaña nueva en Firefox, teclea chrome://mozapps/content/downloads/downloads.xul en la barra de notificaciones y pulsa ENTRAR. ¿Sorprendido? ¡Acabas de abrir la ventana de Descargas en tu pestaña de Firefox! Puedes acceder a cualquier archivo chrome simplemente tecleando su URI en la barra de direcciones. Esto puede ser útil si quieres inspeccionar archivos de script que son parte de Firefox, u otras extensiones, por ti sólo. La mayoría de estos archivos se abren como archivos de texto, a excepción de los archivos XUL, que se ejecutan y muestran como normalmente los verías en una ventana.

- -

Contenido

- -

Hay dos archivos de contenido en el directorio de contenido. Miremos el primer archivo XUL.

- -

Los archivos XUL son archivos XML que definen la interfaz gráfica de usuario de los elementos en Firefox y las extensiones de Firefox. XUL fue inspirado por HTML, así que verás bastantes similitudes entre ambos. De todos modos, XUL es también una mejora sobre HTML, habiendo aprendido de los errores cometidos durante la evolución de HTML. XUL te permite crear interfaces más ricas e interactivas que las que puedas crear con HTML, o al menos XUL lo hace más fácil.

- -

Los archivos XUL normalmente definen una de dos cosas: ventanas o superposiciones. El archivo que has abierto antes, downloads.xul, tiene el código que define la ventana de Descargas. El archivo XUL incluido en la extensión Hola Mundo tiene una superposición. Una superposición extiende una ventana ya existente, añadiendo nuevos elementos a esta o reemplazando algunos de los elementos que tiene. La línea que nos hemos saltado en el archivo  chrome.manifest declara que este archivo XUL es una superposición para la ventana principal del navegador.

- -
-
-
overlay chrome://browser/content/browser.xul  chrome://xulschoolhello/content/browserOverlay.xul
-
-
- -

Con esta línea, Firefox sabe que necesita tomar el contenido de browserOverlay.xul y superponerlo sobre la ventana principal del navegador, browser.xul. Puedes declarar overlays para cualquier ventana o diálogo en Firefox, pero superponer la ventana principal del navegador es el caso más común.

- -

Ahora echemos un vistazo a los contenidos de nuestro archivo XUL. Nos saltaremos las primeras líneas porque se refieren al tema y la localización, las cuales cubriremos más tarde.

- -
-
-
<overlay id="xulschoolhello-browser-overlay"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-
- -

El elemento raíz en el archivo es un overlay. Otros documentos XUL usan la etiqueta window o dialog. El elemento tiene una id única, la cuál deberías usar en la mayoría de los elementos en tu XUL. El segundo atributo es el espaciado de nombres, lo cuál es algo que siempre deberías definir en tu elemento raíz. Esto dice que este nodo y todos sus nodos hijos son XUL. Sólo necesitas cambiar las declaraciones del espaciado de nombres cuando combines distintos tipos de contenidos, como XUL con HTML o SVG.

- -
-
-
Es probable que te hayas dado cuenta del nombre que hemos usado en distintos lugares, así como la id xulschoolhello-browser-overlay. Este es el espaciado de nombres estándar que utilizamos para evitar conflictos con Firefox y otras extensiones, así como hacer algunas tareas de desarrollo más sencillas. Usamos el mismo espaciado de nombres en todas las ids y clases de estilo de los elementos de superposición porque serán mezclados con otros elementos en la ventana principal del navegador. Si usásemos ids genéricas como container o input, estas entrarían en conflicto con las ids usadas dentro de Firefox, o las ids de otras extensiones de superposición. Usando espaciado de nombres minimiza los problemas de compatibilidad con otras extensiones. Usamos camel casing para los nombres de archivos, y todo en minúsculas con barras para las ids de elementos y los nombres de clases de los estilos CSS.
-
-
- -
-
-
<script type="application/x-javascript"
-  src="chrome://xulschoolhello/content/browserOverlay.js" />
-
-
- -

Al igual que en HTML, esto incluye un script en JavaScript. Puedes tener tantos elementos scripts en un archivo XUL como necesites. Miraremos su código más tarde.

- -
-
-
También es posible que te hayas dado cuenta en el formato de nuestro código, y preguntarte sobre las reglas que seguimos. Nuestra regla general es que la longitud de la línea no sea superior a 80 caracteres. Esto puede parecer muy restrictivo, sobre todo en los archivos XML, pero este número ha sido elegido para permitir a casi todos los editores de texto que manejen estos archivos de manera sencilla. Incluso un editor de textos antiguo desde la línea de comandos funciona bien que cortan sus líneas antes de los 80 caracteres. La tabulación es muy directa: 2 espacios en blanco para indentar. Nunca usamos caracteres TAB, a excepción de los Makefiles, los cuáles cubriremos más adelante. La mayoría de nuestros estándares de código se basan en los estándares de Mozilla u otros conocidos.
-
-
- -

Nos saltaremos algo de código qie se cubrirá en la sección de localización, moviéndonos así a la parte importante del contenido:

- -
-
-
<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>
-
-
- -

Este es el código que añade el menú de Hola Mundo a la ventana del navegador. Para escribir este código, necesitamos algo de conocimiento sobre el código XUL en browser.xul. Necesitábamos saber que la id del menú principal es main-menubar. Estamos añadiendo un menú nuestro propio, y diciéndole a Firefox que lo añada a la barra de menú principal, justo después del menú de ayuda. Ese es el propósito del atributo:

- -
-
-
insertafter="helpMenu"
-
-
- -

helpMenu es la id del elemento del menú que corresponde al menú de Ayuda en la ventana principal del navegador. Más adelante veremos como podemos encontrar cosas como las ids de los elementos del navegador, pero por ahora miraremos a los elementos que componen el menú de Hola Mundo.

- -

El elemento menubar representa la barra de menús que normalmente ves arriba del todo de una ventana de aplicación. La ventana principal de Firefox tiene una, pero pocas otras ventanas tienen. También es raro para ventanas adicionales de una extensión tengan sus propias barras de menú.

- -

Hemos añadido el menú de Hola Mundo justo en la "raíz" de la barra de menús así que sería muy fácil para ti localizarlo, pero no es una práctica recomendada. Imaginemos si todas las extensiones añadieran menús a la barra de menús de arriba; teniendo unas pocas extensiones haría que el menú pareciese como un salpicadero de un avión, lleno de opciones. El lugar recomendado para los menús de extensiones es bajo el menú de Herramientas, así que el código se parecería a este:

- -
-
-
<menupopup id="menu_ToolsPopup">
-  <menu id="xulschoolhello-hello-menu" label="&xulschoolhello.hello.label;"
-    accesskey="&xulschoolhello.helloMenu.accesskey;"
-    insertafter="javascriptConsole,devToolsSeparator">
-    <menupopup>
-      <menuitem id="xulschoolhello-hello-menu-item"
-        label="&xulschoolhello.hello.label;"
-        accesskey="&xulschoolhello.helloItem.accesskey;"
-        oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);" />
-    </menupopup>
-  </menu>
-</menupopup>
-
-
- -

Estamos superponiendo un menú que está más adentro en nuestro árbol XUL, pero no parece importar porque todo lo que necesitamos es la id del elemento que queremos superponer. En estado es el elemento menupopup que está dentro del elemento del menú de Herramientas. El atributo insertafter le dice a Firefox que añada el menú debajo del objeto de la Consola de Errores (formalmente conocida como la Consola de JavaScript) en el menú de Herramientas, como se recomienda en la Extension Etiquette page. Discutiremos más de los menús más adelante en este tutorial. Por ahora vamos a centrarnos en la siguiente línea:

- -
-
-
oncommand="XULSchoolChrome.BrowserOverlay.sayHello(event);"
-
-
- -

This attribute defines an event handler. The command event is the most frequently used in Firefox, since it corresponds to the main action for most UI elements. The value of the attribute is JavaScript code that invokes a function. This function is defined in the JS file that was included with the script tag. The JS function will be called once the user clicks on the menu item in the Hello World menu. All event handlers define a special object named event, which is usually good to pass as an argument to the function. Event handlers are explained in greater depth further ahead.

- -

Now let's look at the JavaScript file and see what's going on when the event is fired.

- -
-
-
/**
- * XULSchoolChrome namespace.
- */
-if ("undefined" == typeof(XULSchoolChrome)) {
-  var XULSchoolChrome = {};
-};
-
-
- -

The XULSchoolChrome namespace is defined. All objects and variables we define in this JavaScript are global, meaning that scripts in Firefox and other extensions can see them and interact with them. This also means that if we define an object called MenuHandler or some other generic name, it's likely going to conflict with an existing object. What we do here is define a single global object: XULSchoolChrome. Now we know that all of our objects are inside this object, which is unlikely to be duplicated or overwritten by other extensions.

- -

You can read more about the typeof operator. If you're unfamiliar with JavaScript or this particular syntax, initializing an object as {} is the equivalent of initializing it to new Object().

- -
-
-
/**
- * Controls the browser overlay for the Hello World extension.
- */
-XULSchoolChrome.BrowserOverlay = {
-
-
- -

Finally, BrowserOverlay is our object. Naming and referencing  objects in such a long and verbose manner can feel uncomfortable at first, but it's worth the cost.

- -
-
-
We use Javadoc style comments on all namespaces, objects and object members. This is a similar standard to the one used in Mozilla code, and some tools can generate documentation automatically from Javadoc.
-
-
- -
-
-
sayHello : function(aEvent) {
-  let stringBundle = document.getElementById("xulschoolhello-string-bundle");
-  let message = stringBundle.getString("xulschoolhello.greeting.label");
-
-  window.alert(message);
-}
-
-
- -

And, finally, this is our function declaration. Three lines of code are all we need for it to work. The first line in the body of the function declares a variable that will hold the stringbundle element defined in the overlay. The variable is declared using let, which is similar to var but with more restricted scope. Here you can read more about let declarations. It's worth noting that this is a relatively new addition to JavaScript in Firefox and you should use var if you're creating an extension compatible with very old versions.

- -

Just like in regular JS, we can use the DOM (Document Object Model) in order to manipulate the XUL document. First we get a reference of the stringbundle element in the document. This is a special element that allows us to obtain localized strings dynamically, by only providing a "key" that identifies the string. This is what we do on the second line. We call the getString method of the bundle element and get the localized message to be displayed. We then call the window.alert function with the message, just like we would do in an HTML document.

- -

Locale

- -

There are two types of locale files: DTD and properties, and in this example we use them both. DTD is the most efficient way of showing text in XUL, so you should use it whenever possible. It is somewhat inflexible so it can't be used for dynamically generated text, hence the need for an alternate way of getting localized strings.

- -

Looking back at the menu code, you probably noticed some attributes such as this:

- -
-
-
label="&xulschoolhello.hello.label;" accesskey="&xulschoolhello.helloItem.accesskey;"
-
-
- -

These attributes define the text that you see on the menus, and they are string keys that are defined in our DTD file, browserOverlay.dtd. The DTD file was included in the XUL file with the following code:

- -
-
-
<!DOCTYPE overlay SYSTEM "chrome://xulschoolhello/locale/browserOverlay.dtd" >
-
-
- -

And in the DTD file you can see the association between keys and localized strings:

- -
-
-
<!ENTITY xulschoolhello.hello.label            "Hello World!">
-<!ENTITY xulschoolhello.helloMenu.accesskey    "l">
-<!ENTITY xulschoolhello.helloItem.accesskey    "H">
-
-
- -

Notice that on the XUL file you enclose the string key with & and ; while on the DTD file you only specify the key. You may get weird parsing errors or incorrect localization if you don't get it right.

- -

Access keys are the shortcuts that allow you to quickly navigate a menu using only the keyboard. They are also the only way to navigate a menu for people with accessibility problems, such as partial or total blindness, or physical disabilities that make using a mouse very difficult or impossible. You can easily recognize the access keys on Windows because the letter that corresponds to the access key is underlined, as in the following image:

- -
-

-
- -

Most user interface controls have the accesskey attribute, and you should use it. The value of the access key is localized because it should match a letter in the label text. You should also be careful to avoid access key repetition. For example, within a menu or submenu, access keys should not be repeated. In a window you have to be more careful picking access keys because there are usually more controls there. You have to be specially careful when picking access keys on an overlay. In our case, we can't use the letter "H" as an accesskey in the Main menu item, because it would be the same as the access key in the Help menu. Same goes with "W" and the Window menu on Mac OS. So we settled on the letter "l".

- -

DTD strings are resolved and set when the document is being loaded. If you request the label attribute value for the Hello World menu using DOM, you get the localized string, not the string key. You cannot dynamically change an attribute value with a new DTD key, you have to set the new value directly:

- -
-
-
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"));
-
-
- -

This is the reason DTD strings are not a solution for all localization cases, and the reason we often need to include string bundles in XUL files:

- -
-
-
<stringbundleset id="stringbundleset">
-  <stringbundle id="xulschoolhello-string-bundle"
-    src="chrome://xulschoolhello/locale/browserOverlay.properties" />
-</stringbundleset>
-
-
- -

The stringbundleset element is just a container for stringbundle elements. There should only be one per document, which is the reason why we overlay the stringbundleset that is in browser.xul, hence the very generic id. We don't include the insertbefore or insertafter attributes because the ordering of string bundles doesn't make a difference. The element is completely invisible. If you don't include any of those ordering attributes in an overlay element, Firefox will just append your element as the last child of the parent element.

- -

All you need for the string bundle is an id (to be able to fetch the element later) and the chrome path to the properties file. And, of course, you need the properties file:

- -
-
-
xulshoolhello.greeting.label = Hi! How are you?
-
-
- -

The whitespace around the equals sign is ignored. Just like in install.rdf, comments can be added using the # character at the beginning of the line. Empty lines are ignored as well.

- -

You will often want to include dynamic content as part of localized strings, like when you want to inform the user about some stat related to the extension. For example: "Found 5 words matching the search query". Your first idea would probably be to simply concatenate strings, and have one "Found" property and another "words matching..." property. This is not a good idea. It greatly complicates the work of localizers, and grammar rules on different languages may change the ordering of the sentence entirely. For this reason it's better to use parameters in the properties:

- -
-
-
xulshoolhello.search.label = Found %S words matching the search query!
-
-
- -

Then you use getFormattedString instead of getString in order to get the localized string. Thanks to this we don't need to have multiple properties, and life is easier for translators. You can read more about it on the Text Formatting section of the XUL Tutorial. Also have a look at the Plurals and Localization article, that covers a new localization feature in Firefox 3 that allows you to further refine this last example to handle different types of plural forms that are also language-dependent.

- -

Skin

- -

Styling XUL is very similar to styling HTML. We'll look into some of the differences when we cover the XUL Box Model, and other more advanced topics. There isn't much styling you can do to a minimal menu and a very simple alert message, so the Hello World extension only includes an empty CSS file and the compulsory global skin file:

- -
-
-
<?xml-stylesheet type="text/css" href="chrome://global/skin/"  ?>
-<?xml-stylesheet type="text/css"
-  href="chrome://xulschoolhello/skin/browserOverlay.css"  ?>
-
-
- -

The global skin CSS file holds the default styles for all XUL elements and windows. Forgetting to include this file in a XUL window usually leads to interesting and often unwanted results. In our case we don't really need to include it, since we're overlaying the main browser XUL file, and that file already includes this global CSS. At any rate it's better to always include it. This way it's harder to make the mistake of not including it. You can enter the chrome path in the location bar and inspect the file if you're curious.

- -

This covers all of the files in the Hello World extension. Now you should have an idea of the basics involved in extension development, so now we'll jump right in and set up a development environment. But first, a little exercise.

- -

Exercise

- -

Change the welcome message that is displayed in the alert window and move the Hello World menu to the Tools Menu, where it belongs. Repackage the XPI and re-install it. You can just drag the XPI file to the browser and it will be installed locally. Test it and verify your changes worked. If you run into problems at installation, it's likely that you didn't reproduce the XPI structure correctly, maybe adding unnecessary folders. Note that on Firefox 4 and above, on Windows and some Linux distributions, the Tools menu is hidden by default. It can be enabled using the Alt key.

- -

Once you're done, you can look at this reference solution: Hello World 2.

- -

{{ PreviousNext("Escuela_XUL/Introducción_a_las_extensiones_de_Firefox", "Escuela_XUL/Montando_un_ambiente_de_desarrollo") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/enlazando_contenido_remoto/index.html b/files/es/mozilla/tech/xul/escuela_xul/enlazando_contenido_remoto/index.html deleted file mode 100644 index bc80d6b948..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/enlazando_contenido_remoto/index.html +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: Enlazando contenido remoto -slug: Mozilla/Tech/XUL/Escuela_XUL/Enlazando_contenido_remoto -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Connecting_to_Remote_Content ---- -
-

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("Escuela_XUL/Interceptando_cargas_de_página", "Escuela_XUL/Personalizar_elementos_XUL_con_XBL") }}

- -

Using XMLHttpRequest

- -

XMLHttpRequest is an API for transferring XML between a local script and a remote server via HTTP. It is an integral part of the modern web, and all major browsers support it. Besides XML, it can be used to retrieve data in other formats, for example JSON, HTML and plain text. In this section we'll look into the XML and JSON communication mechanisms.

- -
let url = "http://www.example.com/";
-let request = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
-              .createInstance(Components.interfaces.nsIXMLHttpRequest);
-request.onload = function(aEvent) {
-  window.alert("Response Text: " + aEvent.target.responseText);
-};
-request.onerror = function(aEvent) {
-   window.alert("Error Status: " + aEvent.target.status);
-};
-request.open("GET", url, true);
-request.send(null);
-
- -

In this example we demonstrate how to make a XMLHttpRequest call in asynchronous mode. You can see that an instance of the XMLHttpRequest class is created and it holds all functionality for making a request. We create this instance using XPCOM instead of the usual way (new XMLHttpRequest()) because this way works both in chrome and non-chrome code.

- -

Following initialization, onload and onerror handlers are registered to a callback function to handle the response returned from the remote server. In both cases aEvent.target is an {{ interface("nsIXMLHttpRequest") }}. In the onload callback function, the responseText parameter contains the server response as text.

- -

If the response is an XML document, the responseXML property will hold an XMLDocument object that can be manipulated using DOM methods. Sometimes the server doesn't specify an XML Content-Type header, which is necessary for the XML parsing to happen automatically. You can use overrideMimeType to force the response to be parsed as XML.

- -
request.overrideMimeType("text/xml"); // do this before sending the request!
-
- -

The open method takes two required parameters: the HTTP request method and the URL to send the request. The HTTP request method can be "GET", "POST" or "PUT". Sending a POST request requires you to set the content type of the request and to pass the post data to the send() method as below.

- -
request.open("POST", url, true);
-request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
-request.send("data=hello&version=2");
-
- -

The third parameter for the open method specifies whether the request should be handled asynchronously or not. In asynchronous mode code execution continues immediately after the send call. In synchronous mode the code and user interface are blocked while waiting for a response to come back.

- -
Note: Requests can take a long time to process and you don't want users to be stuck waiting while a request is obtained and processed. Therefore, it is very important that XMLHttpRequest calls are always done asynchronously.
- -

Now let's look at the most common types of content you can use to communicate with remote servers.

- -

JSON content

- -

JSON is a very lightweight and simple data representation format, similar to the object representation used in JavaScript. Unlike JavaScript, the JSON format doesn't allow any kind of code that can be run, only data.

- -

JSON used to be risky in terms of security because the favored way of parsing it was to use the JavaScript eval function. Since eval executes any code contained in the string, workarounds had to be devised in order to close security holes. Luckily, Firefox now provides a few alternatives for extension developers. The JSON page explains in detail how to parse JSON data in different versions of Firefox and other applications.

- -

Assume we need to parse the following data:

- -
{"shops": [{"name": "Apple", "code": "A001"}, {"name": "Orange"}], "total": 100}
-
- -

When the onload callback function is called, the response text is converted into a JS object using the parse method. You can then use this object like any other JavaScript objects in your code.

- -
request.onload = function(aEvent) {
-  let text = aEvent.target.responseText;
-  let jsObject = JSON.parse(text);
-
-  window.alert(jsObject.shops[1].name); // => "Orange"
-  window.alert(jsObject.total);         // => 2;
-};
-
- -

The JavaScript object can also be serialized back with the stringify method.

- -
let string = JSON.stringify(jsObject);
-
- -

XML content

- -

XML is possibly the most popular data interchange format. Let's assume that the XML returned from remote server is this:

- -
<?xml version="1.0"?>
-<data>
-  <shops>
-    <shop>
-      <name>Apple</name>
-      <code>A001</code>
-    </shop>
-    <shop>
-      <name>Orange</name>
-    </shop>
-  </shops>
-  <total>2</total>
-</data>
-
- -

When a valid XML response comes back from the remote server, the XML document object can be manipulated using different DOM methods, to display the data in the UI or store it into a local datasource.

- -
request.onload = function(aEvent) {
-  let responseXML = aEvent.target.responseXML;
-  let rootElement = responseXML.documentElement;
-
-  if (rootElement && "parseerror" != rootElement.tagName) {
-    let shopElements = rootElement.getElementsByTagName("shop");
-    let totalElement = rootElement.getElementsByTagName("total")[0];
-
-    window.alert(shopElements[1].getElementsByTagName("name")[0].firstChild.nodeValue); // => Orange
-    window.alert(totalElement.firstChild.nodeValue);                                     // => 2
-  }
-};
-
- -

Using DOM functions is good for simple XML documents, but DOM manipulation code can become too complicated if the documents are more complex. There are a couple of tools you can use to process these documents more efficiently:

- -

Using XPath

- -
-

XPath stands for XML Path Language, it uses a non-XML syntax that provides a flexible way of addressing (pointing to) different parts of an XML document.

-
- -

Taken from the XPath page.

- -

You can use XPath to quickly access specific nodes in an XML or HTML document with a simple query mechanism. XPath can also be used to extract information from web pages once they load, along with the page load interception techniques discussed previously.

- -

XPath is very useful for cases when you're receiving large and complex XML files, and you only need some of the data contained in them. Using XPath to parse a complete XML document is probably not a good idea performance-wise.

- -

Using XSLT

- -

XSLT (eXtensible Stylesheet Language Transformations) is another tool used to manipulate XML documents and transform them into other forms of text output, such as HTML, XUL, and so on.

- -

We can not cover all transformations to various output formats, so we'll just look into converting an XML document to XUL.

- -

First you need to create an XSLT stylesheet that acts as a template. This template will transform the XML you receive (in our case, the example XML document above) and convert it into XUL. The XSLT tutorial contains details for building these templates.

- -
<?xml version="1.0" encoding="utf-8"?>
-<xsl:stylesheet version="1.0"
-  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <xsl:template match="/data">
-    <xul:vbox>
-      <xsl:for-each select="shops/name">
-        <xul:hbox>
-          <xul:label value="Name:" />
-          <xul:label>
-            <xsl:value-of select="." />
-          </xul:label>
-        </xul:hbox>
-      </xsl:for-each>
-      <xul:hbox>
-        <xul:label value="Total:" />
-        <xul:label>
-          <xsl:value-of select="total" />
-        </xul:label>
-      </xul:hbox>
-    </xul:vbox>
-  </xsl:template>
-</xsl:stylesheet>
-
- -

Next you need to read the XSLT stylesheet as a file stream and parse it into a document object. After that, the XSLT stylesheet can be imported into an XSLT processor as shown below. Now, the processor is ready to perform the transformation.

- -
let domParser = Components.classes["@mozilla.org/xmlextras/domparser;1"]
-                .createInstance(Components.interfaces.nsIDOMParser);
-let fileStream = Components.classes["@mozilla.org/network/file-input-stream;1"]
-                .createInstance(Components.interfaces.nsIFileInputStream);
-let xsltProcessor = Components.classes["@mozilla.org/document-transformer;1?type=xslt"]
-                .createInstance(Components.interfaces.nsIXSLTProcessor);
-let xslDocument;
-
-fileStream.init(someXSLFile, -1, 0x01, 0444); // read only
-
-// parse from the XSLT stylesheet file stream
-xslDocument = domParser.parseFromStream(
-    fileStream, null, fileStream.available(), "text/xml");
-
-// import the XSLT stylesheet to the XSLT processor
-xsltProcessor.importStylesheet(xslDocument);
-
- -

Finally, you can either use {{ ifmethod("nsIXSLTProcessor","transformToDocument") }} or {{ ifmethod("nsIXSLTProcessor","transformToFragment") }} methods to transform the XML document. The {{ ifmethod("nsIXSLTProcessor","transformToDocument") }} method returns a DOM Document with the results of the transformation, whereas, the {{ ifmethod("nsIXSLTProcessor","transformToFragment") }} method returns a DOM DocumentFragment node. In this example code, the first child of the XUL document is appended to a XUL element after the transformation.

- -
request.onload = function(aEvent) {
-  let responseXML = aEvent.target.responseXML;
-  let xulNode;
-
-  // transform the XML document to a XUL document
-  xulDocument = xsltProcessor.transformToDocument(responseXML);
-
-  // append the XUL node to a XUL element
-  xulNode = document.adoptNode(xulDocument.firstChild);
-  document.getElementById("foo").appendChild(xulNode);
-};
-
- -

We effectively transformed the XML file into XUL and integrated it into the UI.

- -
Note: Security should be your number one priority when handling remote content. Do not allow event handlers or any other kinds of code to be passed through your parsers. If you need your generated XUL to have JS code in it, all of it should be added locally, never from the remote source.
- -

Here are a couple of practical situations were you may want to use XSLT:

- -
    -
  1. Convert a large XML document directly into XUL.
  2. -
  3. Filter a complex XML file and generate a simpler XML document with only the data you need, so then you can use regular DOM functions to read it.
  4. -
  5. Convert XML into SQL statements. You could use this to generate a script to run on your local database. You would of course need to be very careful about escaping characters and protecting yourself against SQL injection attacks.
  6. -
  7. Convert XML into RDF. This was more useful when RDF was the default storage format. You can still use RDF as an intermediate format, though, and then use templates to generate XUL and display the data.
  8. -
- -

HTTP debugging

- -

When you start debugging HTTP requests, you may find it hard to know exactly what data was sent, especially with POST data. We recommend you to use extensions like Tamper Data. They help you to track HTTP/HTTPS requests and responses occurring in Firefox.

- -

After installation, you can find a Tamper Data menu item in the menu bar:

- - - -

Once you open the Tamper Data view, all requests and responses will begin to appear in it. You can discover some interesting things about Firefox like this, such as the automatic update URLs for extensions, and the behavior of web applications such as Gmail.

- -

If you click on the "Start Tamper" button, for every request made you will get a popup dialog for tampering with it before it is sent. You can use it to view or even modify the data in a request, and then inspect the result. This can be a lot of work because there is a lot of web activity in a normal Firefox window, so use it sparingly.

- -

A tutorial on Tamper Data can be found here.

- -
Note: You should always test your connection code to cover edge cases, like when there is no Internet connection, or the computer is connected to a local network with no Internet access (like at an airport or hotel room). Make sure you're not telling users everything is OK, or worse, bombarding them with error messages.
- -

{{ PreviousNext("Escuela_XUL/Interceptando_cargas_de_página", "Escuela_XUL/Personalizar_elementos_XUL_con_XBL") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/index.html b/files/es/mozilla/tech/xul/escuela_xul/index.html deleted file mode 100644 index 94497a9507..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/index.html +++ /dev/null @@ -1,77 +0,0 @@ ---- -title: Escuela XUL -slug: Mozilla/Tech/XUL/Escuela_XUL -tags: - - Plugins - - Rerencias - - Tutoriales - - XUL - - extensiones -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School ---- -
-

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}}

- -

El proyecto Escuela XUL es un tutorial completo para la creación de extensiones, enfocándose en el desarrollo de extensiones para Firefox. Es recomendable que lo leas completamente al menos una vez. Como Firefox cambia rápidamente, el contenido en este tutorial debería ser actual y válido.

- -
-
Introducción
-
- -
-
Funcionalidad básica
-
- -
-
Funcionalidad intermedia
-
- -
-
Temas avanzados
-
- -
-
Apéndices
-
- -
-
- -

El proyecto Escuela XUL fue desarrollado por Appcoast (Anteriormente Glaxstar). El proyecto es ahora publicado aquí bajo las siguientes licencias. Su contenido ha sido necesariamente modificado de la fuente original.

diff --git "a/files/es/mozilla/tech/xul/escuela_xul/introducci\303\263n_a_las_extensiones_de_firefox/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/introducci\303\263n_a_las_extensiones_de_firefox/index.html" deleted file mode 100644 index 758ef60e25..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/introducci\303\263n_a_las_extensiones_de_firefox/index.html" +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Introducción a las extensiones de Firefox -slug: Mozilla/Tech/XUL/Escuela_XUL/Introducción_a_las_extensiones_de_Firefox -translation_of: >- - Archive/Add-ons/Overlay_Extensions/XUL_School/Getting_Started_with_Firefox_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}}

- -

{{ PreviousNext("Escuela_XUL/Introducción", "Escuela_XUL/Elementos_esenciales_de_una_extensión") }}

- -

What's a Firefox Extension?

- -
-

Extensions add new functionality to Mozilla applications such as Firefox and Thunderbird. They can add anything from a toolbar button to a completely new feature. They allow the application to be customized to fit the personal needs of each user if they need additional features, while keeping the applications small to download.

-
- -

Taken from the Extensions page.

- -

As described in the quoted text, an extension is a small application that adds something new to one or more Mozilla applications. This tutorial focuses on extensions for Firefox, but the same (or very similar) principles apply to creating extensions for other applications such as Thunderbird, Seamonkey, and Flock.

- -

It is also worth noting that there are differences between the definition of extension and add-on. All extensions are add-ons, but add-ons can also be themes, plugins, or language packs. This tutorial is about extension development, but themes and language packs are developed in a very similar way. Plugins are entirely different, and they will not be covered on this tutorial. You can read more about plugins and their development in the Plugins page.

- -

Firefox provides a very rich and flexible architecture that allows extension developers to add advanced features, customize the user's experience, and completely replace and remove parts of the browser. The Mozilla Add-ons repository (AMO) holds an extensive number of extensions with a wide variety of functions: content filtering (AdBlock Plus, NoScript), web application interaction (Delicious Bookmarks, eBay Companion), web development (DOM Inspector, Firebug), and child protection (Glubble For Families). These are very advanced and complex extensions, and you'll learn most of what it takes to create extensions like these (Glaxstar actually worked on 3 of those listed).

- -

We'll begin by looking into a very simple extension.

- -

The Hello World Extension

- -

Our sample extensions and this tutorial in general are meant for Firefox version 3 and above, but most of it works on previous versions of Firefox as well. We'll try to make it clear when we're discussing a feature that only works on some versions of Firefox.

- -

We'll now begin with a basic "Hello World" extension. Let's start by installing the extension. Click on the link below.

- -

Install Hello World

- -

This will either trigger an install or a file download, depending on the Content-type the webserver is using to serve the file. The appropriate content type to trigger an install is application/x-xpinstall. In this case a file download should occur.

- -

If the content type is set correctly, you will probably get notified that the site is not allowed to install add-ons on Firefox. This is a security measure that prevents sites from installing extensions without user consent. This is necessary because malicious extensions can do the same level of harm as any malicious program: stealing data, erasing or replacing files, and causing unwanted behavior in general. AMO is the only pre-allowed site because all published add-ons on AMO have gone through a review process that includes security checks.

- -

After downloading the file, you can drag and drop it into the Firefox content area, and the installation should begin.

- -

You'll see a window telling you that you're about to install an extension, with some additional information such as the name of the author. You'll see a message saying that the author cannot be verified. Only extensions signed with a digital certificate can verify authorship. Signed extensions are rare, but we'll cover how to sign them later on.

- -

Click on the Install Now button. After the extension is installed, you'll be asked to restart Firefox. Installing, uninstalling, enabling and disabling add-ons (except plugins) require a restart to complete, and there's no easy way to work around it. This is an important point to keep in mind if you're building an extension that manipulates other extensions or themes. There's a very old bug that tracks this issue.

- -

Now, after restarting the browser, you'll see the Add-ons Manager window, showing the extension name, version, and a brief description.

- -

addonman.png

- -

Close the Add-ons window. Look at the main Firefox window and see if you notice anything different.

- -

Did you see it? There's a new menu on the main menu bar, labeled "Hello World!". If you open the menu and then the menu item below, you'll see a nice alert message (for some definitions of 'nice'). Click on the OK button to close it.

- -

- -

That's all the extension does. Now let's take a closer look at it.

- -

Extension Contents

- -

You may have noticed that the extension file you installed is named xulschoolhello1.xpi. XPI (pronounced "zippy") stands for Cross-Platform Installer, because the same installer file can work on all major platforms, and this is the case for most extension XPIs. XPIs are simply compressed ZIP files, but Firefox recognizes the XPI extension and triggers the installation process when an XPI link is clicked.

- -

To look into the XPI file you need to download it first, not install it. If the server triggers an install when clicking on a link or button, what you need to do is right click on the install link, and choose the Save Link As... option.

- -

Next, we'll decompress the XPI file. One way to do this is to rename the file so that it uses the zip extension instead of the xpi. Another way is to open the file using a ZIP tool. Most operating systems ship with a ZIP compression utility, and there are more advanced tools available online. Make your pick, and decompress the file in a convenient location. You should see a directory structure similar to this one:

- - - -

The JAR file contains most of the code, so we'll need to extract the contents of that file as well. Just like XPIs, all you need is a ZIP utility to decompress the file. After doing that, you'll have something like this:

- - - -

That's a lot of files for something so simple! Well, don't worry, we'll shortly see the purpose of all of these files and realize this is quite simple. In the next section we'll inspect these files and see what they do.

- -

{{ PreviousNext("Escuela_XUL/Introducción", "Escuela_XUL/Elementos_esenciales_de_una_extensión") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/introduction/index.html b/files/es/mozilla/tech/xul/escuela_xul/introduction/index.html deleted file mode 100644 index f6fd9f2d96..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/introduction/index.html +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Introduction -slug: Mozilla/Tech/XUL/Escuela_XUL/Introduction -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Introduction ---- -
{{Next("XUL_School/Getting_Started_with_Firefox_Extensions")}}
- -

Welcome to the XUL School Tutorial!

- -

This tutorial is meant to be the stepping stone that will turn you into a professional Firefox extension developer in no time. We have poured years of XUL experience into it, providing many solutions for problems extension developers commonly run into.

- -

XUL School was created by Appcoast (formerly Glaxstar), one of the few companies dedicated to building high-quality Firefox extensions. A team of over a dozen XUL developers conformed Glaxstar at the time this tutorial was created, and the combined experiences of years creating Firefox extensions are reflected here.

- -

With this tutorial you'll learn how to develop Firefox extensions. You'll learn how to quickly do the most common tasks in extension development, comparing several different approaches to solve them. In most cases we'll provide code samples that you can easily copy and adapt to your needs, as well as some working example extensions. The tutorial aims to be as brief as possible, often falling back on Mozilla documentation for more detailed information. You can think of it as a quick guide to the expansive world that is the Mozilla platform. Most links in this documentation are meant to be clicked and read.

- -

We'll start with a brief introduction to some key concepts, in case you're not familiar with Mozilla and Firefox.

- -

Mozilla and Firefox

- -

The term Mozilla can be used to refer to several concepts: the Mozilla project, the Mozilla Foundation, the Mozilla Corporation and the old Mozilla browser. Even Firefox is sometimes referred to as "Mozilla". If you're unfamiliar with these terms, it's good that you take some time and learn a little about Mozilla. This will help you understand the culture that surrounds the Mozilla community.

- -

Mozilla has spawned several products and projects, the most notable being the Mozilla Firefox web browser. Firefox is one of the most successful open source projects in history, combining the openness, standards-compliance and sophistication of open source with the focus on user experience and powerful outreach more commonly seen in less open companies.

- -

Version 1.0 of Firefox was released in November 2004, version 2.0 in October 2006, and version 3.0 in June 2008. This tutorial was written after Firefox 3 was released, and has been updated with time. While most of it should still work for creating extensions in Firefox 3 (and even Firefox 2), it is strongly recommended that you aim to support modern Firefox versions, to encourage users to stay up to date with security fixes. A release that is more than 6 months old is likely vulnerable to published security bugs.

- -

Firefox y otras aplicaciones Mozilla pueden ser vistas como composed of two different parts: a user interface layer that is distinct for each project, and a common platform on top of which the interface layer is built. The user interface is built with technology known as XUL, and the platform is known as XULRunner.

- -

XUL

- -

XUL (pronounced "zool") is one of many technologies used for creating Mozilla-based products and extensions. It is only one part of the development landscape, but given that it's practically exclusive to Mozilla, it tends to be used to identify all Mozilla-related development. You'll sometimes read terms like "XUL applications" and "XUL extensions", but rarely will they refer to projects that are exclusively built with XUL. It usually means that the projects were built using Mozilla technologies. Even this project, called XUL School, covers several other technologies such as JavaScript, CSS, XBL and XPCOM.

- -

XULRunner

- -

XULRunner includes the Gecko rendering engine, the Necko networking library, and several other components that provide OS-independent file management, accessibility, and localization, among others. It is this very powerful platform that has allowed such a fast growth of the development community surrounding Mozilla and Firefox.

- -

XULRunner is available in binary form at the XULRunner page, and it is the base for several projects, such as Songbird, Miro and Eudora. There's a very comprehensive list of XULRunner applications in the XULRunner Hall of Fame.

- -

Gecko

- -

The Gecko engine is the part of Firefox used to render web pages and its own user interface. You can identify the level of compatibility of web standards in Gecko-based browsers looking at their User Agent string, which should include the Gecko version. Gecko versions are somewhat independent from Firefox versions, and you can see a mapping of Firefox versions and Gecko versions at the Gecko page. The User Agent String for Firefox at the time of this writing (in US English, Mac OS X) is:

- -

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0.1) Gecko/20100101 Firefox/25.0.1

- -

The highlighted section is the Gecko version: 25.0.1. You can read and copy the user agent string of any Firefox window, choosing "Help > Troubleshooting Information" from the main menu.

- -

On to the Tutorial

- -

With the basic concepts out of the way, we can now get right into extension development. You are probably still wondering what exactly is an extension, what can it do, and how can you make them. Well, this whole tutorial is devoted to explaining that to you.

- -

Welcome to the world of extension development. Now let's get to it.

- -
{{Next("XUL_School/Getting_Started_with_Firefox_Extensions")}}
- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/manejo_de_preferencias/index.html b/files/es/mozilla/tech/xul/escuela_xul/manejo_de_preferencias/index.html deleted file mode 100644 index 9c3f436636..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/manejo_de_preferencias/index.html +++ /dev/null @@ -1,305 +0,0 @@ ---- -title: Manejo de preferencias -slug: Mozilla/Tech/XUL/Escuela_XUL/Manejo_de_preferencias -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Handling_Preferences ---- -
-
-

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("Escuela_XUL/Notificaciones_Observer", "Escuela_XUL/Almacenamiento_local") }}

- -

Preferences in Firefox

- -

Mozilla applications are highly customizable. Preferences are used to store settings and information to change their default behavior. To open the preferences window in Firefox, select the following from the main menu:

- - - -
-
-
Keep in mind the usage of the terms "Preferences" and "Options" in different platforms. If you need to refer to the term "preference" in any of your locale files, you must change the string depending on the operating system. Tip: you can use window.navigator.platform in your chrome code to figure out the operating system Firefox is running on. You can use the Hidden DOM Window in non-chrome code.
-
-
- -

Firefox loads user preferences from a number of sources. Each source is a JS file that contains some special functions not available in regular code. The following files are used:

- - - -

Firefox exposes its most common high-level preferences through the Preferences window and other parts of its UI. In reality there are thousands of other preferences Firefox handles that are not readily available to the user. These are hidden because they are too advanced or obscure for regular users to manage, and because the Preferences window should be as easy to use as possible. To access all other preferences, enter "about:config" into the Location Bar. This XUL page lists all the preferences defined in the Firefox installation, allowing you to change them as you please. As the warning message states, you should be very careful when changing preferences. Incorrect values can make Firefox behave oddly or break altogether.

- -

You can type on the "Filter" textbox to search for specific preferences. If you type the word "homepage", it will filter all the preferences and display only the ones which include the word "homepage" in its name or value. Right-clicking on the list reveals several options that allow you to modify preference values and add new ones. Preferences with non-default values are highlighted in bold. All changes done in about:config are saved to the prefs.js file.

- -

The list in about:config is not complete. Some Firefox preferences have no default value, so they are left out unless you add them manually. An extensive specification of Firefox preferences can be seen in this page. You don't need to know them by heart; if doing task X requires some preference, then it's better to look for an explanation on how to do X rather than diving into the preferences list and see if you can find the preference you need. MDC articles and other guides are usually good at specifying the preferences you'll need to use.

- -

Adding preferences to an extension

- -

Extensions can read and write Firefox preferences and, most importantly, create and manage their own. The Preferences System provides a simple, unified storage facility for name / value mappings. When your storage needs are more complicated than this, you'll need more advanced APIs that will be discussed in a section further ahead.

- -

To add preferences to your extension you should first create a JS preferences file that describes the preferences and their default values, although setting defaults is not required. As mentioned earlier, a preference with no default value can be set later on.

- -
-
-
We recommend that you include all of your extension preferences in the JS defaults file. It makes it easier to compile a list of the preferences your extensions handle, and to document what they do.
-
-
- -

The preferences file you need to create should be defaults/preferences/yourextensionname.js, under your extension root. The naming of the JS file is not compulsory, but it is the standard most extensions use.

- -
-
-
The purpose of the defaults directory is to hold non-code files your extension needs. In the past we have used this directory to store XSLT files for XML transformations and local storage template files (more on this later). It's the best place to put miscellaneous files your extension needs.
-
-
- -

Download this sample Hello World using preferences. There are a couple of additions in the Makefiles, to include the preference file xulschoolhello.js. The contents of the file are fairly simple:

- -
-
-
// Amount of messages shown to the user.
-pref("extensions.xulschoolhello.message.count", 0);
-
-
- -

This defines a preference we'll use to keep track of the amount of times we have displayed a greeting message to the user. Its default value is 0. You'll see this preference appear in about:config after installing the extension. Just type "xulschool" in the filter box to see your new preference.

- -
Always begin your preference names with extensions, followed by some namespacing and finally the actual name of the preference. Name parts are normally separated by dots.
- -

Now let's look at how we actually manage the preference values.

- -

Managing Preferences with FUEL

- -

FUEL is a JS library integrated into Firefox that was meant to facilitate extension development. It fell a little short of its goals, but it is useful for preference handling. Firefox-based applications like Flock include FUEL, and SeaMonkey includes a FUEL equivalent called SMILE since version 2.

- -

We modified our JSM sample extension so that it uses a preference instead of an internal variable. The main difference in functionality is that after closing Firefox and reopening it, our extension remembers how many greetings have been displayed before. The original extension only kept track of the greetings shown in a browser session. This new version persists this number across sessions.

- -

Since the only reason we used non-chrome code in the JSM sample extension was to store the message count in a single location, we can easily modify this new extension so that it uses chrome code exclusively. There's no need for JavaScript Code Modules or XPCOM anymore. We're making this point because using the FUEL library from chrome code is slightly different thant using it from non-chrome code. The difference lies in how to get the "root" Application object:

- -
-
-
// chrome code.
-Application.something
-
-// non-chrome code.
-let application =
-  Cc["@mozilla.org/fuel/application;1"].getService(Ci.fuelIApplication);
-application.something
-
-
- -

In the chrome you have the global Application object ready to use, while in non-chrome code you need to get it as an XPCOM service. It is an XPCOM service, with the difference that it can be more easily accessed in the chrome.

- -
-
-
FUEL only works in Firefox 3 and above.
-
-
- -

The Application object has a prefs property of type PreferenceBranch. You can use it to manage preferences easily.

- -

First, you get an object that represents your preference:

- -
-
-
this._countPref =
-  application.prefs.get("extensions.xulschoolhello.message.count");
-
-
- -

Then you can get or set its value using the value property.

- -
-
-
/**
- * Returns the current message count.
- * @return the current message count.
- */
-get count() { return this._countPref.value; },
-
-/**
- * Increments the message count by one.
- */
-increment : function() {
-  this._countPref.value++;
-}
-
-
- -

The prefs object also has methods that allow you to get and set preference values directly, but we prefer this approach.

- -

Preference Listeners

- -

Sometimes you'll want to be notified when a preference changes its value. For example, if we wanted to have a display of the message count somewhere in the browser, we should use a preference listener to keep it up to date. This way we know we have the right value even if the user changes it manually in about:config.

- -

To do this in FUEL, add an event listener for the "change" event:

- -
-
-
this._countPref.events.addListener("change", this);
-
-
- -

The listener object should implement the EventListener interface. Similarly to observers, all you need to do is have a handleEvent method in a JS object. Or you can use an anonymous function that takes an EventItem object.

- -
-
-
this._countPref.events.addListener("change", function(aEvent) { /* do stuff. */ });
-
-
- -

Always remember to remove listeners when you don't need them anymore.

- -

Managing Preferences with XPCOM

- -

The preferences system is implemented with XPCOM. FUEL is only a wrapper that gives the XPCOM services a friendlier face, so using either is pretty much the same. Using XPCOM is a little more verbose, as usual.

- -

We use the Preferences Service in order to get and set preference values:

- -
-
-
this._prefService =
-  Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
-// ...
-get count() {
-  return this._prefService.getIntPref("extensions.xulschoolhello.message.count");
-},
-increment : function() {
-  let currentCount =
-    this._prefService.getIntPref("extensions.xulschoolhello.message.count");
-
-  this._prefService.setIntPref("extensions.xulschoolhello.message.count", currentCount + 1);
-}
-
-
- -

One important thing to keep in mind is that the "get" methods of the service can throw an exception if the preference is not found. If you are going to use XPCOM, you should always set a default value to your preferences, or use a try / catch block to prevent unhandled errors.

- -

Preference Listeners

- -

The XPCOM way to add a listener was mentioned in the XPCOM section when describing the QueryInterface method:

- -
-
-
this._prefService.QueryInterface(Ci.nsIPrefBranch2);
-this._prefService.addObserver(prefName, this, false);
-this._prefService.QueryInterface(Ci.nsIPrefBranch);
-
-
- -

All the QI'ing is necessary because the addObserver method is in a different interface, and other than for adding and removing observers, we use the nsIPrefBranch interface for everything related to preferences.

- -

Then, create the observer method:

- -
-
-
observe : function(aSubject, aTopic, aData) {
-  if ("nsPref:changed" == aTopic) {
-    let newValue = aSubject.getIntPref(aData);
-    // do something.
-  }
-},
-
-
- -

Always remember to remove the observer when you don't need it anymore:

- -
-
-
this._prefService.QueryInterface(Ci.nsIPrefBranch2);
-this._prefService.removeObserver(prefName, this);
-
-
- -

Preference Windows

- -

It's very common for extensions to have a few settings that their users can change to tailor them to their needs. Since there are some subtleties related to preference management, there are some facilities provided in XUL and Firefox that make this much easier to deal with.

- -

The standard way of opening a preferences window is to open the Add-ons Manager, select the add-on, and then click on the Preferences button. In order to have this button enabled in your extension you need to add the following line to install.rdf:

- -
-
-
<em:optionsURL>chrome://xulschoolhello/content/preferencesWindow.xul</em:optionsURL>
-
-
- -

If you want to open this window from a different place in the UI, such as a menu item or a button in a toolbar, you need to take into account that the opening behavior of a Preferences window is different depending on the operating system. This is how we do it:

- -
-
-
openPreferences : function() {
-  if (null == this._preferencesWindow || this._preferencesWindow.closed) {
-    let instantApply =
-      Application.prefs.get("browser.preferences.instantApply");
-    let features =
-      "chrome,titlebar,toolbar,centerscreen" +
-      (instantApply.value ? ",dialog=no" : ",modal");
-
-    this._preferencesWindow =
-      window.openDialog(
-        "chrome://xulschoolhello/content/preferencesWindow.xul",
-        "xulschoolhello-preferences-window", features);
-  }
-
-  this._preferencesWindow.focus();
-},
-
-
- -

This code is based on the code that opens Preference windows from the Add-ons Manager. It does 2 things:

- -
    -
  1. Check if the Preferences window is already open. In that case, just give it focus.
  2. -
  3. Make the window modal in systems where the instant apply rule is not used. Notice that this is a preference that users can switch, so checking for the operating system is not good enough.
  4. -
- -
-
-
The general philosophy in non-Windows systems is that a change in a preference applies immediately. Preference windows don't have any buttons, or just an OK or Close button. On Windows, changing preferences don't apply until the user click on the OK button. The user can click on the Cancel button and none of the changes performed in the window will apply. This is why it makes sense to have Preference windows be modal on Windows. This way the user is urged to apply or discard any changes instead of being able to ignore the Preferences window.
-
-
- -

For preferences windows you should always use the prefwindow element instead of window in your XUL file. Firefox will know if it needs to add OK and Cancel buttons or not.

- -

In most cases, your preferences window will have a few options that can be displayed all at once. If you have many preferences, you can organize them using the prefpane element. This creates a visually appealing tabbed view, just like the one in the Firefox Preferences window. The prefpane is just a container, and you can have as many as you want. The tabs at the top of the window will need icons, and just like with toolbar buttons there are subtle differences between operating systems.

- -

The prefwindow allows you to use the preferences and preference elements, which facilitate preference handling. The preferences element is just a container, and you should have one per window, or one per prefpane if you have those. The element and its children are completely invisible, and their purpose is to list the preferences to be used in the window/pane.

- -
-
-
<preferences>
-  <preference id="xulschoolhello-message-count-pref"
-    name="extensions.xulschoolhello.message.count" type="int" />
-  <!-- More preference elements. -->
-
-</preferences>
-
-
- -

After you define the preferences you need, you associate them with the form elements in your window or pane using the preference attribute:

- -
-
-
<textbox preference="xulschoolhello-message-count-pref" type="number"
-  min="0" max="100" />
-
-
- -

In this case we use a numeric field to set the message count preference. Changing the value in the control will change the preference (depending on the instant apply rule), and vice versa. You may be able to create a Preferences window without a single line of JS code thanks to the preference element.

- -

Finally, groupboxes are a good idea to organize the contents of the window and preference panes. They are heavily stylized in the Firefox Preferences window, so you should include the same CSS file that is included in it (chrome://browser/skin/preferences/preferences.css). This way you don't have to rewrite all the CSS rules defined for Firefox. You should also look at the class values set to elements in the XUL file, so that your Preferences window is just like the one in Firefox and your extension is better integrated into the application and the native OS look and feel.

- -

{{ PreviousNext("Escuela_XUL/Notificaciones_Observer", "Escuela_XUL/Almacenamiento_local") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/montando_un_ambiente_de_desarrollo/index.html b/files/es/mozilla/tech/xul/escuela_xul/montando_un_ambiente_de_desarrollo/index.html deleted file mode 100644 index e280fda079..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/montando_un_ambiente_de_desarrollo/index.html +++ /dev/null @@ -1,244 +0,0 @@ ---- -title: Montando un ambiente de desarrollo -slug: Mozilla/Tech/XUL/Escuela_XUL/Montando_un_ambiente_de_desarrollo -translation_of: >- - Archive/Add-ons/Overlay_Extensions/XUL_School/Setting_Up_a_Development_Environment ---- -
-

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("Escuela_XUL/Elementos_esenciales_de_una_extensión", "Escuela_XUL/Agregar_menus_y_submenus") }}

- -

Getting the right tools

- -

There are 3 tools that we think are essential for effective add-on development (or any kind of development, really): a source code editor, a source control system, and a build system.

- -

In regards to code editing, there's no official Mozilla IDE. On the other hand, extensions use the same (or similar) languages that are used for web development, so most text editors and IDEs are up to the task. Most XUL tools and plugins you'll find online are merely templates that generate the folder structure for the project, and that's not much help.

- -

We recommend Komodo Edit. It's free, open source, and cross-platform. It's based on the Mozilla XULRunner platform, so it has support for some of the particularities in Firefox extension development. Komodo Edit has automatic completion for XUL tags and attributes, and it supports Mozilla's CSS extensions (CSS values and properties beginning with "-moz"). It has an add-on system similar to the one in Firefox, and there are some Komodo extensions that provide additional help in extension development. That is more than what you can get with most other editors, so we recommend you to give it a try. All of our examples are handled with Komodo Edit, so if you see a .kpf file in an example you downloaded, this is a Komodo project file.

- -

For source control, we just recommend that you have it. We mostly use Subversion, but any other will do, and it won't be necessary for examples or exercises presented in this tutorial.

- -

To package XPI files, we use make. We chose make because this is the system used by Mozilla to build Firefox, and it is available for all operating systems. make is a default tool in most UNIX-based systems. It can be installed on Mac OS X as part of the XCode Tools package, and on Windows through cygwin. In cygwin installations you'll have to explicitly check the make and zip utilities from the long list of packages to download and install.

- -

Also make sure that make is in the executable system path. After setting up make, you should be able to open a command line window, run "make -ver", and get the installed version of make as output.

- -

We recommend you set up make in your system, since our examples come with all the necessary files to build and install the resulting XPI using this tool. It will save you a lot of packaging time. Or you can create an equivalent system using batch, Ant or whatever you prefer.

- -

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.kpf) 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 are Makefile under src and Makefile.in under chrome. These are the files that make uses to build the XPI. You should take some time to read them and understand them, 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 the file Makefile. These define the extension name (which will also be the name of the JAR file), 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 chrome JAR file.
-  adding: content/browserOverlay.js (deflated 42%)
-  adding: content/browserOverlay.xul (deflated 59%)
-  adding: skin/browserOverlay.css (stored 0%)
-  adding: locale/en-US/browserOverlay.dtd (deflated 52%)
-  adding: locale/en-US/browserOverlay.properties (stored 0%)
-Creating chrome JAR file. Done!
-Creating XPI file.
-  adding: install.rdf (deflated 50%)
-  adding: chrome.manifest (deflated 60%)
-  adding: chrome/xulschoolhello.jar (deflated 30%)
-Creating XPI file. Done!
-
-Build finished successfully.
-
-
- -

If you inspect the bin directory, you should see the xulschoolhello2.xpi file, and a build directory with copies of the project files. The build directory is just a temporary location where files are copied before the final XPI is built. If you run make again, you'll only see the last line of the build process. That is because make can tell that the files in the build directory are 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 add "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 shloud 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. 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("Escuela_XUL/Elementos_esenciales_de_una_extensión", "Escuela_XUL/Agregar_menus_y_submenus") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/notificaciones_de_usuario_y_alertas/index.html b/files/es/mozilla/tech/xul/escuela_xul/notificaciones_de_usuario_y_alertas/index.html deleted file mode 100644 index efce29ae52..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/notificaciones_de_usuario_y_alertas/index.html +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Notificaciones de usuario y alertas -slug: Mozilla/Tech/XUL/Escuela_XUL/Notificaciones_de_usuario_y_alertas -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/User_Notifications_and_Alerts ---- -

{{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}}

- -

{{ PreviousNext("Escuela_XUL/Personalizar_elementos_XUL_con_XBL", "Escuela_XUL/Documentación_de_Mozilla") }}

- -

It is often the case that extensions need to notify users about important events, often requiring some response. Using modal dialogs and alerts is usually a bad idea. They interrupt the user's workflow, demanding immediate action before anything else can be done. Users will find them annoying and probably will learn to dismiss them as quickly as possible without even reading what they have to say. Or they will just get rid your add-on.

- -

This section lists a few alternatives that give you the possibility of notifying the user and requesting action without being too annoying.

- -

The notificationbox element

- -

You have probably seen these before. The "remember password" prompt is the one that shows up the most often. They are thin boxes that appear from beneath the tab list and above the page content, with some text and maybe a few buttons. This kind of notification is implemented with a notificationbox.

- -

This kind on notification is very easy to implement, it doesn't interrupt the user and is easy to read and dismiss, so it is our recommended way of displaying alerts and notifications. There's a catch, though: these notifications are inside the current tab, so switching tabs will make a notification disappear. The notification shows up again when you come back to the tab that displayed it. This means that these notifications make the most sense when they are related to the page currently being displayed, such as a page trying to install an add-on, or a site you just entered a password on.

- -

Notification boxes are very easy to create, and are very customizable:

- -
-
-
let nb = gBrowser.getNotificationBox();
-let acceptButton = new Object();
-let declineButton = new Object();
-let message =
-  this._bundle.getString("xulschoolhello.friendMessage.label");
-let that = this;
-
-acceptButton.label =
-  this._bundle.getString("xulschoolhello.acceptButton.label");
-acceptButton.accessKey =
-  this._bundle.getString("xulschoolhello.acceptButton.accesskey");
-acceptButton.popup = null;
-acceptButton.callback = function() { that.acceptRequest(); };
-// similarly for decline button.
-nb.appendNotification(
-  message, "xulschoolhello-friend-notification",
-  "chrome://xulschoolhello/skin/friend-notification.png",
-  nb.PRIORITY_INFO_HIGH, [ acceptButton, declineButton ]);
-
-
- -

All browser tabs have a notification box by default, so you don't need to do any overlaying. The notificationbox elements can be obtained from the gBrowser object. In this case we don't pass any arguments to getNotificationBox so that we get the notification box that corresponds to the tab currently on display. The appendNotification method takes the message, id, image (32x32), level and buttons. The level argument determines the "strength" of the message, indicated by its background color when it is displayed. You should look for the level that better fits your message, and use the lowest applicable level, to prevent the user from getting used to dismissing high-level notifications. The buttons are represented by simple JS data objects. This is all explained in detail in the notificationbox page.

- -

Notification boxes are designed to be easily dismissed. All notifications have an additional close button, so you should take into account that it's possible that none of your custom buttons will be clicked. Also, clicking on any of your custom buttons will cause the notification to be immediately closed, so you should only use notification boxes for single-step processes.

- -

The Alerts Service

- -

This is a very good option when you want to alert users about events without requiring input from them. Alerts are displayed in an OS-specific way, so their look is native. You can associate an action to the user clicking on the alert. Another advantage is that you use an XPCOM service to do this (nsIAlertsService), so you can easily trigger alerts from chrome and non-chrome code. On the other hand, alerts are displayed only temporarily

- -

Using the Alerts Service is similar to using notification boxes:

- -
-
-
let alertsService =
-  Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService);
-let title = this._bundle.getString("xulschoolhello.greeting.title");
-let message = this._bundle.getString("xulschoolhello.greeting.label");
-
-alertsService.showAlertNotification(
-  "chrome://xulschoolhello/skin/hello-notification.png",
-  title, message, true, "", this, "XULSchool Hello Message");
-
-
- -

We pass this as an argument, assuming that this is an object that implements nsIObserver. We do this when we need to handle clicks on the alert box. The image can have any size, but it is recommended that you use a medium, fixed size.

- -

The main disadvantage of using alerts is that support for the Alerts Service is not guaranteed for all platforms and Firefox versions. Support for Windows has existed since Firefox 2. For Mac OS X, support was added on Firefox 3, and only through a third-party tool called Growl. On Linux systems, we have confirmed that it works on Firefox 3 on Ubuntu Linux, but we haven't tested all distributions and Firefox versions.

- -

Because of the inconsistent support and temporary nature of these alerts, we don't recommend using this service to show information the user needs to know and can't get in any other way.

- -

Custom alerts

- -

Creating custom solutions for alerting the user is not complicated, given the advantages of XUL overlays and CSS positioning. However, these solutions are prone to be buggy and have accessibility issues. You should use the 2 alternatives mentioned above whenever possible. If none of those fit your needs then this is an acceptable solution.

- -

An easy way to display alerts is to include a hidden box in your overlay, which you can fill with any content you need before removing the hidden attribute so that it is displayed to the user. The best locations for this kind of box are above and below the tab browser. Below is preferrable because it only cuts the bottom part of the current page, as opposed to pushing down all tabs and content. Notification boxes are a good guideline to what you should aim for: thin, informative and easy to dismiss.

- -

Another option is to also add a hidden box to the overlay, but use CSS positioning to locate it where you want. This usually means that the box will be hovering on top of the page's content, and there are a few things you must know about this. First of all, switching tabs will probably make your alert disappear. This is probably due to the fact that the browser tab box uses a deck internally, and that affects z-indexing. You'll have to code around this using tab events in order to know when to re-display your alert. Another problem you need to take into account is that transparency of floating XUL on the Mac OS version of Firefox 2 doesn't work. You'll end up with a box with a white background you can't get rid of . On Firefox 3 and above, this seems to have been corrected, using the panel element.

- -

The bottom right corner of the browser is the recommended location for an alert, because it normally doesn't block the part of the content where the user is reading, or the most important parts of page content, such as menus and titles.

- -

Remember this is not a recommended practice. Imagine having multiple extensions notifying you in their own custom way, probably even at the same time! This is not good from a UI perspective, so you consider custom alerts the very last resort.

- -

{{ PreviousNext("Escuela_XUL/Personalizar_elementos_XUL_con_XBL", "Escuela_XUL/Documentación_de_Mozilla") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/objetos_xpcom/index.html b/files/es/mozilla/tech/xul/escuela_xul/objetos_xpcom/index.html deleted file mode 100644 index 497781a405..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/objetos_xpcom/index.html +++ /dev/null @@ -1,378 +0,0 @@ ---- -title: Objetos XPCOM -slug: Mozilla/Tech/XUL/Escuela_XUL/Objetos_XPCOM -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/XPCOM_Objects ---- -
-

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("Escuela_XUL/Uso_de_objetos_en_JavaScript", "Escuela_XUL/Notificaciones_Observer") }}

- -

XPCOM

- -
-

XPCOM is a cross platform component object model, similar to Microsoft COM.

-
- -

Taken from the XPCOM page.

- -

Firefox can be seen as composed of two layers. The largest of the two is a compiled platform, mostly written in C++. On top of it lies the chrome, mostly written in XML, Javascript and CSS. In fact, you can separate the two. We often mention other "Mozilla based applications". Well, those are applications that, simply put, take the underlying platform with perhaps a few changes and additions, and then write their own chrome layer. This lower layer is called XULRunner, and it is a very powerful platform, providing a very robust development base for web-enabled, cross-platform applications. The fact that it allows to easily create OS-independent applications is a big selling point for XULRunner.

- -

XPCOM is the way in which the two layers (XULRunner and chrome) communicate. Most of the objects and functions in the lower layers are hidden from the chrome; those that need to be publicized are exposed through XPCOM components and interfaces. You can think of XPCOM as a reference to all the capabilities available on the lower layers of Firefox.

- -

Using XPCOM components is relatively simple, as you've seen in previous examples.

- -
-
-
this.obsService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
-
-
- -

The Cc object (Components.classes) is an index to static objects and class definitions available through XPCOM. The string between the brackets is just an identifier, in this case corresponding to the Observer service. You'll usually know what string to use by reading examples and documentation. There is no comprehensive list of these (that we know of), and that's understandable since it would be a very long list, and it can be extended by add-ons. If you want to see the list in your current Firefox installation, just run the following code in the Error Console:

- -
-
-
var str = ""; for (var i in Components.classes) { str += i + "\n" }; str
-
-
- -

A run on Firefox 3.6.2 with a few extensions installed yields 876 strings. That's quite a lot. Luckily, you'll only need to know a handful of those for extension development. The @mozilla.org/ prefix is just a way to keep things namespaced. We would use something like @xulschool.com/ to make our own components.

- -

Components are either services (static objects) or instances of classes, just like the objects we handle in JS. The method you call on Cc["some-string"] should either be getService or createInstance, depending on what you're asking for. In most cases it is very clear which one to call, but in case of doubt, look for documentation on it. Those two methods always receive the interface identifier as an argument.

- -

Similarly to Cc, Ci (Components.interfaces) is an index of available interfaces. A modified version of the last code snippet produces an even longer list of available interfaces. Just like in component identifiers, the nsI prefix is just a way of keeping things in order. The NS stands for Netscape, Mozilla's predecessor. The "I" stands for interface. Our interfaces should begin with something like xsIHello.

- -

An interface is just a definition of a set of attributes and methods that an object implementing it should have. XPCOM components can implement multiple interfaces, and they often do. Let's look at the Preference service as an example of this. We'll look at its documentation in a very old XUL site called XUL Planet. All of its documentation was planned to be migrated to MDC, but it looks like it was never finished and XUL Planet was discontinued. Their XPCOM documentation is better in terms of seeing the relationships between components and interfaces, so we'll use that.

- -

Another useful resource is this XPCOM reference. This is generated from source, and it's kept relatively up to date. It shows the relationships between components and interfaces, but it's more of a source browser than a documentation reference.

- -

Stepping into the time machine, we see the Preferences Service component page. Right at the top you can see a list of the interfaces it implements, with a link to a documentation page for each one of them. Then you'll see a list of all members of this object, with some documentation about it. It is particularly important to note that, for every member in the component, you'll see in what interface this member is defined. Clicking on the link for the getBranch method takes you to the nsIPrefService documentation page, where you can see more details on the interface and the method. You can also see a list of what components implement this interface. All of this documentation is generated from the one present in the Firefox source files, so it's in general very complete and well written. It's a shame XUL Planet is no longer with us.

- -

Interfaces can be awkward to handle. If you want to call a method or use an attribute of interface X in a component, you first need to "cast" the component to interface X. This is done via the QueryInterface method that is included in all XPCOM components.

- -
-
-
this._prefService =
-  Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);
-
-this._prefValue = this._prefService.getBoolPref("somePreferenceName");
-
-this._prefService.QueryInterface(Ci.nsIPrefBranch2);
-this._prefService.addObserver("somePreferenceName", this, false);
-this._prefService.QueryInterface(Ci.nsIPrefBranch);
-
-
- -

This is a common piece of code you'll see when initializing components or JSM that rely on preferences. We use the Preferences Service to get and set preference values, such as the preference value we're getting on the fourth line of code. These methods are in the nsIPrefBranch interface. The getService and createInstance methods allow you to get the component already set to an interface. In many cases you only need to use one interface, and you won't have to worry about QueryInterface. But in this case we need to change the interface to nsIPrefBranch2, which is the one that includes the method that adds a preference observer. Then we change it back, because after that we only need to get and set preferences, and those methods are in nsIPrefBranch.

- -
Trying to access methods or attributes without having the right interface set will result in an exception being thrown.
- -

Passing parameters

- -

Passing parameters to XPCOM methods is no different from other JS objects, with some exceptions. In general, you can rely on JavaScript's ability to transform values to the correct type, but it's usually best to pass the right type in the first place. This section is a quick guide on how to read XPCOM documentation, which basically amounts to understanding the syntax of XPIDL, the language used to specify XPCOM interfaces.

- -

At MDC, you'll see stuff like this:

- -
-
-
void setCharPref(in string aPrefName, in string aValue);
-
-
- -

One of the most important details to notice is that both paratemers have the in keyword. This specifies that these are input parameters, values that the method will use to perform its actions. When is a parameter not an in parameter? In some methods the out keyword is used for parameters that are return values in reality. This is done for certain value types that are not valid as return values in IDL, such as typed arrays.

- -
-
-
void getChildList(in string aStartingAt, out unsigned long aCount,[array, size_is(aCount), retval] out string aChildArray);
-
-
- -

This method returns an array of strings. The first parameter is an input that tells the method where to start looking. The second one will hold the length of the return array, and the third parameter will hold the array itself. Note the metadata included in the square brackets, indicating that the parameter is an array, and that its size is determined by the aCount parameter.  Here's one way to invoke this method:

- -
-
-
let childArrayObj = new Object();
-let childArray;
-
-this._prefService.getChildList("", {}, childArrayObj);
-
-// .value holds the actual array.
-childArray = childArrayObj.value;
-
-
- -

The general rule for out parameters is that you can pass an empty object, and then you can get the result by accessing the value attribute in this object after the method call. The method will set value for you. Also, since JS arrays have the length attribute to get their length, there's no need for the second parameter to be used, so we just pass it an empty object that we won't use. The second parameter is only necessary for callers from within C++ code that use pointers instead of high-level arrays.

- -

Some commonly used XPCOM methods require other XPCOM types as parameters. The addObserver method in nsIPrefBranch2 is an example of this.

- -
-
-
void addObserver(in string aDomain, in nsIObserver aObserver, in boolean aHoldWeak);
-
-
- -

Luckily, you don't have to do anything special if you want to register your JS object as a preference observer. The nsIObserver has a single method observe, so all you need to do is have an observe method in your object and you'll be OK.

- -
-
-
XULSchool.PrefObserver = {
-  init: function() {
-
-    this._prefService =
-      Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch2);
-    // pass 'this' as if it implemented nsIObserver.
-    this._prefService.addObserver(
-      "extensions.xulschoolhello.somePref", this, false);
-  },
-
-  observe : function(aSubject, aTopic, aData) {
-    // do stuff here.
-  }
-};
-
-
- -

Finally, here's a table summarizing the types you will most likely encounter in XPCOM interfaces, and how to handle them:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
JS typeIDL typesNotes
StringsAUTF8String, string, wstring, char*, othersHistorically there have been several string types in XPCOM. The currently favored type for most cases is AUTF8String. You can read more about it in the XPCOM String Guide.
Integersshort, unsigned short, long, unsigned long, PRInt32, PRUInt32PRInt32 is the equivalent to long. Most PR* types have an easier to read equivalent, so it is better to use those.
Floating pointfloat 
Booleanboolean, PRBool 
Voidvoid 
TimestampsPRTimeThis type is used to pass timestamps measured in milliseconds, such as the output of the getTime() method in a Javascript Date object.
- -

There are more details about XPIDL in the XPDIL Syntax definition.

- -

Creating Your Own Components

- -

JavaScript XPCOM Components

- -

As we've said before, we recommend using JSM whenever you can. Yet there are some cases where you don't have a choice and you have to create XPCOM components to add a specific feature. In these cases you can choose between compiled XPCOM components, written in C++, or JS XPCOM components. You should favor the latter, they are much less complicated to make and maintain.

- -

Most of the time you'll need 2 source files for a JS XPCOM component: the IDL interface file, and the implementation JS file. In your final extension XPI you'll need to include the JS implementation file, and the XPT file, which is a compiled version of your IDL file. You won't need the IDL or XPT files if your components only use pre-existing Firefox interfaces. In this case you may also find it easier to implement your component using JSM and the XPCOMUtils module.

- -

Download this version of the Hello World project with XPCOM to see how XPCOM files are structured in the project and built. (Your build will probably break, we'll cover this later on.)

- -

In the components directory, the file xsIHelloCounter.idl has the following contents:

- -
-
-
#include "nsISupports.idl"
-
-/**
- * Counter for the Hello World extension. Keeps track of how many times the
- * hello world message has been shown.
- */
-[scriptable, uuid(BD46F689-6C1D-47D0-BC07-BB52B546B8B5)]
-interface xsIHelloCounter : nsISupports
-{
-  /* The maximum allowed count. */
-  const short MAX_COUNT = 100;
-
-  /* The current count. */
-  readonly attribute short count;
-
-  /**
-   * Increments the display count and returns the new count.
-   * @return the incremented count.
-   */
-  short increment();
-};
-
-
- -

The bits about nsISupports are common to most XPCOM interface definitions. nsISupports is the base interface for all interfaces, so it should always be included, except for cases where your interface extends another interface. In those cases you just need to replace nsISupports with the interface you're extending. You can also extend from multiple interfaces, by including a comma-separated list of interfaces instead of only one.

- -
-
-
[scriptable, uuid(BD46F689-6C1D-47D0-BC07-BB52B546B8B5)]
-
-
- -

The scriptable qualifier says that this component can be accessed from JS code. This can also be specified on a per-method basis, which is something you'll see in some of the interfaces in Firefox, but it's not likely you'll have to do it in your own components. The second part defines a UUID for the interface. You must generate a new one for each interface, and you should change it every time the interface changes. In this case you're forced to use UUID, the email address format used for extension ids won't work.

- -

We included a constant, an attribute and a method to display examples of the 3, but this is clearly an overly elaborate way to keep a simple counter.

- -

You can define numeric and boolean constants in IDL files, but not string constants. This is a known limitation of XPIDL, and a simple workaround is to define a readonly attribute instead. This means you have to define a getter in the implementation file, though. You can access constants through a reference of the component, or directly from the interface:

- -
-
-
// these are equivalent.
-max = Ci.xsIHelloCounter.MAX_COUNT;
-max = counterReference.MAX_COUNT;
-
-
- -

The implementation file, xsHelloCounter.js, is much longer. We'll analyze it piece by piece.

- -
-
-
const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cr = Components.results;
-const Ce = Components.Exception;
-
-
- -

You should be familiar with this already, although there are a couple of additions, Components.results and Components.Exception. They'll be used further ahead.

- -
-
-
const CLASS_ID = Components.ID("{37ED5D2A-E223-4386-9854-B64FD38932BF}");
-const CLASS_NAME = "Hello World Counter";
-const CONTRACT_ID = "@xulschool.com/counter;1";
-
-
- -

These constants are used at the bottom, in the component registration code. They specify the details of the component, such as a unique UUID (you have to generate it too and it must be different from the IDL UUID), a descriptive name (this isn't used anywhere that we know of), and the contract ID, which is the string you use to get a reference to the component. The ";1" at the end of the string is supposed to indicate the version of the component, although it shouldn't change much. It can be useful if there are multiple incompatible versions of the component installed at the same time.

- -

The implementation object itself should be easy to understand. The only aspects to take into account are that methods and attributes must have the same names as their IDL counterparts, and that the QueryInterface method is implemented:

- -
-
-
QueryInterface : function(aIID) {
-  if (!aIID.equals(Ci.xsIHelloCounter) &&
-      !aIID.equals(Ci.nsISupports)) {
-    throw Cr.NS_ERROR_NO_INTERFACE;
- }
-
-  return this;
-}
-
-
- -

The method is very simple, it validates that the caller is requesting a supported interface, otherwise it throws an exception.

- -

The rest of the code looks long and complicated, but it is pretty much the same for all components, so you shouldn't worry too much about it. All you have to do to use it in other components is copy it and change some names. The purpose of this code is to register the component so that you can get references to it just like all other Firefox components. It is better read from bottom to top.

- -
-
-
function NSGetModule(aCompMgr, aFileSpec) {
-  return CounterModule;
-}
-
-
- -

This piece of code is the first one that Firefox looks for in all implementation files in the components directory. It simply returns the object that precedes it.

- -
-
-
var CounterModule = {
-  // registerSelf, unregisterSelf, getClassObject, canUnload
-};
-
-
- -

The only thing you may need to change here is when you need to use the Category Manager. The Category Manager is a service that allows you to register your component under categories that are either pre-existing or you make up. The service also allows you to get all components registered in a category and invoke methods on them. One common use for this service is registering a component as a Content Policy. With it you can detect and filter URL loads. This is covered further ahead in another section of the tutorial.

- -

The add and delete calls to the Category Manager would have to be done in the registerSelf and unregisterSelf methods:

- -
-
-
registerSelf : function(aCompMgr, aLocation, aLoaderStr, aType) {
-
-  let categoryManager =
-    Cc[@mozilla.org/categorymanager;1].getService(Ci.nsICategoryManager);
-
-  aCompMgr.QueryInterface(Ci.nsIComponentRegistrar);
-  aCompMgr.registerFactoryLocation(
-    CLASS_ID, CLASS_NAME, CONTRACT_ID, aLocation, aLoaderStr, aType);
-  categoryManager.addCategoryEntry(
-    "content-policy", "XULSchool Hello World", CONTRACT_ID, true, true);
-},
-
-
- -

In this case the component would need to implement nsIContentPolicy.

- -

And, finally, the factory object.

- -
-
-
var CounterFactory = {
-  /* Single instance of the component. */
-  _singletonObj: null,
-
-  createInstance: function(aOuter, aIID) {
-    if (aOuter != null) {
-      throw Cr.NS_ERROR_NO_AGGREGATION;
-    }
-    // in this case we need a unique instance of the service.
-    if (!this._singletonObj) {
-      this._singletonObj = MessageCounter;
-    }
-
-    return this._singletonObj.QueryInterface(aIID);
-  }
-};
-
-
- -

If we wanted a class that can be instantiated, instead of a singleton service, the Factory would look like this:

- -
-
-
var CounterFactory = {
-
-  createInstance: function(aOuter, aIID) {
-    if (aOuter != null) {
-      throw Cr.NS_ERROR_NO_AGGREGATION;
-    }
-
-    return (new Counter()).QueryInterface(aIID);
-  }
-};
-
-
- -

The instructions on how to build an IDL file are included in the section Setting up a Development Environment.

- -

C++ XPCOM Components

- -

You do not want to do this unless it's really necessary.

- -

There are few reasons you might need to use binary XPCOM. One of them is adding functionality to Firefox that it doesn't support natively. In that, you would either need to implement this feature for every platform, or limit your extension compatibility to the ones you'll support. You'll need to build a library file for each one of them: DLL for Windows, dylib for Mac (Intel and PPC) and .so for Linux and similar.

- -

We won't get into details about this because it's certainly not tutorial material. This blog post details the XPCOM build set up. And you'll need to read the Build Documentation thoroughly to understand how this all works.

- -
If you need to interact with system libraries without really needing to create one of your own, you should consider using c-types instead. The c-types module is a new bridge between JavaScript and native binaries, introduced in Firefox 3.7. With it, you can interact with existing system libraries without using XPCOM at all.
- -

{{ PreviousNext("Escuela_XUL/Uso_de_objetos_en_JavaScript", "Escuela_XUL/Notificaciones_Observer") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/personalizar_elementos_xul_con_xbl/index.html b/files/es/mozilla/tech/xul/escuela_xul/personalizar_elementos_xul_con_xbl/index.html deleted file mode 100644 index f01864d483..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/personalizar_elementos_xul_con_xbl/index.html +++ /dev/null @@ -1,544 +0,0 @@ ---- -title: Personalizar elementos XUL con XBL -slug: Mozilla/Tech/XUL/Escuela_XUL/Personalizar_elementos_XUL_con_XBL -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Custom_XUL_Elements_with_XBL ---- -
-

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("Escuela_XUL/Enlazando_contenido_remoto", "Escuela_XUL/Notificaciones_de_usuario_y_alertas") }}

- -
-

XML Binding Language (XBL, sometimes also called Extensible Bindings Language) is a language for describing bindings that can be attached to elements in other documents. The element that the binding is attached to, called the bound element, acquires the new behavior specified by the binding.

-
- -

Taken from the XBL page.

- -

This somewhat cryptic explanation describes a very simple concept: with XBL you can create your own custom elements. XBL is heavily used in XUL, but in theory it could be applied to any XML language. XBL was submitted to the W3C for standardization, but for now it's used in XUL almost exclusively.

- -

With XBL you can define new elements and define their properties, attributes, methods and event handlers. Many complex elements such as tabs, buttons and input controls are implemented using XBL and simpler XUL elements. As explained earlier, XUL is really just boxes, text and images.

- -

We'll look into XBL using a modified version of the Hello World extension. Download the Hello World XBL project, build it and test it for a while. You should see a new item in the Hello World menu, that opens a Binding Test window where you can add "Persons" to a list.

- -

XBL Basics

- -

In order to create an XBL binding you'll need 2 files: the XBL file and a CSS file that binds an element name to your XBL declaration. If you look into the content directory, you'll see both files:

- - - -
If you use bindings on toolbar elements, remember to include the CSS file in the customize dialog, using the style directive in the chrome.manifest file.
- -

With those 2 files properly defined, we can now use the new element. If you look at file bindingDialog.xul, you'll see that the CSS stylesheet is included, which means that the xshelloperson tag can now be used just like any XUL tag. In this case we're adding the "Persons" dynamically, so you'll have to look into the JS file to see how xshelloperson elements are created and added to the DOM just like any other.

- -
addPerson : function(aEvent) {
-  // ...
-  let person = document.createElement("xshelloperson");
-  // ...
-  person.setAttribute("name", name);
-  person.setAttribute("greeting", greeting);
-  // ...
-  personList.appendChild(person);
-  // ...
-},
-
- -

This is where the advantage of XBL is obvious: we only need to create a single node and set some attributes. We didn't need to create a whole XUL structure that would require around 7 nodes every time a "Person" is created. XBL provides the encapsulation we needed to manage these nodes as a unit.

- -
-
-
As a bonus, you should look into the usage of nsIFilePicker to open a "Open File" dialog in a way that looks native for all systems.
-
-
- -

Now let's look into the XBL file, person.xml.

- -
-
-
<bindings xmlns="http://www.mozilla.org/xbl"
-  xmlns:xbl="http://www.mozilla.org/xbl"
-  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-
- -

The bindings element is the root of the document, and it's a container for binding elements. Notice how the default namespace for the document is XBL, and the XUL namespace is defined as "xul". You'll need to keep this in mind when defining the content of the binding, because weird things can happen if you don't add "xul:" to your content nodes.

- -
-
-
<binding id="person">
-
-
- -

In general, you should only have one binding per file. Bindings tend to require many lines of code, and having more than one ends up making gigantic, unbrowsable files. On the other hand, if your bindings are small and have a strong relationship with each other, it makes sense to keep them together. As for the CSS file, it's usually good to have a single file declaring all bindings in your extension.

- -

Content

- -

Under the content tag you define the XUL content that will be displayed for your element.

- -
-
-
<content>
-  <xul:hbox>
-    <xul:image class="xulshoolhello-person-image" xbl:inherits="src=image" />
-    <xul:vbox flex="1">
-      <xul:label xbl:inherits="value=name" />
-      <xul:description xbl:inherits="value=greeting" />
-    </xul:vbox>
-    <xul:vbox>
-      <xul:button label="&xulshoolhello.remove.label;"
-        accesskey="&xulshoolhello.remove.accesskey;"
-        oncommand="document.getBindingParent(this).remove(event);" />
-    </xul:vbox>
-  </xul:hbox>
-</content>
-
-
- -

Our element is very simple, displaying an image, a couple of text lines and a button. Here are a couple of important things to notice:

- - - -

If you need to create a container element, or any other element that has child nodes, you can use the XBL children tag in your content to indicate the place where the child nodes will be inserted. The includes attribute gives you a little more flexibility with children, but it's rarely needed.

- -

One important thing to take into account is that you shouldn't use the id attribute in any content nodes. These nodes are part of the XUL DOM just like any other, and having an id attribute is bound to cause problems, given that you could have more than instance of your element in the same document and then multiple inner items with the same id. In order to work around this problem, the anonid attribute is used instead:

- -
-
-
 <xul:label anonid="xulshoolhello-name-label" xbl:inherits="value=name" />
-
-
- -

And then, in order to get a reference to the node from the JS code in your binding, we use the getAnonymousElementByAttribute DOM method:

- -
-
-
let nameLabel =
-  document.getAnonymousElementByAttribute(
-    this, "anonid", "xulshoolhello-name-label");
-
-
- -

Implementation

- -

The implementation section defines most of the scripting side of your element. Here you can define methods and properties, as well as a constructor and a destructor for your element. JavaScript code is enclosed in CDATA sections to prevent JS and XML syntax conflicts.

- -

Properties and Fields

- -

The field and property tags allow you to handle element variables and access them from outside of the element.

- -

A field holds a value that can be changed, except when the readonly attribute is set. It's very similar to a JS object variable, and we generally use a field for private variables inside of the element.

- -
-
-
<field name="fieldName">defaultValue</field>
-
-
- -

From inside your binding methods, you can access fields with:

- -
-
-
this.fieldName
-
-
- -

You can also access them from outside of the element, if you have a reference to it:

- -
-
-
elementRef.fieldName
-
-
- -
-
-
Just like with JS objects, all fields are publicly accessible, and we use a "_" to indicate a field is "private". 
-
-
- -

A property is a little more robust. It is defined using a getter and setter method, allowing read-only and write-only properties, as well as more complex behavior. There are two properties defined in our binding, which are just meant for easier access to the two text attributes in the element. We use the shorthand version of the property tag:

- -
-
-
<property name="name" onget="return this.getAttribute('name');"
-  onset="this.setAttribute('name', val);" />
-
-
- -

There's a less compact version of the property tag that should be used if the getter or setter code involves more than one line of code:

- -
-
-
<property name="name">
-  <getter><![CDATA[
-    return this.getAttribute('name');
-  ]]></getter>
-  <setter><![CDATA[
-    this.setAttribute('name', val);
-  ]]></setter>
-</property>
-
-
- -

Properties can be accessed just the same as fields, and they're the ones we prefer for public members.

- -
-
-
When you add a node to a XUL document using an XBL binding, all normal DOM operations can be performed on it. You can move it around, delete it or clone it. But there is one thing you need to know about moving or cloning your node: all internal state in the node will be lost. This means that all your properties and fields will be reset. If you want some value to be preserved after such DOM operations, you must set it as an attribute and not an internal value.
-
-
- -

Methods

- -

Our "Person" binding has a single method that removes the item from the list:

- -
-
-
<method name="remove">
-  <parameter name="aEvent" />
-  <body><![CDATA[
-    this.parentNode.removeChild(this);
-  ]]></body>
-</method>
-
-
- -

As you can see, it's very easy to define a method and the parameters it takes. You can also have a return value using the return keyword, just like on regular JS code. The method uses the parent node to remove the Person node. Simple enough.

- -

You can do almost anything from XBL code, including using XPCOM components, JS Code Modules and available chrome scripts. The main setback is that you can't have script tags defined in a binding, so you depend on the scripts that have been included in the XUL files that use the binding. Also unlike scripts, you can include stylesheets using the stylesheet XBL element. DTD and properties files can be handled just like in regular XUL.

- -
-
-
There are two conflicting patterns that you should always keep in mind: encapsulation and separation of presentation and logic. Encapsulation mandates that you try to keep your XBL free of outside dependencies. That is, you shouldn't assume that script X will be included somewhere, because not including it will cause the binding to fail. This suggests that you should keep everything inside your binding. On the other hand, a binding is really just a presentation module. Most XUL elements have basic presentation logic, and any other functionality is processed elsewhere. Plus, XBL files are significantly harder to manage than regular JS files. We prefer to err on the side of simplicity and keep the XBL as simple as possible. If that means having outside dependencies, so be it. But you can still keep some separation and versatility by using custom events to communicate to the outside world. This way you reduce your dependency on specific scripts, and your tag behaves more like the rest.
-
-
- -

Just like fields and properties, methods are easy to invoke if you have a reference to the object that corresponds to the node.

- -
-
-
We have experienced problems when calling methods and setting properties on XBL nodes right after they are created and inserted to the document. This is likely due to some asynchronous operation related to node insertion. If you need to perform an operation to a node right after insertion, we recommend using a timeout to delay the operation (a timeout set to 0 works well).
-
-
- -

Handlers

- -

The handlers and handler XBL elements are used to define event handlers for the element. We have a "click" handler that displays the greeting when the "Person" element is clicked:

- -
-
-
<handler phase="bubbling" event="click"><![CDATA[
-  window.alert(this.greeting);
-]]></handler>
-
-
- -

Handlers are not necessary all that often, since in most cases you'll need the events to only apply to a part of the binding, not the whole thing. In those cases you just add regular event attributes to the nodes inside the content tag.

- -

Inheritance

- -

Inheritance is one of the most powerful features of XBL. It allows you to create bindings that extend existing bindings, allowing lots of code reuse and subtle behavior modifications. All you need is to use the extends attribute of the binding element:

- -
-
-
<binding id="manager"
-  extends="chrome://xulschoolhello/content/person.xml#person">
-
-
- -

This gives you an exact copy of the "Person" binding that you can override as you please.

- -

You could, for instance, just add a content tag with significantly different XUL content, and leave the implementation alone. You do need to be careful about keeping all anonid attributes consistent, and even some DOM structure if the code does node traversal. Sadly, you can't override only some part of the content. If you want to override it, you have to override all of it.

- -

A more common inheritance use case is when you want to change the behavior of some methods and properties. You can leave the content alone by not including the content tag, and then just add the methods and properties you wish to override. All you need to do is match the names of the originals. All methods and properties that are not overriden will maintain their original behavior.

- -

With inheritance you could take the richlistbox element and modify it to make a rich item tree, or create a switch button that changes state everytime it's clicked. And all with very little additional code. Keep it in mind when creating your custom elements because it can save you lots of time.

- -

Replacing Existing XUL Elements

- -

As seen in the beginning of this section, the actual binding process is determined by a simple CSS rule that associates the tag name with the binding. This means that you can change the binding for pretty much any element in Firefox by just adding a CSS rule! This is very powerful: it allows you to change almost any aspect of the interface of any XUL window. In conjuntion with inheritance, it's even easy to do. You can enrich the UI of a Firefox window by extending and replacing elements, which is what the Console² extension does in order to improve the Error Console window.

- -

Replacing elements should always be a last resort solution, specially if it is done on the main browser window. It's very easy to break the UI of the application or other extensions if you do this the wrong way, so be very careful about it. If you only need to change some specific instances of an element, use very specific CSS rules.

- -

You can use the -moz-binding property with any CSS selector.

- -

{{ PreviousNext("Escuela_XUL/Enlazando_contenido_remoto", "Escuela_XUL/Notificaciones_de_usuario_y_alertas") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

- -

{{ PreviousNext("Escuela_XUL/Enlazando_contenido_remoto", "Escuela_XUL/Notificaciones_de_usuario_y_alertas") }}

- -
-

XML Binding Language (XBL, sometimes also called Extensible Bindings Language) is a language for describing bindings that can be attached to elements in other documents. The element that the binding is attached to, called the bound element, acquires the new behavior specified by the binding.

-
- -

Taken from the XBL page.

- -

This somewhat cryptic explanation describes a very simple concept: with XBL you can create your own custom elements. XBL is heavily used in XUL, but in theory it could be applied to any XML language. XBL was submitted to the W3C for standardization, but for now it's used in XUL almost exclusively.

- -

With XBL you can define new elements and define their properties, attributes, methods and event handlers. Many complex elements such as tabs, buttons and input controls are implemented using XBL and simpler XUL elements. As explained earlier, XUL is really just boxes, text and images.

- -

We'll look into XBL using a modified version of the Hello World extension. Download the Hello World XBL project, build it and test it for a while. You should see a new item in the Hello World menu, that opens a Binding Test window where you can add "Persons" to a list.

- -

XBL Basics

- -

In order to create an XBL binding you'll need 2 files: the XBL file and a CSS file that binds an element name to your XBL declaration. If you look into the content directory, you'll see both files:

- - - -
If you use bindings on toolbar elements, remember to include the CSS file in the customize dialog, using the style directive in the chrome.manifest file.
- -

With those 2 files properly defined, we can now use the new element. If you look at file bindingDialog.xul, you'll see that the CSS stylesheet is included, which means that the xshelloperson tag can now be used just like any XUL tag. In this case we're adding the "Persons" dynamically, so you'll have to look into the JS file to see how xshelloperson elements are created and added to the DOM just like any other.

- -
addPerson : function(aEvent) {
-  // ...
-  let person = document.createElement("xshelloperson");
-  // ...
-  person.setAttribute("name", name);
-  person.setAttribute("greeting", greeting);
-  // ...
-  personList.appendChild(person);
-  // ...
-},
-
- -

This is where the advantage of XBL is obvious: we only need to create a single node and set some attributes. We didn't need to create a whole XUL structure that would require around 7 nodes every time a "Person" is created. XBL provides the encapsulation we needed to manage these nodes as a unit.

- -
-
-
As a bonus, you should look into the usage of nsIFilePicker to open a "Open File" dialog in a way that looks native for all systems.
-
-
- -

Now let's look into the XBL file, person.xml.

- -
-
-
<bindings xmlns="http://www.mozilla.org/xbl"
-  xmlns:xbl="http://www.mozilla.org/xbl"
-  xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-
- -

The bindings element is the root of the document, and it's a container for binding elements. Notice how the default namespace for the document is XBL, and the XUL namespace is defined as "xul". You'll need to keep this in mind when defining the content of the binding, because weird things can happen if you don't add "xul:" to your content nodes.

- -
-
-
<binding id="person">
-
-
- -

In general, you should only have one binding per file. Bindings tend to require many lines of code, and having more than one ends up making gigantic, unbrowsable files. On the other hand, if your bindings are small and have a strong relationship with each other, it makes sense to keep them together. As for the CSS file, it's usually good to have a single file declaring all bindings in your extension.

- -

Content

- -

Under the content tag you define the XUL content that will be displayed for your element.

- -
-
-
<content>
-  <xul:hbox>
-    <xul:image class="xulshoolhello-person-image" xbl:inherits="src=image" />
-    <xul:vbox flex="1">
-      <xul:label xbl:inherits="value=name" />
-      <xul:description xbl:inherits="value=greeting" />
-    </xul:vbox>
-    <xul:vbox>
-      <xul:button label="&xulshoolhello.remove.label;"
-        accesskey="&xulshoolhello.remove.accesskey;"
-        oncommand="document.getBindingParent(this).remove(event);" />
-    </xul:vbox>
-  </xul:hbox>
-</content>
-
-
- -

Our element is very simple, displaying an image, a couple of text lines and a button. Here are a couple of important things to notice:

- - - -

If you need to create a container element, or any other element that has child nodes, you can use the XBL children tag in your content to indicate the place where the child nodes will be inserted. The includes attribute gives you a little more flexibility with children, but it's rarely needed.

- -

One important thing to take into account is that you shouldn't use the id attribute in any content nodes. These nodes are part of the XUL DOM just like any other, and having an id attribute is bound to cause problems, given that you could have more than instance of your element in the same document and then multiple inner items with the same id. In order to work around this problem, the anonid attribute is used instead:

- -
-
-
 <xul:label anonid="xulshoolhello-name-label" xbl:inherits="value=name" />
-
-
- -

And then, in order to get a reference to the node from the JS code in your binding, we use the getAnonymousElementByAttribute DOM method:

- -
-
-
let nameLabel =
-  document.getAnonymousElementByAttribute(
-    this, "anonid", "xulshoolhello-name-label");
-
-
- -

Implementation

- -

The implementation section defines most of the scripting side of your element. Here you can define methods and properties, as well as a constructor and a destructor for your element. JavaScript code is enclosed in CDATA sections to prevent JS and XML syntax conflicts.

- -

Properties and Fields

- -

The field and property tags allow you to handle element variables and access them from outside of the element.

- -

A field holds a value that can be changed, except when the readonly attribute is set. It's very similar to a JS object variable, and we generally use a field for private variables inside of the element.

- -
-
-
<field name="fieldName">defaultValue</field>
-
-
- -

From inside your binding methods, you can access fields with:

- -
-
-
this.fieldName
-
-
- -

You can also access them from outside of the element, if you have a reference to it:

- -
-
-
elementRef.fieldName
-
-
- -
-
-
Just like with JS objects, all fields are publicly accessible, and we use a "_" to indicate a field is "private". 
-
-
- -

A property is a little more robust. It is defined using a getter and setter method, allowing read-only and write-only properties, as well as more complex behavior. There are two properties defined in our binding, which are just meant for easier access to the two text attributes in the element. We use the shorthand version of the property tag:

- -
-
-
<property name="name" onget="return this.getAttribute('name');"
-  onset="this.setAttribute('name', val);" />
-
-
- -

There's a less compact version of the property tag that should be used if the getter or setter code involves more than one line of code:

- -
-
-
<property name="name">
-  <getter><![CDATA[
-    return this.getAttribute('name');
-  ]]></getter>
-  <setter><![CDATA[
-    this.setAttribute('name', val);
-  ]]></setter>
-</property>
-
-
- -

Properties can be accessed just the same as fields, and they're the ones we prefer for public members.

- -
-
-
When you add a node to a XUL document using an XBL binding, all normal DOM operations can be performed on it. You can move it around, delete it or clone it. But there is one thing you need to know about moving or cloning your node: all internal state in the node will be lost. This means that all your properties and fields will be reset. If you want some value to be preserved after such DOM operations, you must set it as an attribute and not an internal value.
-
-
- -

Methods

- -

Our "Person" binding has a single method that removes the item from the list:

- -
-
-
<method name="remove">
-  <parameter name="aEvent" />
-  <body><![CDATA[
-    this.parentNode.removeChild(this);
-  ]]></body>
-</method>
-
-
- -

As you can see, it's very easy to define a method and the parameters it takes. You can also have a return value using the return keyword, just like on regular JS code. The method uses the parent node to remove the Person node. Simple enough.

- -

You can do almost anything from XBL code, including using XPCOM components, JS Code Modules and available chrome scripts. The main setback is that you can't have script tags defined in a binding, so you depend on the scripts that have been included in the XUL files that use the binding. Also unlike scripts, you can include stylesheets using the stylesheet XBL element. DTD and properties files can be handled just like in regular XUL.

- -
-
-
There are two conflicting patterns that you should always keep in mind: encapsulation and separation of presentation and logic. Encapsulation mandates that you try to keep your XBL free of outside dependencies. That is, you shouldn't assume that script X will be included somewhere, because not including it will cause the binding to fail. This suggests that you should keep everything inside your binding. On the other hand, a binding is really just a presentation module. Most XUL elements have basic presentation logic, and any other functionality is processed elsewhere. Plus, XBL files are significantly harder to manage than regular JS files. We prefer to err on the side of simplicity and keep the XBL as simple as possible. If that means having outside dependencies, so be it. But you can still keep some separation and versatility by using custom events to communicate to the outside world. This way you reduce your dependency on specific scripts, and your tag behaves more like the rest.
-
-
- -

Just like fields and properties, methods are easy to invoke if you have a reference to the object that corresponds to the node.

- -
-
-
We have experienced problems when calling methods and setting properties on XBL nodes right after they are created and inserted to the document. This is likely due to some asynchronous operation related to node insertion. If you need to perform an operation to a node right after insertion, we recommend using a timeout to delay the operation (a timeout set to 0 works well).
-
-
- -

Handlers

- -

The handlers and handler XBL elements are used to define event handlers for the element. We have a "click" handler that displays the greeting when the "Person" element is clicked:

- -
-
-
<handler phase="bubbling" event="click"><![CDATA[
-  window.alert(this.greeting);
-]]></handler>
-
-
- -

Handlers are not necessary all that often, since in most cases you'll need the events to only apply to a part of the binding, not the whole thing. In those cases you just add regular event attributes to the nodes inside the content tag.

- -

Inheritance

- -

Inheritance is one of the most powerful features of XBL. It allows you to create bindings that extend existing bindings, allowing lots of code reuse and subtle behavior modifications. All you need is to use the extends attribute of the binding element:

- -
-
-
<binding id="manager"
-  extends="chrome://xulschoolhello/content/person.xml#person">
-
-
- -

This gives you an exact copy of the "Person" binding that you can override as you please.

- -

You could, for instance, just add a content tag with significantly different XUL content, and leave the implementation alone. You do need to be careful about keeping all anonid attributes consistent, and even some DOM structure if the code does node traversal. Sadly, you can't override only some part of the content. If you want to override it, you have to override all of it.

- -

A more common inheritance use case is when you want to change the behavior of some methods and properties. You can leave the content alone by not including the content tag, and then just add the methods and properties you wish to override. All you need to do is match the names of the originals. All methods and properties that are not overriden will maintain their original behavior.

- -

With inheritance you could take the richlistbox element and modify it to make a rich item tree, or create a switch button that changes state everytime it's clicked. And all with very little additional code. Keep it in mind when creating your custom elements because it can save you lots of time.

- -

Replacing Existing XUL Elements

- -

As seen in the beginning of this section, the actual binding process is determined by a simple CSS rule that associates the tag name with the binding. This means that you can change the binding for pretty much any element in Firefox by just adding a CSS rule! This is very powerful: it allows you to change almost any aspect of the interface of any XUL window. In conjuntion with inheritance, it's even easy to do. You can enrich the UI of a Firefox window by extending and replacing elements, which is what the Console² extension does in order to improve the Error Console window.

- -

Replacing elements should always be a last resort solution, specially if it is done on the main browser window. It's very easy to break the UI of the application or other extensions if you do this the wrong way, so be very careful about it. If you only need to change some specific instances of an element, use very specific CSS rules.

- -

You can use the -moz-binding property with any CSS selector.

- -

{{ PreviousNext("Escuela_XUL/Enlazando_contenido_remoto", "Escuela_XUL/Notificaciones_de_usuario_y_alertas") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git "a/files/es/mozilla/tech/xul/escuela_xul/sitios_\303\272tiles_de_la_comunidad_mozilla/index.html" "b/files/es/mozilla/tech/xul/escuela_xul/sitios_\303\272tiles_de_la_comunidad_mozilla/index.html" deleted file mode 100644 index 02cd9bfa0f..0000000000 --- "a/files/es/mozilla/tech/xul/escuela_xul/sitios_\303\272tiles_de_la_comunidad_mozilla/index.html" +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Sitios útiles de la comunidad Mozilla -slug: Mozilla/Tech/XUL/Escuela_XUL/Sitios_útiles_de_la_comunidad_Mozilla -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/Useful_Mozilla_Community_Sites ---- -
-

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}}

- -

{{ Previous("Escuela_XUL/Documentación_de_Mozilla") }}

- -

The Mozilla Community is very rich and active. It's a very powerful tool you have when developing on top of the Mozilla platform, and you should take advantage of it in order to create a truly successful add-on .

- -

AMO

- -

AMO (Mozilla Add-ons) is the official Mozilla repository for add-ons. It allows you to upload, search and download all types of add-ons for Mozilla applications. This is the best way to get your extension to users from all around the world.

- -

Adding your extension to AMO is easy. All you need is your XPI, a few screenshots (good ones will make your extension much more appealing), and a few minutes to fill a couple of forms. But this won't make your extension public right away. AMO has a Review Process that prevents malicious, insecure or low quality extensions to make it to the public site. Your extension begins in a sandbox with limited access, and once you nominate it an editor will review it and see if it is appropriate for the public AMO site, where everyone can see it and install it. The review process often takes a few weeks. Just be patient and make sure your extension follows AMO's policies when you nominate it. You can still get a good number of downloads while being in the sandbox.

- -

One of the main advantages of using AMO is that it handles updates automatically for published add-ons. You just need to upload a new version of your extension, and once it's approved it will be pushed as an update to all your users. If you decide to host your own extension, you'll have to learn about the update system in order to push your own updates.

- -

Babelzilla

- -

Babelzilla is a worldwide community of localizers. Developers submit their extensions using the Web Translation System (WTS) and volunteers around the world translate them to different languages. The community is very active, and you can be sure to get translations for the most commonly used languages within a few days of submitting your extension. You'll also receive feedback that you wouldn't notice by testing only in one language, which can reveal other bugs in your locale handling.

- -

There's a significant portion of users that use a localized version of Firefox, so you shouldn't neglect them. Using Babelzilla takes little time and is very valuable.

- -

Mozdev

- -

mozdev.org provides free project hosting and software development tools for Mozilla applications and add-ons. It is the only hosting service tailored to the needs of the Mozilla community.

- -

It offers many necessary services such as bug tracking, source code repositories, download mirrors and many communication tools. There are other free hosting sites such as Souceforge and Google Code that are also very good, but not as specialized as Mozdev. You should pick the one that best fits your development needs.

- -

Conclusion

- -

That's it!

- -

This is the end of the XUL School Tutorial. Hopefully this guide has helped you get started with add-on development and you're on your way to joining the large Mozilla add-ons developer community. The sheer volume of material can be overwhelming, but you can always come back and use this tutorial as a reference for your future development. Now all you need is a good idea (in case you didn't have one already) and get started.

- -

Happy coding!

- -

{{ Previous("Escuela_XUL/Documentación_de_Mozilla") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/tech/xul/escuela_xul/uso_de_objetos_en_javascript/index.html b/files/es/mozilla/tech/xul/escuela_xul/uso_de_objetos_en_javascript/index.html deleted file mode 100644 index ceca9d687d..0000000000 --- a/files/es/mozilla/tech/xul/escuela_xul/uso_de_objetos_en_javascript/index.html +++ /dev/null @@ -1,338 +0,0 @@ ---- -title: Uso de objetos en JavaScript -slug: Mozilla/Tech/XUL/Escuela_XUL/Uso_de_objetos_en_JavaScript -translation_of: Archive/Add-ons/Overlay_Extensions/XUL_School/JavaScript_Object_Management ---- -

{{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}}

- -

{{ PreviousNext("Escuela_XUL/Agregar_barras_laterales", "Escuela_XUL/Objetos_XPCOM") }}

- -

Chrome JavaScript

- -

In this section we'll look into how to handle JavaScript data effectively, beginning with chrome code, in ways which will prevent pollution of shared namespaces and conflicts with other add-ons resulting from such global namespace pollution.

- -

The first step to good JavaScript object management is having a namespace that you know will not conflict with Firefox code or other extensions. Namespace declaration is best located in a file of its own, so that you have this one JS file that should be included in all of your XUL files.

- -

We'll be using the placeholder 〈Namespace〉 below. This needs to be replaced with an identifier name which is unique to your add-on. If your add-on is called Sergeant Pepper, for instance, then SgtPepper would be a good namespace name.

- -
-
-
/**
- * 〈Namespace〉 namespace.
- */
-if (typeof 〈Namespace〉 == "undefined") {
-  var 〈Namespace〉 = {};
-};
-
-
-
- -
-
-
The naming standard that we normally follow is that the first part of the namespace corresponds to the development group (or company), and the second to the specific project. However, most extensions are small projects by individuals, so these examples follow a more practical approach of having just one namespace with the project name.
-
-
- -

Notice how the 〈Namespace〉 namespace is declared using var. We need the namespace to be a global object that it can be used everywhere in the window chrome.

- -

You can include functions in any namespace, since namespaces are just regular JS objects. That should come in handy when you have general utility functions or properties that you want to use across all objects within the namespace. For instance, there are frequently used XPCOM services such as the Observer service that can be included as members in the namespace:

- -
-
-
/**
- * 〈Namespace〉 namespace.
- */
-if (typeof 〈Namespace〉 == "undefined") {
-  var 〈Namespace〉 = {
-    /**
-     * Initializes this object.
-     */
-    init : function() {
-      this.obsService =
-        Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
-    }
-  };
-
-  /**
-   * Constructor.
-   */
-  (function() {
-    this.init();
-  }).apply(〈Namespace〉);
-};
-
-
-
- -

JS objects can also be treated as string-indexed arrays:

- -
-
-
-
-
// equivalent.
-〈Namespace〉.Hello = {};
-〈Namespace〉["Hello"] = {};
-
-// equivalent.
-〈Namespace〉.Hello.init();
-〈Namespace〉.Hello["init"]();
-
-
-
- -

This is very useful in cases where you have to set attributes or functions with dynamically generated names. It's one of the funky properties of JavaScript: all objects are nothing more than name / value mappings. You can add or replace functions and attributes to any Javascript object, at any moment you want. This is an odd, but powerful feature that comes in handy at times when things get complicated. For instance, you could replace a method in any object in the Firefox chrome, so that it behaves differently than how it normally does. This should be a last resort option, but it is very useful at times.

-
-
- -

You usually need only one JS file to control a XUL window, since the code required is normally not that much. If you have complex behavior that requires too much code, look for ways to divide it into multiple objects and files. You can include as many scripts in a XUL window as you need.

- -

To initialize your chrome objects, it's usually better to run the initialization code from the "load" event handler for the window. The load event is fired after the DOM on the window has loaded completely, but before it's displayed to the user. This allows you to manipulate and possibly change elements in the window without the user noticing the changes.

- -
-
-
/**
- * Controls the browser overlay for the Hello World extension.
- */
-〈Namespace〉.BrowserOverlay = {
-  /**
-   * Initializes this object.
-   */
-  init : function(aEvent) {
-    this._stringBundle = document.getElementById("xulschoolhello-string-bundle");
-    // you can make changes to the window DOM here.
-  }
-  // more stuff
-};
-
-window.addEventListener(
-  "load", function() { 〈Namespace〉.BrowserOverlay.init(); }, false);
-
-
-
- -

There are some things you can't (or shouldn't) do inside load handlers, such as closing the window being loaded, or opening new windows, alerts or dialogs. The window has to finish loading before it can do any of these things. They are bad UI practices anyway and you should avoid them. If you really need to do something like this anyway, one way to do it is to have a timeout execute the code after a delay:

- -
-
-
init : function(aEvent) {
-  let that = this;
-
-  this._stringBundle = document.getElementById("xs-hw-string-bundle");
-  window.setTimeout(
-    function() {
-      window.alert(that._stringBundle.getString("xulschoolhello.greeting.label")); }, 0);
-}
-
-
-
- -

The setTimeout function executes the function in the first parameter, after a delay in miliseconds specified by the second parameter. In this case we set the delay to 0, which means the function should be executed as soon as possible. Firefox has a minimum delay of 10-15ms (taken from this blog post), so it won't really run instantly. It is more than enough to let the window finish its load.

- -
-
-
Use window.setTimeout and window.setInterval to control timed code execution. In case you're using JavaScript Code Modules or XPCOM objects, where a window object is not readily available, use an nsITimer instead. 
-
-
- -
This post suggests a way to achieve a true zero ms timeout, as a simple way to achieve parallelism in JS code.
- -

Notice the way we send callback functions as parameters, and the use of an alternate reference for this which we always name that. This is all necessary due to a JavaScript feature (quirk would be a better word for it) called Method Binding. The consequence of doing this wrong is to have a this reference that doesn't do what you expected it to do. There are a few workarounds for this, and we use the ones we have found to be the most elegant and clear to read.

- -
-
-
The general guideline we follow is this: whenever you have to set a callback function parameter, wrap it in an anonymous function. That is, something like function() { /* your code, usually a single function call. */ }. If you have to use a reference to this inside the function, declare a variable called that that equals this, and use that in the anonymous function.
-
-
- -

JavaScript has a host of features that make it extremely flexible, but it also has some disadvantages, as it is not as strict as other languages, such as Java. A clear example of this is the fact that there are no private or public keywords that allow you to protect object members. As a alternative for this, a naming standard is frequently used to distinguish private and public members. There's no scope enforcement whatsoever, but this standard give others the chance to "play nice" and don't use private members.

- -
-
-
Use "_" at the beginning of private attributes and methods in JS objects. For example: _stringBundle, _createUserNode().
-
-
- -

Exercise

- -

Here's a short exercise to test a particular aspect of the chrome. Modify the Hello World extension so that the message says how many times it has been displayed. The message could say something like "Hello! This message has been shown 5 times." Keep the counter as a variable in the BrowserOverlay object, and increment it every time the message is going to be shown.

- -

Once you have this working right, try the following: open the message a few times, so that the number increments. Now open a new window and display the message from the new window. What do you think will happen? What will the count be this time?

- -

You probably didn't expect this, but the count was reset in the new window. Each window keeps its own counter, and now the extension is not behaving as expected. This is a fundamental lesson: the chrome is not global, it's window-specific. All of your scripts and objects are replicated for each window, and they work independently from each other. This is an issue that is very easy to overlook, since most Firefox users, specially power users, have a single window open at all times. You have to make sure you test your extension with multiple windows open; never assume everything will work the same as with a single window.

- -

Now, in most cases you'll need to coordinate data in a way that it is consistent for all open Firefox windows. There are several ways in which you can do this. Preferences is one of them, and they are covered in another section of this tutorial. Two other ways are JavaScript Code Modules (Firefox 3 and above), and XPCOM.

- -

JavaScript Code Modules

- -

JavaScript Code Modules (also known as JSM) are new to Firefox 3, and they're the best tool for keeping everything in sync between windows. They're very simple to set up. The first thing you need to do is add an entry in the chrome.manifest file:

- -
-
-
resource  xulschoolhello     modules/
-
-
-
- -

Javascript code modules are accessed with the resource protocol, which is very similar to the chrome protocol. Just like with the chrome, we define the package name and then a path. To keep things simple, just locate the JSM files in a modules directory under the root of our project. In order to access a file messageCount.js in this directory, the URL would be:

- -
-
-
resource://xulschoolhello/messageCount.js
-
-
-
- -

Code modules are regular JS files, so there's nothing new in regards to naming or file types. Mozilla has adopted a standard of using the extension .jsm for these files, but they say .js is fine as well. To keep things simple, specially regarding code editors and default file associations in the developer's system, we have decided to stick with .js.

- -

Download this version of the Hello World project with JSM to see the changes you need to make to the build system in order to include the files in the modules folder. They are minimal, and we add a very small Makefile.in file in the modules directory, just to keep everything separated and organized.

- -

With the setup out of the way, let's get to it. What are JavaScript Code Modules?

- -

A JavaScript Code Module is a regular JS file that specifies which of the declared elements in it are public. All module files should begin with the a declaration like this:

- -
-
-
var EXPORTED_SYMBOLS = [ "〈ModuleNamespace〉" ];
-
-
-
- -

EXPORTED_SYMBOLS is a special identifier that tells Firefox that this file is only publishing the object named 〈ModuleNamespace〉. Several objects, functions and variables can be declared on this file, but the only object visible from the outside will be 〈ModuleNamespace〉, which is a namespace in our case. Because of namespacing, we don't need to worry much about what to export, usually we just need the namespace object. All of the objects inside of it are exported as well, since they are members of the 〈ModuleNamespace〉 object.

- -

Module files can be imported to a chrome script or to other code modules with the following line:

- -
-
-
Components.utils.import("resource://xulschoolhello/messageCount.js");
-
-
-
- -
When using Components.utils.import, code modules must be loaded using a file: or resource: URL pointing to a file on the disk. In particular, chrome: URLs (even those that point to a file outside a jar archive) are not valid.
- -

To get a better idea, let's look at the code of the modified Hello World example. We have defined two files, one to declare namespaces and another one for the message count functionality mentioned in the previous exercise.

- -

Here again we're using a placeholder, 〈ModuleNamespace〉, for the identifier name that you'll need to choose.

- -
-
-
var EXPORTED_SYMBOLS = [ "〈ModuleNamespace〉" ];
-
-const { classes: Cc, interfaces: Ci } = Components;
-
-/**
- * 〈ModuleNamespace〉 namespace.
- */
-var 〈ModuleNamespace〉 = {};
-
-
-
- -

This should all be familiar enough. We're declaring the namespace we'll use at the module level. We need a separate namespace for the chrome because the chrome namespace objects are repeated for each window, while the module namespace objects are unique for all windows. Setting window-specific data on code modules will lead to nothing but problems, so be careful when deciding what should be chrome and what shouldn't be. We needn't test for the pre-existence of our namespace object here, as modules are given their own namespace.

- -

The 2 declared constants above are used to reduce code size. We frequently need to use XPCOM components in our code, so instead of doing this:

- -
-
-
this.obsService =
-  Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
-
-
-
- -

It's better to do this:

- -
-
-
this.obsService =
-  Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
-
-
-
- -

These 2 constants don't need to be defined in the overlay because they are already defined globally in the browser.js file in Firefox. We only need to define them when we're making windows of our own, or when we're working with code outside of the chrome (or porting your code to SeaMonkey, which doesn't have those constants declared in the main window).

- -
-
-
Include the Cc and Ci constants in all XUL windows that are not overlays, all JSM files, and all XPCOM components (see further ahead). Do this even if you don't need them now. It's better to just make a habit out of it.
-
-
- -

This is a point that is worth highlighting: modules work outside of the window scope. Unlike scripts in the chrome, modules don't have access to objects such as window, document, or other global functions, such as openUILink. These are all UI components and UI operations anyway, so they are better done in the chrome.

- -
-
-
As a general guideline, we keep all of our business logic in JSM, available through service objects, and chrome scripts are limited to handle presentation logic.
-
-
- -

We handle most of our code through static objects, singleton objects that don't require instantiation. But it is sometimes necessary to define classes and be able to create multiple instances. Common cases include interacting with a local database or a remote API. Data will often be translated into arrays of entities, and those are better represented through classes. One way to define a class is as follows:

- -
-
-
/**
- * User class. Represents a Hello World user (whatever that may be).
- */
-〈ModuleNamespace〉.User = function(aName, aURL) {
-  this._name = aName;
-  this._url = aURL;
-};
-
-/**
- * User class methods.
- */
-〈ModuleNamespace〉.User.prototype = {
-  /* The name of the user. */
-
-  _name : null,
-  /* The URL of the user. */
-
-  _url : null,
-
-  /**
-   * Gets the user name.
-   * @return the user name.
-   */
-  get name() {
-    return this._name;
-  },
-
-  /**
-   * Gets the user URL.
-   * @return the user URL.
-   */
-  get url() {
-    return this._url;
-  }
-};
-
-
-
- -

In this example we defined a fictitious User class for the Hello World extension. Using the function keyword to define a class is odd, but this is just the JavaScript way: functions are also objects. The definition of the class acts as a constructor as well, and then you can define all other members using the prototype attribute. In this case we defined "getter" properties for the name and url members. This way we have immutable instances of our class. Well, only if consumers of the class play nice and don't change anything they shouldn't.

- -

Creating an instance and using it is simple enough:

- -
-
-
let user = new 〈ModuleNamespace〉.User("Pete", "http://example.com/pete");
-
-window.alert(user.name);
-
-
-
- -

This is something you can do with JS in general. You can use it in JSM, chrome, even on regular web pages. Since entities tend to be used all throughout an application, we think that having those classes defined at the module level is the best approach.

- -

JSM is the best solution to handle objects that are window-independent. In the following section we'll discuss XPCOM, which is an older alternative to JSM and one of the foundations of Mozilla applications. You shouldn't skip that section because there are many common situations in extension development where you'll have to use XPCOM, maybe even implement XPCOM components of your own.

- -

{{ PreviousNext("Escuela_XUL/Agregar_barras_laterales", "Escuela_XUL/Objetos_XPCOM") }}

- -

This tutorial was kindly donated to Mozilla by Appcoast.

diff --git a/files/es/mozilla/thunderbird/index.html b/files/es/mozilla/thunderbird/index.html deleted file mode 100644 index 7e7c314908..0000000000 --- a/files/es/mozilla/thunderbird/index.html +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Thunderbird -slug: Mozilla/Thunderbird -translation_of: Mozilla/Thunderbird ---- -

Thunderbird es la aplicación de mensajeria de Mozilla. Estas páginas documentan Thunderbird y tambien brindan enlaces a documentación acerca de MailNews backend el cual es usado en otros proyectos como Eudora/Penelope, Seamonkey, Correo, etc. 

-

Thunderbird es el hermano menor de Firefox, y esta construido sobre la misma plataforma técnica que el navegador web. En desarrollo por varios años, y actualmente es uno de los más populares clientes de correo electrónico de código abierto, es utilizado por millones de personas pot todo el mundo para reunir todas las cuentas de correo electrónico, grupo de noticias y alimentar la lectura en un conocido entorno de alta productividad.  (A partir de principios del 2007 hasta principios del 2011 Thunderbird fue desarrollado por Mozilla Messaging, una subsidiaria que era propiedad de Mozilla.)

-
-
-  
-
- - - - - - - - - - - - - -
-

Documentación

-
-
- Construyendo Thunderbird
-
- Información acerca de la construcción de Thunderbird con el repositorio comm-central. También hay informació acerca de how comm-central works, como el review process works y como usar el Mozilla symbol server para ayudar con la depuración
-
- Protocolos MailNews
-
- Rigurosa documentación acerca de los protocolos de correo..
-
- Vista de Base de Datos
-
- Informació backend acerca de  {{ Interface("nsIMsgDBView") }} e interfaces relacionadas..
-
- Documentación de la API de Thunderbird
-
- Documentación de la API de thunderbird
-
- Extensión de la documentación
-
- Tutoriales y consejor para la creació de extensiones de Thunderbird
-
- Pruebas Automatizadas
-
- Detalles de las facilidades de las pruebas automatizadas de Thunderbird
-
- Thunderbird en la Empresa
-
- Ayuda con la implementación de Thunderbird en las grandes organizaciones
-
-
-
-
-

Comunidad

- -

Preguntas de extensiones se discuten con frecuencia en el grupo dev-apps-thunderbird:

-

{{ DiscussionList("dev-apps-thunderbird", "mozilla.dev.apps.thunderbird") }}

-
    -
  • Los debates de desarrollo ocurren en la lista de correo tb-planning:
  • -
  • suscripción
  • -
  • archivos
  • -
- -

Herramientas

- - -
-
- Extensiones
-
-
  
-


- Categories

-

Interwiki Language Links

diff --git a/files/es/mozilla/thunderbird/thunderbird_in_the_enterprise/index.html b/files/es/mozilla/thunderbird/thunderbird_in_the_enterprise/index.html deleted file mode 100644 index 681280ec5e..0000000000 --- a/files/es/mozilla/thunderbird/thunderbird_in_the_enterprise/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Thunderbird en la empresa -slug: Mozilla/Thunderbird/Thunderbird_in_the_Enterprise -tags: - - empresa - - thunderbird -translation_of: Mozilla/Thunderbird/Thunderbird_in_the_Enterprise ---- -

Muchas organizaciones utilizan Mozilla Thunderbird como su cliente de correo. Esta página enlaza a documentos en la red de desarrolladores de mozilla (Mozilla Developer Network) y en cualquier sitio en la red que sea relevante al desarrollo de Mozilla Thunderbird en la empresa.

- - - -

La lista de correo tb-enterprise está disponible para discutir acerca de Thunderbird en la empresa.

- -

A continuación, se presenta información útil sobre Mozilla en la Empresa en:

- - diff --git a/files/es/mozilla/toolkit_version_format/index.html b/files/es/mozilla/toolkit_version_format/index.html deleted file mode 100644 index 9d4de58b0b..0000000000 --- a/files/es/mozilla/toolkit_version_format/index.html +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Formato para la versión del Toolkit -slug: Mozilla/Toolkit_version_format -tags: - - Toolkit API -translation_of: Mozilla/Toolkit_version_format ---- -

Este documento es una referencia para el formato de versión, tal como se usa en Firefox 1.5 (XULRunner 1.8) y posteriores. Este formato se usa por el administrador de extensiones, la actualización de software y otras partes de la plataforma. Las versiones en, al menos, los siguientes lugares deben ser conformes a este formato:

- -

Puede usar nsIVersionComparator para comparar versiones de su aplicación.

-

Véase {{ Anch("Formatos de versión previas") }} más abajo para una descripción del formato de versión anterior usado en Firefox/Thunderbird 1.0.

-

Formato de versión

-

Una cadena de versión consiste en una o más partes de versión, separadas con puntos.

-

Cada parte de versión es en sí misma interpretada como una secuencia de cuatro partes: <tt><número-a><cadena-b><número-c><cadena-d></tt>. Cada una de las partes es opcional. Los números son enteros en base 10 (pueden ser negativos); las cadenas son ASCII.

-

Algunos ejemplos de partes de versión válidas:

- -

Se aplican algunas reglas especiales de interpretación con el fin de proporcionar compatibilidad hacia atrás y legibilidad:

- -

La lógica tras el particionado de una parte de versión en una secuencia de cadenas y números es que, cuando se comparan partes de versión, las partes numéricas se comparan como números, por ejemplo: '1.0pre1' < '1.0pre10', mientras que las cadenas se comparan byte a byte. Véase la siguiente sección para obtener detalles sobre cómo se comparan las versiones.

-

Comparar versiones

-

Cuando se comparan dos cadenas de versión, sus partes de versión se comparan de izquierda a derecha. Una parte de versión vacía o no presente equivale a 0.

-

Si en algún punto una parte de una cadena de versión es mayor que la parte correspondiente de otra cadena de versión, entonces la primera cadena de versión es mayor que la otra.

-

En caso contrario, las cadenas de versión son iguales. Observe que, puesto que las partes de versión no presentes se tratan como si fueran 0, las siguientes cadenas de versión son iguales: 1, 1.0, 1.0., 1.0.0, e incluso 1.0...

-

Comparar partes de versión

-

Las partes de versión también se comparan de izquierda a derecha; las partes A y C se comparan como números, mientras que las partes B y D se comparan byte a byte. Una parte de tipo cadena que exista es siempre menor que una parte de tipo cadena no existente (<tt>1.6a</tt> es menor que <tt>1.6</tt>).

-

Ejemplos

-
1.-1
-< 1 == 1. == 1.0 == 1.0.0
-< 1.1a < 1.1aa < 1.1ab < 1.1b < 1.1c
-< 1.1whatever
-< 1.1pre == 1.1pre0 == 1.0+
-< 1.1pre1a < 1.1pre1aa < 1.1pre1b < 1.1pre1
-< 1.1pre2
-< 1.1pre10
-< 1.1.-1
-< 1.1 == 1.1.0 == 1.1.00
-< 1.10
-< 1.* < 1.*.1
-< 2.0
-
-

Formatos de versión previas

-

Firefox y Thunderbird 1.0 usaban un formato de versión más simple, en concreto

-
mayor[.menor[.publicación[.compilación]]][+]
-
-

donde <tt>{{ mediawiki.external('..') }}</tt> designa un componente opcional y <tt>mayor</tt>, <tt>menor</tt>, <tt>publicación</tt> y <tt>compilación</tt> son todos enteros no negativos.

diff --git a/files/es/mozilla/working_with_windows_in_chrome_code/index.html b/files/es/mozilla/working_with_windows_in_chrome_code/index.html deleted file mode 100644 index 74ac175a82..0000000000 --- a/files/es/mozilla/working_with_windows_in_chrome_code/index.html +++ /dev/null @@ -1,386 +0,0 @@ ---- -title: Trabajar con ventanas desde código chrome -slug: Mozilla/Working_with_windows_in_chrome_code -tags: - - Extensions - - páginas_a_traducir -translation_of: Mozilla/Working_with_windows_in_chrome_code ---- -

Este artículo describe el trabajo con múltiples ventanas en código chrome Mozilla (aplicaciones XUL y extensiones). Contiene trucos y código de ejemplo para abrir nuevas ventanas, encontrar las ventanas ya abiertas, y pasar datos entre diferentes ventanas.

- -

Abrir ventanas

- -

Para abrir una ventana nueva, solemos usar la llamada DOM window.open o window.openDialog, así:

- -
var win = window.open("chrome://myextension/content/about.xul",
-                      "aboutMyExtension", "chrome,centerscreen");
-
- -

El primer parámetro de window.open es la URI del archivo XUL que describe la ventana y su contenido.

- -

El segundo parámetro es el nombre de la ventana. El nombre de la ventana puede ser usado en enlaces o formularios como el atributo target. Esto es diferente del título de ventana visible por el usuario, que es especificado usando XUL.

- -

El tercer, y opcional, parámetro es una lista de las características especiales que la ventana debería tener.

- -

La función window.openDialog funciona de forma similar, pero te permite especificar argumentos opcionales que pueden ser referenciados desde el código JavaScript. También maneja las funciones de ventana de forma un poco distinta, suponiendo siempre que la funcionalidad dialog es especificada.

- -

Si el objeto Window no está disponible (por ejemplo, al abrir una ventana desde código de componente XPCOM), puedes querer usar la interfaz nsiWindowWatcher. Sus parámetros son similares a window.open. En realidad, la implementación de window.open llama a métodos de nsiWindowWatcher.

- -
var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
-                   .getService(Components.interfaces.nsIWindowWatcher);
-var win = ww.openWindow(null, "chrome://myextension/content/about.xul",
-                        "aboutMyExtension", "chrome,centerscreen", null);
-
- -

Window object

- -

Note the win variable in the above section, which is assigned the return value of window.open. It can be used to access the opened window. The return value of window.open (and similar methods) is a Window object (usually ChromeWindow), of the same type that the window variable.

- -

Technically speaking, it implements a number of interfaces, including nsIDOMJSWindow and nsIDOMWindowInternal, but it also contains the user-defined properties for global variables and functions of the window. So, for example, to access the DOM document corresponding to the window, you can use win.document.

- -

Note however, that the open() call returns before the window is fully loaded, so some calls, like win.document.getElementById() will fail. To overcome this difficulty, you can move the initialization code to a load handler of the window being opened or pass a callback function, as described below.

- -

You can get a Window object from a document using document.defaultView.

- -

Content windows

- -

When a XUL window contains a widget capable of displaying a page, such as <browser> or <iframe>, the document in that widget is, naturally, separate from the document of the chrome window itself. There also is a Window object for each sub-document, although there's no window in a common sense for the sub-document.

- -

The same holds for chrome windows opened inside a tab of <tabbrowser>. The elements above the chrome document opened in the tab are separate from your chrome document.

- -

The following two subsections describe how to cross chrome-content boundaries in either way, i.e. accessing elements which are ancestors of your chrome document, or accessing elements which are descendants of your chrome document (but nevertheless in a different context).

- -

Accessing content documents

- -

Assume you have a document loaded in a <tabbrowser>, <browser>, or <iframe> element inside your document. You can use browser.contentDocument to access that document and browser.contentWindow to the Window object of that document.

- -

You should be aware of XPCNativeWrappers when working with untrusted content. With XPCNativeWrappers turned on (which is the default in Firefox 1.5+), your extension can safely access the DOM of the content document, but not the content JavaScript. Bypassing XPCNativeWrapper to work with content JavaScript directly can lead to security problems.

- -

See Interaction between privileged and non-privileged pages if you need to interact with the content page.

- -
The content shortcut
- -

In case of <browser type="content-primary"/>, you can use the content shortcut property to accesss the Window object of the content document. For example:

- -
// alerts the title of the document displayed in the content-primary widget
-
-alert(content.document.title);
-
- -

For example, you can use content.document in a browser.xul overlay to access the web page in the selected tab in a Firefox window.

- -
Some examples use _content instead of content. The former has been deprecated for a while, and you should use content in the new code.
- -

Accessing a document in the sidebar

- -

Firefox has a sidebar, which is implemented as a <browser> element with id="sidebar". To access the elements and variables inside the sidebar, you need to use document.getElementById("sidebar").contentDocument or .contentWindow, like when {{ Anch("Accessing content documents") }}.

- -

For more sidebar tips, see Code snippets:Sidebar.

- -

Accessing the elements of the top-level document from a child window

- -

The opposite case is when you want to access the chrome document from a privileged script loaded in a <browser> or an <iframe>.

- -

A typical case when this can be useful is when your code runs in the sidebar in the main Firefox window and you want to access the elements in the main browser window.

- -

The DOM tree, as shown by the DOM Inspector, can look like this:

- -
#document
-  window                 main-window
-    ...
-      browser
-        #document
-          window         myExtensionWindow
-
- -

where the child window is where your code runs in.

- -

Your task is to access elements above your chrome document, i.e. to break out of your chrome window and access the ancestors. This can be done using the following statement:

- -
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                   .getInterface(Components.interfaces.nsIWebNavigation)
-                   .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
-                   .rootTreeItem
-                   .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                   .getInterface(Components.interfaces.nsIDOMWindow)
-
- -

This allows you to cross the chrome-content boundaries, and returns the main window object.

- -

Finding already opened windows

- -

The window mediator XPCOM component (nsIWindowMediator interface) provides information about existing windows. Two of its methods are often used to obtain information about currently open windows: getMostRecentWindow and getEnumerator. Please refer to the nsIWindowMediator page for more information and examples of using nsIWindowMediator. === Example: Opening a window only if it's not opened already === XXX TBD

- -

Passing data between windows

- -

When working with multiple windows, you often need to pass information from one window to another. Since different windows have separate DOM documents and global objects for scripts, you can't just use one global JavaScript variable in scripts from different windows.

- -

There are several techniques of varying power and simplicity that can be used to share data. We'll demonstrate them from the simplest to the most complex in the next few sections.

- -

Example 1: Passing data to window when opening it with openDialog

- -

When you open a window using window.openDialog or nsIWindowWatcher.openWindow, you can pass an arbitrary number of arguments to that window. Arguments are simple JavaScript objects, accessible through window.arguments property in the opened window.

- -

In this example, we're using window.openDialog to open a progress dialog. We pass in the current status text as well as the maximum and current progress values. Note that using nsIWindowWatcher.openWindow is a bit less trivial . TODO: link to How To Pass an XPCOM Object to a New Window when it has a more useful example

- -

Opener code:

- -
window.openDialog("chrome://test/content/progress.xul",
-                  "myProgress", "chrome,centerscreen",
-                  {status: "Reading remote data", maxProgress: 50, progress: 10} );
-
- -

progress.xul:

- -
<?xml version="1.0"?>
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<window onload="onLoad();" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-<script><![CDATA[
-  var gStatus, gProgressMeter;
-  var maxProgress = 100;
-  function onLoad() {
-    gStatus = document.getElementById("status");
-    gProgressMeter = document.getElementById("progressmeter");
-
-    if("arguments" in window && window.arguments.length > 0) {
-      maxProgress = window.arguments[0].maxProgress;
-      setProgress(window.arguments[0].progress);
-      setStatus(window.arguments[0].status);
-    }
-  }
-
-  function setProgress(value) {
-    gProgressMeter.value = 100 * value / maxProgress;
-  }
-
-  function setStatus(text) {
-    gStatus.value = "Status: " + text + "...";
-  }
-]]></script>
-
-<label id="status" value="(No status)"/>
-<hbox>
-  <progressmeter id="progressmeter" mode="determined"/>
-  <button label="Cancel" oncommand="close();"/>
-</hbox>
-
-</window>
-
- -

Example 2: Interacting with the opener

- -

Sometimes an opened window needs to interact with its opener; for example, it might do so in order to give notice that the user has made changes in the window. You can find the window's opener using its window.opener property or via a callback function passed to the window in a way described in the previous section.

- -

Let's add code to the previous example to notify the opener when the user presses Cancel on the progress dialog.

- - - -

If we're sure the window that opened the progress dialog declares the cancelOperation function, we can use window.opener.cancelOperation() to notify it, like this:

- -
<button label="Cancel" oncommand="opener.cancelOperation(); close();"/>
-
- - - -
function onCancel() {
-  alert("Operation canceled!");
-}
-
-...
-
-window.openDialog("chrome://test/content/progress.xul",
-                  "myProgress", "chrome,centerscreen",
-                  {status: "Reading remote data", maxProgress: 50, progress: 10},
-                  onCancel);
-
- -

The progress dialog can then run the callback like this:

- -
<button label="Cancel" oncommand="window.arguments[1](); close();"/>
-
- -

Example 3: Using nsIWindowMediator when opener is not enough

- -

The window.opener property is very easy to use, but it's only useful when you're sure that your window was opened from one of a few well-known places. In more complicated cases you need to use the nsIWindowMediator interface, introduced above.

- -

One case in which you might want to use nsIWindowMediator is in an extension's Options window. Suppose you're developing a browser extension that consists of a browser.xul overlay and an Options window. Suppose the overlay contains a button to open the extension's Options window which needs to read some data from the browser window. As you may remember, Firefox's Extension Manager can also be used to open your Options dialog.

- -

This means the value of window.opener in your Options dialog is not necessarily the browser window -- instead, it might be the Extension Manager window. You could check the location property of the opener and use opener.opener in case it's the Extension Manager window, but a better way is to use nsIWindowMediator:

- -
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
-                   .getService(Components.interfaces.nsIWindowMediator);
-var browserWindow = wm.getMostRecentWindow("navigator:browser");
-// read values from |browserWindow|
-
- -

You might be tempted to use a similar technique to apply the changes the user made in the Options dialog, but a better way to do that is to use preferences observers.

- -

Advanced data sharing

- -

The above code is useful when you need to pass data from one window to another or to a set of windows, but sometimes you just want to share a JavaScript variable in common between different windows. You could declare a local variable in each window along with corresponding setter functions to keep the "instances" of the variable in sync across windows, but fortunately, there's a better way.

- -

To declare a shared variable, we need to find a place that exists while the application is running and is easily accessible from the code in different chrome windows. There are actually a few such places.

- -

Using JavaScript code modules

- -

JavaScript code modules {{ Fx_minversion_inline(3) }} is a simple method for creating shared global singleton objects that can be imported into any other JavaScript scope. The importing scope will have access to the objects and data in the code module. Since the code module is cached, all scopes get the same instance of the code module and can share the data in the module. See Components.utils.import for more information.

- - - -

Using an XPCOM singleton component

- -

The cleanest and most powerful way to share data is to define your own XPCOM component (you can write one in JavaScript) and access it from anywhere using a getService call:

- -
Components.classes["@domain.org/mycomponent;1"].getService();
-
- - - -

There are several articles and books about creating XPCOM components online.

- -

Using FUEL Application object

- -

The FUEL JavaScript library {{ Fx_minversion_inline(3) }} has a simple method for sharing data between windows. The Application object supports a storage property which can be used to store data globally. This method is a simplified form of the XPCOM singleton method.

- -
Application.storage.set(keyname, data);
-
-var data = Application.storage.get(keyname, default);
-
-where: keyname is a string used to identify the data
-       data is the data
-       default is the data value to return if keyname does not exists
-
- - - -

Storing shared data in preferences

- -

If you just need to store a string or a number, writing a whole XPCOM component may be an unnecessary complication. You can use the preferences service in such cases.

- - - -

See Code snippets:Preferences for detailed description of the preferences system and example code.

- -

Example:

- -
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
-                      .getService(Components.interfaces.nsIPrefService);
-var branch = prefs.getBranch("extensions.myext.");
-var var1 = branch.getBoolPref("var1"); // get a pref
-
- -

The hidden window hack

- -

Some extension authors use the special hidden window to store their data and code. The hidden window is similar to a regular window, but unlike any other window, it's available the whole time the application is running, and isn't visible to user. The document loaded into this window is chrome://browser/content/hiddenWindow.xul on Macs where it is used to implement the menus and resource://gre/res/hiddenWindow.html on other operating systems. Eventually this window will be removed for operating systems where it isn't needed ({{ Bug(71895) }}).

- -

A reference to the hidden window can be obtained from the nsIAppShellService interface. As any other DOM object it allows you to set custom properties:

- -
var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"]
-         .getService(Components.interfaces.nsIAppShellService)
-         .hiddenDOMWindow;
-hiddenWindow.myExtensionStatus = "ready";
-
- -

However, objects put into the hidden window will still belong to the window that created them. If a method of such an object accesses properties of the window object like XMLHttpRequest you might be confronted with an error message because the original window has been closed. To avoid this you can load the objects with a script file into the hidden window:

- -
var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"]
-         .getService(Components.interfaces.nsIAppShellService)
-         .hiddenDOMWindow;
-hiddenWindow.Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
-         .getService(Components.interfaces.mozIJSSubScriptLoader)
-         .loadSubScript("chrome://my-extension/content/globalObject.js");
-hiddenWindow.myExtensionObject.doSomething();
-
- -

With globalObject.js containing something like:

- -
var myExtensionObject = {
-  doSomething: function() {
-    return new XMLHttpRequest();
-  }
-}
-
- - - -

See also

- - diff --git a/files/es/mozilla/xpcom/xpcom/cambios_xpcom_en_gecko_2.0/index.html b/files/es/mozilla/xpcom/xpcom/cambios_xpcom_en_gecko_2.0/index.html deleted file mode 100644 index b8858b9411..0000000000 --- a/files/es/mozilla/xpcom/xpcom/cambios_xpcom_en_gecko_2.0/index.html +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Cambios XPCOM en Gecko 2.0 -slug: Mozilla/XPCOM/XPCOM/Cambios_XPCOM_en_Gecko_2.0 -tags: - - Gecko 2.0 - - XPCOM - - para_revisar ---- -

-

-

Borrador
- Esta página no está completa.

- -

-

Han tenido lugar una serie de cambios que afectan la compatibilidad de componentes XPCOM en Gecko 2. Este artículo detalla esos cambios y provee sugerencias sobre cómo actualizar tu código.

-

Se acabaron las interfaces inmovilizadas

-

Se acabaron las interfaces inmovilizadas; a partir de ahora, todas las interfaces está sujetas a cambios. Se actualizará la documentación según permita el tiempo eliminar las referencias a las interfaces que estén "inmovilizadas " o "no inmovilizadas".

Registro de componentes

-

La manera en que los componentes XPCOM son registrados cambió en Gecko 2. Antes de Gecko 2, durante el registro de un componente, todos los binarios y ficheros del componente JavaScript eran cargados y llamados, pidiéndoles que se registraran a sí mismos. Si usabas XPCOMUtils.jsm, algo de esto estaba oculto, pero eso pasaba.

-

Comenzando en Gecko 2, como sea, los componentes son registrados usando archivos manifest, similar a como chrome es registrado. De hecho, el mismo archivo chrome manifest será usado para registrar componentes.

-

Todos los componentes XPCOM necesitarán ser actualizados para soportar esto. Como sea, es muy fácil hacerlo, y se puede actualmente soportar ambos tipos de registro para conservar la compatibilidad hacia atrás.

-

Manifestos de componentes

-

Todo registro de componentes es controlado a través de archivos manifest. Para extensiones, esto es el mismo chrome.manifest actualmente usado para registrar chrome.

-

Archivos XPT

-

La ruta de los archivos XPT debe ser listada explicitamente en un manifest usando una directiva interfaces directive:

-
interfaces components/mycomponent.xpt
-

Componentes JavaScript

-

El registro de información para componentes JavaScript ya no está dentro del componente mismo; en cambio, está alojado en el manifest. El componente es cargado solo cuando el administrador de XPCOM necesita crear un componente.

-

chrome.manifest:

-
# The {classID} here must match the classID in mycomponent.js
-component {e6b866e3-41b2-4f05-a4d2-3d4bde0f7ef8} components/mycomponent.js
-contract @foobar/mycomponent;1 {e6b866e3-41b2-4f05-a4d2-3d4bde0f7ef8}
-category profile-after-change MyComponent @foobar/mycomponent;1
-
-

El código javascript ya no exporta una función NSGetModule(). Ahora debe exportar una función NSGetFactory(), la cual acepta un ID de contrato como parámetro.

-

Por ejemplo en el código JavaScript de tu componente:

-
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-function myComponent() {
-}
-myComponent.prototype = {
-  // this must match whatever is in chrome.manifest!
-  classID: Components.ID("{e6b866e3-41b2-4f05-a4d2-3d4bde0f7ef8}"),
-
-  QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIMyComponent]),
-
-  /* nsIMyComponent implementation goes here */
-  ...
-};
-
-// The following line is what XPCOM uses to create components. Each component prototype
-// must have a .classID which is used to create it.
-const NSGetFactory = XPCOMUtils.generateNSGetFactory([myComponent]);
-
-

Un componente puede implemente compatibilidad hacia atrás con Gecko 1.9.2 dinámicamente detectando cuál de los simbolos son exportados por XPCOMUtils.jsm y exportando la función correcta:

-
/**
-* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
-* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
-*/
-if (XPCOMUtils.generateNSGetFactory)
-    var NSGetFactory = XPCOMUtils.generateNSGetFactory([mySample]);
-else
-    var NSGetModule = XPCOMUtils.generateNSGetModule([mySample]);
-

Componentes binarios

-

Los componentes binarios deben ser listados explicitamente en un manifest usando una directiva binary-component:

-
binary-component components/mycomponent.dll
-
-

C++ en el componente debe ser cambiado: un componente binario ya no exporta la función NSGetModule(). En cambio, exporta un simbolo de datos NSModule el cual apunta a la estructura mozilla::Module. Para más información acerca de la estructura mozilla::Module, mira la cabecera Module.h. Para un ejemplo actual de implementación de módulos dinámicos, mira nsSampleModule.cpp.

-

Notese que nsIGenericFactory.h ha sido eliminado. Referencias a nsIGenericFactory.h deben ser reemplazadas con mozilla/ModuleUtils.h.

-

Es posible para un componente binario ser compatible con Mozilla 1.9.2 y Mozilla 2.0 usando un macro extraNS_IMPL_MOZILLA192_NSGETMODULE. mira nsSampleModule.cpp para más detalles.

-

Subdirectorios específicos de plataforma

-

El sistema component/chrome usado para mirar en los subdirectorios específicos de plataforma de una extensión, del tipo platform/WINNT_x86-msvc/chrome.manifest en Windows. Ya no está soportado. Puedes usar las directivas de registro chrome, OS y ABI para lograr el mismo efecto:

-
binary-component components/windows/mycomponent.dll ABI=WINNT_x86-msvc
-binary-component components/mac/mycomponent.dylib ABI=Darwin_x86-gcc3
-binary-component components/mac/mycomponent64.dylib ABI=Darwin_x86-64-gcc3
-binary-component components/linux/mycomponent.so ABI=Linux_x86-gcc3
-
-

Registro de categoría

-

Anterior a Gecko 2, las extensiones podían escuchar las notificaciones para el xpcom-startup y app-startup durante el inicio, y realizar acciones durante. Este ya no es el caso. Las más temprana notificacion de inicio que puede recibir una extensión es profile-after-change, la cual tiene siempre que ser una notificación recomendad para observar. Esto es debido a que está entre las notificaciones más tempranas que ocurren despues de que la carpeta de perfil(y por lo tanto preferencias y otros servicios) está disponible.

-

Qué necesitas cambiar

-

Si tu extension actualmente observa aún a xpcom-startup ó app-startup, necesitas actualizar tu código para observer en vez a profile-after-change.

-

Usualmente, las extensiones observaban app-startup porqué en el pasado, necesitabas cargar app-startup con el fin de poder registrarse para observar profile-after-change en primer lugar. A partir de Gecko 1.9.1, este ya no es el caso, como sea; tu puedes registrar ahora profile-after-change usando el administrador de categoría. Mira Recibiendo notificaciones de inicio para más detalles.

-

Para agregar una entrada de categoria, debes insertar la siguiente linea a tu chrome.manifest:

-
category profile-after-change MyComponent @foobar/mycomponent;1
-
-
Importante: Formalmente, el id de contrado de la entrada de categoría era prefijada con "service," si el componente era implementado como un servicio. Este prefijo necesita ser eliminado cuando migres a chrome.manifest.
-

Nombres de categoría cambiados

-

El administrador de categoría en XPCOM es usado para registrar ciertos objetos auxiliares globales. Como chrome.manifest es un formato de espacio delimitado, los nombres de categoría con espacios no pueden ser registrados. Por lo tanto las siguientes categorías han cambiado:

- -
Nombre anterior Nuevo nombre
JavaScript global constructor Javascript-global-constructor
JavaScript global constructor prototype alias JavaScript-global-constructor-prototype-alias
JavaScript global property JavaScript-global-property
JavaScript global privileged property JavaScript-global-privileged-property
JavaScript global static nameset JavaScript-global-static-nameset
JavaScript global dynamic nameset JavaScript-global-dynamic-nameset
JavaScript DOM class JavaScript-DOM-class
JavaScript DOM interface JavaScript-DOM-interface
XSLT extension functions XSLT-extension-functions
-

¿Pero por qué?

-

Previamente, cuando fuera Gecko detectaba que la versión de la aplicación habia cambiado, o una o mas extensiones eran agregadas o eliminadas, activadas o desactivadas, era necesario para tratar todos los registros de componentes existentes, reiniciar la aplicación(Lo que llamamos "Reinicio de administrador de extensiones"), durante su proceso de arranque. Esto fue necesario para asegurar que los componentes que ya no estuvieran disponibles fueran eliminados apropiadamente, y para re-registrar todo, cargando algun nuevo componente que se necesitara.

-

En teoría, estos es invisible para el usuario, pero es un proceso costoso, ya que cada componente necesita ser cargado y ejecutado, luego descargado, luego recargado de nuevo durante el reinicio.

-

Además de eso, con el trabajo que estamos haciendo en el soporte multihilo para Firefox, el contenido de los procesos también necesita registrar componentes en una base por proceso, o de alguna manera para compartir la cache de un componente con el proceso chrome.

-

Los cambios para el modelo de registro de componentes permite este llamado Reinicio de administrador de extensiones volverse una cosa del pasado. En lugar de confiar en una potencial caché de componentes en el arranque, nosotros leemos los registros de componentes de la aplicación fuera de su archivo manifest y cargamos esos componentes. Esto obtiene suficiente de XPCOM cargado y en ejecución con lo que podemos cargar el administrador de extensiones y realizar la instalación, desinstalación y acualización necesaria de algunas extensiones instaladas.

-

Hecho esto, las extensiones pueden ser cargadas simplemente leyendo su manifesto, cargando sus componentes y continuando el proceso de arranque, todo sin tener que reiniciar el navegador.

-

Los contenidos de procesos en Electrolysis pueden simplemente leer el registro del componente durante el arranque.

-

 

-

Cambios en los contenedores XPCNativeWrapper

-

No se pueden desactivar del manifiesto  los contenedores XPCNativeWrapper

-

Ya no se admite la especificación de xpcnativewrappers=no en tu manifiesto. El objetivo de ésta fue siempre ofrecer una solución alternativa a corto plazo que permitiera que las extensiones continuaran funcionando mientras que los autores actualizaban el código para usar los contenedores XPCNativeWrapper.

-

Si tu agregado/complemento depende de un enlace XBL adjunto a los objetos de contenido - por ejemplo, la capacidad para llamar a las funciones u obtener y establecer las propiedades creadas por el enlace XBL - tendrás que usar la propiedad de los contenedores XPCNativeWrapper wrappedJSObject para tener acceso a los objetos ajustados.

-

Si necesitas poder llamar a las funciones o tener acceso a las propiedades definidas por el contenido web, tendrás que hacer esto también. Puede ser el caso si, por ejemplo, has escrito una extensión que añade a un servicio de correo web un botón eliminar y el servicio define una función window.delete() que tienes que llamar.

-

Si, por otro lado, lo único que haces con el contenido es tener acceso a métodos y propiedades DOM, no habrás tenido que usar xpcnativewrappers=no y simplemente deberías eliminarlo de tu manifiesto.

-

Cambios varios en los contenedores XPCNativeWrapper

-

Cambios en XPCOMUtils.jsm

-

Se ha actualizado el módulo de código XPCOMUtils.jsm  para permitir que especifiques las ID de las aplicaciones en las que deseas registrar tu componente.

Captadores de servicios XPCOM

-

Una serie de servicios XPCOM que se usan habitualmente disponen ahora de funciones de captadores de servicios en el  mozilla::services namespace; facilitan en gran medida el acceso a estos servicios desde el código C++.

Consulta también

- -

diff --git a/files/es/mozilla/xpcom/xpcom/el_administrador_de_hilos/index.html b/files/es/mozilla/xpcom/xpcom/el_administrador_de_hilos/index.html deleted file mode 100644 index 4c57aa57e9..0000000000 --- a/files/es/mozilla/xpcom/xpcom/el_administrador_de_hilos/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: El administrador de hilos -slug: Mozilla/XPCOM/XPCOM/El_administrador_de_hilos -tags: - - Firefox 3 -translation_of: Mozilla/Tech/XPCOM/The_Thread_Manager ---- -

- -

El administrador de hilos, introducido en Firefox 3, ofrece un mecanismo simple de utilizar para crear hilos y enviarles eventos para que los procese.

- -

Interfaces

- -

Existen varias interfaces que proveen el soporte multihilo:

- -
-
nsIThreadManager
-
El administrador de hilos en sí mismo te permite crear hilos.
-
nsIThread
-
La interfaz nsIThread encapsula un sistema de hilos funcional, proveyendo un acceso multi-plataforma sencillo al multihilo desde tu código.
-
nsIThreadPool
-
Un pool de hilos provee un conjunto limitado de "hilos de trabajo". Cuando envies un evento al pool, el pool elije un hilo de trabajo disponible para procesar el evento.
-
nsIThreadInternal
-
Una subclase de nsIThread que es implementada por el objeto XPCOM de hilo para agregar soporte de observadores de la actividad de envíos al hilo.
-
nsIThreadObserver
-
Provee la habilidad de monitorear el hilo, recibir notificaciones cuando se le envían eventos y cuando terminan de ser procesados.
-
nsIThreadEventFilter
-
Esta interfaz es usada por el método pushEventQueue() en nsIThreadInternal para permitir el filtrado de eventos.
-
- -

Usando el administrador de hilos

- -

Para usar el Administrador de Hilos, necesitas encapsular cada porción de código de trabajo en un objeto XPCOM nsIRunnable. Puedes escribir el objeto totalmente en javascript, no es excesivamente dificil hacerlo.

diff --git a/files/es/mozilla/xpcom/xpcom/index.html b/files/es/mozilla/xpcom/xpcom/index.html deleted file mode 100644 index 9cb2755097..0000000000 --- a/files/es/mozilla/xpcom/xpcom/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: XPCOM -slug: Mozilla/XPCOM/XPCOM -tags: - - Todas_las_Categorías - - XPCOM -translation_of: Mozilla/Tech/XPCOM ---- -
- Introducción a XPCOM (en)
-

Tutorial en cinco partes de IBM developer Works: Parte I, Parte II, Parte III, Parte IV, Parte V

-
-
-  XPCOM (cross platform component object model) es un COM multi-plataforma, similar a Microsoft COM. Gracias a sus múltiples "language bindings", los componentes XPCOM pueden ser usados e implementados no sólo en C/C++, sino también en diversos lenguajes tales como JavaScript, Java y Python. La definición de interfaces en XPCOM ha desarrollado su propio dialecto IDL, el XPIDL.
-
-  
-
-  Así mismo, XPCOM proporciona un conjunto básico de componentes; por ejemplo, las estructuras básicas: cadenas, matrices, etc. La mayoría de los componentes XPCOM no forman parte de este conjunto básico sino que son proporcionados por otras partes de la plataforma (p.e. Gecko o Necko), por una aplicación o por una extensión.
-

 

- - - - - - - -
-

Documentación

-
-
- Intrefaces XPCOM
-
- En esta sección, vamos a echar un pequeño vistazo a XPCOM (Cross-platform Component Object Model o Modelo de Objeto de Componentes Multiplataforma), el sistema de objetos que utiliza Mozilla.
-
-
-
- Creating XPCOM Components (en)
-
- Este manual proporciona informacion sobre como contruir un componente XPCOM que controle el comportamiento de navegación.
-
-
-
- Cómo crear un componente XPCOM en JavaScript
-
- This is a "Hello World" tutorial for creating an XPCOM component in JavaScript. This tutorial does not describe how and why XPCOM works the way it does, or what every bit of the example code does.
-
-
-
- Usando XPCOM en JavaScript sin perdidas (en)
-
- Usando XPCOM en JavaScript (tambien llamado XPConnect) es una forma donde la adminsitracion de memoria no es la mas indicada. Apesar de esto, es facil escribir codigo en JavaScript que tenga perdidas, ya que algunos objetos con los que tratas en el fondo estan includos en la referencia.
-
-

; XPCOM: <small>Referencia sobre las cadenas en XPCOM.</small>  ; XPCOM Glue<br /> : <small>El XPCOM Glue permite usar las funciones y clases de la utilidad XPCOM, sin tener dependencia de partes del XPCOM (xpcom_core.{dll,so,dylib}).</small> Ver todos...

-
-

Comunidad

- - -
    -
  • Los foros de Mozilla en inglés.
  • -
-

-

 

-

Temas relacionados

-
-
- XUL, JavaXPCOM, PyXPCOM, XPConnect, JavaScript.
-
-
-

diff --git a/files/es/mozistorageconnection/index.html b/files/es/mozistorageconnection/index.html deleted file mode 100644 index 3bfa18ae40..0000000000 --- a/files/es/mozistorageconnection/index.html +++ /dev/null @@ -1,470 +0,0 @@ ---- -title: mozIStorageConnection -slug: mozIStorageConnection -tags: - - Interfaces - - Storage - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/mozIStorageConnection ---- -

 

-

La interfaz de mozIStorageConnection representa una conexión de base de datos adjuntos a un archivo específico o de datos en memoria de almacenamiento. Es la principal interfaz para interactuar con una base de datos, incluyendo la creación de comandos preparados, la ejecución de SQL, y el examen de los errores de base de datos.
-
- Véase el almacenamiento de una introducción

-


-

-
storage/public/mozIStorageConnection.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.9 (Firefox 3)
-

-

Hereda de: nsISupports

-

Método de vista

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void close();
mozIStorageStatement createStatement(in AUTF8String aSQLStatement);
void executeSimpleSQL(in AUTF8String aSQLStatement);
boolean tableExists(in AUTF8String aTableName);
boolean indexExists(in AUTF8String aIndexName);
void beginTransaction();
void beginTransactionAs(in PRInt32 transactionType);
void commitTransaction();
void rollbackTransaction();
void createTable(in string aTableName, in string aTableSchema);
void createFunction(in AUTF8String aFunctionName, in long aNumArguments, in mozIStorageFunction aFunction);
void createAggregateFunction(in AUTF8String aFunctionName, in long aNumArguments, in mozIStorageAggregateFunction aFunction);
void removeFunction(in AUTF8String aFunctionName);
mozIStorageProgressHandler setProgressHandler(in PRInt32 aGranularity, in mozIStorageProgressHandler aHandler);
mozIStorageProgressHandler removeProgressHandler();
void preload();
-

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
connectionReadybooleanIndica si la conexión está abierta o lista para usar. Esto es pérfido si la conexión no pudo abrir o si se ha cerrado.
databaseFilensIFileEl archivo de base de datos actual. NULL -
-
-
- <object width="18" height="18" id="tts_flash" data="http://www.gstatic.com/translate/sound_player.swf" type="application/x-shockwave-flash"> <param name="movie" value="http://www.gstatic.com/translate/sound_player.swf"/> <param name="flashvars" value="sound_name=&amp;sound_name_cb=_TTSSoundFile"/> <param name="wmode" value="transparent"/> <param name="allowScriptAccess" value="always"/></object>
- si La Conexión de la Base de Datos en sí refiere una base de la uña de Datos en la memoria.
-
-
lastInsertRowIDlong longEl identificador de fila de la última operación INSERT de SQL. 
lastErrorlongEl último código de error SQLite que se produjo.
lastErrorStringAUTF8StringLa cadena de error Inglés reportados por la librería SQLite para el funcionamiento de SQLite pasado.
schemaVersionlongLa versión del esquema de la base de datos. Esto no debe ser utilizado hasta la base de datos está listo. La versión será reportado como 0 si no se establece. desde Gecko 1.9 M8
transactionInProgressboolean -

Devuelve true si hay una transacción en curso sobre la base de datos, de lo contrario devuelve false.

-
-

Constantes

- - - - - - - - - - - - - - - - - - - - - - - -
ConstanteValorDescripción
TRANSACTION_DEFERRED0Predeterminado. El bloqueo de la base de datos se adquiere cuando sea necesario.
TRANSACTION_IMMEDIATE1Obtener un bloqueo de lectura sobre la base de datos inmediatamente.
TRANSACTION_EXCLUSIVE2Obtener un bloqueo de escritura sobre la base de datos inmediatamente.
-

Métodos

-

close()

-

Cierra una conexión de base de datos. C + + que llaman simplemente debe establecer la variable de la base de datos como NULL. desde Gecko 1.9 M8

-

Tienes que llamar finalize() en la declaración si ha creado uno antes de intentar cerrar o usted recibirá un NS_ERROR_FILE_IS_LOCKED excepción.

-
void close();
-
-
Parámetros
-

Ninguno.

-

createStatement()

-

Crea un mozIStorageStatement para la expresión de SQL dada. La expresión puede utilizar "?" para indicar los argumentos numerados secuencialmente (?1, ?2, etc) or ":name" y "$var" para indicar el nombre argumentos.

-
 mozIStorageStatement createStatement(
-   in AUTF8String aSQLStatement
- );
-
-
Parámetros
-
-
- aSQLStatement
-
- La instrucción SQL a ejecutar.
-
-
Return value
-

Devuelve una nueva mozIStorageStatement que se utilizará para ejecutar la instrucción especificada.

-

executeSimpleSQL()

-

Ejecuta una expresión SQL. De forma predeterminada, que no espera ningún argumento en absoluto.

-
 void executeSimpleSQL(
-   in AUTF8String aSQLStatement
- );
-
-
Parámetros
-
-
- aSQLStatement
-
- La instrucción SQL a ejecutar.
-
-

tableExists()

-

Este método reporta si los informes de la tabla dada existe o no.

-
 boolean tableExists(
-   in AUTF8String aTableName
- );
-
-
Parámetros
-
-
- aTableName
-
- La tabla de SQL cuya existencia debe estar marcada.
-
-
Return value
-

Devuelve true si la tabla existe, false en caso contrario.

-

indexExists()

-

Este método determina si el índice dado existe.

-
 boolean indexExists(
-   in AUTF8String aIndexName
- );
-
-
Parámetros
-
-
- aIndexName
-
- El índice de comprobar.
-
-
Return value
-

Returns true if the index exists, false otherwise.

-

beginTransaction()

-

Inicia una nueva transacción. De forma predeterminada, SQLite aplaza transacciones. Si la transacción ya está activa, este método produce una excepción.

-

Nota: Use of beginTransaction() and related methods is strongly recommended because it stores the transaction state in the connection. Otherwise, the attribute transactionInProgress will have the wrong value.

-
 void beginTransaction();
-
-

beginTransactionAs()

-

This method starts a new transaction of the given transaction type.

-
 void beginTransactionAs(
-   in PRInt32 transactionType
- );
-
-
Parameters
-
-
- transactionType
-
- The type of transaction (TRANSACTION_DEFERRED, TRANSACTION_IMMEDIATE or TRANSACTION_EXCLUSIVE).
-
-

commitTransaction()

-

This method commits the current transaction.

-
 void commitTransaction();
-
-
Parameters
-

None.

-
Exceptions thrown
-
-
- NS_ERROR_STORAGE_NO_TRANSACTION
-
- No transaction is active.
-
-

rollbackTransaction()

-

This method rolls back the current transaction. This is essentially an "undo," and returns the database to the state it was in before the transaction began.

-
 void rollbackTransaction();
-
-
Parameters
-

None.

-
Exceptions thrown
-
-
- NS_ERROR_STORAGE_NO_TRANSACTION
-
- No transaction is active.
-
-

createTable()

-

This method creates a table with the given table name and schema.

-

Nota: At some point in the near future, this method will check to be sure the schema is the same as what is specified, but that is not currently done.

-
 void createTable(
-   in string aTableName,
-   in string aTableSchema
- );
-
-

 

-
Parameters
-
-
- aTableName
-
- The name of the table to create; table names may consist of the letters A-Z in either upper or lower case, the underscore, and the digits 0-9. The first character must be a letter.
-
- aTableSchema
-
- The table's schema. This should be specified using the same syntax the CREATE TABLE statement uses. For example: "foo INTEGER, bar STRING".
-
-
Exceptions thrown
-
-
- NS_ERROR_FAILURE
-
- Table already exists or the requested table couldn't be created.
-
-

createFunction()

-

Creates a new SQLite function. since Gecko 1.9 M8

-
 void createFunction(
-   in AUTF8String aFunctionName,
-   in long aNumArguments,
-   in mozIStorageFunction aFunction
- );
-
-
Parameters
-
-
- aFunctionName
-
- The name of function to create, as seen in SQL.
-
- aNumArguments
-
- The number of arguments the function takes. Pass -1 for variable-argument functions.
-
- aFunction
-
- The instance of mozIStorageFunction that implements the function.
-
-

createAggregateFunction()

-

This method creates a new SQLite aggregate function. since Gecko 1.9 M8

-
 void createAggregateFunction(
-   in AUTF8String aFunctionName,
-   in long aNumArguments,
-   in mozIStorageAggregateFunction aFunction
- );
-
-
Parameters
-
-
- aFunctionName
-
- The name of the aggregate function to create, as seen in SQL.
-
- aNumArguments
-
- The number of arguments the function takes. Pass -1 for variable-argument functions.
-
- aFunction
-
- The instance of mozIStorageAggregateFunction that implements the function.
-
-

removeFunction()

-

Deletes a custom SQLite function; it works with both standard and aggregate functions. since Gecko 1.9 M8

-
 void removeFunction(
-   in AUTF8String aFunctionName
- );
-
-
Parameters
-
-
- aFunctionName
-
- The name of the function to remove.
-
-

setProgressHandler()

-

This method sets a progress handler. Only one handler can be registered at a time; if you need more than one, you need to chain them yourself. since Gecko 1.9 M8

-
 mozIStorageProgressHandler setProgressHandler(
-   in PRInt32 aGranularity,
-   in mozIStorageProgressHandler aHandler
- );
-
-

 

-
Parameters
-
-
- aGranularity
-
- The number of SQL virtual machine steps between progress handler callbacks.
-
- aHandler
-
- The instance of mozIStorageProgressHandler.
-
-
Return value
-

Returns the previous registered handler.

-

removeProgressHandler()

-

Removes a progress handler. since Gecko 1.9 M8

-
 mozIStorageProgressHandler removeProgressHandler();
-
-
Parameters
-

None.

-
Return value
-

Returns the previous registered handler.

-

preload()

-

Precarga el caché de la base de datos mediante la carga de las páginas desde el principio del archivo de base de datos hasta la caché de memoria (el tamaño de las que se especifica en PRAGMA cache_size = tamaño) está lleno o la totalidad del expediente que se lee.

-
- Advertencia: Este método ha sido eliminado en Firefox 3.
-

El caché debe estar activo en la base de datos para que esto funcione. Esto significa que debe tener una transacción abierta en la conexión, o tiene una transacción abierta en otro contexto, que comparte la misma caché de localizador. Estos datos almacenados en caché se marchará cuando se cierra la transacción.
-
- Esta operación precarga puede acelerar las operaciones de lectura porque los datos se carga un gran bloque.Normalmente, las páginas se lee en la carta, que puede causar muchos de disco busca.

-
 void preload();
-
-
Parameters
-

None.

-

Ejemplo: Creación de una declaración sin parámetros

-

C++

-
rv = mDBConn->ExecuteSimpleSQL(NS_LITERAL_CSTRING("CREATE TABLE foo (a INTEGER)"));
-
-

JavaScript

-
mDBConn.executeSimpleSQL("CREATE TABLE foo (a INTEGER)");
-
-

Ejemplo: Creación de una declaración que tiene parámetros

-

C++

-
nsCOMPtr<mozIStorageStatement> statement;
-rv = mDBConn->CreateStatement(NS_LITERAL_CSTRING("SELECT * FROM foo WHERE a = ?1"),
-                              getter_AddRefs(statement));
-NS_ENSURE_SUCCESS(rv, rv);
-
-

JavaScript

-
var statement = mDBConn.createStatement("SELECT * FROM foo WHERE a = ?1");
-
-

Ver también

- -

diff --git "a/files/es/m\303\263vil/index.html" "b/files/es/m\303\263vil/index.html" deleted file mode 100644 index 151bec1066..0000000000 --- "a/files/es/m\303\263vil/index.html" +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Móvil -slug: Móvil -tags: - - Mozilla -translation_of: Mozilla/Mobile ---- -

Firefox OS

- -

Firefox OS is an open source mobile operating system which uses Linux and Mozilla's Gecko engine to run a user interface and set of applications written entirely in HTML, CSS and JavaScript.

- -

Read about how to install Firefox OS and how to develop apps for it.

- -

Firefox for Android

- -

Firefox for Android is Mozilla's mobile web browser for Android devices. It's recently been rewritten to use Android's native UI, making it faster, leaner and more responsive. It provides support for powerful APIs to access device capabilities such as the camera and telephony stack.

- -

Read about how to help create Firefox for Android, how to use its device APIs, and how to build mobile add-ons.

- -

Firefox for iOS

- -

Firefox for iOS is Mozilla's upcoming mobile web browser for iOS devices. Because of AppStore restrictions, it uses the built in WebView supplied by iOS rather than Gecko.

- -

Read about how to help with Firefox for iOS, and how to integrate it with your other iOS Apps.

- -

Mobile web development

- -

Mobile devices have very different hardware characteristics from desktop or laptop computers, and many of the APIs used to work with them are still in the process of being standardized.

- -

Read about how to develop web sites that look good on mobile devices and take advantage of the new possibilities they offer. Learn how to make sure your web site works well on different browsers.

diff --git "a/files/es/m\303\263vil/viewport_meta_tag/index.html" "b/files/es/m\303\263vil/viewport_meta_tag/index.html" deleted file mode 100644 index fd26b5bebf..0000000000 --- "a/files/es/m\303\263vil/viewport_meta_tag/index.html" +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: >- - Usando la etiqueta meta viewport para controlar la composición en los - navegadores móviles -slug: Móvil/Viewport_meta_tag -translation_of: Mozilla/Mobile/Viewport_meta_tag ---- -

Antecedentes

- -

El {{glossary("viewport")}} del navegador es el área de la ventana en donde el contenido web está visible. Generalmente no es del mismo tamaño que la página renderizada, en donde se brindan barras de desplazamiento para que el usuario pueda acceder a todo el contenido.

- -

Dispositivos con pantallas angostas (p.e. móviles) muestran la página en una ventana virtual o viewport, que es usualmente más ancho que la pantalla y la comprimen de manera que pueda verse completa. El usuario podrá recorrerla y hacer zoom para ver diferentes áreas de la página. Por ejemplo, si una pantalla móvil tiene un ancho 640px, las páginas pueden ser procesadas con un viewport de 980px, y después comprimidas para que entren en 640px.

- -

Esto se hace porque muchas páginas no están optimizadas para dispositivos móviles y se quiebran (o, al menos, se ven mal) cuando son procesadas a un ancho de viewport pequeño. El viewport virtual es una forma de resolver el problema de sitios no optimizados para móviles, logrando que se vean mejor.

- -

Ingresar el meta tag viewport

- -

Sin embargo, este mecanismo no es tan bueno para páginas que están optimizadas para pantallas pequeñas usando media queries - si el viewport tiene, por ejemplo, 980px los media queries que se activan en 640px o 480px o menos nunca serán usados, limitando la efectividad de esas técnicas de diseño responsive.

- -

Para mitigar este problema, Apple introdujo el meta tag "viewport" en Safari para iOS que permite a los desarrolladores controlar su tamaño y escala. Muchos navegadores hoy lo soportan, aunque no es parte de ningún standard. La documentación de Apple hace un buen trabajo explicando cómo los desarrolladores web pueden usar esta etiqueta, pero hemos tenido que hacer trabajo de detectives para descubrir exactamente cómo implementarlo en Fennec. Por ejemplo, la documentación de Safari dice que el contenido está "separado por comas", pero los navegadores existentes y las páginas web usan una mezcla entre comas, punto y coma y espacios como valores de separación.

- -

Puede aprenderse más sobre los diferentes navegadores móviles en A Tale of Two Viewports en quirksmode.org.

- -

Viewport básico

- -

Un sitio típico optimizado para móvil contiene algo así:

- -
<meta name="viewport" content="width=device-width, user-scalable=no">
- -

La propiedad width controla el tamaño del viewport. Puede definirse con un número en pixeles como  width=600 o con un valor especial device-width que es el equivalente al ancho de la pantalla en píxeles CSS en una escala de 100%. (Existen valores correspondientes de heightdevice-height, los cuales pueden ser útiles para páginas con elementos que cambian tamaño o posición basadas en la altura del viewport (height).

- -

La propiedad initial-scale controla el nivel de zoom cuando la página se carga por primera vez. Las propiedades maximum-scale, minimum-scale, y user-scalable controlan la forma en cómo se permite a los usuarios aumentar o disminiuir el zoom en la página.

- -

Un pixel no es un pixel

- -

El iPhone y muchos teléfonos Android populares tienen pantallas de 3 a 4 pulgadas (7–10 cm) con 320—480 píxeles (~160 dpi). Firefox para Maemo se ejecuta en el Nokia N900, el cual físicamente tiene el mismo tamaño, pero 480—800 píxeles (~240 dpi). Debido a esto, la versión más reciente de Fennec mostró muchas páginas alrededor de un tercio más pequeñas (en tamaño real, tamaño físico) que iPhone o Android. Esto causó problemas de usabilidad y lectura en muchos sitios web optimizados con funcionalidad touch. Peter-Paul Koch escribió sobre este problema en A pixel is not a pixel is not a pixel.

- -

Fennec 1.1 para Maemo usa 1,5 pixels de hardware para cada "pixel" de CSS, siguiendo los criterios de los navegadores en Android basados en WebKit. Esto significa que una página con un valor de  initial-scale=1 se mostrará renderizada aproximadamente al mismo tamaño físico en Fennec para Maemo, Safari Mobile para iPhone, y el navegador de Android tanto en teléfonos  HDPI y MDPI. Esto es consistente con la especificación CSS 2.1, que dice:

- -
-

Si la densidad en pixeles del aparato es muy diferente de aquella típica en pantalla de computadores, el "user agent" deberá reescalar los valores en pixeles. Se recomienda que la unidad de pixel refiera al número total de pixels del aparato que más se aproxime al pixel de referencia. Se recomienda también que el pixel de referencia sea el ángulo visual de un pixel en un aparato con una densidad de pixels de 96dpi y una distancia del lector del largo de un brazo.

-
- -

Para los desarrolladores web, esto supone que 320px es el ancho máximo en modo retrato a scale=1, y todos los dispositivos mencionados anteriormente, deben ajustarse acorde al tamaño la maquetación y las imágenes. Pero recuerda que no todos los móviles tienen el mismo ancho; debes asegurarte además que tus páginas funcionan corectamente en modo apaisado, y en dispositivos más grandes como el iPad o las tablets Android.

- -

En las pantallas de 240-ppp, las páginas con initial-scale=1 serán escaladas efectivamente a un 150% tanto en Fennec como en Android WebKit. Su texto será suave y fresco, pero sus imágenes de bitmap probablemente no obtengan ninguna ventaja de la máxima resolución de la pantalla. Para obtener imágenes más finas en estas pantallas, los desarrolladores web deben diseñar imágenes - o maquetaciones completas - al 150% de sus tamaño final (o al 200%, para soportar dispositivos de 320-ppp como por ejemplo el iPhone con pantalla retina) y entonces disminuar la escala usando CSS o las propiedades del viewport.

- -

La relación por defecto depende de la densidad de la pantalla. En una pantalla con una densidad inferior a 200ppp, el ratio es 1.0. En pantallas con densidades entre 200 y 300ppp, el ratio es 1.5. Para pantallas con densidades por encima de 300ppp, el ratio es el entero inferior (densidad/150ppp). Hay que observar que el ratio por defecto es cierto sólo cuando la escala del viewport es igual a 1. En cualquier otro caso, la relación entre los pixels en CSS y en el dispositivo dependen del nivel de zoom en cada momento.

- -

Ancho del viewport y ancho de la pantalla

- -

Muchos sitios establecen su viewport a "width=320, initial-scale=1" para ajustarse de manera precisa a la pantalla del iPhone en modo portrait. Tal y como se menciona arriba, esto causa problemas cuando Fennec 1.0 renderiza estos sitios, especialmente en modo landscape. Para arreglar esto, Fennec 1.1 expandirá el ancho del viewport si es necesario para rellenar la pantalla a la escala requerida. Esto encaja con el comportamiento de Android y Mobile Safari, y es especialmente útil en dispositivos de gran pantalla como el iPad (el sitio de Allen Pike Choosing a viewport for iPad tiene una buena explicación para desarrolladores web).

- -

Para páginas que establecen una escala inicial o máxima, esto se traduce en que la propiedad width realmente pasa a ser el ancho mínimo del viewport. Por ejemplo, si tu diseño necesita al menos 500 píxeles de ancho entonces  podrás usar la siguiente anotación. Cuando la pantalla tenga un ancho mayor a 500 píxeles, el navegador extenderá el viewport (en lugar de acercar el zoom) para ajustarlo a la pantalla:

- -
<meta name="viewport" content="width=500, initial-scale=1">
- -

Fennec 1.1 también añade soporte para minimum-scale, maximum-scale y user-scalable con valores por defecto y límites similares a los de Safari. Estas propiedades afectan a la escala inicial y al ancho, además de limitar los cambios a nivel de zoom.

- -

Los navegadores para dispositivos móviles responden a los cambios de orientación de manera ligeramente diferente. Por ejemplo, Mobile Safari a menudo solo amplía el zoom de la página cuando se cambia la orientación portrait a la landscape, en lugar de exponer la página como si originalmente se hubiera cargado en landscape. Si los desarrolladores web quieren que su escala establecida permanezca consistente cuando cambie la orientación en un iPhone, deben añadir un valor maximum-scale para prevenir éste efecto de zoom, el cual tiene el (a veces) efecto secundario indeseado de impedir que los usuarios acerquen el zoom:

- -
<meta name="viewport" content="initial-scale=1, maximum-scale=1">
- -

Esto no es necesario en Fennec; cuando el dispositivo cambia de orientación, Fennec actualiza el tamaño de viewport, el diseño de la página, y las propiedades de  JavaScript/CSS como device-width, basadas en las nuevas dimensiones de la pantalla.

- -

Tamaños Comunes de Viewport en Equipos Móviles y Tabletas 

- -

Si quieres saber qué tipo de ancho de viewport tienen los equipos móviles y tabletas, hay una lista exhaustiva aquí: mobile and tablet viewport sizes. La lista te brinda información tanto del ancho del viewport en los modos de orientación vertical y horizontal ("portrait" y "landscape"), así como del tamaño de la pantalla, sistema operativo y la densidad de píxeles del dispositivo.

- -

Standards

- - - - - - - - - - - - - - - - -
SpecificationStatusComment
{{SpecName('CSS3 Device', '#viewport-meta', '<meta name="viewport">')}}{{Spec2('CSS3 Device')}}Non-normatively describes the Viewport META element
- -

Claramente existe demanda por la etiqueta "meta viewport", ya que es soportada por la mayoría de los buscadores móviles y usada por miles de sitios web. Sería bueno contar con un verdadero estándar para que las páginas web puedan controlar las propiedades del viewport. Mientras avance el proceso de estandarización, en Mozilla trabajaremos para asegurarnos de poder implementar cualquier cambio realizado durante dicho proceso.

diff --git a/files/es/nsicancelable/index.html b/files/es/nsicancelable/index.html deleted file mode 100644 index f54b4aea34..0000000000 --- a/files/es/nsicancelable/index.html +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: nsICancelable -slug: nsICancelable -tags: - - Interfaces - - Todas_las_Categorías -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsICancelable ---- -

 

-

 

-


- La interfaz nsICancelable ofrece in método para cancelar una operación de descarga que está en progreso.

-


-

-
netwerk/base/public/nsICancelable.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.9 (Firefox 3)
-

-

Inherits from: nsISupports

-

Descripción de método

- - - - - - -
void cancel(in nsresult aReason);
-

Métodos

-

cancel()

-

CLlama a éste método para solicitar la cancelación de cualquier operación que pueda estar realizando.

-
 void cancel(
-   in nsresult aReason
- );
-
-
Parámetros
-
-
- <tt>aReason</tt>
-
- Un código de fallo indica porqué la operación ha sido cancelada. Es un error pasar un código de éxito.
-
-
-  
-

diff --git a/files/es/nsichannel/index.html b/files/es/nsichannel/index.html deleted file mode 100644 index a221ea5b33..0000000000 --- a/files/es/nsichannel/index.html +++ /dev/null @@ -1,183 +0,0 @@ ---- -title: nsIChannel -slug: nsIChannel -tags: - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIChannel ---- -

La interfaz nsIChannel permite a los clientes construir peticiones "GET" para protocolos específicos y manejarlos de forma uniforme.

- -


- nsIChannel is defined in http://mxr.mozilla.org/mozilla/sourc...nsIChannel.idl .

- -

Una vez que se crea un canal (via nsIIOService::newChannel), pueden presentarse parámetros para esa petición usando los atributos de canal, o poniéndose en cola (QI'ing) de una subclase de nsIchannel para los parámetros específicos del protocolo. Entonces, puede buscarse la URI llamando nsIChannel::open o nsIChannel::asyncOpen. Después de que una petición se ha completado, el canal está aún disponible para acceder a resultados específicos del protocolo. Por ejemplo, poniéndose en cola (QI'ing) a nsIHttpChannel permite que se puedan leer las correspondientes cabeceras de respuesta de una transacción http.

- -

Métodos

- -

open()

- -
nsIInputStream open();
-
- -

Abre un canal de forma síncrona.

- -

@return blocking input stream to the channel's data.

- -

NOTA: las implementaciones nsIChannel no requieren implementar este método. Aún más, ya que este método puede llegar a bloquear el proceso de la llamada, no debería usarse en el transcurso del proceso de eventos UI.

- -

NOTA: Las implementaciones deberían devolver NS_ERROR_IN_PROGRESS si se re-abre el canal.

- -

asyncOpen()

- -
void asyncOpen(in nsIStreamListener aListener, in nsISupports aContext);
-
- -

Abre este canal de forma asíncrona. Los datos son enviados al canal de escucha en cuanto están disponibles. El método de escucha es llamado en el mismo hilo en que se encuentra la operación de llamada asyncOpen y no es llamado hasta después del retorno de la función asyncOpen. Si asyncOpen devuelve con éxito, el canal prometo llamar al menos a onStartRequest y onStopRequest.

- -

Si el objeto nsIRequest pasado al método de escucha no está en este canal, es necesario enviar una notificación onChannelRedirect antes de llamar a onStartRequest.

- -

Si llamada de retorno del canal y del grupo de carga no ofrecen un nsIChannelEventSink al hacer la llamada a onChannelRedirect, esto es equivalente a haber llamado a onChannelRedirect.

- -

Si asyncOpen retorna con éxito, el canal es responsable de mantenerse vivo hasta que reciba una llamada onStopRequest en la escucha o se lame a onChannelRedirect.

- -

Las implementaciones tienen permitido añadirse por sí mismas, de forma síncrona, al grupo de carga asociado (si lo hay).

- -

NOTA: Las implementaciones deberían devolver NS_ERROR_ALREADY_OPENED si un canal es re-abierto.

- -

@param aListener the nsIStreamListener implementation @param aContext an opaque parameter forwarded to aListener's methods @see nsIChannelEventSink for onChannelRedirect

- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
originalURInsIURILa URI original usada para construir el canal. Esto se usa en el caso de una "resolución" de una URI re-dirigida (p.e. resolviendo un recurso: URI a archivo: URI) de forma que la URI original (antes de la redireción) esté disponible. -

NOTA: esto es notablemente distinto del Referer de http (URI referente) que es usualmente la página que contenía la URI original (accesible desde nsIHttpChannel).

-
URIreadonly nsIURILa URI correspondienter al canal. Su valor es inmutable.
ownernsISupportsEl dueño, correspondiendo a la entidad que es responsable por este canal. Lo usa el agente de seguridad para otorgar o denegar privilegios al código cargado a través de este canal. -

NOTA: esto es una fuerte referencia al dueño, de forma que si este está también manteniendo una fuerte referencia al canal, hay que tener mucho cuidado de cortar explícitamente la referencia al canal.

-
notificationCallbacksnsIInterfaceRequestorLas llamadas de notificación devueltas al canal. Estas son realizadas por el cliente, que quiere ofrecer una forma de recibir notificaciones de progreso, estado o específicas del protocolo. Si este valor es NULL, la implementación del canal puede usar las llamadas devueltas a su grupo de carga. El canal también puede interrogar las llamadas desde su grupo de carga, si las notificaciones que le llegan no ofrecen el interfaz requerido. -

Los interfaces usualmente requeridos incluyen: nsIProgressEventSink, nsIPrompt, y nsIAuthPrompt/nsIAuthPrompt2.

- -

Cuando el canal ha terminado, no debe mantener ninguna referencia a estos objetos.

- -

NOTA: Una implementación de un canal debe tener cuidado cuando almacena ("caching") el puntero de un interfaz llamado en una notificación. Si la notificación cambia, el puntero almacenado puede ser invalido y por tanto debería ser buscado de nuevo.

-
securityInforeadonly nsISupportsInformación de seguridad a nivel transporte (si la hay) correspondiente al canal.
contentTypereadonly ACStringEl tipo MIME del contenido del canal, si está disponible. -

NOTA: el tipo de contenido está, a menudo, incorrectamente especificado (p.e. extensión incorrecta del archivo, tipo MIME incorrecto, tipo de documento equivocado en el servidor, etc.) y es aconsejeble que el llamante verifique los datos propiamente.

- -

Establecer contentType antes de que el canal esté abierto, da una pista al canal sobre que tipo de MIME se va a encontrar. El canal puede ignorar esta pista y decidir el tipo MIME que va a reportar.

- -

Establecer contentType despues de que onStartRequest sea llamado o despues de llamar a open(), sobre escribirá el tipo determinado por el canal.

- -

Establecer contentType en el momento entre que asyncOpen() es llamada y el momento en que se lanza onStartRequest tendrá resultados inpredecibles en este momento.

- -

El valor del atributo contentType es una cadena en minúsculas. El valor asignado a este atributo será analizado y nomalizado de la siguiente forma:

- -

1- cualquier parámetro (delimitado con ';') será desnudado. 2- si se da un parámetro del tipo charset, su valor reemplazará el atributo contentCharset del canal. 3- el valor desnudado será convertido a minúsculas. cualquier implementación de nsIChannel debe seguir estas reglas.

-
contentCharsetreadonly ACStringEl juego de caracteres del contenido del canal si está disponible y es aplicable. Este atributo solo se aplica a datos tipo texto. -

El valor del atributo contentCharset es una cadena de mayúsculas y minúsculas.

-
contentLengthreadonly longLa longitud de los datos asociados con el canal si está disponible. Un valor de -1 indica que la longitud es desconocida. -

Los llamantes deberían escoger leer la propiedad "content-length" como un valor de 64 bit pasando a través de nsIPropertyBag2, si esta interfaz está disponible al canal.

-
- -

Constantes

- -

Flags de carga específicos del canal:

- -

Los bit 22 a 31 están reservados para un uso futuro de esta interfaz o una de sus derivadas (ejem. ver nsICachingChannel).

- -

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstanteValorDescripción
LOAD_DOCUMENT_URI16Establecer (p.e. a través de docshell) para indicar si el canal corresponde o no a un documento URI.
LOAD_RETARGETED_DOCUMENT_URI17Si el consumidor final de esta carga ha sido cambiado tras conocer su contenido, este flag será establecido:
LOAD_REPLACE18Este flag se establece a para indicar que este canal está reemplazando a otro canal. Esto significa que: -

1) se pasó al método asyncOpen la escucha en la que este canal sería notificado, de algún otro canal

- -

y

- -

2) la URI de este canal es un mejor identificador del recurso que está siendo accedido que la URI original del canal.

- -

Este flag puede ser establecido, por ejemplo, por redirectores o en casos en que un solo canal tiene múltiples partes (y por tanto pueden seguir onStopRequest con otro par onStartRequest/onStopRequest, cada par para una petición distinta).

-
LOAD_INITIAL_DOCUMENT_URI19Establecer (p.e. a través de docshell) para indicar si el canal corresponde o no a la URI original de la carga (e.g., link click).
LOAD_TARGETED20Establecer (p.e. por el URILoader) para indicar si el consumidor final para esta carga ha sido determinado.
LOAD_CALL_CONTENT_SNIFFERS21Si este flag está establecido, el canal debería llamar al analizador de contenidos según se describe en nsNetCID.h acerca NS_CONTENT_SNIFFER_CATEGORY. -

Nota: Los canales pueden ignorar este flag. Sin embargo, la implementación de nuevos canales deberían hacer esto sólo por una buena razón.

-
diff --git a/files/es/nsidomofflineresourcelist/index.html b/files/es/nsidomofflineresourcelist/index.html deleted file mode 100644 index ea595df8c8..0000000000 --- a/files/es/nsidomofflineresourcelist/index.html +++ /dev/null @@ -1,228 +0,0 @@ ---- -title: nsIDOMOfflineResourceList -slug: nsIDOMOfflineResourceList -tags: - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIDOMOfflineResourceList ---- -

El interfaz nsIDOMOfflineResourceList ofrece acceso al "application-cache" (memoria cache temporal de la aplicación) que permite que los recursos del contenido web sean almacenados localmente para ser usados en modo desconectado. Este interfaz incluye métodos para agregar recursos o eliminar recursos de la cache, así como hacer una lista de los recursos manejados dinámicamente.

- -


-

-
dom/public/idl/offline/nsIDOMOfflineResourceList.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.9 (Firefox 3)
-

- -

Inherits from: nsISupports

- -

Resumen del método

- - - - - - - - - - - - - - - - - - - -
void add(in DOMString uri);
DOMString item(in unsigned long index);
void remove(in DOMString uri);
void swapCache();
void update();
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
lengthunsigned longEl número de entradas la lista de recursos manejados dinámicamenteSólo lectura .
oncheckingnsIDOMEventListenerEl evento de escucha que se llamará cuando se lean los manifiestos en la cache y se busquen actualizaciones.
onerrornsIDOMEventListenerUn evento de escucha que será llamado cuando ocurra un error durante el proceso de almacenaje en cache.
onnoupdatensIDOMEventListenerUn evento de escucha que será llamado cuando no hay actualizaciones a descargar.
ondownloadingnsIDOMEventListenerUn evento de escucha que será llamado cuando se están descargando recursos a la cache.
onprogressnsIDOMEventListenerUn evento de escucha que será llamado periódicamente a lo largo del proceso de descarga.
onupdatereadynsIDOMEventListenerUn evento de escucha que será llamado cuando hay disponible una actualización para un recurso; este evento no se utiliza actualmente ya que las aplicaciones con diferentes versiones aún no están implementadas.
oncachednsIDOMEventListenerUn evento de escucha que será llamado cuando se ha completado el proceso de almacenaje en cache.
statusunsigned shortUna de las constantes constants que indican el estado de la cache de la aplicación.
- -

Constantes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstanteValorDescripción
UNCACHED0El objeto no está asociado con una aplicación.
IDLE1La cache de la aplicación no está en proceso de ser actualizada.
CHECKING2El manifiesto de la cache de la aplicación está siendo leído y en busca de actualizaciones.
DOWNLOADING3Los recursos están siendo descargados para ser agregados a la cache.
UPDATEREADY4Hay una nueva versión de la aplicación disponible. -

Las aplicaciones con diferentes versiones no están aún implementadas, por lo que este valor de estado no está aún implementado.

-
- -

Métodos

- -

add()

- -

Agrega un ítem a las entradas manejadas dinámicamente. Los recursos serán leídos y agregados a la cache de la aplicación.

- -
 void add(
-   in DOMString uri
- );
-
- -
Parámetros
- -
-
uri
-
La URI del recurso a agregar a la lista.
-
- -

item()

- -

Devuelve la URI del ítem en la posición especificada en la lista de recursos en la cache.

- -
 DOMString item(
-   in unsigned long index
- );
-
- -
Parámetros
- -
-
index
-
El índice de elementos en la cache cuya URI será devuelta.
-
- -
Valor devuelto
- -

Una constante DOMString conteniendo la URI del recurso especificado.

- -

remove()

- -

Elimina un ítem de la lista de entradas manejadas dinámicamente. Si es la última referencia a una URI determinada en la cache de la aplicación, la entrada de la caché es eliminada.

- -
 void remove(
-   in DOMString uri
- );
-
- -
Parámetros
- -
-
uri
-
La URI del elemento a eliminar de la lista.
-
- -

swapCache()

- -

Cambia a la nueva versión de la cache de la aplicación.

- -

Las aplicaciones con diferentes versiones no están aún implementadas. Este método generará una excepción.

- -
 void swapCache();
-
- -
Parámetros
- -

Ninguno.

- -

update()

- -

Comienza el proceso de actualización de la cache de la aplicación.

- -
 void update();
-
- -
Parámetros
- -

Ninguno.

- -

Ver también

- - diff --git a/files/es/nsidownload/index.html b/files/es/nsidownload/index.html deleted file mode 100644 index 3f0ea1bde1..0000000000 --- a/files/es/nsidownload/index.html +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: nsIDownload -slug: nsIDownload -tags: - - Firefox 3 - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIDownload ---- -

Obsoleto
Esta funcionalidad es obsoleta. Aunque puede aún funcionar en algunos navegadores, se desalienta su uso ya que puede ser removida en cualquier momento. Evite usarla.

- -

La interfaz nsIDownload describe un objeto descarga. Los objetos descarga son usados por el Administrador de Descargas (ver nsIDownloadManager para manejar archivos que están en cola para ser descargados, están siendo descargados y han terminado de ser descargados).

- -
Nota: Una vez que la descarga esta completada, el Administrador de Descargas deja de actualizar el objeto nsIDownload. Los estdos de completado son: nsIDownloadManager::DOWNLOAD_FINISHED, nsIDownloadManager::DOWNLOAD_FAILED, y nsIDownloadManager::DOWNLOAD_CANCELED.
- -


-

-
toolkit/components/downloads/public/nsIDownload.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.9 (Firefox 3)
-

- -

Inherits from: nsITransfer

- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeTypeDescription
targetFilensILocalFileIndica la localización donde estará el archivo descargado (o está, si la descarga se ha completado).Sólo lectura
percentCompletePRint32El porcentaje de la transferencia que se ha completado, o -1 si el tamaño del archivo es desconocido.Sólo lectura
amountTransferredPRUint64El número de bytes que se han descargado hasta ahora.Sólo lectura
sizePRUint64El tamaño total del archivo en bytes o LL_MAXUINT, si el tamaño es desconocido.Sólo lectura'Read only.
sourcensIURILa URI origen del archivo.Sólo lectura
cancelablensICancelableUn objeto que puede ser usado para cancelar la descarga. Una vez que la descarga se ha completado, esta valor se pone a null.Sólo lectura
displayNameAStringUna descripción, legible por el usuario, de la transferencia.Sólo lectura
startTimelong longLa hora a la que empezó la transferencia.Sólo lectura
speeddoubleLa velocidad de la transferencia en bytes por segundo.Sólo lectura
MIMEInfonsIMIMEInfoEste atributo opcional ofrece información relevante del MIME del archivo destino incluyendo el tipo MIME, la aplicación de ayuda y si la aplicación de ayuda debe o no ser llamada al terminar la descarga.
idunsigned longLa ID única por la que se identifica en la base de datos.
stateshortEl estado actual de la transferencia. Ver the nsIDownloadManager constants list.
referrernsIURILa URI referente de la descarga. Esto es sólo válido para descargas HTTP y puede ser null.
resumablebooleanIndica si la descarga puede ser reanudada después de haberse puesto en pausa. Esto es sólo aplicable si la descarga se hace sobre HTTP/1.1 o FTP y el servidor lo admite.
- -

Ver también

- -

nsIDownloadManager, nsIDownloadProgressListener, nsIXPInstallManagerUI

diff --git a/files/es/nsidownloadmanager/index.html b/files/es/nsidownloadmanager/index.html deleted file mode 100644 index 95f09bdf4c..0000000000 --- a/files/es/nsidownloadmanager/index.html +++ /dev/null @@ -1,442 +0,0 @@ ---- -title: nsIDownloadManager -slug: nsIDownloadManager -tags: - - Firefox 3 - - Interfaces - - Todas_las_Categorías -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIDownloadManager ---- -

Obsoleto
Esta funcionalidad es obsoleta. Aunque puede aún funcionar en algunos navegadores, se desalienta su uso ya que puede ser removida en cualquier momento. Evite usarla.

El interfaz nsIDownloadManager permite a las aplicaciones y extensiones comunicarse con el Administrador de Descargas, añadiendo y quitando archivos a descargar, recolectando información sobre las descargas y siendo notificado cuando las descargas son finalizadas.

- -


-

-
toolkit/components/downloads/public/nsIDownloadManager.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.9 (Firefox 3)
-

- -

Deriva desde: nsISupports

- -

Implementado por: @mozilla.org/download-manager;1. Para crear una unidad, usa:

- -
var dm = Components.classes["@mozilla.org/download-manager;1"]
-                   .createInstance(Components.interfaces.nsIDownloadManager);
-
- -

Descripción del método

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
nsIDownload addDownload(aDownloadType para abreviar, en nsIURI aSource, en nsIURI aTarget, en AString aDisplayName, en nsIMIMEInfo aMIMEInfo, en PRTime aStartTime, en nsILocalFile aTempFile, en nsICancelable aCancelable)
nsIDownload getDownload(in unsigned long aID)
void cancelDownload(in unsigned long aID)
void removeDownload(in unsigned long aID)
void pauseDownload(in unsigned long aID)
void resumeDownload(in unsigned long aID)
void retryDownload(in unsigned long aID)
void cleanUp()
void addListener(in nsIDownloadProgressListener aListener)
void removeListener(in nsIDownloadProgressListener aListener)
- -

Atributos

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
DBConnectionmozIStorageConnectionLa conexión de la base de datos con la base de datos de descargas. Sólo lectura
canCleanUpbooleanSi hay o no descargas que se pueden limpiar (quitar) p.e. descargas completadas, fallidas o canceladas. Sólo lectura
activeDownloadCountlongNúmero de archivos actualmente siendo descargados. Sólo lectura
activeDownloadsnsISimpleEnumeratorEnumeración de los nsIDownloads activos. Sólo lectura
defaultDownloadsDirectorynsILocalFileDevuelve el directorio por defecto (dependiendo del SO) para las descargas. Sólo lectura
userDownloadsDirectorynsILocalFileDevuelve el directorio, configurado por el usuario, para las descargas. Sólo lecturaonly. -

El path depende de dos configuraciones del usuario en las preferencias:

- -

browser.download.folderList define la localización por defecto para los archivos:

- -
    -
  • 0: Los archivos se descargan en el Escritorio por defecto.
  • -
  • 1: Los archivos se descargan en el directorio especificado por el OS por defecto.
  • -
  • 2: Los archivos se descargan en el directorio local especificado por la preferencia browser.download.dir. Si esta preferencia es invalida, la descarga se realiza en el sitio por defecto.
  • -
-
- -

Constantes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstaneValorDescripción
DOWNLOAD_NOTSTARTED-1La descarga no ha comenzado aún.
DOWNLOAD_DOWNLOADING0La descarga esta en proceso de ser descargada.
DOWNLOAD_FINISHED1La descarga ha terminado.
DOWNLOAD_FAILED2La descarga ha fallado.
DOWNLOAD_CANCELED3La descarga fue cancelada por el usuario.
DOWNLOAD_PAUSED4La descarga está actualmente en pausa.
DOWNLOAD_QUEUED5La descarga está en cola pero no está siendo descargada.
DOWNLOAD_BLOCKED6La descarga ha sido bloqueada, bien por un control paterno o el escáner de virus ha determinado que el archivo está infectado y no puede limpiarse.
DOWNLOAD_SCANNING7La descarga está siendo escaneada por la utilidad antivirus.
DOWNLOAD_TYPE_DOWNLOAD0¿Qué es esto?
- -

Métodos

- -

addDownload()

- -

Crea un nsIDownload y lo añade para ser manejado por el Administrador de descargas.

- -
nsIDownload addDownload(
-  in short aDownloadType,
-  in nsIURI aSource,
-  in nsIURI aTarget,
-  in AString aDisplayName,
-  in nsIMIMEInfo aMIMEInfo,
-  in PRTime aStartTime,
-  in nsILocalFile aTempFile,
-  in nsICancelable aCancelable
-)
-
- -
Parámetros
- -
-
aDownloadType
-
El tipo de transferencia de descarga.
-
- -
-
aSource
-
El inicio del URI de transferencia. No debe ser null.
-
- -
-
aTarget
-
El destino del URI dónde debe guardarse la transferencia. No debe ser null.
-
- -
-
aDisplayName
-
Una descripción de la transferencia, legible por el usuario. Puede ser una cadena vacía.
-
- -
-
aMIMEInfo
-
La información MIME asociada con el objetivo. Esto puede incluir el tipo MIME y la aplicación de ayuda en caso necesario. Este parámetro es opcional.
-
- -
-
startTime
-
La hora a la que empezó la descarga.
-
- -
-
aTempFile
-
La localización del archivo temporal (un archivo temporal en el que guardar los datos recibidos, que no es igual que el archivo de destino). El archivo será movido a su localización definitiva indicada por aTarget cuando se complete la descarga. Esto puede ser null.
-
- -
-
aCancelable
-
Un objeto que puede ser utilizado para abortar una descarga. No debe ser null.
-
- -
Valor devuelto
- -

El objeto recientemente creado con las propiedades dadas.

- -
Nota: Agregar una descarga no comienza el proceso de transferencia. Si quieres que sea así, necsitas crear un objeto nsIWebBrowserPersist, llamar al método, poner el progressListener al objeto de descarga devuelto y entonces llamar al método saveURI().
- -

getDownload()

- -

Lee una descarga manejada por el administrador de descargas. La descarga puede estra en proceso, o haber terminado y estar almacenada en la base de datos.

- -
nsIDownload getDownload(
-  in unsigned long aID
-)
-
- -
Parámetros
- -
-
aID
-
La ID única de la descarga.
-
- -
Valor devuelto
- -

TLa descarga con el ID único especificado.

- -
Excepciones
- -
-
NS_ERROR_NOT_AVAILABLE
-
La descarga no está en la base de datos.
-
- -

cancelDownload()

- -

Cancela la descarga que tiene el ID único especificado, si se encuentra en progreso. Esto llama a cancel(NS_BINDING_ABORTED) en el nsICancelable dado por la descarga.

- -
 void cancelDownload(
-   in unsigned long aID
- )
-
- -
Parámetros
- -
-
aID
-
El ID único de la descarga.
-
- -
Excepciones
- -
-
NS_ERROR_FAILURE
-
La descarga no está en progreso.
-
- -

removeDownload()

- -

Quita de la lista, la descarga con el ID único especificado, si ésta no está en progreso. Así como cancelDownload() simplemente cancela la transferencia mientras que la información de la descarga se mantiene, removeDownload() borra todos los datos pertenecientes a la descarga.

- -
 void removeDownload(
-   in unsigned long aID
- )
-
- -
Parámetros
- -
-
aID
-
La ID única de la descarga.
-
- -
Excepciones
- -
-
NS_ERROR_FAILURE
-
La descarga está activa (está en proceso de transferencia).
-
- -

pauseDownload()

- -

Pone la descarga especificada en pausa.

- -
 void pauseDownload(
-   in unsigned long aID
- )
-
- -
Parámetros
- -
-
aID
-
La ID única de la descarga a detener.
-
- -
Excepciones
- -
-
NS_ERROR_FAILURE
-
La descarga no está en proceso.
-
- -

resumeDownload()

- -

Reanuda la descarga especificada.

- -
 void resumeDownload(
-   in unsigned long aID
- )
-
- -
Parámetros
- -
-
aID
-
La ID única de la descarga a reanudar.
-
- -
Excepciones
- -
-
NS_ERROR_FAILURE
-
La descarga no está en progreso.
-
- -

retryDownload()

- -

Reintenta una descarga fallida.

- -
 void retryDownload(
-   in unsigned long aID
- )
-
- -
Parámetros
- -
-
aID
-
La ID única de la descarga.
-
- -
Excepciones
- -
-
NS_ERROR_NOT_AVAILALE
-
si la descarga es desconocida.
-
- -

cleanUp()

- -

Quita de la lista las descargas terminadas, fallidas y canceladas.

- -
 void cleanUp()
-
- -
Parámetros
- -

Ninguno.

- -

addListener()

- -

Agrega una escucha al Administrador de Descargas.

- -
 void addListener(
-   in nsIDownloadProgressListener aListener
- )
-
- -
Parámetros
- -
-
aListener
-
El objeto nsIDownloadProgressListener que recibirá la información de estado desde el Administrador de Descargas.
-
- -

removeListener()

- -

Retira una escucha del Administrador de Descargas.

- -
 void removeListener(
-   in nsIDownloadProgressListener aListener
- )
-
- -
Parámetros
- -
-
aListener
-
El objeto nsIDownloadProgressListener dejará de escuchar al Administrador de Descargas.
-
- -

Ver también

- - diff --git a/files/es/nsidownloadmanagerui/index.html b/files/es/nsidownloadmanagerui/index.html deleted file mode 100644 index 457e4adbe8..0000000000 --- a/files/es/nsidownloadmanagerui/index.html +++ /dev/null @@ -1,126 +0,0 @@ ---- -title: nsIDownloadManagerUI -slug: nsIDownloadManagerUI -tags: - - Firefox 3 - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIDownloadManagerUI ---- -

El interfaz nsIDownloadManagerUI se usa para implementar el interfaz del usuario del Administrador de Descargas. Si quieres reemplazar el interfaz de usuario por defecto del Administrador de Descargas, implementa este interfaz.

- -


-

-
toolkit/components/downloads/public/nsIDownloadManagerUI.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.9 (Firefox 3)
-

- -

Inherits from: nsISupports

- -

Resumen del método

- - - - - - - - - - -
void getAttention();
void show([optional] in nsIInterfaceRequestor aWindowContext, [optional] in unsigned long aID, [optional] in short aReason);
- -

Atributos

- - - - - - - - - - - - - - -
AtributoTipoDescripción
visiblebooleanEste atributo de sólo lectura es true cuando el interfaz de usuario del Administrador de Descargas es visible, devolviendo false en caso contrario.
- -

Constantes

- - - - - - - - - - - - - - - - - - - -
ConstanteValorDescripción
REASON_USER_INTERACTED0Cuando se abre el interfaz de usuario del Administrador de Descargas, este valor indica que se ha abierto por requerimiento del usuario.
REASON_NEW_DOWNLOAD1Cuando se abre el interfaz de usuario del Administrador de Descargas, este valor indica que el interfaz está visible porque se ha iniciado una nueva descarga.
- -

Métodos

- -

getAttention()

- -

Llama la atención del interfaz de usuario del Administrador de Descargas si este está aún visible.

- -
 void getAttention();
-
- -
Parámetros
- -

Ninguno.

- -
Excepciones
- -
-
NS_ERROR_UNEXPECTED
-
El interfaz no es actualmente visible.
-
- -

show()

- -

Muestra el interfaz de usuario del Administrador de Descargas al usuario.

- -
 void show(
-   [optional] in nsIInterfaceRequestor aWindowContext,
-   [optional] in unsigned long aID,
-   [optional] in short aReason
- );
-
- -
Parámetros
- -
-
aWindowContext
-
La ventana padre que mostrará el interfaz. Con esta información, es posible poner el Administrador de Descargas en una pestaña de la misma ventana .
-
aID
-
El ID de la descarga que aparecerá preseleccionada cuando se abra el interfaz de usuario (UI) del administrador de Descargas.
-
aReason
-
Una de las razones (una constantes) indicando porqué debe ser mostrado el interfaz de usuario.
-
- -

Ver también

- - diff --git a/files/es/nsidownloadprogresslistener/index.html b/files/es/nsidownloadprogresslistener/index.html deleted file mode 100644 index ba65413b73..0000000000 --- a/files/es/nsidownloadprogresslistener/index.html +++ /dev/null @@ -1,304 +0,0 @@ ---- -title: nsIDownloadProgressListener -slug: nsIDownloadProgressListener -tags: - - Firefox 3 - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIDownloadProgressListener ---- -

El interfaz nsIDownloadProgressListener da a las aplicaciones y extensiones una manera de vigilar el estado de las descargas que están siendo procesadas por el Administrador de Descargas. Simplemente implementa este interfaz en tu código y llama a la función addListener() del nsIDownloadManager para empezar a escuchar.

- -

Cuando no necesites escuchar más al Administrador de Descargas, llama a la función removeListener() del nsIDownloadManager para detener la escucha.

- -

Al momento en que los estados de las descargan cambian, los métodos descritos aquí son llamados por el Administrador de Descargas para que tu código realice cualquier acción que necesite.

- -

Esta interfaz trabaja de forma similar a la interfaz nsIWebProgress.

- -


-

-
toolkit/components/downloads/public/nsIDownloadProgressListener.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.9 (Firefox 3)
-

- -

Inherits from: nsISupports

- -

Descripción del método

- - - - - - - - - - - - - - - - - - - -
void onDownloadStateChange(in short aState, in nsIDownload aDownload)
void onProgressChange(in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long long aCurSelfProgress, in long long aMaxSelfProgress, in long long aCurTotalProgress, in long long aMaxTotalProgress, in nsIDownload aDownload)
void onStatusChange(in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage, in nsIDownload aDownload)
void onLocationChange(in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI aLocation, in nsIDownload aDownload)x
void onSecurityChange(in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aState, in nsIDownload aDownload)
- -

Atributos

- - - - - - - - - - - - - - -
AtributoTipoDescripción
documentnsIDOMDocumentEl objeto documento que representa la ventana del Administrador de Descargas.
- -

Métodos

- -

onDownloadStateChange()

- -

Es llamado cuando el estado de una descarga en particular cambia.

- -
 void onDownloadStateChange(
-   in short aState,
-   in nsIDownload aDownload
- );
-
- -
Parámetros
- -
-
aState
-
El estado previo de la descarga. Ver nsIDownloadManager para una lista de valores posibles.
-
- -
-
aDownload
-
El objeto nsIDownload que representa el archivo cuyo estado de descarga ha cambiado. Puedes obtener el nuevo estado de la descarga con este método.
-
- -

onStateChange()

- -

Llamado cuando cambia el estado de una descarga en particular.

- -
 void onStateChange(
-   in nsIWebProgress aWebProgress,
-   in nsIRequest aRequest,
-   in unsigned long aStateFlags,
-   in nsresult aStatus,
-   in nsIDownload aDownload
- );
-
- -
Parámetros
- -
-
aWebProgress
-
La instancia nsIWebProgress que usa el Administrador de Descargas para vigilar la descarga.
-
- -
-
aRequest
-
El nsIChannel cuyo estado cambia. Éste parámetro no será NULL.
-
- -
-
aStateFlags
-
Flags indicandoel nuevo estado de la descarga. Este valores una combinación de uno de los state transition flags documentados en la sección nsIWebProgressListener.
-
- -
-
aStatus
-
La información del nuevo estado de la descarga. Ver The new state information for the download. See onStateChange() en nsIWebProgressListener para más detalles. También puede ser una constante de nsIDownloadManager state constants.
-
- -
-
aDownload
-
La descarga cuyo estado ha cambiado.
-
- -

onProgressChange()

- -

Llamado cuando el nivel de progreso de la descarga cambia.

- -
 void onProgressChange(
-   in nsIWebProgress aWebProgress,
-   in nsIRequest aRequest,
-   in long long aCurSelfProgress,
-   in long long aMaxSelfProgress,
-   in long long aCurTotalProgress,
-   in long long aMaxTotalProgress,
-   in nsIDownload aDownload
- );
-
- -
Parámetros
- -
-
aWebProgress
-
La instancia nsIWebProgress usada por el Administrador de Descargas para vigilar las descargas.
-
- -
-
aRequest
-
El nsIChannel que ha cambiado de estado. Este parámetro no será NULL.
-
- -
-
aCurSelfProgress
-
La cantidad actual de progreso de la descarga especificada por aDownload.
-
- -
-
aMaxSelfProgress
-
El valor de progreso que debe alcanzarse para dar por finalizada la descarga.
-
- -
-
aCurTotalProgress
-
La cantidad actual de progreso que se ha hecho en todas las descargas.
-
- -
-
aMaxTotalProgress
-
El valor que necesita alcanzar el progreso total para determinar que todas las descargas están completadas.
-
- -
-
aDownload
-
El objeto nsIDownload cuyo progreso está representado por los parámetros aCurSelfProgress y aMaxSelfProgress.
-
- -

onStatusChange()

- -

Llamado cuando el estado de una descarga solicita un cambio. El mensaje de estado recibido se quiere que sea bien visible al usuario.

- -
Atención: Este método ya no está en Firefox 3 (Gecko 1.9). En versiones anteriores, este método nunca fue usado.
- -
 void onStatusChange(
-   in nsIWebProgress aWebProgress,
-   in nsIRequest aRequest,
-   in nsresult aStatus,
-   in wstring aMessage,
-   in nsIDownload aDownload
- );
-
- -
Parámetros
- -
-
aWebProgress
-
La instancia nsIWebProgress usada por el Administrador de Descargas para vigilar las descargas.
-
- -
-
nsIChannel
-
El nsIRequest que cambia de estado. Este parámetro no será NULL.
-
- -
-
aStatus
-
La información del nuevo estado de la descarga. Ver onStateChange() en nsIWebProgressListener para más detalles.
-
- -
-
aMessage
-
Un mensaje de estado legible por el usuario, que se quiere presentar muy visible en la pantalla.
-
- -
-
aDownload
-
La descarga cuyo estado ha cambiado.
-
- -

onLocationChange()

- -
Atención: Este método ya no está en Firefox 3 (Gecko 1.9). En versiones anteriores, este método nunca fue usado.
- -
 void onLocationChange(
-   in nsIWebProgress aWebProgress,
-   in nsIRequest aRequest,
-   in nsIURI aLocation,
-   in nsIDownload aDownload
- );
-
- -

 

- -
Parámetros
- -
-
aWebProgress
-
La instancia nsIWebProgress usada por el Administrador de Descargas para vigilar las descargas.
-
- -
-
aRequest
-
El nsIChannel que ha cambiado de estado. Este parámetro no será NULL.
-
- -
-
aLocation
-
La URI del archivo que se está descargando.
-
- -
-
aDownload
-
El objeto nsIDownload que representa el archivo que se está descargando.
-
- -

onSecurityChange()

- -

Llamado cuando el nivel de seguridad usado mientras se hace la descarga cambia. Por ejemplo, si la petición inicial se ha hecho en un servidor HTTPS pero la descarga cambia a un servidor HTTP, esta función es llamada para avisar de la transición

- -
 void onSecurityChange(
-   in nsIWebProgress aWebProgress,
-   in nsIRequest aRequest,
-   in unsigned long aState,
-   in nsIDownload aDownload
- );
-
-
- -
Parámetros
- -
-
aWebProgress
-
La instancia nsIWebProgress usada por el Administrador de Descargas para vigilar las descargas.
-
- -
-
aRequest
-
El nsIChannel que cambia de estado. Este parámetro no será NULL.
-
- -
-
aState
-
El nuevo estado de la descarga. Ver nsIDownloadManager para una lista de valores posibles.
-
- -
-
aDownload
-
La descarga cuyo nivel de seguridad ha cambiado.
-
- -

Ver también

- -

nsIDownloadManager, nsIDownload, nsIWebProgressListener

diff --git a/files/es/nsidragservice/index.html b/files/es/nsidragservice/index.html deleted file mode 100644 index 89c629f87e..0000000000 --- a/files/es/nsidragservice/index.html +++ /dev/null @@ -1,317 +0,0 @@ ---- -title: nsIDragService -slug: nsIDragService -tags: - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIDragService ---- -

-
widget/nsIDragService.idlScriptable
- - -Implements the Drag Service for handling drag and drop operations. - - -
-Inherits from: nsISupports -Last changed in Gecko 43 (Firefox 43 / Thunderbird 43 / SeaMonkey 2.40)
-

- -
Note: Using this interface directly from add-on code is deprecated. Add-ons should use the standard dataTransfer drag and drop API instead. The only exception is getCurrentSession(), since there's currently no way to check for a drag in progress using standard DOM methods or properties.
- -

Method overview

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void endDragSession( in PRBool aDoneDrag ) ;
void dragMoved(in long aX, in long aY); Native code only!
void fireDragEventAtSource(in unsigned long aMsg); Obsoleto Gecko 43
void fireDragEventAtSource(in mozilla::EventMessage aEventMessage); Native code only!
nsIDragSession getCurrentSession( ) ;
void invokeDragSession( in nsIDOMNode aDOMNode, in nsISupportsArray aTransferables, in nsIScriptableRegion aRegion, in unsigned long aActionType );
void invokeDragSessionWithImage(in nsIDOMNode aDOMNode, in nsISupportsArray aTransferableArray, in nsIScriptableRegion aRegion, in unsigned long aActionType, in nsIDOMNode aImage, in long aImageX, in long aImageY, in nsIDOMDragEvent aDragEvent, in nsIDOMDataTransfer aDataTransfer);
void invokeDragSessionWithSelection(in nsISelection aSelection, in nsISupportsArray aTransferableArray, in unsigned long aActionType, in nsIDOMDragEvent aDragEvent, in nsIDOMDataTransfer aDataTransfer);
void startDragSession( ) ;
void suppress();
void unsuppress();
- -

Constants

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstantValueDescription
DRAGDROP_ACTION_NONE0No action.
DRAGDROP_ACTION_COPY1The drag and drop operation should copy the object.
DRAGDROP_ACTION_MOVE2The drag and drop operation should move the object.
DRAGDROP_ACTION_LINK4The drag and drop operation should link the object.
DRAGDROP_ACTION_UNINITIALIZED64The action is not initialized.
- -

Methods

- -

Native code only!

dragMoved

- -

- -

Programmatically changes the drag position of the drag session. This is used on Mac and Windows to update the position of a popup being used as a drag image during the drag operation. It's not used on GTK, which handles the drag popup itself.

- -
[noscript] void dragMoved(
-  in long aX,
-  in long aY
-);
-
- -
Parameters
- -
-
aX
-
The X coordinate to which to move the popup being dragged.
-
aY
-
The Y coordinate to which to move the popup being dragged.
-
- -

endDragSession()

- -

Tells the Drag Service to end a drag session. This is called when an external drag occurs.

- -
void endDragSession(
-  in PRBool aDoneDrag
-);
-
- -
Parameters
- -
-
aDoneDrag
-
If aDoneDrag is true, the drag has finished, otherwise the drag has just left the window.
-
- -

fireDragEventAtSource()

- -

Obsoleto Gecko 43 (Firefox 43 / Thunderbird 43 / SeaMonkey 2.40)
Esta funcionalidad es obsoleta. Aunque puede aún funcionar en algunos navegadores, se desalienta su uso ya que puede ser removida en cualquier momento. Evite usarla.

- -

Fire a drag event at the source of the drag. This was changed in Gecko 43, see the following section.

- -
void fireDragEventAtSource(
-  in unsigned long aMsg
-); Obsoleto Gecko 43
-
- -
Parameters
- -
-
aMsg
-
One of the NS_DRAGDROP_* contants which was defined in widget/BasicEvents.h
-
- -

- -

Fire a drag event at the fource of the drag. This is available only from native code since Gecko 43.

- -
[noscript] void fireDragEventAtSource(
-  in mozilla::EventMessage aEventMessage
-);
-
- -
Parameters
- -
-
aEventMessage
-
One of the event messages between eDragDropEventFirst and eDragDropEventLast defined in widget/EventMessageList.h
-
- -

getCurrentSession()

- -

Returns the current nsIDragSession.

- -
nsIDragSession getCurrentSession();
-
- -
Parameters
- -

None.

- -
Return value
- -

The current drag session, or null if no drag is in progress.

- -

invokeDragSession()

- -

Starts a modal drag session with an array of transferables

- -
void invokeDragSession(
-  in nsIDOMNode aDOMNode,
-  in nsISupportsArray aTransferables,
-  in nsIScriptableRegion aRegion,
-  in unsigned long aActionType
-);
-
- -
Parameters
- -
-
aDOMNode
-
The source node on which the drag gesture was started.
-
aTransferables
-
An array of transferables to be dragged.
-
aRegion
-
A region containing rectangles for cursor feedback, in window coordinates.
-
aActionType
-
Specified which of copy/move/link are allowed.
-
- -

invokeDragSessionWithImage()

- -

Starts a modal drag session using an image.

- -

A custom image may be specified using the aImage argument. If this is supplied, the aImageX and aImageY arguments specify the offset within the image where the cursor would be positioned. That is, when the image is drawn, it is offset up and left the amount so that the cursor appears at that location within the image. If aImage is null, aImageX and aImageY are not used and the image is instead determined from the source node aDOMNode, and the offset calculated so that the initial location for the image appears in the same screen position as where the element is located. The node must be within a document.

- -

Currently, supported images are all DOM nodes. If this is an HTML <image> or <canvas> element, the drag image is taken from the image data. If the element is in a document, it will be rendered at its displayed size, otherwise, it will be rendered at its real size. For other types of elements, the element is rendered into an offscreen buffer in the same manner as it is currently displayed. The document selection is hidden while drawing. The aDragEvent must be supplied as the current screen coordinates of the event are needed to calculate the image location.

- -
void invokeDragSessionWithImage(
-  in nsIDOMNode aDOMNode,
-  in nsISupportsArray aTransferableArray,
-  in nsIScriptableRegion aRegion,
-  in unsigned long aActionType,
-  in nsIDOMNode aImage,
-  in long aImageX,
-  in long aImageY,
-  in nsIDOMDragEvent aDragEvent,
-  in nsIDOMDataTransfer aDataTransfer
-);
-
- -
Parameters
- -
-
aDOMNode
-
The source node on which the drag gesture was started.
-
aTransferables
-
An array of transferables to be dragged.
-
aRegion
-
A region containing rectangles for cursor feedback, in window coordinates.
-
aActionType
-
Specified which of copy/move/link are allowed.
-
aImage
-
Image object.
-
aImageX
-
X position of image.
-
aImageY
-
Y position of image.
-
aDragEvent
-
The drag gesture event that initiated the drag.
-
aDataTransfer
-
A data transfer object that is available on the current drag session.
-
- -

invokeDragSessionWithSelection()

- -

Start a modal drag session using the selection as the drag image. The aDragEvent must be supplied as the current screen coordinates of the event are needed to calculate the image location.

- -
void invokeDragSessionWithSelection(
-  in nsISelection aSelection,
-  in nsISupportsArray aTransferableArray,
-  in unsigned long aActionType,
-  in nsIDOMDragEvent aDragEvent,
-  in nsIDOMDataTransfer aDataTransfer
-);
-
- -
Parameters
- -
-
aSelection
-
The selection that is to be dragged.
-
aTransferableArray
-
An array of transferables to be dragged.
-
aActionType
-
Specified which of copy/move/link are allowed
-
aDragEvent
-
The drag gesture event that initiated the drag.
-
aDataTransfer
-
A data transfer object that is available on the current drag session.
-
- -

startDragSession()

- -

Tells the Drag Service to start a drag session. This is called when an external drag occurs

- -
void startDragSession();
-
- -
Parameters
- -

None.

- -

suppress()

- -

Increase dragging suppress level by one. This disables dragging if it is not already disabled.

- -
void suppress();
-
- -
Parameters
- -

None.

- -

unsuppress()

- -

Decrease dragging suppress level by one. If level is zero, dragging is re-enabled.

- -
void unsuppress();
-
- -
Parameters
- -

None.

- -

diff --git a/files/es/nsilocalfile/index.html b/files/es/nsilocalfile/index.html deleted file mode 100644 index 60e4f41990..0000000000 --- a/files/es/nsilocalfile/index.html +++ /dev/null @@ -1,121 +0,0 @@ ---- -title: nsILocalFile -slug: nsILocalFile -tags: - - Interfaces - - 'Interfaces:Frozen' - - 'Interfaces:Scriptable' - - Todas_las_Categorías -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsILocalFile ---- -

 

-

 

-

« XPCOM API Reference

-

Resumen

-

La interfaz nsILocalFile representa un archivo o un directorio en una manera independiente de la plataforma, que es accesible en el sistema de archivos local. Por ello, incrementa nsIFile.

-
 #include "nsILocalFile.h"
-
- [scriptable, uuid=(aa610f20-a889-11d3-8c81-000064657374)]
- interface nsILocalFile : nsIFile { ... };
-
-

Métodos

-
-
- initWithPath
-
- Éste método es usado para establecer el path completo a que hace referencia nsILocalFile.
-
-
-
- initWithNativePath
-
- Éste método es usado para establecer el path completo a que hace referencia nsILocalFile references. [variante con los caractéres especiales locales]
-
-
-
- initWithFile
-
- Éste método se usa para inicializar un nsILocalFile desde otro nsILocalFile.
-
-
-
- openNSPRFileDesc
-
- Éste método se usa para abrir el archivo correspondiente a este nsILocalFile.
-
-
-
- openANSIFileDesc
-
- Éste método se usa para abrir el archivo correspondiente a este nsILocalFile.
-
-
-
- load
-
- Éste método se usa para abrir la librería (enlazada dinámicamente) correspondiente a nsILocalFile.
-
-
-
- appendRelativePath
-
- Éste método es usado para agregar un path relativo al nsILocalFile en curso.
-
-
-
- appendRelativeNativePath
-
- Éste método es usado para agregar un path relativo al nsILocalFile en curso. [variante con los caractéres especiales locales]
-
-
-
- reveal
-
- Éste método solicita que el sistema operativo revele éste nsILocalFile al usuario. No implementado en algunas plataformas.
-
-
-
- launch
-
- Éste método solicita que el sistema operativo intente abrir éste nsILocalFile. No implementado en algunas plataformas.
-
-
-
- getRelativeDescriptor
-
- Éste método devuelve una representación multi-plataforma del path relativo de un archivo.
-
-
-
- setRelativeDescriptor
-
- Éste método inicializa un nsILocalFile a partir de la descripción relativa obtenida de getRelativeDescriptor.
-
-

Atributos

-
-
- followLinks
-
- Éste atributo determina si el nsILocalFile resolverá o no, enlaces simbólicos.
-
-
-
- diskSpaceAvailable
-
- Éste atributo presenta la cantidad de espacio disponible en el disco que contiene el nsILocalFile.
-
-
-
- persistentDescriptor
-
- Éste atributo presenta una cadena, dependiente de la plataforma, representando el nsILocalFile.
-
-

Observaciones

-

Los métodos initWithNativePath y appendRelativeNativePath toman parámetros representados por cadenas que son codificados usando el sistema de códigos local. Esto significa que no puedes usar nombres con caracteres fuera de la página de códigos de Windows, aunque Windows 2000 y posteriores no tengan problema en manejarlos. Por tanto, nunca uses funciones a no ser que estés absolutamente seguro de que el path que pasan es siempre ASCII. Ver nsIFile para más información sobre los códigos de caractéres locales.

-

launch y reveal están sólo implementados en Windows, MacOSX, BeOS y OS/2 (a fecha 2007/03/14, FX3.0, Gecko 1.9). En sistemas *nix-ish tales como Linux, BSDs, Solaris o similares ninguna de estas dos funciones harán nada más que devolver inmediatamente un valor NS_ERROR_FAILURE. Ver error 391980 para más información.
- Para trabajar con esos sistemas también, querrás considerar el atajo de Firefox Download Manager. Para un poco de "inspiración" ver: http://mxr.mozilla.org/seamonkey/sou...t/downloads.js

-

Historia

-

Este interfaz fue congelado por Mozilla 1.0. Ver error 129279 para más detalles.

-
-  
-

diff --git a/files/es/nsisimpleenumerator/index.html b/files/es/nsisimpleenumerator/index.html deleted file mode 100644 index b90d96f4eb..0000000000 --- a/files/es/nsisimpleenumerator/index.html +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: nsISimpleEnumerator -slug: nsISimpleEnumerator -tags: - - Interfaces - - 'Interfaces:Frozen' - - 'Interfaces:Scriptable' - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsISimpleEnumerator ---- -

Resumen

- -

El interfaz nsISimpleEnumerator representa una enumeración de los objetos XPCOM y ofrece métodos para acceder a los elementos secuencialmente.

- -
#include "nsISimpleEnumerator.h"
-
-[scriptable, uuid=(D1899240-F9D2-11D2-BDD6-000064657374)]
-interface nsISimpleEnumerator : nsISupports { ... };
-
- -

Métodos

- -
-
hasMoreElements
-
Este método devuelve true si hay más objetos XPCOM en la lista.
-
- -
-
getNext
-
Este método devuelve el siguiente objeto XPCOM en la lista.
-
- -

Observaciones

- -

Aunque hasMoreElements puede ser llamado independientemente de getNext, getNext debe estar precedido de una llamada a hasMoreElements.

- -

No hay manera de "reset" una lista nsISimpleEnumerator.

- -

Historia

- -

Esta interfaz ha sido congelada por Mozilla 0.9.6. Ver bug 154047para más detalles.

- -

Ejemplo

- -

Code example of nsISimpleEnumerator

diff --git a/files/es/nsisupports/addref/index.html b/files/es/nsisupports/addref/index.html deleted file mode 100644 index 75587c76b6..0000000000 --- a/files/es/nsisupports/addref/index.html +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: AddRef -slug: nsISupports/AddRef -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsISupports/AddRef ---- -

 

-

 

-

« XPCOM API Reference

-

Resumen

-

El método AddRef notifica al objeto, que un puntero de la interfaz ha sido duplicado.

-
[noscript, notxpcom] nsrefcnt AddRef();
-
-

Valores devueltos

-

Devuelve un entero que es generalmente ignorado.

-

Observaciones

-

Cada llamada a AddRef debe compensarse con una llamada a Release cuando no se necesita más el puntero.

-

 

-
-  
-

diff --git a/files/es/nsisupports/index.html b/files/es/nsisupports/index.html deleted file mode 100644 index ab928f9c60..0000000000 --- a/files/es/nsisupports/index.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: nsISupports -slug: nsISupports -tags: - - Interfaces - - 'Interfaces:Frozen' - - Todas_las_Categorías -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsISupports ---- -

 

-

 

-

« XPCOM API Reference

-

Resumen

-

Todas las interfaz XPCOM heredan la interfaz de nsISupports.

-
#include "nsISupports.h"
-
-[scriptable, uuid=(0000000-0000-0000-c000-000000000046)]
-interface nsISupports { ... };
-
-

Métodos

-
-
- AddRef
-
- El método AddRef notifica al objeto, que un puntero de la interfaz ha sido duplicado.
-
-
-
- QueryInterface
-
- El método QueryInterface facilita el tipo de runtime.
-
-
-
- Release
-
- El método Release notifica al objeto, que un puntero de la interfaz ha sido destruido y que cualquier recurso que el objeto tenga en nombre del cliente, puede ser liberado.
-
-

Observación

-

Las descripciones de métodos anteriores han sido tomadas de Essential COM by Don Box. El objeto de estas descripciones es resaltar el hecho de que Addref y Release no corresponden necesariamente a incrementar y decrementar, respectivamente, un contador, aunque así sea como se han implementado generalmente.

-

En los sistemas Win32, nsISupports es compatible a nivel ABI con la interfaz IUnknown de Microsoft COM.

-
-  
-

diff --git a/files/es/nsisupports/queryinterface/index.html b/files/es/nsisupports/queryinterface/index.html deleted file mode 100644 index ab988699f9..0000000000 --- a/files/es/nsisupports/queryinterface/index.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: QueryInterface -slug: nsISupports/QueryInterface -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsISupports#QueryInterface() ---- -

 

-

 

-

« XPCOM API Reference

-

Resumen

-

El método QueryInterface facilita el tipo de runtime.

-
void QueryInterface(
-  in nsIIDRef aIID,
-  [iid_is(aIID), retval] out nsQIResult aResult
-);
-
-

Parámetros

-
-
- aIID
-
- [in] El IID del interfaz requerido.
-
-
-
- aResult
-
- [out] El puntero resultante.
-
-

Valores devueltos

-

Este método no devuelve valor alguno.

-

Excepciones

-
-
- NS_ERROR_NO_INTERFACE
-
- La interfaz interrogada no está disponible.
-
-

Observaciones

-

El puntero de interfaz, aResult, devuelto por QueryInterface debe ser liberado mediante una llamada a Release cuando ya no se necesite. QueryInterface es un operador simétrico, transitivo, y reflexivo.

-

 

-
-  
-

diff --git a/files/es/nsisupports/release/index.html b/files/es/nsisupports/release/index.html deleted file mode 100644 index 48b76f3584..0000000000 --- a/files/es/nsisupports/release/index.html +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: Release -slug: nsISupports/Release -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsISupports/Release ---- -

 

-

 

-

« XPCOM API Reference

-

Resumen

-

El método Release notifica al objeto que, un puntero del interfaz ha sido destruido y que cualquier recurso que el objeto mantenga en nombre del cliente, puede ser liberado.

-
[noscript, notxpcom] nsrefcnt Release();
-
-

Valores devueltos

-

Devuelve un entero que es generalmente ignorado.

-

 

-
-  
-

diff --git a/files/es/nsiuri/index.html b/files/es/nsiuri/index.html deleted file mode 100644 index 051f6399c0..0000000000 --- a/files/es/nsiuri/index.html +++ /dev/null @@ -1,441 +0,0 @@ ---- -title: nsIURI -slug: nsIURI -tags: - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIURI ---- -

nsIURI es un interfaz para un identificador de recursos uniforme con soporte de internacionalización, que ofrece atributos que permiten la configuración y filtrado de componentes de URI y métodos para le ejecución de operaciones básicas en URI´s. Para detalles vea los siguientes RFC´s:

- -

-

-

- -

Las subclases de nsIURI, tales como nsIURL , imponen estructura adicional sobre la URI.

- -

nsIURI se define en netwerk/base/public/nsIURI.idl . Es encriptable y se ha mantenido congelada desde Mozilla 1.0.0 .

- -

Heredada de: nsISupports

- -

Para crear un objeto nsIURI, debes usar el método newURI() de  nsIIOService, como este:

- -
- - -
    -
  1. function makeURI(aURL, aOriginCharset, aBaseURI) {  
  2. -
  3.   var ioService = Components.classes["@mozilla.org/network/io-service;1"]  
  4. -
  5.                             .getService(Components.interfaces.nsIIOService);  
  6. -
  7.   return ioService.newURI(aURL, aOriginCharset, aBaseURI);  
  8. -
  9. -
-
- -

Nota: Esta es la única forma correcta de crear un objeto nsIURI.

- -

Componentes de un URI

- -
Edit section
- -

uri-diagram.png

- -

Vista rápida del método

- -
Edit section
- - - - - - - - - - - - - - - - -
nsIURI clone()
boolean equals(in nsIURI other);
boolean schemeIs(in string scheme);
AUTF8String resolve(in AUTF8String relativePath);
- -

Atributos

- -
Edit section
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AtributoTipoDescripción
specnsACString (UTF-8) -

Retorna un cadena en representación de la URI. Al usar spec causa que la nueva spec sea evaluada usando las reglas que tiene actualmente el el esquema de la URI. Si la cadena no puede ser analizada como una URI, aparece un NS_ERROR_MALFORMED_URI. (error de URI malformada).

- -
Advertencia: Ya que la comprobación de la cadena se ha hecho usando el esquema de la URI actual, el uso de spec para un URI con un esquema diferente producirá resultados incorrectos. Por lo tanto, únicamente las implementaciones del manejador de protocolo debieran hacer esto.
- -

Si la URI almacena información de la newURI() de la interfaz de nsIIOService que la creó, una cadena además a la analizada, el comportamiento de esta información cuando el atributo spec es establecido, no está definido.

-
prePathsololectura nsACString (UTF-8) -

La prePath retorna la cadena antes de la ruta(como en "scheme://user:password@host:port"). Esto es muy útil para sesiones de autenticación o administración.

- -
Nota: Algunos caracteres pueden ser códigos de escape.
-
schemensACString (US-ASCII) -

La scheme es el protocolo al cual esta URI se refiere. El scheme está restringido a los caractéres de la US-ASCII por RFC2396.

- -
Advertencia: Al usar esto fuera de una implementación de manejador de protocolo es muy desalentador, una vez establecido generalmente lleva a obtener resultados impredecibles.
-
userPassnsACString (UTF-8) -

El "username:password" (o nombre de usuario sólo si el valor no contiene una':').

- -
Nota: Algunos caracteres pueden ser códigos de escape.
-
usernamensACString (UTF-8) -

El nombre de usuario opcional, suponiendo que la preHost consiste en "username:password".

- -
Nota: Algunos caracteres pueden ser códigos de escape.
-
passwordnsACString (UTF-8) -

La contraseña opcional, suponiendo que la preHost consiste en "usuario:contraseña".

- -
Nota: Algunos caracteres pueden ser códigos de escape.
-
hostPortnsACString (UTF-8) -

El "servidor:puerto" parte de la URI (o simplemente el servidor, si el puerto es -1).

- -
Nota: Los caracteres no son códigos de escape.
-
hostnsACString (UTF-8) -

El servidor es el nombre de dominio de Internet a los que se refiere este URI. Podría ser una dirección literal IPv4 (o IPv6). Si está soportada, podría ser un nombre de dominio no-ASCII internacionalizado.

- -
Nota: Los caracteres no son códigos de escape.
-
portPRInt32 -

El puerto de URI's. Un valor de puerto de -1 corresponde al puerto por defecto del protocolo (por ejemplo, -1 implica el puerto 80 para HTTP URIs).

-
pathnsACString (UTF-8) -

La ruta, que típicamente incluye al menos una de las principales '/' (aunque también puede estar vacío, dependiendo del protocolo).

- -
Nota: Algunos caracteres pueden ser códigos de escape.
-
asciiSpecreadonly nsACString (US-ASCII) -

La especificación URI con una codificación compatible con ASCII. La porción de host sigue la especificación del proyecto de IDNA. Otras partes son URL con caracteres de escape por las normas de RFC2396. El resultado es estrictamente ASCII.

-
asciiHostreadonly nsACString (US-ASCII) -

El servidor URI con una codificación compatible con ASCII. Sigue la especificación del proyecto de IDNA para convertir los nombres de dominio internacionalizados (UTF-8) a ASCII para la compatibilidad con la infraestructura de Internet existente.

-
originCharsetreadonly nsACString -

El juego de caracteres del documento del que se originó este URI. Un valor vacío implica UTF-8.

- -

Si este valor es algo distinto de UTF-8 a continuación, los componentes de URI (por ejemplo, spec, prePath, nombre de usuario, etc) son totalmente URL de escape. De lo contrario, los componentes de URI pueden contener caracteres sin escape multibyte UTF-8 .

-
- -

 

- -


-

-
netwerk/base/public/nsIURI.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.0.0
-

- -

Código de interfaz

- -
[scriptable, uuid(07a22cc0-0ce5-11d3-9331-00104ba0fd40)]
-interface nsIURI : nsISupports
-{
-  attribute AUTF8String spec;
-  readonly attribute AUTF8String prePath;
-  attribute ACString scheme;
-  attribute AUTF8String userPass;
-  attribute AUTF8String username;
-  attribute AUTF8String password;
-  attribute AUTF8String hostPort;
-  attribute AUTF8String host;
-  attribute long port;
-  attribute AUTF8String path;
-
-  boolean equals(in nsIURI other);
-  boolean schemeIs(in string scheme);
-  nsIURI clone();
-  AUTF8String resolve(in AUTF8String relativePath);
-
-  readonly attribute ACString asciiSpec;
-  readonly attribute ACString asciiHost;
-  readonly attribute ACString originCharset;
-};
-
- -

Esencialmente URI son nombres estructurados para... cualquier cosa. Este interfaz ofrece métodos para crear y cuestionar los componentes básicos de un URI. Las sub clases, incluida ofrecen mayor estructura a los URI. Esta interfaz sigue las especificaciones Berners-Lee en RFC 2396, donde se definen las URI básicas como:

- -
ftp://user:password@example.org:12345/path/leaf
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ComponenteValore en el ejemplo
schemeftp
userPassuser:password
hostexample.org
port12345
path/path/leaf
prePathftp://user:password@example.org:12345
- -

Métodos

- -

equals()

- -
boolean equals (in nsIURI other);
-
- -

Compara la URI actual con otra, retornando true si las dos representan el mismo sitio.

- -

Nota: Es más que un comparación de cadena, ya que dos cadenas URI distintas pueden representar el mismo sitio. P.e.: Esta comparación devolverá true  http://example.com:80/ == http://example.com/

- -

schemeIs()

- -
boolean schemeIs(in string scheme);
-
- -

Una optimización para hacer chequeos de esquema sin pedir los usuarios de nsIURI a GetScheme, con esto se ahorran asignaciones y liberaciones extra de memoria. Retorna True  si el esquema coincide (se ingnoran mayúsculas o minúsculas)

- -

clone()

- -
nsIURI clone();
-
- -

Clona la URI, retornando un nuevo objeto nsIURI

- -

Para algunos protocolos, esto es más que una simple optimización. Por ejemplo, en MacOS X, la especificación de una dirección de fichero no implica necesariamente la identificación exclusiva de un archivo, ya que dos volúmenes podrían tener el mismo nombre.

- -

resolve()

- -
AUTF8String resolve(in AUTF8String relativePath);
-
- -

Este método resuelve una cadena uri relativa usando esta URI como base.

- -

Nota: Algunas implementaciones puede que no tengan el concepto de URI relativo.

- -

Attributes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AttributeTypeDescription
specnsACString (UTF-8)Devuelve una representación de cadena de la URI. Configura las spec causada con la nueva spec para ser analizada, inicializa la URI.
prePathreadonly nsACString (UTF-8)El prePath (eg. scheme://user:password@host:port) retorna la cadena de caracteres que se encuentran antes del path. Esto es útil para la autenticación o para el manejo de sesiones. -

Some characters may be escaped.

-
schemensACString (US-ASCII)El Esquema es el protocolo al cual la URI se refiere. El Esquema está restringido al conjunto de caracteres US-ASCII definido por el RFC2396.
userPassnsACString (UTF-8)La combinación nombre_de_usuario:contraseña (username:password) (o nombre_de_usuario sólo si el valor no contiene ':'). -

Some characters may be escaped.

-
usernamensACString (UTF-8)The optional username, assuming the preHost consists of username:password. -

Some characters may be escaped.

-
passwordnsACString (UTF-8)The optional password, assuming the preHost consists of username:password. -

Some characters may be escaped.

-
hostPortnsACString (UTF-8)La combinación host:puerto (host:port) (o simplemente el host, si el puerto es -1). -

Characters are NOT escaped.

-
hostnsACString (UTF-8)El host es el nombre de dominio de internet al cual se refiere la URI. Puede ser una dirección IPv4 o IPv6. Si es soportado puede ser un nombre de dominio internacionalizado no-ASCII. -

Characters are NOT escaped.

-
portPRInt32Si el valor del puerto es -1 esto corresponde con el puerto por defecto para el protocolo (ejm. -1 implica que se usa el puerto 80 para las URI http).
pathnsACString (UTF-8)The path, typically including at least a leading '/' (but may also be empty, depending on the protocol). -

Some characters may be escaped.

-
asciiSpecreadonly nsACString (US-ASCII)The URI spec with an ASCII compatible encoding. Host portion follows the IDNA draft spec. Other parts are URL-escaped per the rules of RFC2396. The result is strictly ASCII.
asciiHostreadonly nsACString (US-ASCII)The URI host with an ASCII compatible encoding. Follows the IDNA draft spec for converting internationalized domain names (UTF-8) to ASCII for compatibility with existing internet infrasture.
originCharsetreadonly nsACStringThe charset of the document from which this URI originated. An empty value implies UTF-8. -

If this value is something other than UTF-8 then the URI components (e.g., spec, prePath, username, etc.) will all be fully URL-escaped. Otherwise, the URI components may contain unescaped multibyte UTF-8 characters.

-
diff --git a/files/es/nsiwebprogress/index.html b/files/es/nsiwebprogress/index.html deleted file mode 100644 index 3b9fbb8ff0..0000000000 --- a/files/es/nsiwebprogress/index.html +++ /dev/null @@ -1,233 +0,0 @@ ---- -title: nsIWebProgress -slug: nsIWebProgress -tags: - - Interfaces - - 'Interfaces:Frozen' - - 'Interfaces:Scriptable' - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIWebProgress ---- -

« XPCOM API Reference

- -

Resumen

- -

El interfaz nsIWebProgress es usado para agregar o quitar instancias nsIWebProgressListener para observar la carga de peticiones asíncronas (usualmente en el contexto DOM).

- -

Las instancias nsIWebProgress pueden ser dispuestas en una configuración padre-hijo, correspondiente a la configuración padre-hijo de sus respectivas ventanas DOM. Sin embargo, en algunos casos, una instancia nsIWebProgress puede no estar asociada a una ventana DOM. La relación padre-hijo de las instancias nsIWebProgress no está hecha explícitamente para este intefaz, pero la relación puede existir en algunas implementaciones.

- -

Una instancia nsIWebProgressListener recibe notificaciones la instancia nsIWebProgress a la cual se ha agregado y puede tambien recibir notificaciones de cualquier instancia nsIWebProgress que sea hija de la instancia nsIWebProgress.

- -

-
uriloader/base/nsIWebProgress.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.8.0
-

- -

Código del interfaz

- -
[scriptable, uuid(570F39D0-EFD0-11d3-B093-00A024FFC08C)]
-interface nsIWebProgress : nsISupports
-{
-  const unsigned long NOTIFY_STATE_REQUEST  = 0x00000001;
-  const unsigned long NOTIFY_STATE_DOCUMENT = 0x00000002;
-  const unsigned long NOTIFY_STATE_NETWORK  = 0x00000004;
-  const unsigned long NOTIFY_STATE_WINDOW   = 0x00000008;
-  const unsigned long NOTIFY_STATE_ALL      = 0x0000000f;
-
-  const unsigned long NOTIFY_PROGRESS       = 0x00000010;
-  const unsigned long NOTIFY_STATUS         = 0x00000020;
-  const unsigned long NOTIFY_SECURITY       = 0x00000040;
-  const unsigned long NOTIFY_LOCATION       = 0x00000080;
-
-  const unsigned long NOTIFY_ALL            = 0x000000ff;
-
-  void addProgressListener(in nsIWebProgressListener aListener,
-                           in unsigned long aNotifyMask);
-
-  void removeProgressListener(in nsIWebProgressListener aListener);
-
-  readonly attribute nsIDOMWindow DOMWindow;
-
-  readonly attribute PRBool isLoadingDocument;
-};
-
- -

Constantes

- -

Estas lineas indican los estados de transición a observar, correspondientes a nsIWebProgressListener::onStateChange.

- -
-
NOTIFY_STATE_REQUEST - -
-
Sólo recibe el evento onStateChange si el parámetro aStateFlags incluye nsIWebProgressListener::STATE_IS_REQUEST.
-
-
-
- -
-
NOTIFY_STATE_DOCUMENT - -
-
Sólo recibe el evento onStateChange si el parámetro aStateFlags incluye nsIWebProgressListener::STATE_IS_DOCUMENT.
-
-
-
- -
-
NOTIFY_STATE_NETWORK - -
-
Sólo recibe el evento onStateChange si el parámetro aStateFlags incluye nsIWebProgressListener::STATE_IS_NETWORK.
-
-
-
- -
-
NOTIFY_STATE_WINDOW - -
-
Sólo recibe el evento onStateChange si el parámetro aStateFlags incluye nsIWebProgressListener::STATE_IS_WINDOW.
-
-
-
- -
-
NOTIFY_STATE_ALL - -
-
Recibe todos los eventos onStateChange.
-
-
-
- -

Estas lineas indican los otros eventos a observar, correspondientes a los otros métodos definidos en nsIWebProgressListener.

- -
-
NOTIFY_PROGRESS - -
-
Recibe eventos onProgressChange.
-
-
-
- -
-
NOTIFY_STATUS - -
-
Recibe eventos onStatusChange.
-
-
-
- -
-
NOTIFY_SECURITY - -
-
Recibe eventos onSecurityChange.
-
-
-
- -
-
NOTIFY_LOCATION - -
-
Recibe eventos onLocationChange.
-
-
-
- -

Métodos

- -

addProgressListener

- -
void addProgressListener(in nsIWebProgressListener aListener,
-                         in unsigned long aNotifyMask);
-
- -

Registra un escucha que recibirá los eventos del progreso web.

- -
Parámetros
- -

aListener

- -
-
El interfaz de escucha que será llamado cuando ocurra un evento de progreso.
-
Este objeto debe también implementar nsISupportsWeakReference.
-
- -

aNotifyMask

- -
-
Los tipos de notificaciones a recibir.
-
- -
Excepciones
- -

NS_ERROR_INVALID_ARG

- -
-
Indica que aListener fue bien null o que no soporta referencias débiles.
-
- -

NS_ERROR_FAILURE

- -
-
Indica que aListener ya fué registrado.
-
- -

removeProgressListener

- -
 void removeProgressListener(in nsIWebProgressListener aListener);
-
-
- -
Parámetros
- -

aListener

- -
-
El interfaz e escucha anteriormente registrado con un llamado a addProgressListener.
-
- -
Excepciones
- -

NS_ERROR_FAILURE

- -
-
Indica que aListener no fué registrado.
-
- -

Atributos

- -

DOMWindow

- -
atributo de sólo lectura nsIDOMWindow DOMWindow;
-
- -

La ventana DOM asociada con esta instancia nsIWebProgress.

- -
Exceptions
- -

NS_ERROR_FAILURE

- -
-
Indica que no hay un ventana DOM asociada.
-
- -

isLoadingDocument

- -
readonly attribute PRBool isLoadingDocument;
-
- -

Indica si un documento está siendo cargado o no en el contexto de esta instancia nsIWebProgress.

diff --git a/files/es/nsizipwriter/index.html b/files/es/nsizipwriter/index.html deleted file mode 100644 index 9c59481e6a..0000000000 --- a/files/es/nsizipwriter/index.html +++ /dev/null @@ -1,517 +0,0 @@ ---- -title: nsIZipWriter -slug: NsIZipWriter -translation_of: Mozilla/Tech/XPCOM/Reference/Interface/nsIZipWriter ---- -

The nsIZipWriter interface provides an easy way for scripts to archive data in the Zip file format. Operations on the archive can be performed one by one, or queued for later execution.

- -

Once all the operations you wish to perform are added to the queue, a call to processQueue() will perform the operations in the order they were added to the queue. Operations performed on the queue throw any errors that occur out to the observer.

- -

Attempting to perform a synchronous operation on the interface while the background queue is in progress will throw an NS_ERROR_IN_PROGRESS exception.

- -

File and directory names should use slashes ("/") as separators and should not begin with a slash.

- -

Nota: Although it isn't necessary to add directory entries in order to add file entries within them, some Zip utilities may have problems with that, so it may be best to add the directory entries explicitly first.

- -


-

-
modules/libjar/zipwriter/public/nsIZipWriter.idlScriptable
- - -Please add a summary to this article. - - -
-  -Last changed in Gecko 1.9 (Firefox 3)
-

- -

Inherits from: nsISupports

- -

Implemented by: @mozilla.org/zipwriter;1. To create an instance, use:

- -
var zipWriter = Components.classes["@mozilla.org/zipwriter;1"]
-                          .createInstance(Components.interfaces.nsIZipWriter);
-
- -

Method overview

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void addDirectoryEntry(in AUTF8String aZipEntry, in PRTime aModTime, in boolean aQueue);
void addEntryChannel(in AUTF8SZtring aZipEntry, in PRTime aModTime, in PRInt32 aCompression, in nsIChannel aChannel, in boolean aQueue)
void addEntryFile(in AUTF8SZtring aZipEntry, in PRInt32 aCompression, in nsIFile aFile, in boolean aQueue)
void addEntryStream(in AUTF8SZtring aZipEntry, in PRTime aModTime, in PRInt32 aCompression, in nsIInputStream aStream, in boolean aQueue)
void close()
nsIZipEntry getEntry(in AUTF8String aZipEntry);
boolean hasEntry(in AUTF8String aZipEntry);
void open(in nsIFile aFile, in PRInt32 aIoFlags);
void processQueue(in nsIRequestObserver aObserver, in nsISupports aContext)
void removeEntry(in AUTF8String aZipEntry, in boolean aQueue)
- -

Attributes

- - - - - - - - - - - - - - - - - - - - - - - - -
AttributeTypeDescription
commentACStringGets or sets the comment associated with the currently open Zip file. Throws NS_ERROR_NOT_INITIALIZED if there isn't an open Zip file.
inQueuebooleantrue if operations are being performed in the background queue, or false if background operations are not in progress. Read-only.
filensIFileThe Zip file being written to. Read-only.
- -

Constants

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConstantValueDescription
COMPRESSION_NONE0Don't compress the file.
COMPRESSION_FASTEST1Use the fastest compression method when adding the file to the archive.
COMPRESSION_DEFAULT6Use the default compression method when adding the file to the archive.
COMPRESSION_BEST9Use the best compression method when adding the file to the archive.
- -

Methods

- -

addDirectoryEntry()

- -

Adds a new directory entry to the Zip file.

- -

Nota: Although it isn't necessary to add directory entries in order to add file entries within them, some Zip utilities may have problems with that, so it may be best to add the directory entries explicitly first.

- -
 void addEntryDirectory(
-   in AUTF8String aZipEntry,
-   in PRTime aModTime,
-   in boolean aQueue
- );
-
- -
Parameters
- -
-
aZipEntry
-
The path of the directory entry to add to the Zip file.
-
aModTime
-
The modification time of the entry in microseconds.
-
aQueue
-
If true, the operation is queued for later execution. If false, the operation is performed immediately.
-
- -
Exceptions thrown
- -
-
NS_ERROR_NOT_INITIALIZED
-
No Zip file is open.
-
NS_ERROR_FILE_ALREADY_EXISTS
-
The specified path already exists in the Zip file.
-
NS_ERROR_IN_PROGRESS
-
The Zip writer is already performing another operation.
-
- -

addEntryChannel()

- -

Adds data from a channel to the Zip file.

- -
 void addEntryChannel(
-   in AUTF8String aZipEntry,
-   in PRTime aModTime,
-   in PRInt32 aCompression,
-   in nsIChannel aChannel,
-   in boolean aQueue
- );
-
- -
Parameters
- -
-
aZipEntry
-
The path of the file entry to add to the Zip file. This is the path it will be located at within the Zip file.
-
- -

Nota: You must use forward slashes in the path.

- -
-
aModTime
-
The modification time of the entry in microseconds.
-
aCompression
-
One of the compression constants, indicating the compression method to use.
-
aChannel
-
The channel from which to get the data.
-
aQueue
-
If true, the operation is queued for later execution. If false, the operation is performed immediately.
-
- -
Exceptions thrown
- -
-
NS_ERROR_NOT_INITIALIZED
-
No Zip file is open.
-
NS_ERROR_FILE_ALREADY_EXISTS
-
The specified path already exists in the Zip file.
-
NS_ERROR_IN_PROGRESS
-
The Zip writer is already performing another operation.
-
- -

addEntryFile()

- -

Adds a new file or directory to the Zip file. If the specified file is a directory, this call is equivalent to:

- -
 addDirectoryEntry(aZipEntry, aFile.lastModifiedTime, aQueue);
-
- -
 void addEntryFile(
-   in AUTF8String aZipEntry,
-   in PRInt32 aCompression,
-   in nsIFile aFile,
-   in boolean aQueue
- );
-
- -
Parameters
- -
-
aZipEntry
-
The path of the file entry to add to the Zip file. This is the path it will be located at within the Zip file.
-
- -

Nota: You must use forward slashes in the path.

- -
-
aCompression
-
One of the compression constants, indicating the compression method to use.
-
aFile
-
The file from which to get the data and modification time.
-
aQueue
-
If true, the operation is queued for later execution. If false, the operation is performed immediately.
-
- -
Exceptions thrown
- -
-
NS_ERROR_NOT_INITIALIZED
-
No Zip file is open.
-
NS_ERROR_FILE_ALREADY_EXISTS
-
The specified path already exists in the Zip file.
-
NS_ERROR_IN_PROGRESS
-
The Zip writer is already performing another operation.
-
- -

addEntryStream()

- -

Adds data from an input stream to the Zip file.

- -
 void addEntryStream(
-   in AUTF8String aZipEntry,
-   in PRTime aModTime,
-   in PRInt32 aCompression,
-   in nsIInputStream aStream,
-   in boolean aQueue
- );
-
- -
Parameters
- -
-
aZipEntry
-
The path of the file entry to add to the Zip file. This is the path it will be located at within the Zip file.
-
- -

Nota: You must use forward slashes in the path.

- -
-
aModTime
-
The modification time of the entry in microseconds.
-
aCompression
-
One of the compression constants, indicating the compression method to use.
-
aStream
-
The input stream from which to get the data.
-
aQueue
-
If true, the operation is queued for later execution. If false, the operation is performed immediately.
-
- -
Exceptions thrown
- -
-
NS_ERROR_NOT_INITIALIZED
-
No Zip file is open.
-
NS_ERROR_FILE_ALREADY_EXISTS
-
The specified path already exists in the Zip file.
-
NS_ERROR_IN_PROGRESS
-
The Zip writer is already performing another operation.
-
- -

close()

- -

Closes the Zip file.

- -
 void close();
-
- -
Parameters
- -

None.

- -
Exceptions thrown
- -
-
NS_ERROR_NOT_INITIALIZED
-
No Zip file is open.
-
NS_ERROR_IN_PROGRESS
-
The Zip writer is already performing another operation.
-
- -

Other errors may be thrown if a failure to complete the Zip file occurs.

- -

getEntry()

- -

Returns a specified entry in the current Zip file.

- -
 nsIZipEntry getEntry(
-   in AUTF8String aZipEntry,
- );
-
- -
Parameters
- -
-
aZipEntry
-
The path of the file entry to get.
-
- -
Return value
- -

An nsIZipEntry object describing the specified entry, or null if there is no such entry.

- -

hasEntry()

- -

Determines whether or not a specific entry exists in the Zip file.

- -
 boolean hasEntry(
-   in AUTF8String aZipEntry,
- );
-
- -
Parameters
- -
-
aZipEntry
-
The path of the file entry to check for.
-
- -
Return value
- -

true if there is an entry with the given path in the Zip file, otherwise returns false.

- -

open()

- -

Opens the specified Zip file.

- -
 void open(
-   in nsIFile aFile,
-   in PRInt32 aIoFlags
- );
-
- -
Parameters
- -
-
aFile
-
The Zip file to open.
-
aIoFlags
-
The open flags for the Zip file, from prio.h.
-
- -
Exceptions thrown
- -
-
NS_ERROR_ALREADY_INITIALIZED
-
A Zip file is already open.
-
NS_ERROR_INVALID_ARG
-
The aFile parameter is null.
-
NS_ERROR_FILE_NOT_FOUND
-
The specified file was not found and the flags didn't permit creating it. Or the directory for the file does not exist.
-
NS_ERROR_FILE_CORRUPTED
-
The specified file is not a recognizable Zip file.
-
- -

Other errors may be thrown upon failing to open the file, such as if the file is corrupt or in an unsupported format.

- -

processQueue()

- -

Processes all queued items until the entire queue has been processed or an error occurs. The observer is notified when the first operation begins and when the last operation completes.

- -

Any failures are passed to the observer.

- -

The Zip writer will be busy until the queue is complete or an error halts processing of the queue early. In the event of an early failure, the remaining items stay in the queue; calling processQueue() again will continue where operations left off.

- -
 void processQueue(
-   in nsIRequestObserver aObserver,
-   in nsISupports aContext
- );
-
- -
Parameters
- -
-
aObserver
-
The observer to receive notifications from the queue.
-
aContext
-
The context to pass to the observer.
-
- -
Exceptions thrown
- -
-
NS_ERROR_NOT_INITIALIZED
-
No Zip file is open.
-
NS_ERROR_IN_PROGRESS
-
The queue is already in progress.
-
- -

removeEntry()

- -

Removes an entry from the Zip file.

- -
 void removeEntry(
-   in AUTF8String aZipEntry,
-   in boolean aQueue
- );
-
- -
Parameters
- -
-
aZipEntry
-
The path of the entry to remove from the Zip file.
-
aQueue
-
true to place the remove operation into the queue, or false to process it at once.
-
- -
Exceptions thrown
- -
-
NS_ERROR_NOT_INITIALIZED
-
No Zip file is open.
-
NS_ERROR_IN_PROGRESS
-
The queue is already in progress.
-
NS_ERROR_FILE_NOT_FOUND
-
No entry with the given path exists.
-
- -

Other errors may occur if updating the Zip file fails.

- -

Examples

- -

Adding a comment to a Zip file

- -
var zipWriter = Components.Constructor("@mozilla.org/zipwriter;1", "nsIZipWriter");
-var zipW = new zipWriter();
-
-zipW.open(myZipFilePath, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE);
-zipW.comment = "This is a comment.";
-zipW.close();
-
- -

PR_RDWR and friends are constants that are not in any interface (see Bug 433295), so for the code above to work you need something like:

- -
const PR_RDONLY      = 0x01;
-const PR_WRONLY      = 0x02;
-const PR_RDWR        = 0x04;
-const PR_CREATE_FILE = 0x08;
-const PR_APPEND      = 0x10;
-const PR_TRUNCATE    = 0x20;
-const PR_SYNC        = 0x40;
-const PR_EXCL        = 0x80;
-
- -

See PR_Open Documentation or File I/O Snippets for details.

- -

Adding a file to a Zip archive

- -

This code synchronously adds the file specified by the nsIFile theFile to the Zip archive.

- -
var zipWriter = Components.Constructor("@mozilla.org/zipwriter;1", "nsIZipWriter");
-var zipW = new zipWriter();
-
-zipW.open(myZipFilePath, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE);
-zipW.addEntryFile("Path/For/This/File/In/Zip Archive", Components.interfaces.nsIZipWriter.COMPRESSION_DEFAULT, theFile, false);
-zipW.close();
-
- -

The argument nyZipFilePath isn't a path but rather it has to be an nsIFile instance specifying the location of the new zip file. The file need not exist, but the directory that contains it (nsIFile.parent) must exist.

- -

Other examples

- -

For other examples, take a look at the unit tests in the source tree:

- - - -

See also

- - diff --git a/files/es/nspr/index.html b/files/es/nspr/index.html deleted file mode 100644 index 51a4540a75..0000000000 --- a/files/es/nspr/index.html +++ /dev/null @@ -1,58 +0,0 @@ ---- -title: NSPR -slug: NSPR -translation_of: Mozilla/Projects/NSPR ---- -

Netscape Portable Runtime (NSPR) provides a platform-neutral API for system level and libc-like functions. The API is used in the Mozilla clients, many of Red Hat's and Sun's server applications, and other software offerings.

-

Getting NSPR

-

NSPR is available in various source and binary packages, depending on your platform:

- - - - - - - - -
-

Documentation

-
-
- 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...

-
-

Community

-
    -
  • View Mozilla forums...
  • -
-

{{DiscussionList("dev-tech-nspr", "mozilla.dev.tech.nspr")}}

- - -
-

 

diff --git a/files/es/nss/index.html b/files/es/nss/index.html deleted file mode 100644 index b8e53866da..0000000000 --- a/files/es/nss/index.html +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Servicios de Seguridad de Red -slug: NSS -tags: - - JSS - - NSS - - NeedsMigration - - Proyecto MDC -translation_of: Mozilla/Projects/NSS ---- -

Los Servicios de Seguridad de Red  (Network Security Services (NSS)) son un conjunto de bibliotecas designadas para ayudar al desarrollo en múltiples plataformas de aplicaciones para servidor y cliente con seguridad habilitada. Las aplicaciones desarrolladas con NSS pueden admitir SSL v2 y v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, certificados X.509 v3, y otros estándares de seguridad. Para obtener información detallada sobre los estándares admitidos, visita Descripción general sobre_NSS. Para revisar la lista de preguntas frecuentes, visita FAQ.

-

NSS se encuentra disponible bajo licencia pública de Mozilla, la licencia pública general GNU y licencia pública general GNU Lesser. Para obtener información sobre cómo descargar versiones de NSS en formato .tar, visita Fuente de descarga de PKI.

-

 

- -

Notas de las versiones

 


Documentación

La documentación de Mozilla NSS puede encontrarse en . Toda esta información debe convertirse a formato wiki.

Existe documentación adicional disponible sobre los siguientes temas (sólo en wiki) en:

Control de calidad/evaluación :

La información sobre planificación de NSS se puede encontrar en wiki.mozilla.org, incluyendo:

Comunidad

  • Para ver los foros de seguridad de Mozilla:

{{ DiscussionList("dev-security", "mozilla.dev.security") }}

  • Para ver los foros de criptografía de Mozilla, visita:

{{ DiscussionList("dev-tech-crypto", "mozilla.dev.tech.crypto") }}

Temas relacionados

Seguridad
-

 

-

{{ languages( { "en": "en/NSS", "fr": "fr/NSS", "ja": "ja/NSS" } ) }}

diff --git a/files/es/nss/nss_sources_building_testing/index.html b/files/es/nss/nss_sources_building_testing/index.html deleted file mode 100644 index de3a9ed645..0000000000 --- a/files/es/nss/nss_sources_building_testing/index.html +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: NSS sources building testing -slug: NSS/NSS_Sources_Building_Testing -translation_of: Mozilla/Projects/NSS/NSS_Sources_Building_Testing ---- -

Obtener el código fuente de los Servicios de seguridad de red (NSS) , cómo construirlo y cómo ejecutar su conjunto de pruebas.

- -

Obtener el código fuente y una descripción rápida

- - - -

La forma más fácil es descargar archivos de versiones NSS del servidor de descargas de Mozilla . Encuentre el directorio que contiene el número de versión más alto. Debido a que NSS depende de la biblioteca base NSPR , debe descargar el archivo que combina NSS y NSPR.

- -

Si es un desarrollador de software y tiene la intención de aportar mejoras a NSS, debe obtener la última instantánea de desarrollo de NSS utilizando mercurial / hg (una herramienta de administración de control de fuente distribuida ). Para comenzar, el acceso anónimo de solo lectura es suficiente. Cree un nuevo directorio en su computadora que usará como su área de trabajo local y ejecute los siguientes comandos.

- -
hg clone https://hg.mozilla.org/projects/nspr
-hg clone https://hg.mozilla.org/projects/nss
- - - -

Después de completar los comandos anteriores, debe tener dos directorios locales, llamados nspr y nss, uno al lado del otro.

- -

(Información histórica: el código fuente NSPR y NSS se ha reorganizado recientemente en una nueva estructura de directorios. En versiones anteriores, todos los archivos estaban ubicados en una jerarquía de directorios que comenzaba con el prefijo "mozilla". La biblioteca base de NSPR estaba ubicada en el directorio mozilla / nsprpub. Los subdirectorios dbm, security / dbm, security / coreconf, security / nss fueron parte de las fuentes de NSS).

- -

El directorio nss contiene los siguientes subdirectorios importantes:

- - - -

Es importante mencionar la diferencia entre el código NSS interno y las interfaces exportadas. El software que quisiera usar la biblioteca NSS debe usar solo las interfaces exportadas. Estos se pueden encontrar mirando los archivos con la extensión de archivo .def, dentro de la jerarquía de directorios nss / lib. Cualquier función C que no esté contenida en archivos .def es estrictamente para uso privado dentro de NSS, y las aplicaciones y herramientas de prueba no pueden llamarlas. Para todas las funciones que se enumeran en los archivos .def, NSS promete que la interfaz de funciones binarias (ABI) se mantendrá estable.

- -

Compilando NSS

- - - -

El proceso de compilación está dirigido por Makefiles desde las ventanas de la consola. Debido a los requisitos de portabilidad multiplataforma, la compilación puede comportarse de manera diferente a lo que está acostumbrado. En particular, NSS no usa scripts de configuración. Puede establecer variables de entorno para definir qué variación de compilación desea.

- -

En un sistema similar a Linux / Unix, use el shell bash. En un sistema Windows, debe descargar el paquete de compilación de Windows proporcionado por el proyecto Mozilla.org, que le proporcionará un entorno de línea de comandos similar, suficiente para los propósitos de compilación.

- -

Asegúrese de que las fuentes NSPR y NSS estén una al lado de la otra, debajo del mismo directorio principal. Si descargó un archivo fuente nss-with-nspr publicado recientemente del directorio de lanzamiento de NSS en el servidor FTP (versión 3.15 o posterior), ya estará organizado de esa manera.

- -

Para comenzar el proceso de construcción, use "cd nss" y ejecute "make nss_build_all". De forma predeterminada, esto generará una compilación en modo de depuración y para una arquitectura de 32 bits. Puede configurar la variable de entorno BUILD_OPT = 1 para obtener una compilación optimizada, y / o la variable USE_64 = 1 para obtener una compilación de 64 bits.

- -

Una vez realizada la compilación, puede encontrar el resultado de la compilación debajo del directorio dist / *. OBJ, donde * será un nombre derivado dinámicamente de la arquitectura de su sistema. Los archivos de encabezado exportados para aplicaciones NSS se pueden encontrar en el directorio "incluir", los archivos de biblioteca en el directorio "lib" y las herramientas en el directorio "bin". Para ejecutar las herramientas, debe configurar el entorno del sistema para utilizar las bibliotecas de su compilación desde el directorio "lib", por ejemplo, utilizando la variable de entorno LD_LIBRARY_PATH.

- -

La siguiente página puede tener información adicional de interés .

- -

Ejecutando el conjunto de pruebas NSS

- - - -

Esta es una parte importante del trabajo de desarrollo, para garantizar que sus cambios no introduzcan regresiones. Al agregar nuevas funciones a NSS, también se deben agregar pruebas para la nueva función.

- -

Debe compilar NSS antes de ejecutar las pruebas. Después de que la compilación en su computadora haya tenido éxito, antes de que pueda ejecutar las pruebas en su computadora, puede ser necesario establecer variables de entorno adicionales. Las pruebas NSS iniciarán las herramientas del servidor TCP / IP en su computadora, y para que eso funcione, el conjunto de pruebas NSS necesita saber qué nombre de host pueden usar las herramientas del cliente para conectarse a las herramientas del servidor. En las máquinas que están configuradas con un nombre de host que se ha registrado en el DNS de su red, esto debería funcionar automáticamente. En otros entornos (por ejemplo, en redes domésticas), puede establecer las variables de entorno HOST y DOMSUF (para sufijo de dominio) para indicarle al conjunto de NSS qué nombre de host usar. Como prueba, debe ser posible utilizar con éxito el comando "ping $ HOST. $ DOMSUF" en su computadora (ping informa que recibe respuestas). En muchas computadoras, las variables HOST = localhost DOMSUF = localdomain funcionan. En caso de que haya creado NSS en 64 bits, debe establecer la variable de entorno USE_64 en 1 para ejecutar las pruebas.

- -

Después de haber configurado las variables de entorno requeridas, use "cd nss / tests" e inicie las pruebas usando "./all.sh". Las pruebas tardarán un tiempo en completarse; en una computadora lenta puede tomar un par de horas.

- -

Una vez que se haya completado el conjunto de pruebas, se imprimirá un resumen que muestra el número de fallas. Puede encontrar los resultados del conjunto de pruebas en el directorio nss /../ tests_results (es decir, el directorio de resultados termina al lado del directorio nss, no dentro de él). Cada ejecución del conjunto de pruebas creará un nuevo subdirectorio; debes limpiarlos de vez en cuando. Dentro del directorio encontrará el archivo de texto output.log, que contiene un informe detallado de todas las pruebas que se están ejecutando. Para conocer los detalles de las fallas de la prueba, busque en el archivo la prueba en mayúscula FALLIDA.

- -

Si lo desea, es posible ejecutar solo subconjuntos de las pruebas. Lea el contenido del archivo all.sh para aprender cómo funciona.

diff --git a/files/es/nuevas_tablas_de_compatibilidad_beta/index.html b/files/es/nuevas_tablas_de_compatibilidad_beta/index.html deleted file mode 100644 index 8f12f0ca94..0000000000 --- a/files/es/nuevas_tablas_de_compatibilidad_beta/index.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Nuevas tablas de compatibilidad (beta) -slug: Nuevas_tablas_de_compatibilidad_beta -translation_of: Archive/MDN/New_Compatibility_Tables_Beta ---- -

Quizás estás aquí porque seguiste el enlace de notificación beta desde unas de nuestras nuevas tablas de compatibilidad. (¿No? ¿Quiéres ver las tablas nuevas? Hágase probador beta.)

- -

Gracias por ayudarnos a probarlas. Son parte de un proyecto mucho más grande. Estamos moviendo todos nuestros datos de compatibilidad del navegador a JSON estructurado.

- -

Las nuevas tablas aparecerán en las páginas a medida que los datos sean convertidos al nuevo formato.

- -

Editando

- -

Nuestros datos de compatibilidad se han movido a archivos JSON dentro del repositorio browser-compat-data de GitHub.

- -

Para contribuir con datos de compatibilidad, ahora puede enviar un pull request o crear una issue en el repositorio.

- -

¿Cómo ayudar?

- -

Si encuentras algún problema con los datos, por favor cree una issue en el repositorio de GitHub.

- -

Si hay algo mal con la apariencia o funcionalidad de las tablas, por favor haga click en el boton "report an erroren el menu desplegable que se encuentra sobre la tabla.

- -

Si tiene un momento, le agradeceríamos que rellenase nuestra encuesta.

diff --git a/files/es/persona/crypto/index.html b/files/es/persona/crypto/index.html deleted file mode 100644 index aeed5638b6..0000000000 --- a/files/es/persona/crypto/index.html +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: Cifrado -slug: Persona/Crypto -tags: - - Persona -translation_of: Archive/Mozilla/Persona/Crypto ---- -

El sistema de identidad de Persona usa el cifrado de llave pública para asegurar la confianza y seguridad en el proceso de autenticación.

-

¿Por qué funciona el sistema descrito en Información general del Proveedor de Identidad?

-

Cadena de confianza

-

El navegador del usuario almacena localmente pequeñas piezas de información para cada una de las identidades del usuario: una dirección de correo electrónico, un par de llaves, y un certificado del IdP (Identity Provider) asociado.

-

El par de llaves del usuario es un par criptográfico DSA o RSA estándar que es generado y guardado localmente en el navegador del usuario. El certificado es firmado por el IdP asociado a la identidad del usuario elegida. Estos certificados están diseñados para no durar mas de 24 horas y pueden ser proporcionados de nuevo cuando caducan, siempre y cuando el usuario tenga una sesión activa con el IdP. Los pares de llaves nunca son compartidos entre computadoras ni entre navegadores.

-

-

Como se describe en la descripción general del protocolo, el navegador del usuario es capaz de generar y firmar aserciones de identidad efímeras especifícas del sitio. Cuando se toman juntas estas aserciones con la información en un certificado del usuario, el sitio es capaz de verificar la identidad de ese usuario. La autenticidad de los certificados debe ser verificada obteniendo la llave pública del IdP, la cual es publicada en un documento disponible sobre SSL.

-

De esa manera, la seguridad de Persona depende de que la llave privada del usuario y la llave privada del dominio se mantengan en secreto y de que la conexión SSL al IdP sea segura. Si se rompe la seguridad en cualquiera de estos puntos, la seguridad de la identidad del usuario puede verse comprometida.

-

Generando pares de llaves IdP

-

Para los IdPs (Identity Providers ), el paquete jwcrypto proporciona una herramienta de linea de comandos, generate-keypair, la cual genera las llaves adecuadas para el uso con Persona. Debido a que las llaves generadas ya están serializadas en JSON, la llave pública es adecuada para su inclusión directa en el campo de llaves públicas del archivo /.well-known/browserid del IdP.

-

Certificado y formato de aserción

-

Por favor, consulte la especificación de BrowserID para información más detallada, pero a grandes rasgos, tanto los certificados como las aserciones son cadenas con tres partes: un encabezado, un cuerpo y una firma criptográfica. Cada parte está codificada separadamente en base64url, y concatenada delimitando cada parte con caracteres ".". El cuerpo no está cifrado, es texto plano que puede leerse si lo decodificas en base64url.

-

-

Los certificados y las aserciones son empaquetados juntos en una "aserción respaldada" cuando el usuario intenta autenticarse en un sitio. El paquete es creado concatenando un certificado y una aserción, separados por un "~".

diff --git a/files/es/persona/iniciar_persona/index.html b/files/es/persona/iniciar_persona/index.html deleted file mode 100644 index eb00a1b3e4..0000000000 --- a/files/es/persona/iniciar_persona/index.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Iniciando el proyecto Persona -slug: Persona/Iniciar_Persona -translation_of: Archive/Mozilla/Persona/Bootstrapping_Persona ---- -

Para poder ser realmente exitoso y descentralizado, Persona necesita el apoyo de tres grupos diferentes:

- -

Esto da lugar a un problema del tipo "el huevo o la gallina": ninguno de estos grupos se beneficiaría significativamente a menos que hubiese una masa considerable de usuarios pero un sistema distribuido no puede conseguir una masa considerable de usuarios sin el apoyo de los grupos mencionados anteriormente.

-

Para resolver este problema, https://login.persona.org alberga tres recursos:

-
    -
  1. Un Proveedor de Identidad de respaldo, que intercede por aquellos usuarios cuyos proveedores de email no soportan Persona
  2. -
  3. Una implementación JavaScript multinavegador (cross-browser en inglés) de las APIs navigator.id para los navegadores sin soporte nativo.
  4. -
  5. Una API de verificación albergada para facilitar que los sitios verifiquen las credenciales de usuario.
  6. -
-

Todo esto en conjunto permite que los sitios web ofrezcan Persona a los usuarios sin importar el navegador y sin que los proveedores de email tengan que involucrarse.

-

Estos servicios son temporales y el sistema Persona está diseñado de manera tal que los mismos puedan ser desplazados transparente y automáticamente a medida que se agreguen medios de soporte nativo a los navegadores y proveedores de email. Así, serán menos relevantes a medida que Persona crece; y posiblemente sean todos removidos con el correr del tiempo. En ese momento, https://login.persona.org no figurará en lo absoluto en el sistema Persona.

-

Proveedor de identidad de respaldo

-

Cualquier dominio puede ser un Proveedor de Identidad siempre y cuando las partes involucradas estén dispuestas a confiar en los certificados emitidos por ese dominio. Esperamos que los proveedores de email actúen como IdPs para las direcciones que administran haciendo que la experiencia de usuario de Persona sea fluida para esos usuarios. Permite que los usuarios se beneficien de su relación existente con el proveedor de email cuando se autentiquen (acrediten) en otros sitios.

-

No obstante, los proveedores de email no serán IdPs hasta que haya una demanda significativa por parte de sus usuarios. Mientras tanto, Mozilla opera un IdP de respaldo en https://login.persona.org. Este respaldo permite que los usuarios inicien sesión en sitios con sus direcciones de email existentes sin importar si el proveedor soporta Persona. El IdP de respaldo certificará las direcciones de email de cualquier dominio empleando su propio flujo de autenticación y contraseña, en la medida que el usuario sea capaz de probar el control de una dirección al hacer clic en un enlace de un email de verificación.

-

Una vez que el proveedor de email soporte Persona nativamente, sus usuarios comenzarán a usuarlo transparentemente en lugar del IdP de respaldo.

-

Librería de APIs multinavegador

-

Para que Persona funcione, el navegador del usuario debe soportar la API navigator.id. Con el tiempo, los navegadores proveerán un soporte nativo para estas APIs pero, hasta entonces, una implementación multinavegador está disponlible en https://login.persona.org/include.js. Al incluir este archivo, los sitios web ya pueden empezar a usar Persona. Una vez que las implementaciones nativas de las APIs estén disponibles, la librería las pospondrá automáticamente.

-

Servicio de verificación remota

-

En https://login.persona.org Mozilla alberga un servicio de verificación remota que los sitios web pueden utilizar para verificar las aseveraciones de identad enviadas por sus usuarios. Esto facilita que los sitios web soporten Persona porque se hace cargo de analizar la aseveración y de verificar critográficamente las identidades de los usuarios.

-

Una vez que se estabilicen los formatos de dato de Persona, la verificación se hará posiblemente en el servidor de cada sitio. Esta transición es especialmente importante para la privacidad del usuario debido a que hará imposible que el IdP de respaldo rastree a sus usuarios. Aun con la verificación remota, los usuarios de IdPs nativos no pueden ser rastreados por ese IdP.

diff --git a/files/es/persona/internationalization/index.html b/files/es/persona/internationalization/index.html deleted file mode 100644 index 5eb991287f..0000000000 --- a/files/es/persona/internationalization/index.html +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Internacionalización -slug: Persona/Internationalization -tags: - - Persona -translation_of: Archive/Mozilla/Persona/Internationalization ---- -

Qué está localizado en Persona

-

En el futuro, la interfaz de usuario para iniciar sesión en sitios con Persona estará directamente integrada con el navegador, y por lo tanto estrá localizada junto con la localización del propio navegador. Para los navegadores sin soporte integrado, la interfaz de usuario Persona consiste en una serie de diálogos servidos desde login.persona.org. Estos diálogos son traducidos por un equipo de voluntarios de la comunidad, y más 45 configuraciones regionales están actualmente habilitadas en producción.

-

Cómo elije Persona la localización

-

El servicio persona selecciona un lenguaje usando el encabezado Accept-Language enviado junto con las peticiones de tu navegador Web. El algoritmo usado para asignar un encabezado Accept-Language a un idioma es el mismo que usa mozilla.org:

-
    -
  1. Por cada etiqueta de idioma en el encabezado Accept-Language: -
      -
    • comprueba si tenemos una coincidencia exacta para el idioma identificado por la etiqueta idioma
    • -
    • comprueba si tenemos una coincidencia exacta para el idioma identificado por la primera parte de la etiqueta idioma
    • -
    -
  2. -
  3. Si no se puede hacer una coincidencia con la regla(1), recurrimos a en-US. Sin embargo, en o en-US es casi siempre el último encabezado accept-lang enviado por muchos navegadores.
  4. -
-

Por ejemplo, la tabla de abajo muestra los idiomas seleccionados para varios encabezados Accept-Language, si las siguientes configuraciones locales fueran soportadas : en-US, es, es-MX:

- - - - - - - - - - - - - - - - - - - - - - - - - -
Encabezado Accept-LanguageIdioma Seleccionado
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
-

Actualmente no hay manera que un sitio web obligue a un diálogo aparecer en otro idioma. Esto es porque la interfaz de usuario de Persona es lógicamente (y en un futuras implementaciones nativas será asi) parte de la interfaz de usuario del navegador, asi que su idioma debería ser consistente con el idioma seleccionado en el navegador.

-

Cómo puedo ayudar

-

Persona usa Mozilla Verbatim para ayudar a los voluntarios con la creación de sus traducciones . Si quieres ayudarnos, lee iniciando con Verbatim y echa un vistazo al proyecto "BrowserID" de Verbatim.

-

 

diff --git a/files/es/persona/libraries_and_plugins/index.html b/files/es/persona/libraries_and_plugins/index.html deleted file mode 100644 index 47eada5212..0000000000 --- a/files/es/persona/libraries_and_plugins/index.html +++ /dev/null @@ -1,165 +0,0 @@ ---- -title: Bibliotecas y complementos -slug: Persona/Libraries_and_plugins -tags: - - Persona -translation_of: Archive/Mozilla/Persona/Libraries_and_plugins ---- -

Quieres usar Persona en tu sitio web o blog? Implementar Persona desde cero es fácil, pero con los complementos y las bibliotecas listadas aquí puedes ir más rápido!

-

Esta página enumera tres tipos de bibliotecas:

-
    -
  1. Complementos que integran Persona con marcos existentes y sistemas de gestión de contenidos
  2. -
  3. Bibliotecas que son útiles en la construcción de nuevos complementos o integrar Persona en un sitio desde cero
  4. -
  5. Todo lo demás relacionado con Persona, incluyendo bibliotecas para convertir su dominio en un proveedor de identidad Persona
  6. -
-

Esta es una lista mantenida por la comunidad. Si ha creado una biblioteca o un complemento, por favor agreguelo a esta página.

-
- Esta página está en proceso de revisión y algunos complementos pueden estar desactualizados. Revise los complementos antes de usarlos.
-

Complementos

-

Clojure

- -

Cold Fusion

- -

Haskell

- -

Java

- -

JavaScript

- -

Node.js

- -

PHP

- -

Python

- -

Ruby

- -

Erlang

- -

Miscellaneous

- -

¿No ve su lenguage o marco en la lista? LoginRadius, un widget de autenticación, ofrece una integración Persona para una amplia variedad de plataformas.

-

Bibliotecas

-

C

- -

Go

- -

Haskell

- -

.Net

- -

Node.js

- -

Perl

- -

PHP

- -

Python

- -

Ruby

- -

Todo lo demás

-

Perl

- -

Python

- -

Ruby

- -

PHP

- -

Racket

- diff --git a/files/es/plugins/index.html b/files/es/plugins/index.html deleted file mode 100644 index 7f9e31e896..0000000000 --- a/files/es/plugins/index.html +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Plugins -slug: Plugins -tags: - - Plugins - - Todas_las_Categorías -translation_of: Archive/Plugins ---- -

-

Los Plugins (o plug-ins) son pequeños fragmentos de software que interactúan con el navegador para proporcionar algunas funciones que en la mayoria de los casos son muy especificas. Ejemplos tipicos de plugins son los usados para mostrar los distintos formatos gráficos, o para reproducir ficheros multimedia. Los plugins son ligeramente diferentes de las Extensiones, que modifican o se añaden a funcionalidades ya existentes. -


-

- -
-

Documentación

-
Usando el marcado correcto para llamar a los plugins -
Este artículo trata de como llamar a un plugin correctamente usando HTML. Habla sobre el elemento object y el elemento embed, asi como detalles sobre como llamar a aplicaciones Java con HTML en aplicaciones web. -
-
Usar XPInstall para instalar plugins -
XPInstall es un instalador basado en la tecnología JavaScript y que funciona en todas las plataformas en las que los navegadores basados en Mozilla y Netscape basados en Mozilla (como Netscape 7) estan presentes. -
-

Detectando Plugins (en) -

-
"Ya que hay situaciones donde esta claro que hay que usar plugins, la pregunta es, ¿que hacer con aquellos que no tienen el plugin requerido instalado?" -
-

Ver todos... -

-
-

Comunidad

- -
  • View Mozilla forums... -
-

{{ DiscussionList("dev-tech-plugins", "mozilla.dev.tech.plugins") }} -

Ver todo -

-

Herramientas

- -

Ver todo -

-

Temas relacionados

-
Gecko -
-
-

Categorías -

Interwiki Language Links -


-

-
-
-{{ languages( { "de": "de/Plugins", "en": "en/Plugins", "fr": "fr/Plugins", "ja": "ja/Plugins", "ko": "ko/Plugins", "pl": "pl/Wtyczki", "pt": "pt/Plugins" } ) }} diff --git a/files/es/plugins/supporting_private_browsing_in_plugins/index.html b/files/es/plugins/supporting_private_browsing_in_plugins/index.html deleted file mode 100644 index 4448567bb4..0000000000 --- a/files/es/plugins/supporting_private_browsing_in_plugins/index.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Supporting private browsing in plugins -slug: Plugins/Supporting_private_browsing_in_plugins -translation_of: Archive/Plugins/Supporting_private_browsing_in_plugins ---- -

{{ fx_minversion_header(3.5) }}

-

Firefox 3.5 introduced private browsing, a mode in which potentially private information is not recorded in any way.  It also introduced a mechanism by which plugins can determine whether or not private browsing mode is in effect.  Plugins should be updated to monitor the state of private browsing mode and only save private information when private browsing is disabled.

-

Potentially private information may include (but is not necessarily limited to) history information for downloaded data.  For example, if private browsing mode is in effect, video player plugins should not record the URLs of watched videos in their histories.

-

Detecting private browsing mode

-

Plug-ins can detect whether or not private browsing mode is in effect by using the NPN_GetValue() function to check the current value of the NPNVprivateModeBool variable.

diff --git a/files/es/preferencias_del_administrador_de_descargas/index.html b/files/es/preferencias_del_administrador_de_descargas/index.html deleted file mode 100644 index 0805f36b3b..0000000000 --- a/files/es/preferencias_del_administrador_de_descargas/index.html +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: Preferencias del Administrador de Descargas -slug: Preferencias_del_Administrador_de_Descargas -tags: - - páginas_a_traducir -translation_of: Archive/Mozilla/Download_Manager_preferences ---- -

Hay varias preferencias usadas por el Administrador de Descargas. Este artículo ofrece una lista de ellas.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PreferenciaDescripción
browser.download.manager.showAlertOnCompleteUn valor booleano que indica si debe ser mostrada o no una aleerta cuando se completa la descarga.
- Valor por defecto es true.
browser.download.manager.showAlertIntervalEl número mínimo de mili segundos que deben transcurrir entre alertas de descarga completa.
- Valor por defecto: 2000 (2 segundos).
browser.download.manager.retentionIndica por cuanto tiempo deben permanecer las descargas en la cola del Administrador de Descargas, tras haber sido completadas con éxito. 0 indica que la descarga puede ser eliminada una vez completada, 1 indica que las descargas completadas y las abandonadas deben desparecer al cerrar el navegador, 2 indica que las descargas no deben ser nunca eliminadas automáticamente.
- En Firefox por defecto el valor es 2.
- En Thunderbird el valor por defecto es 1;
- Si la preferencia no existe, el valor usado es 0.
browser.download.manager.quitBehaviorIndica lo que debería pasar con las descargas en progreso si se cierra el navegador. 0 indica que la descarga debería ponerse en pausa y reanudarse automáticamente la siguiente vez que se inicie el navegador, 1 indica que la descarga pero que no debería reanudarse automáticamente y 2 indica que la descarga debe ser cancelada al salir.
- El valor por defecto es 0 (reanudar en la próxima apertura).
browser.download.manager.closeWhenDoneUn valor boleano indicando si la ventana del Administrador de Descargas deberá ser cerrada o no cuando se completen las descargas.
- En Thunderbird este valor es por defecto true.
- En Otras aplicaciones el valor por defecto es false.
browser.download.manager.addToRecentDocsUn valor booleano que indica si las nuevas descargas deben ser añadidas o no a la lista de documentos recientes.
- El valor por defecto es true.
browser.download.manager.scanWhenDoneUn valor booleano que indica si hay que realizar o no un análisis anti-virus cuando se ha completado una descarga. En Windows XP SP2 y Windows Vista, este valor también indica si las descargas presentan un aviso de seguridad al abrir los archivos.
- El valor por defecto es true.
browser.helperApps.deleteTempFileOnExitUn valor booleano que indica si hay que borrar o no el archivo temporal usado para la descarga, una vez completada esta.
- En Mac el valor por defecto es false.
- En Otros OS el valor por defecto es true
browser.download.manager.flashCountIndica el número de veces que el interfaz de usuario debe parpadear para llamar la atención del usuario, cuando la descarga está completa.
- El valor por defecto es 2.
browser.download.manager.focusWhenStartingUn valor booleano que indica si poner o no el foco en la ventana del Administrador de Descargas cuando se inicia una descarga.
- En Firefox y Thunderbird el valor por defecto es false.
- En Otras aplicaciones el valor por defecto es true.
browser.download.manager.showWhenStartingUn valor booleano que indica si mostrar o no la ventana de descarga cuando se inicia una descarga.
- El valor por defecto es true.
browser.download.manager.useWindowUn valor booleano indicando si se debe usar la ventana de descargas (true) o presentar el estado en la barra de estado (false) en la ventana del navegador.
- El valor por defecto es true.
browser.download.useDownloadDirUn valor booleano que indica si la preferencia de usuario es guardar automáticamente las descargas en el directorio de descargas. Si este valor es false, el usuario es preguntado sobre qué hacer.
- En Thunderbird el valor por defecto es false.
- En Otras aplicaciones el valor por defecto es true.
browser.download.antivirus.dontcleanUn valor booleano que indica si el software anti-virus debe intentar limpiar un archivo descargado cuando se ha detectado un virus.
- El valor por defecto es false.
browser.download.manager.alertOnEXEOpenUn valor booleano que indica si el iterfaz de usuario debe alertar al usuario acerca de los peligros de abrir (ejecutar) un archivo .EXE. El usuario puede marcar la casilla de "No volver a preguntar" en el interfaz .
- El valor por defecto es true.
- -

Si una preferencia no está marcada cuando el Administrador de Descargas la busca, éste asume el valor por defecto pero no necesariamente añadirá la preferencia. La siguiente tabla, sin embargo, incluye las preferencia que deben ser incluidas en todo producto para que funcione el Administrador.

- - - - - - - - - - - - - - - - -
PreferenciaDescripción
browser.download.folderListIndica el directorio por defecto dónde descargar los archivos. 0 indica el escritorio, 1 indica el directorio por defecto del sistema operativo, 2 indica un directorio escogido (ver: browser.download.dir) folder.
- Firefox y Thunderbird ponen el valor por defecto a 0*.
- * - Firefox en Windows Vista cambia esta preferencia a 1 en la primera ejecución.
browser.download.dirUn directorio local que el usuario puede haber seleccionado para descargar archivos. La migración de las propiedades de otros navegadores pueden alterar este valor. Este directorio se habilita cuando browser.download.folderList es igual a 2.
- -

Ver también

- - diff --git a/files/es/preguntas_frecuentes_sobre_extensiones/index.html b/files/es/preguntas_frecuentes_sobre_extensiones/index.html deleted file mode 100644 index 60e87e9f41..0000000000 --- a/files/es/preguntas_frecuentes_sobre_extensiones/index.html +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Preguntas frecuentes sobre Extensiones -slug: Preguntas_frecuentes_sobre_Extensiones -tags: - - Complementos - - Todas_las_Categorías - - extensiones -translation_of: Archive/Mozilla/Extension_Frequently_Asked_Questions ---- -

Esta es una recopilación de respuestas breves a los problemas más frecuentes del desarrollo de extensiones. Están escritas pensando principalmente en Firefox, pero la mayoría de ellas- si no todas- son fácilmente aplicables a SeaMonkey, Thunderbird o cualesquiera de las demás aplicaciones.

-

Si estás buscando còmo empezar a programar una extensión, prueba con el tutorial Creando una extensión o Primeros pasos (en).

-

Asegúrate de configurar el entorno de desarrollo (en) correctamente antes de empezar.

-

Depuración

-

Deberías configurar el entorno de desarrollo antes de empezar a depurar tu extensión.

-

¿Cómo puedo encontrar los errores de mi código?

-

Después de activar la opción javascript.options.showInConsole (poniéndola a true), podrás leer los errores en la consola de JavaScript. A pesar de su nombre, en esta consola se mostrarán todo tipo de errores (no solo de JavaScript).

-

¿Cómo puedo monitorizar qué está haciendo mi extensión?

-

Puedes usar las funciones alert() o dump() o nsIConsoleService.

-

¿Por qué no se ejecuta correctamente mi script?

-

Si tu script no hace lo que debiera, lo primero que debes hacer es comprobar  la consola de JavaScript (lee más arriba).

-

Un error muy común es intentar acceder al DOM de una ventana antes de que haya terminado de cargarse. Esto ocurre si colocas el código de inicialización fuera de cualquier función (en el programa principal). La solución es usar un listener del evento load que retrase la ejecución de ese código hasta que la ventana haya terminado de cargarse:

-
function exampleBrowserStartup(event)
-{
-  // place your startup code here
-}
-window.addEventListener("load", exampleBrowserStartup, false);
-
-

El acceso al documento de la página web no funciona

-

Para acceder al documento de la página web en uso desde un browser.xul, debes usar content.document, en lugar de simplemente document (que es el documento de la ventana del propio navegador). Lee Trabajando con ventanas en código chrome para más información.

-

Al mismo tiempo, la configuración por defecto de XPCNativeWrapper impide el acceso a objetos definidos por script en la página web y algunas otras cosas.

-

Tengo un error parseando el XML, y el fichero parece correcto

-

Un motivo muy frecuente de errores de parseo (resaltados en <font color="red">rojo</font> con texto como este: <font color="red">-------------^</font> subrayándolos) es la presencia en tu script de un carácter o valor de atributo que tiene un significado especial en XML. Por ejemplo:

-
<button oncommand="window.open('http://example.com/q?param1=value&param2=val2')"/>
-
-

o

-
<script>function lesser(a,b) { return a < b ? a : b; }</script>
-
-

El problema puede resolverse de distintas formas:

-
  1. Escribir el caràcter con la representación apropiada en XML. (Por ejemplo: "&" -> "&amp;", "<" -> "&lt;")
  2. (En caso de tratarse de un nodo de texto, como un script) etiquetar el texto con CDATA:
    <script><![CDATA[
    -   function lesser(a,b) {
    -     return a < b ? a : b;
    -   }
    - ]]></script>
  3. Colocar el script en un fichero separado, e incluirlo usando:
    <script type="application/x-javascript" src="our.js"/>
  4. -
-

Código de ejemplo

-

La forma más sencilla de descubrir cómo codificar lo que necesitas, es buscar una extensión (o una parte del propio Mozilla) que lo haga y mirar su código. (Los fichero XPI y JAR están comprimidos en formato ZIP).

-

También puedes encontrar alguna documentación. Busca en Artículos sobre extensiones en MDC y Página de ejemplos de código en MozillaZine.

-

¿Dónde puedo encontrar más ayuda?

-

Puedes buscar más información en la página de la Comunidad y en la categoría Herramientas.

-

Antes de pedir ayuda, asegúrate de configurar las preferencias de depuración y comprobar la consola de JavaScript. Tampoco olvides hacer al menos una búsqueda por internet antes de preguntar, y... ¡leer esta lista de preguntas!

-

 

- -

{{ languages( { "de": "de/Erweiterungen_FAQ", "en": "en/Extension_Frequently_Asked_Questions", "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", "ru": "ru/FAQ_\u043f\u043e_\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c" } ) }}

diff --git a/files/es/prtime/index.html b/files/es/prtime/index.html deleted file mode 100644 index 1292d61054..0000000000 --- a/files/es/prtime/index.html +++ /dev/null @@ -1,432 +0,0 @@ ---- -title: PRTime -slug: PRTime -translation_of: Mozilla/Projects/NSPR/Reference/PRTime ---- -

-


-

-

Una representación de tiempos absolutos. -

-

Sintaxis

-
 #include <prtime.h>
-
- typedef PRInt64 PRTime;
-
-

Descripción

-

Este tipo es un entero de 64 bits que representa la cantidad de micro segundos desde la época NSPR, medianoche (00:00:00) del 1 de Enero de 1970 UTC (Coordinated Universal Time). El tiempo despues de esa época, tiene un valor positivo y un tiempo anterior tiene valor negativo.

En NSPR usamos más familiarmente, la expresión GMT (Greenwich Mean Time) en lugar de UTC. Aunque UTC y GMT no son exactamente lo mismo en una definición extricta, pueden ser usados generalmente como equivalentes. -

Ya que PRTime es un entero de 64 bits, debes usar las macros LL definidas en <tt>prlong.h</tt> para manipular los valores de PRTime. (Ver Chapter 18 "Long Long (64-bit) Integers)". -

-
Nota: Recuerda que mientras PRTime almacena el valor de micro segundos de la época, las fechas en JavaScript almacenan el valor en segundos de la época.
-


-

-
-
diff --git a/files/es/pruebas_automatizadas_de_mozilla/index.html b/files/es/pruebas_automatizadas_de_mozilla/index.html deleted file mode 100644 index 43215322de..0000000000 --- a/files/es/pruebas_automatizadas_de_mozilla/index.html +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Pruebas automatizadas de Mozilla -slug: Pruebas_automatizadas_de_Mozilla -tags: - - Desarrollando_Mozilla - - NecesitaRevisiónGramatical - - NecesitaRevisiónTécnica - - Pruebas_automatizadas - - Todas_las_Categorías -translation_of: Mozilla/QA/Automated_testing ---- -

 

-

Esta página proporciona un compendio de opciones para pruebas automatizadas disponibles para los desarrolladores de Mozilla.

-

La mayoría de las pruebas automatizadas deberían ejecutarse sobre make check. Cómo añadir una prueba en el momento de compilar describe los pasos requeridos para añadir un programa de pruebas arbitrario al conjunto de tests. Dependiendo de lo que se necesite probar, puede usarse uno de los siguientes frameworks disponibles:

-

Pruebas unitarias

-

xpcshell: make check

-

Con las ayudas para pruebas de xpcshell escribes pruebas unitarias en JavaScript. El código se ejecutará más tarde en xpcshell, que es una consola JS con capacidad para XPConnect. Esto significa que tu código puede acceder a componentes XPCOM, pero no puede (fácilmente) abrir ventanas, probar el chrome de la aplicación, trabajar con el analizador HTML o usar DOM.

-

Hay disponible un servidor HTTP sencillo para su uso desde los tests xpcshell.

-

Pruebas mediante código compilado

-

Las funcionalidades no susceptibles de ser usadas en scripts y otras similares requieren que se escriban pruebas en C++ para ejecutar la funcionalidad. A pesar de las apariencias, existen muy pocas pruebas de esta naturaleza en el repositorio en este momento. Aunque en realidad hay muchas pruebas así (mira los contenidos de {{ Source("xpcom/tests") }} para ver muchos ejemplos), muchas de ellas sólo pueden ejecutarse manualmente, la mayoría devuelven fallos usando mensajes personalizados directamente a la consola (y, por tanto, no se puede revisar automáticamente si se han ejecutado correctamente), y muchas no se compilan correctamente o contienen numerosos errores.

-

A pesar de todo ello, se han escrito algunas pruebas en C++ que pueden ser ejecutadas automáticamente detectando los fallos. El mejor ejemplo actual en términos de facilidad de autoría es {{ Source("xpcom/tests/TestPipe.cpp") }}, que usa una cabecera especial de apoyo a pruebas dirigida a facilitar la escritura de tales pruebas. Mira Compiled-code automated tests para obtener detalles.

-

Escribir una prueba en C++ es más difícil que escribir una prueba en xpcshell, y el código es más difícil de mantener y modificar. ¡No escribas pruebas en código compilado si no es necesario! Deberías usar estas pruebas únicamente cuando la funcionalidad a probar depende de interfaces, métodos o propiedades que no se pueden llamar desde scripts.

-

Pruebas gráficas y/o interactivas

-

Mochitest

-

Mochitest es un framework basado en Mochikit para escribir pruebas. Las pruebas se ejecutan en el navegador, desde un servidor web local (proporcionado por Mochitest). Los scripts de inicio que lo acompañan conceden diversos privilegios a localhost (crea un nuevo perfil en cada ejecución). Como resultado, las pruebas unitarias son libres de solicitar privilegios UniversalXPConnect (acceso a componentes XPCOM), abrir ventanas emergentes, etc. Mochitest es una buena solución si realmente necesitas un navegador completo para probar un problema. Por ejemplo, un test reciente verifica que el envío de formularios funciona en iframes fijados a display:none. Hay una FAQ de Mochitest.

-

Pruebas chrome del navegador

-

Las pruebas chrome del navegador están pensadas para usarse probando el código "chrome" de la interfaz, y otras características susceptibles de ser probadas desde el código JavaScript de chrome. Consisten en pequeños bloques de código JavaScript que se ejecutan en el ámbito de la ventana del navegador.

-

Reftest

-

{{ Source("layout/tools/reftest/README.txt", "Tests visuales del motor de dibujado (reftest)") }}. Cada test consiste normalmente en dos archivos - uno de ellos contiene un conjunto de etiquetas de prueba y el otro normalmente contiene un conjunto de etiquetas de referencia (aunque también es posible usar un PNG estático si se desea). El sistema trabaja comparando el renderizado de los dos archivos.

-

reftest se compila e instala ahora automáticamente cuando ENABLE_TESTS está activado (valor predeterminado) y hay pruebas de ejemplo en {{ Source("layout/reftests") }}.

-

Para ejecutar todos estos tests, escribe:

-

obj-debug/dist/MinefieldDebug.app/Contents/MacOS/firefox -reftest layout/reftests/reftest.list

-

(Se supone que "make lcheck" debe hacer esto por ti, pero actualmente no funciona).

-

Puedes buscar entre los resultados (usando "grep") la cadena "UNEXPECTED" o ejecutar una de las herramientas de procesado de salida de reftest listadas en el README.

-

Puede que quieras usar un perfil separado para ejecutar los tests (creando un perfil llamado "reftests" y añadiendo -P reftests a la línea que invoca la aplicación).

-

Para más información, acude a {{ Source("layout/tools/reftest/README.txt", "") }} y el tutorial sobre cómo crear un test basado en reftest.

-

Crash tests

-

El framework para pruebas de fallos está basado en el framework reftest, por lo que escribir y ejecutar pruebas es muy parecido. Cada test es un solo archivo y la prueba funciona cargando el archivo y ejecutándolo sin detener el programa ni lanzar aserciones (el framework no vigila explícitamente las aserciones en este momento, necesitarás hacer grep para localizarlas en la salida).

-

Para ejecutar todas las pruebas de fallos, escribe

-

obj-debug/dist/MinefieldDebug.app/Contents/MacOS/firefox -reftest testing/crashtest/crashtests.list

-

Otra documentación de referencia

-

Por favor, ignora la página {{ interwiki('wikimo', 'SoftwareTesting:Scratchpad', 'wikimo:SoftwareTesting:Scratchpad') }}, y mira únicamente {{ interwiki('wikimo', 'SoftwareTesting', 'wikimo:SoftwareTesting') }}. La pizarra (Scratchpad) es para trabajos en curso, y casi con toda seguridad estará obsoleta o tendrá documentación errónea.

-

También está {{ interwiki('wikimo', 'SoftwareTesting', 'wikimo:SoftwareTesting') }} y Consejos y trucos para pruebas automatizadas si estás buscando algo que leer.

-

Estos otros esfuerzos están en curso:

- -

Utilidades y frameworks existentes para pruebas

-

(originalmente de {{ interwiki('wikimo', 'SoftwareTesting:Catalog_of_Automated_Tests', 'wikimo:SoftwareTesting:Catalog_of_Automated_Tests') }})

- -

{{ languages( { "en": "en/Mozilla_automated_testing" } ) }}

diff --git a/files/es/qa/bug_writing_guidelines/index.html b/files/es/qa/bug_writing_guidelines/index.html deleted file mode 100644 index 94641c4a09..0000000000 --- a/files/es/qa/bug_writing_guidelines/index.html +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: Guía para escribir un Bug -slug: QA/Bug_writing_guidelines -translation_of: Mozilla/QA/Bug_writing_guidelines ---- -
-

Si necesitas ayuda con algún software de Mozilla (por ejemplo con Firefox, Seamonkey o Thunderbird), usa una de las opciones disponibles de ayuda. ¡No modifiques esta página! Por favor, lee esta página para aprender como reportar un bug usando Bugzilla, que es el sistema de seguimiento de bugs de Mozilla.

- -

Si eres nuevo reportando bugs, puede ser que quieras intentar obtener ayuda de los colaboradores más experimentados. Vaya a la seccion de la comunidad en la página QA para consejos. Si vas a reportar un bug en Firefox, también puedes obtener asitencia en el canal #firefox en irc.mozilla.org.

- -

Ver también Cómo escribir un bug apropiadamente.

-
- -

Los reportes efectivos de bugs son los que más probablemente se resolverán. Estos lineamientos explican como escribir reportes efectivos.

- -

Preliminares

- -
    -
  1. Asegúrate de que tu software está actualizado -
      -
    • Idealmente, haz las pruebas en las versiones en desarrollo para ver si tu bug ya ha sido solucionado. (Léase Firefox Beta, Aurora, o si estás a la última con Nightly).
    • -
    • Si se reproduce de manera ocaciona, pero no después de seguir pasos especificos, debe proveer información adicional que sea util para el bug.
    • -
    • Si no puede reproducir el problema, es probable que no lo reporte, excepto que provea la información acerca de lo ocurrido.
    • -
    -
  2. -
  3. Haz una búsqueda en Bugzilla para ver si tu bug ya ha sido reportado (tutorial).
  4. -
  5. Abre el formulario para Reportar un nuevo bug, el cual te guiará a través de la mayoría del proceso de reporte del bug. -
      -
    • Si tienes varias cuestiones, llena reportes por separado.
    • -
    -
  6. -
- -

Escribir pasos precisos para reproducir

- -

¿Cómo puede el desarrollador reproducir el bug en su propia computadora?

- -

Los pasos para reproducir un bug son la parte más importante de cualquier reporte. Si el desarrollador está listo para reproducir el bug, el bug es muy probable que sea corregido. Si este paso no está tan claro, no será posible saber si el bug ha sido corregido.

- -

Describe tu método de interacción con Firefox  además de la atención de cada paso.

- - - -

Después de tus pasos, describe con precisión los resultados observados y el resultado esperado. Hechos claramente separados (observaciones) de especulaciones.

- - - -

Si el bug parece enorme, podría ser algo inusual en la configuración necesaria de los pasos para reproducir el bug. Ver si puedes reproducir el bug en un nuevo perfil Firefox. Si el bug solo sucede en tu perfil existente, trata de averiguar que ajustes, extensiones, o archivos en tu perfil se necesitan para reproducir el bug.

- - - -

Escribiendo un resumen claro

- -

¿Cómo describirías el bug utilizando aproximadamente 10 palabras? Esta es la primera parte de tu reporte que un triager o desarrollador verá.

- -

Un buen resumen podría rápida y únicamente identificar un reporte. Esto debe exponer el problema, no tu solución sugerida.

- - - - - -

Encontrando el producto y componente correcto

- -

Se te pedirá que categorices tu bug en un "producto" y un  "componente" dentro de ese producto, con el fin de dirigir tu reporte a los desarrolladores correctos.

- -

Si estás usando Firefox, el bug es más probable en "Firefox", "Toolkit", o "Core".

- - - -

En caso de duda, se deben buscar errores similares y ver en qué componente están.

- -

Si ninguno de los componentes parece apropiado, busca un componente "General" en el producto más apropiado.

- -

Bugs específicos

- -

Si reporta de un bloqueo, porfavor incluir el ID de Breakpad o adjunte el seguimiento de la pila e incluya la firma del bloqueo en el resumen del bug.

- -

If you are reporting a memory use or leak bug, please attach the output of about:memory (Firefox 6+). Ideally, find steps to reproduce an increase in what is shown in about:memory (even after clicking the "Minimize memory usage" button at the bottom). If you have trouble finding steps to reproduce, try the Firefox Support page titled High Memory Usage. If you are a C++ developer, more precise tools are available.

- -

If you are reporting a bug involving a specific web page, please try to make a reduced testcase and attach it to the bug report.

- -

If the bug was recently introduced, finding a regression window can help identify the cause of the bug.

- -
-

Original document information

- - -
diff --git a/files/es/qa/confirming_unconfirmed_bugs/index.html b/files/es/qa/confirming_unconfirmed_bugs/index.html deleted file mode 100644 index deb06950b6..0000000000 --- a/files/es/qa/confirming_unconfirmed_bugs/index.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Confirmando bugs sin confirmar -slug: QA/Confirming_unconfirmed_bugs -translation_of: Mozilla/QA/Confirming_unconfirmed_bugs ---- -

Los bugs que son de nuevos reporteros van a estar inicialmente marcados como SIN CONFIRMAR. Para cambiar un bug de SIN CONFIRMAR a NUEVO, necesitaremos tu ayuda para verificar si este es válido. Un bug puede ser movido de SIN CONFIRMAR a NUEVO si:

- -

Nota: No es necesario que puedas reproducir el bug para poder confirmarlo.

-

Para ayudar a confirmar bugs, tienes que hacer lo siguiente:

-

Consigue configurar

- -

Es recomendable usar los links Atrás/Adelante (Back/Forward) para moverse dentro de las listas, en vez de recargarlas cada vez que quieras buscar un nuevo bug.

-

Consigue los privilegios adecuados

-

Para poder confirmar los bugs necesitas el privilegio "Puedes confirmar".

-

Si has sido activo en Bugzilla, lo mas seguro es que tengas este privilegio. Revisa tus Preferencias en Bugzilla. Si tus permisos dicen "Puedes confirmar un bug" ("Can confirm a bug"), entonces estas listo. 

-

Si no tienes este privilegio, entonces puedes solicitarlo siguiendo estos pasos.

-

Confirma lo inconfirmado

-

1. Intenta determinar si el bug se encuentra duplicado. Use este método para buscar en la base de datos. 

-

2. Intente reproducir el bug.Si es posible reproducir el bug, entonces anota el hecho de que puedes reproducirlo, y agrega este comentario al campo de Comentarios Adicionales:

-
1. Tu versión de Mozilla (el título de la barra del navegador)
-2. Tu plataforma
-3. Tu sistema operativo
-
-

Si no puedes reproducir el bug, entonces anota en los comentarios de que intentaste reproducirlo y no pudiste. Si otros también están de acuerdo de que el bug es irreproducible, puedes marcarlo como INVÁLIDO (INVALID) o WORKSFORME, y decirle al que lo reportó que lo reabra si puede proporcionar pasos para reproducirlo en la nueva versión. Un texto ejemplo para los problemas coumunes de bugs puede ser encontrado al fondo de esta página.

-

3. Has que el bug sea fácil de entender.Mira los lineamientos para la Redacción de Bugs para saber el tipo de información que es de ayuda en un bug, incluyendo pasos para la reproducción y una buena descripción.

-

4. Verifica el Producto y el Componente. Si el reporte de bug es clasificado incorrectamente, muévelo hacia el correcto Producto y Componente. Asegúrate de clickear en el botón que dice "reasignar el bug al dueño del componente seleccionado" ("reassign the bug to owner of the selected component.")

-

5. Verifica el resumen del bug. Actualiza el resumen para que sea descriptivo, y contenga las suficientes palabras claves para que las personas que lo busquen lo encuentren.

-

6. Cambia el estatus a NUEVO. Deberías confirmar un bug cuando no está en el Componente general.

-

Opcional, pero de ayuda

- diff --git a/files/es/qa/index.html b/files/es/qa/index.html deleted file mode 100644 index b8b4bf82af..0000000000 --- a/files/es/qa/index.html +++ /dev/null @@ -1,252 +0,0 @@ ---- -title: Control de calidad de Mozilla (QA) -slug: QA -tags: - - Ayudar - - Calidad - - Landing - - Pruebas - - QA -translation_of: Mozilla/QA ---- -
Cómo escribir un buen bug
-Al seguir estos lineamientos, aseguras que tus bugs estén en la cima de la pila de trabajo de los ingenieros de Mozilla y por lo tanto, ayudas a resolverlos.
- -

Hay muchas cosas que puedes hacer para ayudar al proyecto Mozilla en el departamento de Control de Calidad (QA). No todas requieren saber programar, algunas tampoco requieren conocer HTML u otra tecnología Web. Si estás interesado en ayudarnos como testeador o en alguna otra actividad de QA, primero debes leer las siguientes páginas: Mozilla Quality Assurance y Helping with Quality Assurance

- -

Empezando

- - - -

Bugs

- -
-
-

Reportando bugs

- -
-
Bugzilla
-
Todos los proyectosMozilla usan Bugzilla para rastrear bugs. Necesitarás crear una cuenta con Bugzilla en orden para reportar bugs y priorizarlos.
-
Guías de redacción de bugs
-
Entre más efectivamente se reporte un bug, es más probable que un ingeniero puedo arreglarlo. Siguiendo estas guías, ayudas a asegurar que yus bugs sean nototios en el montón de los ingenieros Mozilla, y sean arreglados.
-
La vida de un bug
-
Este tutorial te dara un vistazo del qué sucede en los estados que un bug pasará, así cómo va desde un estado al otro en su ciclo de vida. También explica el significado de banderas (flags)/términos usados en QA.
-
Presentando crash bugs
-
Este documento enlista las guías y consejos acerca de cómo redactar reported de un bug reports que rompe, de una manera que ayude a depurar y arreglar el asunto reportado.
-
-
- -
-

Catalogando bugs

- -
-
Confirmando bugs no confirmados
-
Identifica reportes de bugs útiles y cierra el resto.
-
Catalogando bugs para Firefox
-
Información acerca del proceso completo de clasificación de bugs – desde procesar los bugs entrantes hasta detallar los pasos para recrear bugs.
-
Ocultando bugs duplicados
-
Ayuda a que los bugs sean más faciles de arrgelar al ocultar reportes entrantes acerca de duplicados.
-
Guías generales
-
Qué hacer y qué NO hacer en Bugzilla.
-
-
-
- -
-

Pruebas manuales

- -
-
-
-
Complementode la redacción de caso de prueba
-
Cómo escribir casos de prueba correctos
-
-
- -
-
-
TestRail
-
Casos de prueba del área de QA en Mozilla se encuentran en TestRail. Necesitarás una cuenta LDAP para ingresar y ejecutar casos de prueba. Aprende más en la página wiki de TestRail.
-
-
-
- -
-

Pruebas automatizadas

- -
-
-
-
Automatización de pruebas en Mozilla
-
Documentación acerca de la creación y uso de pruebas automatizadas para el código de Mozilla.
-
Ejecutando pruebas automatizadas
-
-

Esta página enlista los pasos requeridos para ejecutar suites de pruebas automatizadas de Mozilla.

-
-
Desarrollando pruebas
-
Asegurar que cambios fúturos en Mozilla no vayan a dañar cosas que funcionan correctamente.
-
Evitar fallas intermitentes en pruebas
-
Sugerencias para hacer rus pruebas más confiables, de tal manera que ayudan a evitar fallas intermitentes y aleatorias en pruebas.
-
Verificación de pruebas
-
Cuando una colección de cambios agrega una nueva prueba, o modifica una prueba existente, la verificación de pruebas (test verification,TV) de un grupo de pruebas realiza evaluación adicional que ayuda a encontrar fallas intermitentes en ñas pruebas modificadas tan pronto como es posible.
-
Mozharness FAQ
-
Respuestas a preguntas comunes de Mozharness.
-
-
- -
-
-
Robocop
-
Robocop es el sistema de automatización de pruebas usado en Firefox para Android. Aprende sus guías de estilo de codificación. 
-
Marionette
-
Conoce las pruebas de interfaz de usuario con Marionette.
-
Pruebas de plataforma-web
-
Aprende cómo usar el  sistema de pruebas Web en tiempo de ejecución estándar de la industria, multi-navegador, multi-platforma para la organización W3C usedo por Mozilla y otros para asegurar interoperabilidad entre navegadores.
-
Pruebas de Media externa
-
Empieza probando elementos de vídeo en HTML5u sando VideoPuppeteer, una colección de pruebas de Marionette usada probar sitios como YouTube o Netflix.
-
Pruebas de cromo
-
Una prueba de cromo es básicamente una prueba de Mochitest corriendo con privilegios de cromo (código Javascript en la parte front-end del sistema Gecko).
-
-
-
- -
-

Ingeniería de calidad Firefox

- -
-
-
-
Catalogando bugs para Firefox
-
Información acerca del completo proceso de clasificación de bugs – desde el procesamiento de bugs entrantes hasta reducir los pasos para replicar un bug.
-
- -
-
Consejos y trucos
-
Estos consejos y trucos harán tu vida más fácil cuando estés probando.
-
-Descargando ramas de builds o nocturnos - -
-
Cada 24 horas, un build "nocturno" es creado para que los testers de todo el mundo lo descarguen y prueben, reportando como van encontrando los defectos.
-
-
- -
-
-
Opciones de línea de comandos
-
Opciones de la línea de comandos son usadas para especificar varios ajustes de arranque en Firefox.
-
Reportando un problema de desempeño
-
Este artículo te guiará en el reporte de un problema de desempeño usando la extensión Gecko Profiler.
-
Informe de accidentes
-
Firefox incluye un sistema de código abierto para informar accidentes.
-
-
-
- -
-

Firefox para Android

- -
-
-
-
Firefox móvil
-
Firefox para Android es la versión móvil de Firefox con una apariencia nativa de Android.
-
Pruebas de compatibilidad
-
Ayudanos a identificar sitios web que no funcionen bien en Firefox al reportar  las cuestiones especificas que encuentras en tu investigación.
-
-
- -
-
-
Registrando con Android Debug Bridge y Logcat
-
Este artículo proveerá un recorrido en descargar y establecer un ambiente al cual se puede obtener acceso y ver los registros del sistema de Android.
-
Habilitando la Consola de Error
-
Vee el artículo Mozilla Hacks en Depurando Remotamente en Firefox para Android para contenido web. Si necesitas depurar el mismo navegador Firefox  usa adb logcat de Android.
-
-
-
- -
-

Firefox OS

- -
-
-

Pruebas manuales

- -
-
Simulador vs Emulador vs Dispositivo
-
Éstas son las tres opciones cuando viene a conseguir un ambiente Firefox OS en orden para trabajar, o desarrollar para, Firefox OS.
-
Depurando
-
Descubrir las diferentes herramientas a nuestra disposición para depurar tu código Firefox OS.
-
Reportando bugs
-
Este artículo proporciona una guía para archivar bugs acerca del proyecto Firefox OS, incluyendo Gaia y B2G.
-
-
- -
-

Plataforma (Gecko)

- -
-
Pruebas Automatizadas
-
Aprende varios aspectos de pruebas Firefox OS, incluyendo ejecutar diferentes pruebas, automatización, y reporte y seguimiento de resultados.
-
Pruebas de desempeño Gaia
-
Este artículo proporciona información acerca de ejecutar pruebas de desempeño en Gaia, así como el cómo crear nuevas pruebas.
-
Gráfico de soporte de funciones
-
Hay varios builds diferentes de Firefox OS que se pueden descargar o construir tú mísmo, y hay algunas diferencias entre los tipos de características disponibles en cada dispositivo.
-
-
-
- -
-

Web QA

- -
-
-
-
Refinando casos de prueba
-
Mejorando los reportes de defectos al convertir páginas web rotas en simples casos de prueba, los cuales pueden ayudar a desarrolladores entender el defecto y también pueden ser usados para crear pruebas automatizados.
-
Gestionando XFails
-
Uno de las tareas en marcha del departamento de Web QA es gestionar xfails. Este documento expliacrá que son las xfails, y describe los pasos que uno puede tomar para investigar y actualizarlos.
-
-
- -
-
-
Ejecutar pruebas automatizadas
-
¿Así que estás interesadx en contribuir en los proyectos de automatización Mozilla Web QA pero no sabes por dónde empezar? Este documento te ayudará a preparar y ejecutar un conjunto de pruebas locales.
-
-
-
- -
-

Glosario

- -
-
-
Smoke Test
-
-
-
- -

Ver también

- - diff --git a/files/es/qa/organizando_un_testday/index.html b/files/es/qa/organizando_un_testday/index.html deleted file mode 100644 index 25a0d5b818..0000000000 --- a/files/es/qa/organizando_un_testday/index.html +++ /dev/null @@ -1,219 +0,0 @@ ---- -title: Organizando un Testday -slug: QA/Organizando_un_Testday -tags: - - Evento - - Organizando - - QA - - Testdays -translation_of: Mozilla/QA/Organizing_a_Testday ---- -
-

Esta página necesita una revisión técnica del Equipo QA de Mozilla en Q4 2014. (Asignada a Aaron Train.)

-
- -

Por favor recuerda que lo mostrado en este artículo es solo una guía aproxmada. Cuanto mayor esfuerzo pongas en la preparación de un Testday, tendrás mayor probabilidad de éxito. Dá de tu parte, y de la comunidad, suficiente tiempo para preparar el evento. Sobre todo, experimenta y diviertete con tu Testday.

- -

Planeando Tu Evento

- -
Lo siguiente debe ser hecho en no más de una semana antes de tu evento:
- -
 
- -
    -
  1. Una vez tengas un tema en mente, elige un día para agendar tu evento — revisa el calendar on QMO para ver la disonibilidad.
  2. -
  3. Crea un plan de pruebas para definir el criterio de éxito,  establecer un lugar designado para la suscripción de mentores, establece un esquema (ej., past event test-plan)
  4. -
  5. Publica y postea el evento en QMO (de ser necesario, preguntar al staff de QA en  IRC para asistencia) — una valiosa publicación debe contener una solicitud para  inscripción de tutoría y  enlaces a documentación disponible (ej., see past event notice)
  6. -
  7. Difunde tu evento — Seguir nuestras sugerencias de comunicación listadas abajo ayudará a difundir y publicar el evento.
  8. -
  9.  Contar cno mentores para ayudar a facilitar y educar durante todo el evento — reunir información de contacto para asegurar la asistencia al evento.
  10. -
- -

El Día "D"

- -
    -
  1. Asegurate que el tema del canal IRC esté actualizado para señalar a las personas al plan de pruebas.
  2. -
  3. Ser proactivo en dar la bienvenida a las personas y eliminar las barreras para que puedan constribuir - hacer preguntas e interactuar con las personas que se unen al canal.
  4. -
  5. Recomendar suscribirse al dev-quality y mozillians a los asistentes para notificaciones de futuros eventos.
  6. -
  7. Proporcionar una encuesta de opinión a los participantes, clonar o copiar este documento de ejemplo
  8. -
- -

Después del Evento

- -
    -
  1. Proporcionar un post de seguimiento en tus canales de comunicación agradeciendo a quienes asistieron.
  2. -
  3. Planear un futuro evento.
  4. -
- -

Consejos para el Éxito

- -
Lo siguiente es una lista de consejos con lo que esperamos que tu evento sea más exitoso.
- -
 
- - - -

Canales de Comunicación

- -

Lo siguiente es una lista de varios canales de comunicación que deberiamos usar para anuncios. Elige los que veas conveniente.

- -
Listas de Correo
- - - -
Redes Sociales
- - - -
Foros
- - - -
Páginas de Reuniones
- - - -
Otros Sitios Web
- - - -
-
-

Esta página necesita una revisión técnica del equipo Mozilla QA Team in Q4 2014. (Asignado a Aaron Train.)  Este artículo ha sido creado de esta página de QMO: Roles and Tips

-
- -

Moderadores

- -

Lo siguiente son algunos consejos para que los moderadores tengan un Testday exitoso.

- - - -

Colaboradores

- -

Lo siguiente son algunos consejos para que los colaboradores tengan un testday exitoso.

- - - -
-

Información Original de Documento

- - -
- -
-
-

Esta págna necesita una revisión técnica del Equipo Mozilla QA Team en Q4 2014. (Asignado a Aaron Train.) Este artículo ha sido creado de esta página de QMO: Testday Template

-
- -

Págna de Evento QMO

- -

La semana antes al testday necesitamos crear una página de evento QMO.

- - - -

Este es un ejemplo de una exelente página de Evento QMO. Antes de postear asegurate de:

- - - -

Publicación en QMO

- -

El día antes al testday, simplemente crea un post que recuerde a las personas que el testday será mañana.

- - - -

Este es un buen ejemplo de un Recordatorio a un evento QMO. Tu publicación debe ser sindicada en el Planet dentro de 30 minutos a una hora.

- -

Publicación de Resultados QMO

- -

El día después del testday, elavora otra publicación que resalte los resultados.

- - - -

Este es un buen ejemplo de una Publicación de Resultados QMO. Tu publicación debe estar sindicada en el Planet en 30 minutos a una hora.  

- -
-

Información Original de documento

- - -
- -

 

diff --git a/files/es/qa/screening_duplicate_bugs/index.html b/files/es/qa/screening_duplicate_bugs/index.html deleted file mode 100644 index b6480d53cb..0000000000 --- a/files/es/qa/screening_duplicate_bugs/index.html +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Screening duplicate bugs -slug: QA/Screening_duplicate_bugs -translation_of: Mozilla/QA/Screening_duplicate_bugs ---- -
- Por Sean Richardson
-

Si has estado confirmando bugs SIN CONFIRMAR o viendo nuevos bugs, te habrás dado cuenta de que todos los bugs que son enviados por reporteros inexperimentados son bugs DUPLICADOS. A pesar de que menos de la mitad resultan ser duplicados, lo mejor es asumir que cada uno lo es hasta que uno se convenza de lo contrario.

-

Esto es una guía que sirve para ayudarle a identificar la máxima cantidad posible de bugs duplicados que llegan de la manera mas eficiente. Se asume que siente cierta comodidad usando Searching Bugzilla.

-

Este tutorial está escrito como si fueras a sentarte y a buscar bugs DUPLICADOS (DUPs) uno tras otros, pero muchos de estos se aplican, no importa como llegues a un bug potencialmente duplicado. Si quieres intentar identificar los bugs DUPLICADOS uno por uno al final de la lista hay una lista de bugs, que indica los tipos de bugs que usualmente están DUPLICADOS.

-

Mientras que estés revisando los reportes de bugs para ver si hay DUPLICADOS, por favor confirma los bugs SIN CONFIRMAR, agrega o simplifica casos de prueba, mejora los pasos para reproducirlo, mejora el resumen, reporta si lo has reproducido en otra plataforma, y/o si has hecho algo mas que tenga sentido antes de moverte al próximo, si el bug no parece ser un DUPLICADO.

-

Para marcar a un bug como DUPLICADO, tu necesitas el permiso "Puedes editar todos los aspectos de cualquier bug". Si no tienes este permiso, manda un e-mail a Gerv o a bugmaster@mozilla.com, y pregunta si lo pueden agregar a tu cuenta de Bugzilla. Mientras tanto, agrega un comentario a cualquier bug mencionando de que es, o puede ser un duplicado.

-

 

-

Los bugs rápidos y obvios

-
-
- Si no lo has hecho todavía, por favor tomate tu tiempo con la lista de los bugs más frecuentemente reportados de Mozilla y la sección de los Problemas Conocidos en notas de versiones de Firefox.
-
-  
-
- Si el reporte se parece a una regresión reciente, fijate en los bugs recientemente reportados por el equipo de QA team, y en el newsgroup (netscape.public.mozilla.builds) para ver si el problema ya es conocido.
-
-  
-
- También puedes ver más en la lista de bugs de hoy para Firefox y Thunderbird. Mira la página de smoketesting si quieres concentrarte en esta área.
-
- Tendrás menos dicultades escogiendo los bugs duplicados que tu ya cononces que se han reportado. En lugar de ir a través de la lista de bugs en orden, busca en ella bugs cuyos resúmenes parecen familiares, para que puedas tener tantos duplicados como se pueda sin reordenar las busquedas no guiadas.  Los DUPs que tu has reportado o que has encontrado deberían de ser los más fáciles de encontrar, y los más productivos al resolverlos, desde que eres capaz de reconocer y evaluar los identicos rápidamente. 
-
-  
-
- Some ways to narrow down the query based on what you remember: -
    -
  • If you can remember an e-mail address associated with the existing bug, enter it into one of the Email sections and set the appropriate role(s). Do the same if you think you added a comment to the existing bug.
  • -
  • If you can remember roughly when the bug entered the system, choose "[Bug Creation]" in the Where the field(s) field, and set a date range in the dates and to fields.
  • -
  • If you know you've seen some mail from bugzilla-daemon@mozilla.org on the subject of an existing bug that's a candidate for a match lately, enter a number in the Changed in the last [ ] days field.
  • -
-
-
- If you get no matches, your recall may be fallible, so try the search again without the restriction.
-  
-
- If you were able to quickly find the correct bug report to mark a new bug a DUP of, but its summary contains none of the words the reporter of the new bug might have tried to search with, consider adding those words to the summary, or, if you can't do that, including them in a comment suggesting that they be added to the summary -- especially if the bug looks likely to get more duplicates.
-
-

Searching

-
-
- The first field, Status, is normally preset to find NEW, ASSIGNED, and REOPENED bugs. Add UNCONFIRMED (use Ctrl-click in Windows, Command-click in MacOS) to find duplicates among newly-entered bugs too.
-  
-
- To cast a wider net, add RESOLVED and VERIFIED, or deselect everything in the Status field. Do this if you wouldn't otherwise expect a long bug list, or when trying again if you got a relatively short list with no matches. It can be easier to find earlier DUPLICATE bugs (which will be RESOLVED) and follow them to the "real" bug, especially if there are several DUPs already. The existing bug you are hunting for may also have been fixed already.
-  
-
- To exclude obviously extraneous bugs, narrow the search by making a choice under Product. Usually it will be "Core" (for Browser, HTML composition, and text-editing bugs) or "Firefox" or "Thunderbird".
-  
-
- If the proper component for previously reported bug is obvious (as could be expected for, as an example, most "Bookmarks" bugs), choose that component. You can select multiple components at once. Be prepared, though, to retry you query without specifying a component if you don't find a match - not all bugs end up where you'd expect.
-  
-
- The same will apply to the Keywords field. Not all bugs that should be labelled "fonts", for instance, necessarily are.
-  
-
- Beside each of the Summary, Description entry, and URL fields. There is a drop-down that lets you choose the type of matching. Choose among "case-insensitive substring","case-sensitive substring", "all words", "any words", or "regular expression", as appropriate (hints on which work best for several common search scenarios are available in the Text Searching tutorial). Although searching within the Description entry is much slower than any other field, go ahead and use it if it makes sense or the search terms available might not show up in the summary, but try to restrict the search with other fields at the same time if you can.
-  
-
- Boolean Charts are an advanced feature that can let you do searches that are otherwise impossible. You can use any kind of match with almost any field, and set up boolean ands and ors. The first chart always ands with the rest of the query form. As a trivial example, to search for bugs about the tab key and exclude bugs about tables, add [Summary] [Does not contain (case-insensitive) substring] ["table"] after putting "tab" in the Summary field.{C}
-  
-
- If you don't find a match on the bug list generated by your first query, it is usually worth trying at least one or two more queries.
-
-

Matching

-
-
- When the bug list appears, scan it for anything that looks like a possible match. It's useful to open bugs in a new window to preserve the list. At the top of each column, clicking on its name will sort the bugs by that field. You can add other fields to the bug list by clicking on Change columns; for some searches, the Components column can be very useful.
-  
-
- If you find a clear and certain match, add a comment stating which bug the duplicate bug is a DUPLICATE of (if the bug report that matches is itself a DUP, follow the trail of "This bug has been marked as a duplicate of 00000" comments). If you had to read deep into the existing bug or puzzle out the connection, mention the date of the comment that explains the match or describe the connection.
-  
-
- If you are not certain of the match, but it looks probable or even possible, add a comment, but also say how sure you are. Even if you are not completely certain that a new bug is a DUP at all, if you think it probably is or even might be, add a comment saying that.
-  
-
- If the original report is deficient enough that you had to try to reproduce the bug before you could understand what the report was saying, please add enough detail so that the next person reading the bug won't have that problem, and will have an easier time confirming or verifying the match. Even if you don't find a match at all, please do this to make it easier for the next person, who might make the connection immediately given your improved description.
-  
-
- If the existing bug that the DUPLICATE matches to is in a different component, change the Component field to match the existing bug.
-  
-
- Finally, if you are sure that the bug is a DUPLICATE, go ahead and click on the radio button beside Resolve bug, mark it as duplicate of bug # [     ] and enter the bug number of the existing bug. Be sure to check for a typo or transposition error before clicking on [Commit].
-  
-
- If, to the best of your knowledge, a new UNCONFIRMED bug is not a DUP, please follow the steps outlined in the Confirming Unconfirmed Bugs guidelines before moving on to the next.
-
-

Which is the Duplicate?

-
-
- Other things being equal, newer bugs should be made DUPLICATES of older bugs, but, more importantly, whichever bug is further along in the process of getting fixed should not be made a duplicate. Signs that progess has been made include: -
    -
  • the bug is marked FIXED, a patch is attached or a fix is promised soon
  • -
  • the bug is ASSIGNED to the right Component and developer
  • -
  • the bug has been analyzed by developers
  • -
  • the bug has been given a higher priority (e.g., [PDT+], beta2) or an imminent milestone
  • -
  • the bug report has a explanation of how to reliably reproduce the bug and/or it has a simplified testcase
  • -
-
-
- UNCONFIRMED and "General" bugs should never have another bug made a duplicate of them unless the other bug is also an UNCONFIRMED or "General" bug. Even then, the bug reports that have less detail and work should be made duplicate of the bug reports that are further along, even if those are older. At that point the bug that receives the DUP should normally be confirmed, if it is not already.
-  
-
- If you are stumped, add a comment resembling the following: -
This bug appears to be a duplicate of bug nnnnn, but
-I'm not sure which should be made DUPLICATE of which.
-
-
-

One Down, or, Keeping in the Groove

-
-
- Take another look at the bug list after making a match: there may well be another DUPLICATE of the same bug lurking there. You might also see two bugs on the list that look suspiciously similar even though neither matches the bug you started with.
-  
-
- After some time you will naturally become much more familiar with some types of issues and some components than others. Go with that, focus on the areas you can make sense of quickly. You might also have some existing expertise or experience that makes it easier for you to evaluate some bugs. If you know javascript well, for instance, it makes sense to check over new-to-you DOM bugs before identifying duplicates in any other area.
-  
-
- Similarly, let your tools guide you, to some extent at least. If you know how to use a Debugger, you can make more of a contribution to evaluating Crashers than others can, so it makes sense to look at them. Similarly, some bugs that are reported on Linux, Macs, or other platforms are specific to the platform or platform/OS combination that they were reported on. Someone unfamiliar with that platform won't be as efficient, so if you regularly use something other than Microsoft Windows, please look at bugs reported on your platform first, by selecting it on the query page. Use the Edit this query link at the bottom of a bug list to get back to the query form if you can't use the [Back] button.
-  
-
- By concentrating on the bug reports that you have the skills and experience to evaluate quickly and surely, you will be able to help more in the time you can contribute.
-
-

Specific Types of Duplicates

-

Some types of bug reports need or can benefit from special handling:

-
    -
  1. Bug reports about a particular URL: Check first for a substring (usually just the domain name is appropriate) of the URL in the URL field, matching against bugs with any Status. Obvious exact DUPs should show up easily that way, so long as the reporter filled in the URL field. In case that was not done, check in the Description entry field if there is no match in the URL field.
  2. -
  3. Reports of Crashes: Crashes are identified by what specific code crashed, not how they are reproduced, so some sort of debugging output may be required before a determination can be made whether a crash report is a DUP. If you reproduce a crash on a previously unreported platform or OS, or using a current binary when the reporter was using a milestone release, please add as much detail as you can. If a module name is reported or you can generate a stack trace, search in Bugzilla for bugs with the crash keyword. If you don't find a match, add "crash" to the keywords field, so long as you were able to reproduce the crash.
  4. -
  5. Multiply-DUPLICATE reports: Some bug reports describe a number of often unrelated problems. If all of the problems mentioned are clearly duplicates of existing bug reports, mark the new bug report as a DUPLICATE based on the first issue. If it is clear that all but one of the problems have already been reported, state that, citing the bug numbers if possible, and adjust the Summary to refer to the remaining problem.
  6. -
  7. "General" bug reports: Be sure to move the bug to the appropriate Component if you can identify it, and copy over the QA contact, at the same time that you mark it as a DUP, so that it can be verified by someone familiar with the existing bug report.
  8. -
  9. Same Exact Bug, two bug numbers: Sometimes a bug report ends up in the Bugzilla database twice in a row. If you see two bugs with the same summary and adjacent bug numbers, mark one as a DUP of the other immediately, before both get comments -- but look at both first, in case one has comments already.
  10. -
  11. An ASSIGNED bug may be a DUP: It does sometimes happen that one assigned bug is a duplicate of another. If both are assigned to the same engineer, add a comment to the one that is not as far along as the other; if two different engineers are involved, add a comment to both, pointing out the existence of the other and why it appears to be a DUP. Do not resolve ASSIGNED bugs as DUPs yourself; the assignee should do that.
  12. -
-

Lists Where Duplicates Lurk

-
-
- The greatest concentration of duplicate bugs is in those that enter the database as UNCONFIRMED, although plenty of NEW bugs also turn out to be DUPs. Bugs do occasionally get ASSIGNED before being found to be a DUP, but that is what duplicate-screening is meant to prevent, so please concentrate on UNCONFIRMED and NEW bugs.
-  
-
- The bug lists below are displayed in rough descending order of prevalence of duplicates. They will appear in new windows; you may want to open bugs from the list in new windows too, to preserve the list. Happy matching; if you find only one DUP, you'll have earned the thanks of a busy software enginner.
-  
-
- - -
-
-

(Thanks to Jan Leger, Eli Goldberg, David Baron, John Morrison, Matthew Thomas, Gervase Markham, Liz Henry, and Terry Weissman for contributing to this document. Additional suggestions welcome.)

diff --git a/files/es/rdf/index.html b/files/es/rdf/index.html deleted file mode 100644 index 500f4578d4..0000000000 --- a/files/es/rdf/index.html +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: RDF -slug: RDF -tags: - - RDF - - Todas_las_Categorías -translation_of: Archive/Web/RDF ---- -

-

-
Guía Breve de Web Semántica
-RDF es uno de los pilares de la Web Semántica, pero... ¿Qué es la Web Semántica?.

El Marco de Descripción de Recursos (RDF) es una familia de especificaciones para un modelo de metadatos que a menudo es implementado como una aplicación XML. -

RDF se basa en la idea de hacer las declaraciones sobre los recursos en la forma de una expresión de sujeto-predicado-objeto, llamado "un triple" en terminología RDF. El sujeto es el recurso, "la cosa" descrita. El predicado es un rasgo o el aspecto relativo al recurso, y a menudo expresa una relación entre el sujeto y el objeto. El objeto es el valor de aquel rasgo. -

RDF es un estándar del W3C -

-
-

Documentación

-
¿Que es RDF? -
RDF es uno de los vocabularios de XML que mas se ha hecho sentir ultimamente, RDF propone ser el gran habilitador de la web semantica y convertirse en el standard universal para los metadatos en la web. -
-
RDF Especificación del Modelo y la Sintaxis -
Traducción de la recomendación del W3C 22 febrero 1999. Este documento ha sido sustituido por: RDF Primer, W3C Recommendation 10 February 2004 -
-
Preguntas frecuentes sobre RDF en Mozilla -
Faq sobre el Marco de Descripción de Recursos en Mozilla. -
-
Marco de Descripción de Recursos -
Otra introducción al tema. -
-

Ver más...

-
-

Comunidad

- -
  • La comunidad Mozilla... En inglés. -
-

{{ DiscussionList("dev-tech-rdf", "mozilla.dev.tech.rdf") }} -* {{ mediawiki.external('http://www.ilrt.bris.ac.uk/discovery/rdf-dev/ RDF-Dev mailing list') }} -

Ver más...

-

Herramientas

- -

Ver más...

-

Temas Relacionados

-
XML -
-
-

Categorías -

Interwiki Language Links -


-

-
-
-{{ languages( { "de": "de/RDF", "en": "en/RDF", "fr": "fr/RDF", "it": "it/RDF", "ja": "ja/RDF", "ko": "ko/RDF", "pl": "pl/RDF", "pt": "pt/RDF", "ru": "ru/RDF" } ) }} diff --git a/files/es/rhino/comunidad/index.html b/files/es/rhino/comunidad/index.html deleted file mode 100644 index 6b8eb552f7..0000000000 --- a/files/es/rhino/comunidad/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Comunidad Rhino -slug: Rhino/Comunidad -translation_of: Mozilla/Projects/Rhino/Community ---- -

¿Tiene alguna pregunta que no encuentra respuesta en la documentación Rhino? Estos son algunos recursos adicionales para su ayuda:

-

Lista de Correo

-

En diciembre de 2010, hay una nueva Rhino lista de correo alojada en Grupos de Google.

-

El antiguo grupo de noticias mozilla.dev.tech.js-engine.rhino sufrió un ataque de spam en el verano de 2010 después de lo cual se hizo prácticamente imposible para publicar nuevos mensajes en la misma. Para ver los mensajes archivados en el antiguo grupo de noticias, prueba el  Grupo Google para esto u otros servicios de grupos de noticias.

-

Los mozilla.dev.tech.js-engine Grupos de noticias responde a preguntas sobre la aplicación C de JavaScript, y también se utilizan para responder a preguntas sobre Rhino hasta el 27 de septiembre de 2007. Para ver los mensajes archivados anteriores al 27 de septiembre de 2007, trate Grupo Google para el anterior grupo de noticias.

-

Sistema de errores

-

Utilice Bugzilla para inroducir fallos en contra de Rhino. Tenga en cuenta que Rhino tiene u propia categoría de producto.

-

{{ languages( { "ja": "ja/Rhino_help" } ) }}

diff --git a/files/es/rhino/descarga_rhino/index.html b/files/es/rhino/descarga_rhino/index.html deleted file mode 100644 index dc0ca60106..0000000000 --- a/files/es/rhino/descarga_rhino/index.html +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: Descarga Rhino -slug: Rhino/Descarga_Rhino -translation_of: Mozilla/Projects/Rhino/Download_Rhino ---- -

Rhino está disponible para descargar tanto en código fuente como en su forma compilada.

- -

Binarios

- -

Rhino 1.7R4 es la versión más reciente calificada.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PublicaciónFecha de PublicaciónNotas de la versiónEnlace de descarga
Rhino 1.7R42012-06-18Nuevo en Rhino 1.7R4rhino1_7R4.zip
Rhino 1.7R52015-01-29Notas de la versiónrhino1_7R5.zip
Rhino 1.7.62015-04-15Notas de la versiónrhino1.7.6.zip
Rhino 1.7.72015-06-17Notas de la versiónrhino1.7.7.zip
Rhino 1.7.7.12016-02-01Notas de la versiónrhino1.7.7.1.zip
Rhino 1.7.7.22017-08-24Notas de la versiónrhino1.7.7.2.zip
Rhino 1.7.82018-01-22Notas de la versiónrhino1.7.8.zip
Rhino 1.7.92018-03-15Notas de la versiónrhino1.7.9.zip
Rhino 1.7.102018-04-09Notas de la versiónrhino1.7.10.zip
Rhino 1.7.112019-05-30Notas de la versiónrhino1.7.11.zip
Rhino 1.7.122020-01-13Notas de la versiónrhino1.7.12.zip
- -

Para descargar las versiones anteriores de Rhino, consulte el archivo de descargas de Rhino.

- -

Licencia

- -

Rhino es de código abierto. Apartir de la versión Rhino 1.7R4  está disponible bajo MPL 2.0.

- -

Las versiones anteriores fueron liberadas bajo licencia MPL 1.1/GPL 2.0.

- -

Vea la  licencia de Rhino para obtener más información.

- -

Fuente

- -

Además de obtener la fuente en los archivos zip anteriores, el código fuente de Rhino se puede encontrar en github en: https://github.com/mozilla/rhino. Para obtener el código fuente, utilice el comando:

- -
git clone https://github.com/mozilla/rhino.git
-
- -

Rhino utiliza Ant como su sistema de compilación. Ejecute el comando ant en el directorio principal de la distribución de Rhino y debe ver la lista de destinos de generación disponible.

diff --git a/files/es/rhino/index.html b/files/es/rhino/index.html deleted file mode 100644 index f4a3ae69b0..0000000000 --- a/files/es/rhino/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Rhino -slug: Rhino -tags: - - bug-840092 -translation_of: Mozilla/Projects/Rhino ---- -

Image:rhino.jpg

-

Rhino es una implementación de código abierto de una máquina virtual de  JavaScript escrita enteramente en Java. Generalmente se integra en aplicaciones Java para proporcionar secuencias de comandos (scripting) a los usuarios finales. Se integra en J2SE 6 como un motor de secuencia de comandos de Java por omisión.

-

Descarga Rhino

-

¿Cómo conseguir los fuentes y los binarios?

-

Documentación de Rhino

-

Información sobre Rhino para los escribir scripts y empotrarlo en programas.

-

Ayuda de Rhino

-

Aquí hay algunos recursos si te atascas.

-

{{ languages( { "ja": "ja/Rhino" } ) }}

diff --git a/files/es/rhino/resumen/index.html b/files/es/rhino/resumen/index.html deleted file mode 100644 index bda616d66a..0000000000 --- a/files/es/rhino/resumen/index.html +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Resumen de Rhino -slug: Rhino/Resumen -translation_of: Mozilla/Projects/Rhino/Overview ---- -

Introducción

-

La mayoría de las personas que han utilizado JavaScript antes lo han hecho añadiendo las secuencias de comandos HTML a sus páginas web. Sin embargo, Rhino es una implementación de sólo el núcleo del lenguaje y no contiene objetos o métodos para manipular documentos HTML.

-

Rhino incluye

- -

Lenguaje

-

El lenguaje JavaScript en sí esta estandarizado por la norma Standard ECMA-262 ECMAScript: A general purpose, cross-platform programming language. Rhino 1.3 y superiores se ajustan a la Versión 3 de la Norma.

-

Rhino 1.6 y superiores implementan ECMA-357 ECMAScript for XML (E4X). Consulte las especificaciones para obtener más información sobre la norma, y vea Versión de Rhino 1.6R1 notas de versión para obtener mas información sobre la implementación de Rhino.

-

Además, Rhino ha implementado JavaAdapters, que le permite implementar JavaScript en cualquier interfaz Java o ampliar una clase Java con un objeto JavaScript. Vea el ejemplo enum.js para obtener mas información.

-

Numerosos libros y tutoriales de JavaScript están disponibles. JavaScript: The Definitive Guide es recomendable, y contiene un capítulo sobre Rhino.

-

Características del Lenguaje Obsoletas

-

Varias características del lenguaje introducidas en JavaScript 1.2 se consideran obsoletas. Estas características permiten la "reflexión computacional": es decir, la capacidad de un script para determinar e influir en los aspectos de la forma que se evalúa. Estas características no suelen ser útiles, sin embargo, imponen restricciones significativas en las  implementaciones que dificultan o impiden la optimización.  Las características en desuso son the __proto__ and __parent__ properties, y los constructores With, Closure, y Call. Si pretende invocar estos constructores con la versión 1.4 se producirá un error. para otras versiones, se genera una advertencia.

-

Internacionalización

-

Los mensajes reportados por el motor de JavaScript por defecto son recuperados desde el archivo de propiedad org/mozilla/javascript/resources/Messages.properties. Si existen otras propiedades de los archivos con las extensiones correspondientes a la localización actual, se van a utilizar en su lugar.

-

Versiones del Lenguaje JavaScript

-

Algunos comportamientos en el motor JavaScript depende de la versión del lenguaje. En la incorporación del navegador, la versión de idioma se selcciona mediante el atributo LANGUAGE de la etiqueta SCRIPT con los valores tales como "JavaScript1.2".

-

Versión 1.3 y superiores son compatibles con ECMA.

-

Los Operadores == and !=

-

La versión 1.2 sólo utiliza la igualdad estricta para los operadores == y !=. En la versión 1.3 y superiores, == y != tienen el mismo significado que ECMA. Los operadores === y !== se utiliza estrictamente en todas las versiones.

-

Para Booleano

-

Booleano(new Boolean(false)) es falsa para todas las versiones anteriores a 1.3. Es true ( y por lo tanto compatible con ECMA) para la versión 1.3 y superiores.

-

Array.prototype.toString y Object.prototype.toString

-

La versión 1.2 solo retorna array o objetos de notación literal ("{{ mediawiki.external(1,2,3) }}" ó "{a:1, b:2}" por ejemplo). En la  versión 1.3 y superiores esta funciones es compatible con ECMA.

-

Constructores de Array

-

Array(i) para un argumento de número i construye una matriz con un solo elemento igual a i solo para la versión 1.2. Lo contrario si se utiliza la versión ECMA compatible ( Una matriz se construye sin elementos pero con propiedad de longitud igual a i).

-

String.prototype.substring

-

Solo para la versión 1.2, los dos argumentos no se cambian si el primer argumento es menor que el segundo. Todas las demas verciones son compatibles con ECMA.

-

String.prototype.split

-

Solo para la versión 1.2, realiza la division de Perl4 cuando se les da un caracter de espacio como argumento (salta principalmente espacios en blanco, y se divide el espacio en blanco). Todas las demás versiones se divide en el carácter de espacio adecuado segín lo especificado por ECMA.

-

Seguridad

-

Las caracteristicas de seguridad de Rhino proporcionan la capasidad de rastrear el origen de una parte del código ( y cualquier pedazo de código que se pueda generar). Estas caracteristicas permiten la implementación de una politica de seguridad tradicional basada en URL para JavaScript como en el Navegador Netscape. Integrar esa confianza en el código JavaScript que se ejecuta puede ignorar las caracteristicas de seguridad.

-

Insertar código JavaScript que no es de confianza debe hacer dos cosas para habilitar las funciones de seguridad. En primer lugar, todos los contesxtos que se crean deben ser suministrados como instancia de un objeto que implementa la interfaz SecuritySupport. Esto proporcionará la funcionalidad Rhino de apoyo que necesita para realizar tareas reliacionadas con la seguridad.

-

Second, the value of the property security.requireSecurityDomain should be changed to true in the resource bundle org.mozilla.javascript.resources.Security. The value of this property can be determined at runtime by calling the isSecurityDomainRequired method of Context. Setting this property to true requires that any calls that compile or evaluate JavaScript must supply a security domain object of any object type that will be used to identify JavaScript code. In a typical client embedding, this object might be a string with the URL of the server that supplied the script, or an object that contains a representation of the signers of a piece of code for certificate-based security policies.

-

When JavaScript code attempts a restricted action, the security domain can be retrieved in the following manner. The class context should be obtained from the security manager (see java.lang.SecurityManager.getClassContext()). Then, the class of the code that called to request the restricted action can be obtained by looking an appropriate index into the class context array. If the caller is JavaScript the class obtained may be one of two types. First, it may be the class of the interpreter if interpretive mode is in effect. Second, it may be a generated class if classfile generation is supported. An embedding can distinguish the two cases by calling isInterpreterClass() in the Context class. If it is the interpreter class, call the getInterpreterSecurityDomain() method of Context to obtain the security domain of the currently executing interpreted script or function. Otherwise, it must be a generated class, and an embedding can call getSecurityDomain() in the class implementing SecuritySupport. When the class was defined and loaded, the appropriate security domain was associated with it, and can be retrieved by calling this method. Once the security domain has been determined, an embedding can perform whatever checks are appropriate to determine whether access should be allowed.

-

{{ languages( { "ja": "ja/Rhino_Overview" } ) }}

diff --git a/files/es/rhino_documentacon/index.html b/files/es/rhino_documentacon/index.html deleted file mode 100644 index 701fbfd67f..0000000000 --- a/files/es/rhino_documentacon/index.html +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: Documentación de Rhino -slug: Rhino_documentacon -translation_of: Mozilla/Projects/Rhino/Documentation ---- -

Información sobre Rhino para script writers y embedders.

-

General

-
-
- Resumen
-
- Una visión general del lenguaje JavaScript y de Rhino.
-
- Licencia
-
- Información de la licencia de Rhino.
-
- Requerimientos y limitaciones
-
- Lo que usted debe tener para ejecutar Rhino y lo que no puede hacer con Rhino.
-
- Descargas de archivos
-
- Incluye notas de versiones para emisiones de Rhino.
-
- Optimización
-
- Detalles sobre los distintos niveles de optimización.
-
- Preguntas frecuentes
-
- Respuestas a las preguntas más frecuentes acerca de Rhino.
-
- Historia de Rhino
-
- Historia de la bestia.
-
-

Escritura de Scripts

-
-
- Secuencia de comandos Java
-
- Cómo usar Rhino para escritura en clases Java.
-
- Secuencia de comandos Java
-
- Cómo usar Rhino para escritura en clases Java. (forma antigua).
-
- Secuencias de rendimiento
-
- Algunos consejos sobre cómo escribir código JavaScript más rápido.
-
-

JavaScript Herramientas

-
-
- Consola Rhino
-
- Interactivo o ejecución por lotes de comandos.
-
- Depurador JavaScript
-
- Depurar secuencias de comandos que se ejecutan en Rhino.
-
- Compilador JavaScript
-
- Compilación de comandos en archivos Java class.
-
- Ejecución de las pruebas de Rhino
-
- Ejecutar serie de pruebas JavaScript con Rhino.
-
-

Integración de Rhino

-
-
- Tutorial de integración
-
- Un breve tutorial sobre cómo integrar Rhino en su aplicación.
-
- Referencia del API javadoc (¿Enlace roto? Pruebe esté en Jarvana.)
-
- un bosquejo de la interfaz de programación de Rhino (tip only).
-
- Ámbitos y Contextos
-
- Describe cómo utilizar los ámbitos y contextos para el mejor rendimiento y la flexibilidad, con la mirada puesta en entornos multiproceso.
-
- Serialización
-
- Como realizar series de objetos JavaScript y funciones en Rhino.
-
- Tiempo de ejecución
-
- Una breve descripción en tiempo de ejecución de JavaScript.
-
- Pequeña Huella
-
- Consejos para las personas interesadas en incrustaciones de pequeñas dimensiones.
-
- Ejemplos
-
- Una serie de ejemplos que muestran cómo controlar el motor de JavaScript y crear objetos huésped en JavaScript.
-
- Usando Rhino con Bean Scripting Framework (BSF)
-
- Cómo usar Rhino con aplicaciones que soportan BSF (Bean Scripting Framework) del proyecto Apache Jakarta.
-
-

Referencias externas

-
-
- Lenguajes de escritura para Java
-
- un artículo de comparación y contraste de Rhino y Jython.
-
-

Contribuyentes Rhino

-

¿Interesado en contribuir en Rhino? Echa un vistazo a la Lista de deseos Rhino.

diff --git a/files/es/sandbox/index.html b/files/es/sandbox/index.html deleted file mode 100644 index e7614ae246..0000000000 --- a/files/es/sandbox/index.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Sandbox (Página de pruebas) -slug: Sandbox -tags: - - caja-de-arena - - demo - - sanbox - - temporario -translation_of: Sandbox ---- -

Hola Mundo

- -

Contenido HTML

- -
<h1>
-
-

Hello friends

- -

Contenido CSS

- -
h1{
-color:#AAAF;
-}
- -

Resultado

- -

- -

Hello World

diff --git a/files/es/sax/index.html b/files/es/sax/index.html deleted file mode 100644 index 33cc6fbb9a..0000000000 --- a/files/es/sax/index.html +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: SAX -slug: SAX -tags: - - Complementos - - Todas_las_Categorías - - extensiones -translation_of: Archive/SAX ---- -

-

SAX (Simple API for XML, API simple para XML) es una API de análisis. SAX fue la primera API para XML ampliamente adoptada en Java y más tarde implementada en muchos otros entornos de programación. A partir de Firefox 2 es posible utilizar los analizadores SAX para aplicaciones y extensiones XUL. Para más información, veáse la página de SAX. -


-

-

Inicio rápido

-

La funcionalidad de un analizador SAX está disponible a través del componente lector de XML. Para crear uno, utiliza el siguiente trozo de código: -

-
var xmlReader = Components.classes["@mozilla.org/saxparser/xmlreader;1"]
-                          .createInstance(Components.interfaces.nsISAXXMLReader);
-
-

Después de que hayas creado un analizador SAX, necesitarás asociar los manejadores de eventos que te interesen y arrancar el proceso de análisis. Todas las funcionalidades están disponible a través de la interfaz nsISAXXMLReader. -


-

-

Estableciendo los manejadores

-

Los manejadores son objetos definidos por el usuario que implementan las interfaces de manejadores SAX y dependiendo de la clase de información que necesita obtener desde el analizador. Una vez comenzado el proceso de análisis, los manejadores asociados serán llamados por el analizador (callbacks) con el contenido de XML que está siendo analizado. Los siguientes manejadores están disponibles: -

- - - - - - - - - - - -
Interfaz Propósito
nsISAXContentHandler Es notificada sobre el contenido lógico de un documento (p.e.: elementos, atributos, espacios en blanco e instrucciones de proceso).
nsISAXDTDHandler Es notificada sobre eventos básicos relacionados con DTDs.
nsISAXErrorHandler Es notificada sobre errores en el flujo de entrada.
nsISAXLexicalHandler Manejador ampliado de SAX2 para eventos léxicos (p.e.: comentarios y nodos de tipo CDATA, declaraciones DTD y entidades).
-

A continuación se muestra un ejemplo de una implementación de un manejador de contenidos más comúnmente usado: -

-
function print(s) {
-  dump(s + "\n");
-}
-
-xmlReader.contentHandler = {
-  // nsISAXContentHandler
-  startDocument: function() {
-    print("startDocument");
-  },
-
-  endDocument: function() {
-    print("endDocument");
-  },
-
-  startElement: function(uri, localName, qName, /*nsISAXAttributes*/ attributes) {
-    var attrs = [];
-    for(var i=0; i<attributes.length; i++) {
-      attrs.push(attributes.getQName(i) + "='" +
-                 attributes.getValue(i) + "'");
-    }
-
-    print("startElement: namespace='" + uri + "', localName='" +
-          localName + "', qName='" + qName + "', attributes={" +
-          attrs.join(",") + "}");
-  },
-
-  endElement: function(uri, localName, qName) {
-    print("endElement: namespace='" + uri + "', localName='" +
-          localName + "', qName='" + qName + "'");
-  },
-
-  characters: function(value) {
-    print("characters: " + value);
-  },
-
-  processingInstruction: function(target, data) {
-    print("processingInstruction: target='" + target + "', data='" +
-          data + "'");
-  },
-
-  ignorableWhitespace: function(whitespace) {
-    // don't care
-  },
-
-  startPrefixMapping: function(prefix, uri) {
-    // don't care
-  },
-
-  endPrefixMapping: function(prefix) {
-    // don't care
-  },
-
-  // nsISupports
-  QueryInterface: function(iid) {
-    if(!iid.equals(Components.interfaces.nsISupports) &&
-       !iid.equals(Components.interfaces.nsISAXContentHandler))
-      throw Components.results.NS_ERROR_NO_INTERFACE;
-    return this;
-  }
-};
-
-

Iniciar el análisis

-

El componente XML Reader puede analizar XMLs a partir de una cadena de texto (un nsIInputStream) o asíncronamente a través de la interfaz nsIStreamListener. Abajo se muestra un ejemplo de análisis a partir de una cadena: -

-
xmlReader.parseFromString("<f:a xmlns:f='g' d='1'><BBQ/></f:a>", "text/xml");
-
-

Esta llamada desemboca en la siguiente salida (asumiendo que se ha usado el manejador de contenidos mostrado antes): -

-
startDocument
-startElement: namespace='g', localName='a', qName='f:a', attributes={d='1'}
-startElement: namespace='', localName='BBQ', qName='BBQ', attributes={}
-endElement: namespace='', localName='BBQ', qName='BBQ'
-endElement: namespace='g', localName='a', qName='f:a'
-endDocument
-
diff --git a/files/es/servicios_web_xml/index.html b/files/es/servicios_web_xml/index.html deleted file mode 100644 index 3101b6dc9e..0000000000 --- a/files/es/servicios_web_xml/index.html +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Servicios Web XML -slug: Servicios_Web_XML -tags: - - Servicios_Web_XML - - Todas_las_Categorías -translation_of: Archive/Mozilla/Firefox/SOAP_in_Gecko-based_Browsers ---- -

 

-
Principios básicos de los servicios Web
-A short introduction to web services.
-
Un servicio Web es una colección de protocolos y estándares empleados para intercambiar datos entre aplicaciones y sistemas. Las aplicaciones, escritas en diversos lenguajes de programación y ejecutándose en distintas plataformas pueden utilizar los servicios Web para intercambiar datos sobre una red de ordenadores como Internet de una forma similar a la comunicación entre procesos en un solo ordenador. En los servicios Web, todos los datos se intercambian se formatean con etiquetas XML{{ Ref(1) }}
- -

Documentación

SOAP Versión 1.2 Parte 0: Fundamentos
Traducción del documento inicial de la especificación de SOAP 1.2.
"Es un documento no normativo que pretende proporcionar un tutorial fácilmente entendible sobre las características de SOAP"
SOAP en los navegadores basados en Gecko
Este artículo muestra como acceder a los servicios web utilizando SOAP y JavaScript en los navegadores basados en Gecko.
Mozilla Web Services Security Model
To prevent the browser from being used as a tool for Web sites to obtain priveleges that belong to the browser's user, Web browsers restrict what Web pages can do when accessing things in other domains. These restrictions apply to Web Services.
Tutorial de W3School sobre SOAP (en)
SOAP es un protocolo basado en XML que permite a las aplicaciones intercambiar información sobre HTTP. En este tutorial de W3Schools sobre SOAP, aprenderá que es SOAP, y como utilizar el lenguaje XML para intercambiar información entre aplicaciones.

los comento por que no me parecen apropiados ; {{ mediawiki.external('http://davenet.scripting.com/1998/07/14/xmlRpcForNewbies XML-RPC para novatos (en)') }}<br /> : <small>Informal pero informativa introducción a XML Remote Procedure Calls. (XML-RPC).</small>  ; {{ mediawiki.external('http://xmlrpc-c.sourceforge.net/xmlrpc-howto/xmlrpc-howto.html XML-RPC HowTo (en)') }}<br /> : <small>Este articulo describe como utilizar XML-RPC para implementar clientes y servidores en una gran variedad de lenguajes, proporcionando código fuente en Perl, Pitón, C, C++, Java, PHP y otros lenguajes. Este articulo también incluye secciones sobre Zope y KDE 2.0.La información aquí contenida se aplica a todos los sistemas operativos con soporte XML-RPC.</small>  ; {{ mediawiki.external('http://webservices.xml.com/pub/a/ws/2001/04/04/webservices/ A Web Services Primer (en)') }}<br /> : <small>"Los servicios Web son una nueva variedad de aplicaciones Web. Son auto contenidos, auto descriptivos, aplicaciones modulares que pueden ser publicadas, localizadas y ejecutadas a través del Web. Realizando funciones que pueden variar desde la función más sencilla a complicados procesos de negocio. Una vez que se despliega un servicio Web otras aplicaciones (y otros servicios Web) pueden descubrirlo y ejecutarlo."</small>

Ver más...

Comunidad

  • La comunidad Mozilla... en inglés

{{ DiscussionList("dev-tech-xml", "mozilla.dev.tech.xml") }}

Ver más...

Herramientas

Ver más...

Temas Relacionados

XML
-<hr> -

{{ Note(1) }} De .

-

Categorías

-

Interwiki Language Links

-

 

-

{{ languages( { "en": "en/XML_Web_Services", "fr": "fr/Services_Web_XML", "it": "it/XML_Web_Services", "ja": "ja/XML_Web_Services", "ko": "ko/XML_Web_Services", "pl": "pl/XML_Web_Services", "zh-cn": "cn/XML_Web_Services" } ) }}

diff --git a/files/es/sistema_de_preferencias/index.html b/files/es/sistema_de_preferencias/index.html deleted file mode 100644 index 07638dcb46..0000000000 --- a/files/es/sistema_de_preferencias/index.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Sistema de preferencias -slug: Sistema_de_preferencias -tags: - - Sistema_de_preferencias - - Todas_las_Categorías - - XUL - - páginas_a_traducir -translation_of: Mozilla/Preferences/Preferences_system ---- -

Este documento describe el nuevo sistema de preferencias del Toolkit de Aviary. Usando este sistema es posible crear ventanas de preferencias que se muestren y funcionen apropiadamente en varias plataformas (Windows, MacOS X y GNOME).

- -

Ten en cuenta que el sistema de preferencias solo está disponible desde Firefox/Thunderbird 1.5 (incluyendo sus versiones alpha y beta). No puedes usarlo en las aplicaciones y extensiones basadas en Firefox 1.0.

- -

El nuevo sistema esta implementado mediante unos pocos elementos y atributos en XUL. Puedes encontrar información sobre estos, simplemente haciendo clic en alguno de los enlaces a continuación:

- -

Documentación sobre el Sistema de preferencias:

- -

Uso

- -

this will eventually be moved from here

- -

El código para una típica ventana de preferencias sería algo así:

- -
<prefwindow id="appPreferences"
-            xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <prefpane id="pane1" label="&pane1.title;">
-    <preferences>
-      <preference id="pref1" name="pref.name" type="bool"/>
-    </preferences>
-
-   .. UI elements that refer to the preferences above, e.g.:
-    <checkbox id="check1" preference="pref1"
-              label="&check1.label;" accesskey="&check1.accesskey;"/>
-  </prefpane>
-
-  <prefpane id="pane2" label="&pane2.title;" src="chrome://uri/to/pane.xul"/>
-</prefwindow>
-
- -

La hoja de contenido puede ser especificada en línea, o mediante un enlace externo que cargue dicho contenido en la misma, de manera dinámica.Presta especial atención al HIGs de las plataformas en las que estés desarrollando y al usar el preprocesador de XUL si fuera necesario para configurar apropiadamente los diferentes titulos de ventana. Debes especificar también el ancho de la ventana (en el em) así como hacer un uso correcto del preprocesador para cada plataforma que uses , así como la altura (en el em) para aquellas plataformas en donde el tamaño de la ventana no cambie cuando se cambie al panel seleccionado.(p.ej. Windows).

- -

Uso en aplicaciones XULRunner

- -

Cuando abras el diálogo de preferencias en una aplicación XULRunner, asegúrate de comprobar lo siguiente:

- - - -
pref("browser.preferences.animateFadeIn", false);
-pref("browser.preferences.instantApply", true);
-
- - - -
var features = "chrome,titlebar,toolbar,centerscreen,modal";
-window.openDialog(url, "Preferences", features);
-
- -

Bugzilla

- -

El componente para bugs (no disponible en las opciones de la interfaz de usuario en Firefox/Thunderbird ) se encuentra en Herramientas:Preferencias (archivar un bug lista de bugs)

diff --git a/files/es/social_api/glossary/index.html b/files/es/social_api/glossary/index.html deleted file mode 100644 index a92cdda06a..0000000000 --- a/files/es/social_api/glossary/index.html +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Glosario de Social API -slug: Social_API/Glossary -tags: - - Social -translation_of: Archive/Social_API/Glossary ---- -
-

Note: Hay algunos puntos destacados donde los enlaces hacia otros documentos necesitan ser añadidos cuando estos sean escritos.

-
-

Para hacer uso de Social API (si estás escribiendo un nuevo proveedor de servicios sociales o trabajando con un proveedor ya existente), hay un número de términos que necesitas saber. ¡Este glosario te ayudará!

-
-
- Notificación Cliente-a-usuario (Client-to-user notification)
-
- La notificación Cliente-a-usuario es la API (interfaz de programación de aplicaciones) que se pone a disposición a un worker del servicio (service worker) para indicar que los datos y las interacciones están pendientes para el usuario en el dispositivo en particular, y que el servicio está listo para proporcionarlas. Sujeto a la configuración del navegador, estas notificaciones pueden ser utilizadas para lanzar una variedad de elementos de interfaz para llamar la atención, incluyendo ventanas temporales de estilo "toast" o "Growl", notificaciones ambientales (por ejemplo brillos, saltos, pulsaciones), o colecciones (por ejemplo paneles desplegables de notificación, listas de eventos pendientes). Estas notificaciones son construidas para permitir al service worker recibir notificaciones cuando el usuario indica interés en una de ellas, permitiendo la presentación de datos o interacción para proceder inmediatamente.
-
- Panel (Panel)
-
- Una región del interfaz de usuario (generalmente rectangular) que se muestra temporalmente por encima del contenido y de la interfaz del navegador; estos son usados para interacciones breves que son iniciadas por el usuario o que son muy importantes
-
- Recomendar (Recommend)
-
- El acto iniciado por el usuario de indicar que una pieza de contenido web (generalmente una URL) debe marcarse de interés para el usuario. No se espera una entrada distinta a una URL. Una recomendación puede ser completada sin widget; no tiene más interfaz de usuario que el botón, barra de menú o comando que indica "recomienda esto".
-
- Notificación servidor-a-cliente (Server-to-client notification)
-
- La notificación de servidor a cliente es un sistema por el cual un servicio Server-to-client notification dispone de notificaciones para ser enviadas de manera rápida y eficaz a un cliente. No es una característica de esta propuesta, aunque las técnicas web existentes incluyendo WebSockets, Server-sent events, XMLHttpRequest con sondeo largo, long polling (o infrequently quick polling) pueden ser todas usadas para workers de servicio (service workers). Se espera que un worker de servicio que recibe una notificación servidor-a-cliente retransmitirá a menudo estos datos en una notificación cliente-a-usuario.
-
- Mensaje de servicio (Service message)
-
- Un mensaje es una cadena de texto codificada en JSON que es enviada por el navegador por el worker de servicio, o es enviada por el worker del servicio al navegador. Estos mensajes son usados para coordinar la visualización de elementos de usuario manejados por el navegador y responder a las interacciones de usuario y contenido. Véase Serialización de mensajes para detalles de codificación.
-
- Worker de servicio (Service worker)
-
- Un ambiente de cálculo ejecutando durante mucho tiempo un JavaScript, manejado por el navegador y servido por una dirección web específica de usuario, que actúa como un eje o hub de coordinación y comunicación entre el navegador y un servicio web.
-
- Compartir (Share)
-
- El acto, iniciado por el usuario, de enviar una parte de contenido web (normalmente una URL) con un comentario opcional, explicación u otros datos a la dirección del usuario, lista de direcciones de usuario, red social u otro destino. Los detalles de la iteración son específicos para cada servicio y se requiere un ShareWidget para representar la interfaz de usuario que complete el intercambio.
-
- Barra lateral (Sidebar)
-
- Un rectángulo vertical de espacio de pantalla, posicionado al lado del contenido normal del navegador en una ventana de navegación con pestañas, que es estable a lo largo de la navegación y a cambios de foco entre pestañas. Una barra lateral puede ser minimizada, lo que causa que sea mostrada enteramente en el espacio "por encima del contenido / no superpuesto sobre el contenido".
-
- Proveedor de servicio social (Social service provider)
-
- Un servicio web que proporciona una o más APIs al navegador para habilitar características sociales. Es definida en el navegador por un archivo estructurado de texto, que le dice al navegador cómo cargar  recursos de JavaScript y HTML que trae sus funciones al navegador.
-
- Widget (Widget)
-
- Un elemento de interfaz de usuario, creado por el navegador, que proporciona una región visual para el contenido producido por el proveedor de servicio.
-
diff --git a/files/es/social_api/guide/index.html b/files/es/social_api/guide/index.html deleted file mode 100644 index 72655a87c5..0000000000 --- a/files/es/social_api/guide/index.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Guía social API -slug: Social_API/Guide -translation_of: Archive/Social_API/Guide ---- -

 

-

-

Borrador
- Esta página no está completa.

- -

-

Este artículo describe el ciclo de vida de un social service worker, como el servicio social permite al navegador interactuar con un sitio  de redes sociales y asi sucesivamente.

-

Ciclo de vida de un social service worker

-

Un proveedor de servicios sociales esta definido por un archivo de texto estructurado (JSON) incluyendo un número de URLs con llave, un nombre y un icono. Los URLs poseen el mismo orígen que el archivo JSON si es cargado remotamente.

-

Un social service worker es instanciado del URL de dicho service worker provisto por el proveedor de servicios; este URL  debe resolver a un archivo JavaScript que es evaluado por el trabajador de servicios. El worker es un worker compartido, renderizado "no comprable" en un estilo muy similar a la especificación de los Trabajadores Web ( aunque debe tomarse en cuenta que la implementación actual no es, de hecho, un Worker).

-

El service worker permanece con vida hasta finalizar, ya sea por cierre de navegador o por un comando de control explícito del usuario.

-

Si el navegador determina que la finalización del service worker es necesaria, todos los contenidos del servicio-nivel asociados con el service worker es descargado ( esto significa, que todos los ServiceWindows y barras laterales seran cerrados) como parte de la finalización.

-

Si el navegador se inicia ( o se reinicia) el servicio durante una sesión de usuario normal, el service worker es primero completamente cargado, y las barras laterales son instanciadas en ventanas existentes. Los ServiceWindows (como los chats) no son reiniciados automáticamente.

-

Flujo de implementación

-

Esta sección ilustra como el social service comenzó, como se comunica con el sitio de redes sociales, y se finaliza.

-

<<<añada un diagrama actual>>>

-
    -
  1. El servicio es registrado con un servicio, widget de barra lateral y widget para compartir.
  2. -
  3. En el momento de inicio del navegador, el trabajador de servicio es instanciado.
  4. -
  5. El servicio abre un conexión a su servicio, si una sesión de usuario esta disponible, y empieza a recibir eventos de inserción.
  6. -
  7. Cuando una ventana del navegador es creada, el contenido del widget de la barra lateral es instanciado.
  8. -
  9. La barra lateral se registra con el servicio usando mozSocial.getWorker().postMessage("hello").
  10. -
  11. El trabajador de servicios captura el mensaje "hello" y añade la sidebarContentWindow a una lista de recepción de eventos.
  12. -
  13. El contenido de la barra lateral podrá entonces realizar una conformidad de conexiónes publicar-suscribir más elaboradas, para limitar que eventos este recibe.
  14. -
  15. Cuando el servicio recibe eventos del servidor (o de otro contenido), invoca window.postMessage() en cada referencia de ventana que fue previamente guardada. La barra lateral se regenera segun sea necesario.
  16. -
  17. Si el usuario hace click en la barra lateral para, por ejemplo, abrir una ventana de chat, window.open() se hace la llamada y una nueva ventana es creada. La ventana de chat se registra con el servicio utilizaando mozSocial.getWorker().postMessage("hello") y recibe un mensaje de vuelta indicandole con quien abrir un chat. El servicio puede entregar eventos servidor-inserción a la ventana de chat, tal vez a través de un sistema publicar-suscribir.
  18. -
diff --git a/files/es/social_api/index.html b/files/es/social_api/index.html deleted file mode 100644 index 087ca43479..0000000000 --- a/files/es/social_api/index.html +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Social API -slug: Social_API -tags: - - Social -translation_of: Archive/Social_API ---- -

Social API es una nueva API para facilitar a los navegadores web integrarse con los servicios de redes sociales. Una vez que una red social es implementada por Firefox, permite que el navegador incorpore controles e información del usuario en ese servicio. Los siguientes artículos explican cómo implementar un proveedor de servicios sociales.

-
-

Nota: Mucho del contenido de las subpáginas que se encuentra aquí ha sido escrito pero aún no se ha migrado a este directorio: temporalmente puedes encontrarlos aquí.

-
-
-
-

Documentación de Social API

-
-
- Glosario de Social API
-
- Provee definiciones de los términos principales que necesitaras entender cuando estés usando Social API.
-
- Social API y guía del servicio social.
-
- Una introducción y guía a Social API y los servicios asociados.
-
- Archivo manifest del servicio social
-
- Una descripción de—y una guía para construir— el archivo Manifest requerido.
-
- Referencia de la API del social service worker
-
- Una referencia a la API del social service worker.
-
- Contenido de la API del servicio social: MozSocial
-
- Una referencia al contenido de la API del servicio social que es proporcionada por el objeto navigator.MozSocial.
-
- Widgets del servicio social
-
- Una guía de los widgets proporcionados por el servicio social.
-
- Implementación de la funcionalidad de chat
-
- Una guía para implementar las características de chat usando Social API.
-
-

Ver todos...

-
-
-

Obtener ayuda de la comunidad

-

Necesitas ayuda con un problema relacionado con Social API y no puedes encontrar la solución en la documentación?

-
    -
  • Haz tu pregunta en el canal IRC de Mozilla: #socialdev
  • -
-

No te olvides de la netiquette...

-

Herramientas y demostraciones

- -

Ver todos...

- - -
-
-

 

diff --git a/files/es/social_api/manifiesto/index.html b/files/es/social_api/manifiesto/index.html deleted file mode 100644 index 5602e901e6..0000000000 --- a/files/es/social_api/manifiesto/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Manifiesto del servicio social -slug: Social_API/Manifiesto -translation_of: Archive/Social_API/Manifest ---- -

Un manifiesto del servicio social es un archivo JSON que describe al navegador cómo crear instancias de un service worker para un service provider.

-

Contenido

-

Como mínimo, un manifiesto del servicio social debe contener una propiedad services, de tipo objeto, que contiene a su vez una propiedad social, también de tipo objeto. El objeto social debe contener las siguientes propiedades:

-
-
- name
-
- El nombre del servicio
-
- iconURL
-
- La dirección URL del ícono que usará el servicio en la interfaz de usuario.
-
- workerURL
-
- La dirección URL de un archivo JavaScript que define el social service worker para el servicio.
-
- sidebarURL
-
- La dirección URL de un archivo HTML  que define la barra lateral que utiliza el servicio.
-
-

Ejemplo

-
{
-  "services": {
-    "social": {
-      "name": "Ejemplo de Servicio Social",
-      "iconURL": "/icon.png",
-      "workerURL": "/worker.js",
-      "sidebarURL": "/sidebar.htm",
-    }
-  }
-}
-

 

diff --git a/files/es/social_api/service_worker_api_reference/index.html b/files/es/social_api/service_worker_api_reference/index.html deleted file mode 100644 index 9ce93f64b8..0000000000 --- a/files/es/social_api/service_worker_api_reference/index.html +++ /dev/null @@ -1,377 +0,0 @@ ---- -title: Service worker API reference -slug: Social_API/Service_worker_API_reference -translation_of: Archive/Social_API/Service_worker_API_reference ---- -

-

No estándar
- This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

-

- -

- -

service Worker de Servicio de Referencia

- -

Un service Worker hereda todas las limitaciones y los comportamientos disponibles para service Workeres Compartidos de HTML5. Puede crear XMLHttpRequests, usar WebSockets, recibir mensajes de ventanas y del navegador, usar IndexedDB, y publicar mensajes a otras ventanas.

- -

El service Worker puede usar los métodos ononline, onoffline, y navigator.online y las propiedades que están disponibles para todos los service Workeres para obtener una notificación del estado online/offline de los navegadores.

- -

Además de los métodos estándar, los Service Wokers tienen acceso a funciones adicionales, todas las cuales están implementadas usando mensajes enviados y recibidos por un service Worker "puertos de mensaje". Así como los puertos de mensaje son inherentemente asíncronos, cualquier mensaje que necesite una respuesta involucrará dos mensajes - uno para la pregunta y otro para la respuesta. No todos los mensajes requieren respuesta - esto es parte de la especificación del mensaje. Los mensajes que no requieran una respuesta son análogos a un 'evento' no solicitado. Si un mensaje sí requiere una respuesta, entonces la respuesta siempre deberá ser enviada en el mismo puerto de la petición y en general, el 'asunto' de la respuesta será el asunto de la petición con "-respuesta" concatenado.

- -

Se espera que los service Workeres de Servicio provean una función en un ámbito global, nombrado onconnect. El navegador invocará onconnect durante la fase de arranque,pasando un evento. El service Worker debería acceder a la propiedad ports de este evento para extraer una comunicación estable hacia el puerto del navegador, y persiste por el ciclo de vida del service Worker, como esto:

- -
var apiPort;
-var ports = [];
-onconnect = function(e) {
-    var port = e.ports[0];
-    ports.push(port);
-    port.onmessage = function (msgEvent)
-    {
-        var msg = msgEvent.data;
-        if (msg.topic == "social.port-closing") {
-            if (port == apiPort) {
-                apiPort.close();
-                apiPort = null;
-            }
-            return;
-        }
-        if (msg.topic == "social.initialize") {
-            apiPort = port;
-            initializeAmbientNotifications();
-        }
-    }
-}
-
-// send a message to all provider content
-function broadcast(topic, data) {
-  for (var i = 0; i < ports.length; i++) {
-    ports[i].postMessage({topic: topic, data: data});
-  }
-}
-
- -

Cada mensaje tiene un elemento con 2 campos: 'topic' y 'data'. El topic identifica el método o evento que es utilizado, y el data especifica datos adicionales únicos al topic. Todos los métodos estandarizados y eventos tienen topics que comienzan con "social." - esto significa que los servicios son libres de usar topics sin este prefijo como un detalle de implementación privada (por ejemplo, para comunicar algún contenido de un servicio a un service Worker de servicio).

- -

Serialización de mensajes

- -

Para un mensaje con el asunto topic y los argumentos (arg1:val1, arg2:val2), construye un objeto como:

- -
{ topic: topic, data: { arg1: val1, arg2: val2 } }
-
- -

Mensajes de Control enviados a service Workeres de servicios

- -

social.initialize

- -

Enviados por el navegador durante el arranque. Cuando el JavaScript de un service Worker ha sido cargado con éxito y evaluado, el navegador enviará un mensaje con este asunto. Cuando el service Worker recibe el social.initalize event, debería enviar ambos, el social.user-profile y, si los Mrcadores de Página son soportados [como en Fx23], el mensaje desocial.page-mark-config.

- -

social.port-closing

- -

Enviado por el navegador durante el apagado del service Worker, cuando un PuertodeMensaje para el service Worker está a punto de ser cerrado. Este será el último mensaje que el service Worker recibirá en el puerto.

- -

Mensajes de Control enviados desde el service Worker de Servicio al navegador

- -

social.reload-worker

- -

Enviado por el service Worker para solicitar al navegador que re-cargue al service Worker.

- -

social.cookies-get

- -

Enviado por el service Worker para solicitar al navagador que responda con una lista del mismo origen de las cookies para el proveedor. El navegador responderá con un mensaje social.cookies-get-response.

- -

social.request-chat

- -

Enviado por el service Worker para solicitar al navagador que abra un nuevo panel de chat flotante con la URL especificada. La ventana de chat abierta por el service Worker será abierta en un modo minimizado.

- -

Argumentos:

- -

URL

- -
-

Cadena, requerida. La URL de la página de chat para abrir en la ventana.

-
- -

Control de Notificación de Ambiente

- -

social.user-profile

- -

Enviada por el service Worker, para establecer las propiedades para el proveedor de icónico de perfil de usuario de datos usado para el botón de la barra. Si el retrato de usuario y userName no se encuentran, el botón de IU indicará el estado de no-logueado. Cuando esté indicando un estado de no-logueado, los íconos de estado establecidos vía social.ambient-notification serán removidos. Un servicio que no maneja el loguéo de usuarios deberá enviar este mensaje con los alores apropiados para el sitio, como lo son el ícono del sitio, URL principal y el nombre de la marca.

- -

Argumentos:

- -

iconURL

- -
-

Cadena, requerida. Si es sumistrada, especifíca la URL hacia una imagen 16x16 pixeles usada por el ícono de estado. El iconURL puede ser una URL de datos con una imagen codificada para evitar solicitudes a los http (ejemplo: "data:image/png;base64,...data...").

-
- -

portrait

- -
-

Cadena, opcional. Si es suministrada, especifíca la URL hacia una imagen de 48x48 pixeles del usuario. El retrato puede ser una URL de datos con una imagen codificada para evitar solicitudes a los http.

-
- -

userName

- -
-

Cadena, opcional. El nombre de la cuenta mostrado con el retrato en el menú de proveedor.

-
- -

dispayName

- -
-

Cadena, requerido. Nombre real del usuario usado para propósitos de visualización en varios elementos de IU.

-
- -

profileURL

- -
-

Cadena, requerido. URL a  la página de perfil de un usuario logueado. Este será abierto en una pestaña normal del navegador cuando el nombre de usuario es cliqueado.

-
- -

social.ambient-notification

- -

Enviado por el service Worker, para actualizar o crear un ambiente de íconos de notificaciones. Es enviado uno por cada ícono. Un usuario debe estar logueado para mostrar los íconos de estado, y deberás llamar a social.user-profile antes de llamar social.ambient-notification para establecer los íconos de estado.

- -

Argumentos:

- -

name

- -
-

Cadena. Un identificador para el ícono. La primera vez que un nombre dado es mostrado, eficazmente crea un nuevo ícono. Si el mismo nombre es usado en llamadas sub-secuentes, el ícono existente es actualizado.

-
- -

iconURL

- -
-

Cadena, opcional. Si es suministrada, especifíca la URL hacia una imagen de 16x16 pixeles usada para el ícono de estado. El iconURL puede ser una URL con una imagen codificada para evitar solicitudes a los http (ejemplo: "data:image/png;base64,...data...")

-
- -

counter

- -
-

Número, opcional. Especifíca un númeroque será sobre-puesto sobre el ícono, típicamente usado para transmitir un concepto unread.

-
- -

contentPanel

- -
-

Cadena, opcional. Especifíca la URL de un contenido que será mostrado en el panel popup para el ícono.

-
- -

Control de Notificaciones Activo

- -

social.notification-create

- -

Enviado por el service Worker, para crear y mostrar un objeto de notificación. Esto solicita que el navegador notifique al usuario de un relevante e inmediato cambio de estado. Ver https://developer.mozilla.org/en/DOM/navigator.mozNotification para más detalles. Cuando el usuario cliquea en la notificación, el mensaje social.notification-action es enviado al service Worker. El título de la notificación siempre será el nombre del proveedor.

- -

NOTA: Queremos aumentar el objeto mozNotification definido en los documentos con un "tipo" de campo adicional. Detalles TBD. NOTA: No hay manera de almacenar la duración y tampoco de "cancelar" una notificación (la hipótesis es de que son de muy corta duración). ¿Está bien?

- -

Argumentos:

- -

id

- -
-

Cadena: Un ID para la notificación. Este ID no será mostrado pero será pasado atrás vía el evento social.notification-action si el usuario cliquea en la notificación.

-
- -

type

- -
-

Cadena: La cadena Tipo deberá ser consistente para cada tipo de notificación. Este será usado por algun sistema de notificación para proveer filtraciones de notificaciones al nivel del usuario. Un proveedor deberá elegir cualquier cadena para el tipo, pero deberá mantener los tipos de cadena consistentes y descriptivos para cada tipo de acción. Por ejemplo, las notificaciones de chat deberían siempre de tener la cadena del mismo tipo. Sugerencia/ejemplo que incluye la notificación:

-
- - - -

icon

- -
-

Cadena/nulo. La URL de una imagen a ser colocada en una notificación. Mientras que esta puede ser cualquier RL válida, los implementadores están muy recomendados que usen una URL de datos para minimizar la latencia.

-
- -

body

- -
-

Cadena: El cuerpo del mensaje de notificación. este cuerpo será tomado como un super-enlace y podrá ser cliqueado. El marcado de HTML no es soportado.

-
- -

action

- -
-

Cadena: Una acción para ejecutar cuando el usuario hace clic en la notificación. Si ninguna acción es prevista, la notificación no es cliqueable. Acualmente las únicas acciones soportadas son link, callback y openServiceWindow. Si la acción está difinida, actionArgs también deberá ser definida.

-
- -

actionArgs

- -
-

Objeto: Una objeto con argumentos (abajo). Acciones soportadas y sus actionArgs son:

-
- - - -

social.notification-action

- -

Enviada al service Worker como una respuesta a la notificación "callback", después de que el usuario ha cliqueado en la notificación.

- -

Argumentos:

- -

id

- -
-

Cadena: el ID de la notificación que fue cliqueada.

-
- -

action

- -
-

Cadena: La acción enviada en social.notification-create.

-
- -

actionArgs

- -
-

Objeto: Las actionArgs enviados en social.notification-create.

-
- -

Marcadores de página

- -

ESTADO: CON MIRA EN Fx23 (reemplazando Link Recommendation below)

- -

Las Marcas de Página son un simple mecanismo de compartir una URL con un proveedor social. Las Marcas de Página difieren para compartir en que la URL solo es enviada al proveedor. Esta funcionalidad puede manejar casos de uso como el Me Gusta de Facebook, Google +1, Pocket, u otras características como ver-más-tarde. Cuando estan habilitados, y el botón adicional de Marca aparecerá al final de la botonera Social en Firefox. No hay una IU asociada con otro botón que no sea el cambiar la imagen de botón para reflejar el estado de marcado o no-marcado.

- -

social.page-mark-config

- -

Enviado por el service Worker para notificar a Firefox de soporte para las Marcas de Página. Este mensaje puede ser enviado en cualquier momento. Te recomendamos mandarlo cuando se esté manejando el mensaje social.initialize.

- -

Argumentos:

- -

images

- -
-

Objeto. Debe tener dos llaves de tipo String, 'marked' y 'unmarked', los cuales serán usados como ícono del botón de Marcador de Página. El agente de usuario buscará si la actual página ha sido marcada - si sí, mostrará la imagen 'marked', de otra manera motrará la imagen 'unmarked'. Puede contener una imagen direccionable - web o una URL de datos conteniendo una imagen de datos generada dinamicamente.  Implementadores están fuertemente recomendados de usar una URL de datos para minimizar la latencia. Cada imagen se espera que sea de de 16x16 píxeles.

-
- -

messages

- -
-

Objeto. Debe tener las siguientes llaves de cadena:

-
- - - -

social.page-mark

- -

Enviado por el navegador hacia el service Worker cuando el usuario 'marca' o 'desmarca' una página. No hay respuesta esperada. El navegador rastreará el estado de la marca de la página separadamente del proveedor. Si el usuario limpia su historial, todas las marcas de página serán removidas.

- -

Arguments:

- -

url

- -
-

Cadena. La URL de la página es marcada.

-
- -

marked

- -
-

Boolean.

-
- -

 

- -

Enlace de Control de Recomendación

- -

 

- -

NOTA: El siguiente mensaje usuario-recomendación fue RECHAZADO y REMOVIDO de Fx23. Fue reemplazado por Page Marks.

- -

social.user-recommend-prompt

- -

ESTADO: RECHAZADO, REMOVIDO de Fx23, REEMPLAZADO CON social.page-mark-config

- -

Enviado por el navegador para solicitar una vista de la interfaz para la "recomendación de usuario". El service Worker debe responder con una user-recommend-prompt-response

- -

Nota que tipicamente este mensaje solo será enviado cuando un proveedor está activado y la respuesta será usada para todas las URL's. En otras palabras, el proveedor no espera que este mensaje sea enviado cada vez que el agente de usuario navega o muestra una nueva UTL.

- -

Arguments:

- -

None

- -

social.user-recommend-prompt-response

- -

STATUS: DEPRECATED, REMOVED Fx23

- -

The Worker constructs and posts a user-recommend-prompt-response in response to a social.user-recommend-prompt message received from the browser. See social.user-recommend-prompt for more details.

- -

Arguments:

- -

images

- -
-

Object. Must have 2 string keys, 'share' and 'unshare', which each value being the URL to an image which will be set as the "src" property of an image contained in the user-facing click target for the "recommend" action. The user agent will track if the current page has been shared - if so, it will show the 'unshare' image, otherwise will show the 'share' image. It can contain a web-addressible image or a data URL containing dynamically-generated image data. Implementors are strongly encouraged to use a data URL to minimize latency. Each image is expected to be 16px wide and 16px high.

-
- -

messages

- -
-

Objeto. Debe tener las siguientes llaves de cadena:

-
- - - -

social.user-recommend

- -

ESTADO: RECHAZADA, REMOVIDO DE Fx23, REEMPLAZADO CON social.page-mark

- -

Indica que el usuario ha hecho clic en el elemento de interfaz "user recommendation". El mensaje incluye:

- -

Argumentos:

- -

url

- -
-

Cadena, requerida. La URL que el usuario está viendo, incluída la cadena de busqueda, pero menos cualquier texto de hash, de la raíz de la actual vista del navegador.

-
- -

No es necesaria una respuesta; como fuere, el servicio debe responder en el mismo puerto con una usuario-recomendación-prompt-respuesta si el objetivo de clic debe cambiar su apariencia.

- -

social.user-unrecommend

- -

ESTADO: RECHAZADO, REMOVIDO DE Fx23

- -

Indíca que al usuario le gustaría volver a su previa recomendación. El mensaje incluye:

- -

Argumentos:

- -

url

- -
-

Cadena, requerido. La URL que el usuario está viendo, incluyendo la cadena de consulta, pero no los textos de hash, de la raíz del contexto actual de vista del navegador.

- -
-
-
- -

 

diff --git a/files/es/social_api/widgets/index.html b/files/es/social_api/widgets/index.html deleted file mode 100644 index 85ae2e03a5..0000000000 --- a/files/es/social_api/widgets/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Widgets -slug: Social_API/Widgets -translation_of: Archive/Social_API/Widgets ---- -

Widgets

-

SidebarWidget

-

Si un servicio define un SidebarWidget, el navegador crea instancias, en determinadas ventanas del navegador, un área de contenido cuyo contenido se encuentra en el sidebarURL definido en el manifiesto. Estas regiones no se crean instancias hasta que el Worker ha sido completamente cargado.El contenido de estas regiones tiene la API adicional definida en la referencia de Service Content API.

-

Las Sidebars pueden estar en estado visibles u ocultos.

- -

Windows Sidebar se crea una instancia única en las ventanas del navegador que tienen una completa interfaz de navegación por pestañas, ventanas creadas con window.open que no cuentan con estos elementos de la interfaz no recibe una barra lateral.

-

Cuando una pestaña que se representa directamente en el navegador sin barra de direcciones se selecciona, la barra lateral se coloca automáticamente en el estado oculto. Cuando el usuario sale de esa pestaña, la barra lateral se hace visible de nuevo. Estas pestañas incluyen la página de administración de complementos, about:permissions, etc.

-

Los estados minimizada / maximizada / oculta de la barra lateral del widget son consistentes a través de todas las ventanas del navegador. El estado más reciente es recordado y usado para las nuevas ventanas, y se conserva en todos los reinicios del navegador.

diff --git a/files/es/spidermonkey/index.html b/files/es/spidermonkey/index.html deleted file mode 100644 index 231a18eab5..0000000000 --- a/files/es/spidermonkey/index.html +++ /dev/null @@ -1,115 +0,0 @@ ---- -title: SpiderMonkey -slug: SpiderMonkey -tags: - - SpiderMonkey -translation_of: Mozilla/Projects/SpiderMonkey ---- -
{{SpiderMonkeySidebar}}
- -
-

SpiderMonkey is Mozilla's JavaScript engine written in C and C++. It is used in various Mozilla products, including Firefox, and is available under the MPL2.

-
- -

Standalone source code releases can be found on the Releases page.

- -
-
-

Guides

- -

Building

- -
-
SpiderMonkey Build Documentation
-
How to get SpiderMonkey source code, build it, and run the test suite.
-
- -

Using SpiderMonkey

- -
-
Introduction to the JavaScript shell
-
Documentation of the command-line JavaScript shell, js.
-
JSAPI User Guide
-
This guide provides an overview of SpiderMonkey and describes how you can embed engine calls in your applications to make them JavaScript-aware.
-
JSAPI cookbook
-
Shows the JSAPI translation of some commonly used JavaScript expressions and statements.
-
GC Rooting Guide
-
Guide on how to write code compatible with the Generational GC in SpiderMonkey.
-
How to embed the JavaScript engine
-
An older tutorial about embedding SpiderMonkey.
-
- -

Hacking on SpiderMonkey

- -
-
New to SpiderMonkey
-
A guide to hacking on SpiderMonkey.
-
Setting up CDT to work on SpiderMonkey
-
How to configure Eclipse to work on the SpiderMonkey code.
-
Contributing to SpiderMonkey (YouTube)
-
A video that is less than four minutes long.
-
- -
-
Running Automated JavaScript Tests
-
How to run the JavaScript test suites.
-
Creating JavaScript tests
-
How to add tests to the JavaScript test suites.
-
-
- -
-

Reference

- -
-
JSAPI Reference
-
SpiderMonkey API reference.
-
JS Debugger API Reference
-
API reference for the Debugger object introduced in SpiderMonkey 1.8.6, which corresponds to Gecko 8.0 {{ geckoRelease("8.0") }}.
-
Bytecode descriptions
-
Listing of SpiderMonkey's bytecodes.
-
Parser API
-
Reflection of the SpiderMonkey parser, made available as a JavaScript API.
-
- -

Tips, tricks and philosophy

- -
-
Future Directions
-
Future directions for functionality, design, and coding practices.
-
SpiderMonkey Internals
-
A design overview and a file-by-file walkthrough of the implementation.
-
Bytecode Reference
-
SpiderMonkey bytecode reference.
-
SpiderMonkey Internals: GC
-
Separate internals article on the GC
-
SpiderMonkey Internals: Hacking Tips
-
Collection of helpful tips & tools for hacking on the engine
-
- - - - - -

Releases

- -
-
SpiderMonkey release notes
-
Current and past versions: 52, 45, 38, 31, 24, 17
-
- -

Community

- - - -
-
-
-
diff --git a/files/es/storage/performance/index.html b/files/es/storage/performance/index.html deleted file mode 100644 index 91f15d4cb2..0000000000 --- a/files/es/storage/performance/index.html +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: Rendimiento -slug: Storage/Performance -translation_of: Mozilla/Tech/XPCOM/Storage/Performance ---- -

-
-
- - mozStorage utiliza SQLite como servidor. Cuenta con el rendimiento generalmente bueno para una pequeña base de datos integrados. Sin embargo, muchas cosas causan varias operaciones de base de datos a ser lenta.
-

 

-
-

Transacciones

-

- -

 

-


- Editar la sección
-
- No hay sobrecarga asociada con cada transacción. Cuando se ejecuta una SQL de forma aislada, una transacción implícita se crea alrededor de esa declaración. Cuando las transacciones se han comprometido, sqlite es el diario que requiere la sincronización de datos en el disco. Esta operación es extremadamente lento. Por lo tanto, si usted está haciendo muchas de las transacciones en una fila, obtendrás mejoras significativas en el rendimiento de las rodea en una transacción.
-
- Si usted no está usando el almacenamiento en caché avanzadas más adelante, la caché de base de datos en memoria se borra al final de cada transacción. Esta es otra razón para utilizar las transacciones, incluso si sólo está ejecutando operaciones de lectura.
-
- El asincrónico escribe discuten a continuación elimina la mayor parte de la pena inmediata de una comisión, por lo que no notará el problema como mucho. Sin embargo, todavía hay sobrecarga, y el uso de una transacción seguirá siendo más rápido. Un gran problema es que la cola de operaciones de archivo tendrá mucho tiempo si hay muchas operaciones. Algunas operaciones requieren caminar esta cola para ver qué operaciones han estado pendientes, y que será más lento. Si el usuario cierra el navegador pronto después de hacer este tipo de operaciones, puede retrasar el apagado (posiblemente durante decenas de segundos para que un gran número de transacciones y discos lentos), lo que hace que parezca que el navegador se cuelga.

-

 

-

Consultas

-
- Edit section
-


- Reordenación de la atención de la declaración SQL, o la creación de los índices adecuada, a menudo puede mejorar el rendimiento. Véase la descripción general del optimizador sqlite en el sitio web de sqlite para información sobre cómo utiliza los índices de sqlite y ejecuta sentencias.
-
- Usted también puede tratar de la "explicar" en función de sus estados de cuenta para ver si están utilizando los índices que usted espera. Tipo de "explicar", seguido de su estado de cuenta para ver el plan. Por ejemplo, explicar select * from moz_history; Los resultados son difíciles de entender, pero usted debería ser capaz de ver si es la utilización de índices. Un comando que le dará una visión general de alto nivel es "explicar plan de consulta". Por ejemplo:

-
sqlite> explain query plan select * from moz_historyvisit v join moz_history h
-        on v.page_id = h.id where v.visit_date > 1000000000;
-
-0|0|TABLE moz_historyvisit AS v WITH INDEX moz_historyvisit_dateindex
-1|1|TABLE moz_history AS h USING PRIMARY KEY
-

Esto nos dice que primero buscará en moz_historyvisit partir de un índice, y luego buscará en moz_history utilizando la clave principal. Ambas son "buenas" porque utilizan índices y claves principales, que son rápidos.

-

 

-
sqlite> explain query plan select * from moz_historyvisit where session = 12;
-
-0|0|TABLE moz_historyvisit
-

-
-
- -

En este ejemplo, se puede ver que no está usando un índice, por lo que esta consulta podría ser muy lento.

-

-
-
- - Puede descargar la herramienta de línea de comandos desde la página de descarga sqlite. Asegúrese de tener una versión de la herramienta de línea de comandos que es al menos tan reciente como lo utiliza Mozilla. A partir del 10 de abril 2006, Mozilla usa sqlite 3.3.4, pero la última versión precompilada de las herramientas de línea de comandos no está disponible para todas las plataformas. Esto dará lugar a errores que dicen "base de datos es cifrada" porque la herramienta no es capaz de reconocer el formato de archivo. Es posible que desee comprobar la definición SQLITE_VERSION en db/sqlite3/src/sqlite3.h para la versión actual si está teniendo problemas.
-
-
-
-

 

-

-

Caché

-

 

-
- Edit section
-

 

-


- Sqlite tiene un caché de páginas de bases de datos en la memoria. Mantiene páginas relacionadas con la transacción actual por lo que puede hacer retroceder, y que además mantiene los utilizados recientemente para que pueda correr más rápido.
-
- De forma predeterminada, sólo guarda las páginas en la memoria durante una operación (si no explícitamente abierta una transacción, será abierto para usted que rodea cada declaración individual). Al final de una transacción, el caché se vacía. Si, posteriormente, iniciar una nueva transacción, las páginas que necesita se volverá a leer el disco (o esperar que el caché de sistema operativo). Esto hace que incluso bloquear las operaciones simples en los archivos del SO lecturas, que pueden ser prohibitivos en algunos sistemas con cachés de disco malo o unidades de red.
-
- Usted puede controlar el tamaño de la caché de memoria mediante el 
cache_sizepragma. Este valor controla el número de páginas del archivo que se puede guardar en la memoria a la vez. El tamaño de página se pueden establecer mediante el page_size pragma antes de que las operaciones se han realizado en el archivo. Puede ver un ejemplo de establecer el tamaño máximo de caché a un porcentaje de la memoria en nsNavHistory:: initdb en toolkit / components / places / src / nsNavHistory.cpp.

-

 

-

El almacenamiento en caché

-

 

-
- Edit section
-

 

-

Activa el modo de almacenamiento para  sqlite shared-cache mode), que hace varias conexiones a la parte misma base de datos la misma caché. Debido a que el caché no es multi-hilo, esto significa que por desgracia no se puede tener diferentes conexiones desde diferentes subprocesos el acceso a la misma base de datos. Sin embargo, la memoria caché compartida que nos permite seguir en directo entre las operaciones, en lugar de borrarlo después de cada transacción como sqlite no por defecto.

-
-
-
- Si su aplicación utiliza muchas transactons pequeña, puede obtener una mejora significativa del rendimiento al mantener el caché en vivo entre las transacciones. Esto se hace mediante el uso de un suplemento "ficticia" la conexión a la misma base de datos (es importante que utilice exactamente el mismo nombre de archivo al abrir estas conexiones según lo determinado por strcmp). La conexión ficticia mantiene una transacción perpetuamente abierta, que bloquea el caché en la memoria. Dado que el caché es compartida con la conexión principal, el caché nunca expira.
-
- La transacción debe ser un maniquí que bloquea una página en la memoria. Una simple instrucción
BEGIN TRANSACTION no hace esto porque el bloqueo no sqlite perezosamente. Por lo tanto, debe tener una declaración que modifica los datos. Puede ser tentador para ejecutar una declaración sobre la sqlite_master que contiene la información sobre las tablas e índices en la base de datos. Sin embargo, si su aplicación se está inicializando la base de datos por primera vez, esta tabla estará vacía y la caché no estará bloqueado. nsNavHistory:: StartDummyStatement crea una tabla de maniquí con un solo elemento en él para este fin.
-
- Es importante señalar que cuando una instrucción está abierta, el esquema de base de datos no pueden ser modificados. Esto significa que cuando la operación simulada se está ejecutando, no puede crear o modificar las tablas o índices, o el vacío de la base de datos. Usted tiene que parar la operación simulada, hacer la operación de modificación de esquema, y reiniciarlo.
-
-

 

-

-

-
-
- -

Escrituras en disco

-

Sqlite establece las normas básicas de la teoría ACID base de datos:

-
-
- -

-
-
- - El problema es que estos requisitos hacer algunas operaciones, especialmente compromete, muy lento. Para cada confirmación, sqlite hace dos sincroniza el disco entre muchas otras operaciones de archivo (consulte la sección "commit atómico" de http://www.sqlite.org/php2004/slides-all.html para obtener más información sobre cómo funciona esto). Estos sincroniza el disco son muy lentos y limitan la velocidad de un compromiso a la velocidad de rotación del disco mecánico.
-
- Pasar la aspiradora y cero de relleno
-
- Sqlite tiene un comando VACUUM para comprimir el espacio no utilizado de la base de datos. Sqlite funciona como un administrador de memoria o un sistema de archivos. Cuando se eliminan datos, los bytes asociados se marcan como libres, pero no se quita del archivo. Esto significa que el archivo no se reducirá, y los datos todavía pueden ser visibles en el archivo. La manera de evitar esto es ejecutar el comando de vacío para eliminar este espacio.
-
- Pasar la aspiradora es muy lenta. El comando de vacío es esencialmente la misma que la línea de comandos sqlite3 olddb. Volcado
sqlite3 olddb .dump | sqlite3 newdb; mv newdb olddb.En algunas unidades de red, pasar la aspiradora una base de datos de 10 MB ha sido el tiempo en más de un minuto. Por lo tanto, debe evitar siempre que sea posible pasar la aspiradora.
-
- Algunos artículos de bases de datos son la privacidad sensibles, como los elementos eliminados de la historia. Los usuarios tienen la expectativa de que a borrar los elementos de su historia será eliminar los restos de que a partir de la base de datos. Como resultado, Mozilla permite la bandera preprocesador
SQLITE_SECURE_DELETE en db/sqlite3/src/Makefile.in .Esta opción hace que los elementos eliminados para ser llenado con 0s en el disco. Esto elimina la necesidad de vacío, excepto para recuperar espacio en disco, y hace que muchas operaciones mucho más rápido.
-
- Zero-llenado pueden tener sobrecarga de rendimiento significativas en algunas situaciones. Por ejemplo, el servicio de la historia usa para eliminar varios elementos de base de datos cuando se apaga cuando expira elementos antiguos de la historia. Esta operación no es necesariamente lento, pero 0s escribir en el disco en un "ACI" base de datos todavía son lentos. Esto hizo que cierre muy lento porque el hilo AsyncIO bloquearía apagado (
bug 328598). tiempos de parada de más de 30 segundos fueron vistos. Como resultado, este error introducido la historia de caducidad incremental eliminando la necesidad de escribir muchas 0s en el disco en el apagado.
-
- Desafortunadamente, esta operación no puede ser controlado en un esquema por transacción o cada conexión. Algunas operaciones se beneficiarán, mientras que otros serán afectados.
-
-

 

diff --git a/files/es/temas/background/index.html b/files/es/temas/background/index.html deleted file mode 100644 index d30153f9c1..0000000000 --- a/files/es/temas/background/index.html +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: Background Themes -slug: Temas/Background -translation_of: Mozilla/Add-ons/Themes/Lightweight_themes ---- -

Cómo crear su propio fondo temático

- -
-

Los temas se componen de un archivo de imagen gráfica "de cabecera", que superpone el valor por defecto del IU de Firefox.

- -

¿Termino su diseño? Puede enviarlo ahora mismo!

- -

Creación de una Imagen Cabecera del Tema

- -

La imagen de cabecera se muestra como el fondo de la parte superior de la ventana del navegador, situado detrás de las barras de herramientas, barra de direcciones, barra de búsqueda y la barra de pestañas. Estará anclada en la esquina superior derecha de la ventana del navegador.

- -

- - - -

Requisitos de la Imagen

- - - -

Consejos

- - - -

Recursos de editores de imágenes en línea

- - - -

Creando una imagen de pie de página del tema

- -

En versiones anteriores de Firefox, o versiones más recientes con determinados complementos instalados, la imagen de pie de página se muestra como el fondo de la parte inferior de la ventana del navegador, detrás de las barras complemento. Estará anclada en la esquina inferior izquierda de la ventana del navegador. Imágenes de pie de página son opcionales.

- -

- - - -

Requisitos de la Imagen

- - - -

Consejos

- - - -

Presentar sus imagenes del tema

- -

Para empezar a enviar sus imágenes, vaya a la página de presentación de Temas:

- -
    -
  1. El nombre de su tema  elegir un nombre único para su tema. Nombres duplicados no están permitidos, por lo que puede que tenga que probar un par de veces para encontrar un nombre único.
  2. -
  3. Elija una categoría y etiquetas  seleccionar una categoría y entrar en algunas etiquetas que mejor describen su tema. Tenga en cuenta que un crítico puede rechazar su tema si es obvio que su categoría y / o etiquetas no están relacionados con su tema.
  4. -
  5. Describa su tema  escribir una breve descripción de su tema. Tenga en cuenta que un crítico puede rechazar su tema si su descripción no es una representación exacta de su tema.
  6. -
  7. Seleccione una licencia para su tema  decidir sobre una licencia de derechos de autor para su trabajo. Lea más acerca de los tipos de licencias Creative Common. -
      -
    • Importante: Por favor, asegúrese de que tiene los derechos para usar la imagen en su tema!
    • -
    -
  8. -
  9. Cargue sus imágenes  asegurarse de que son menos de 300 KB de tamaño y JPG o PNG!
  10. -
  11. Seleccione el texto y los colores de la ficha  puede elegir la pestaña ("background") color y color de texto plano que mejor funcione con su imagen de cabecera.
  12. -
  13. Vista previa de su tema  usted está listo para previsualizar su tema! Simplemente puntero del ratón sobre la imagen arriba del botón Enviar Tema y ver cómo se ve al instante.
  14. -
  15. Presentar su tema  si todo se ve bien, haga clic en el botón Enviar Tema y todo listo! Puede ver todos los temas que has sido autor en su página de perfil. -
      -
    • Consejo: para asegurarse de que su tema está aprobado para la galería, asegúrese de que cumple con las directrices de contenido y los términos de servicio!
    • -
    -
  16. -
- -

- -

Presente su Tema Ahora

-
diff --git a/files/es/temas/index.html b/files/es/temas/index.html deleted file mode 100644 index 24376902a6..0000000000 --- a/files/es/temas/index.html +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Temas -slug: Temas -tags: - - Complementos - - Temas - - Todas_las_Categorías -translation_of: Mozilla/Add-ons/Themes ---- -

 

-
Primeros pasos
Para quienes quieren crear un tema y no saben cómo.
-

Los Temas son skins (apariencias) para las aplicaciones Mozilla. Te permiten cambiar la apariencia de la interfaz de usuario y personalizarlo a tu gusto. Un tema puede cambiar simplemente el color de la UI o puede cambiar toda su apariencia.

-
- -

Documentación

Creando un tema para Firefox
Para crear un tema para Firefox necesitaras saber tres cosas. Cómo editar imágenes, como extraer archivos zip, y como modificar CSS.
Empaquetar un Tema
Como empaquetar temas para Firefox y Thunderbird.
Cambios del tema en Firefox 2
¿Creaste un tema para Firefox 1.5, y ahora quieres actualizarlo para que funcione correctamente en Firefox 2?
Installing Extensions and Themes From Web Pages (en)
There are a variety of ways you can install Extensiones and Temas from web pages, including direct linking to the XPI files and using the InstallTrigger object.

;{{ mediawiki.external('http://cheeaun.phoenity.com/weblog/2004/12/first-steps-in-theme-design.html First steps in theme design (en)') }} :

Ver todos...

Comunidad

  • DesarrollMDNo Mozilla en los foros de Mozilla-ES.
  • View Mozilla forums...

{{ DiscussionList("dev-themes", "mozilla.dev.themes") }}

Ver todos...

Herramientas

Ver todos...

Temas relacionados

CSS
-

Categorías

-

Interwiki Language Links

-

 

-

 

-

{{ languages( { "de": "de/Themes", "en": "en/Themes", "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/es/temas/theme_concepts/index.html b/files/es/temas/theme_concepts/index.html deleted file mode 100644 index 1f096e9586..0000000000 --- a/files/es/temas/theme_concepts/index.html +++ /dev/null @@ -1,231 +0,0 @@ ---- -title: Conceptos de los temas -slug: Temas/Theme_concepts -translation_of: Mozilla/Add-ons/Themes/Theme_concepts ---- -
{{AddonSidebar()}}
- -

Los temas desarrollados con la API WebExtensions en Firefox le permiten cambiar el aspecto del navegador al agregar imágenes al área del encabezado del navegador Firefox; este es el área detrás de la barra de menú, las barras de herramientas, la barra de direcciones, la barra de búsqueda y la barra de pestañas.

- -

Estas opciones de tema se pueden implementar como temas estáticos (aunque las imágenes del tema pueden ser animadas) o como temas dinámicos creados en una extensión del navegador

- -
-

If you have a lightweight theme it will be converted to this new theme format automatically before lightweight themes are deprecated. You do not need to port your theme. However, please feel free to update your themes to use any of the new features described here.

-
- -

Static themes

- -
-

Note that you can't yet submit static WebExtension-based themes to addons.mozilla.org. The work to support this is tracked in https://github.com/mozilla/addons/issues/501. If you want to share a theme with other users, you'll need to make it either a lightweight theme or a dynamic theme.

-
- -

Static themes are specified using the same resources as a browser extension: a manifest.json file to define the theme components with those components stored in the same folder as the manifest.json file or a sub folder. These resources are then packed in a zip for publication on addons.mozilla.org (AMO).

- -
-

A theme and browser extension functionality cannot be defined in one package, such as including a theme to complement an extension. You can, however, programmatically include a theme in an extension using the Theme API. See Dynamic themes.

-
- -

Defining a theme

- -

To create a theme (in this example a simple, single image theme):

- - - -

Static theme approaches

- -

There are two approaches you can take to theming the header area of Firefox: using a single image or using multiple images. You could combine the two, but it’s easier to treat them separately.

- -

Single image themes

- -

This is the basic or minimal theming option, where you define:

- - - -

The area your header image needs to fill is a maximum of 200 pixels high. The maximum image width is determined by the resolution of the monitor Firefox is displaying on and how much of the monitor Firefox is using. Practically, this means you would need to allow for a width of up to 5120 pixels wide (for the next generation of 5k monitors). However, rather than creating a very wide image, a better approach is to use a narrower image with a transparent left edge so that it fades to the background color. For example, we could use this image
- An image of a weta (the common name for a group of about 70 insect species in the families Anostostomatidae and Rhaphidophoridae, endemic to New Zealand) with the left edge fading to total transparency.
- combined with a complementary background color, to create this effect in the header
- A single image theme using the weta.png image

- -

See details about this theme in the themes example weta_fade.

- -

Obviously, you can still provide a single wide image if you prefer.

- -

Multiple image themes

- -

As an alternative to creating a single image theme, you have the option to use multiple images. These images can be individually anchored to locations within the header, with the option to apply tiling to each image.

- -

Depending on the effect you want to create you may need to suppress the mandatory "headerURL": image with an empty or transparent image. You would use an empty or transparent image if, for example, you wanted to tile a centrally justified image, such as
- An image of a weta (the common name for a group of about 70 insect species in the families Anostostomatidae and Rhaphidophoridae, endemic to New Zealand) with the left and right edges fading to total transparency.
- to create this effect
- A single image theme using the additional images option to align an image to the center of the heading and tile it.
- Here you specify the weta image like this:

- -
"images": {
-  "headerURL": "empty.png",
-  "additional_backgrounds": [ "weta_for_tiling.png"]
-},
- -

and the images tiling with:

- -
"properties": {
-  "additional_backgrounds_alignment": [ "top" ],
-  "additional_backgrounds_tiling": [ "repeat"  ]
-},
- -

Full details of how to setup this theme can be found in the themes example weta_tiled. Full detais of the alignment and tiling options can be found in the "theme" key description.

- -

Alternatively, you can use multiple images, say combining the original weta image with this one anchored to the left of the header
- An image of a weta (the common name for a group of about 70 insect species in the families Anostostomatidae and Rhaphidophoridae, endemic to New Zealand) with the right edge fading to total transparency.
- to create this effect
- A theme using the additional images option to place two mirrored image to the left and right of the browser header.

- -

Where the images are specified with:

- -
"images": {
-  "headerURL": "empty.png",
-  "additional_backgrounds": [ "weta.png", "weta-left.png"]
-},
- -

and their alignment by:

- -
"properties": {
-  "additional_backgrounds_alignment": [ "right top" , "left top" ]
-},
- -

Full details of how to setup this theme can be found in the themes example weta_mirror. Full detais of the alignment options can be found in the "theme" key description.

- -

Static animated themes

- -

It is possible to create an animated theme using an APNG format image, as in the themes example animated. However, remember that rapid animations, such as the one in the example might be too distracting for a practical theme.

- -

You can also animate themes programmatically, which we discuss in Dynamic themes.

- -

Dynamic themes

- -

As an alternative to defining a static theme, you can use the {{WebExtAPIRef("theme")}} API to control the theme used in Firefox from within a browser extension. There are a couple of use cases for this option:

- - - -

And, obviously, you can combine the two and bundle a programmatically controlled theme with your extension.

- -

Using the {{WebExtAPIRef("theme")}} API is straightforward. First, request "theme" permission in the extension's manifest.json file. Next, you build a JSON object containing the same information you would use in a static theme’s manifest.json, Finally, pass the JSON object in a {{WebExtAPIRef("theme.update()")}} call.

- -

For example, the following code, from the dynamic theme example defines the content for the day and night elements of the dynamic theme:

- -
const themes = {
-  'day': {
-    images: {
-     headerURL: 'sun.jpg',
-    },
-    colors: {
-     accentcolor: '#CF723F',
-     textcolor: '#111',
-    }
-  },
-  'night': {
-    images: {
-     headerURL: 'moon.jpg',
-    },
-    colors: {
-     accentcolor: '#000',
-     textcolor: '#fff',
-    }
-  }
-};
- -

The theme.Theme object is then passed to {{WebExtAPIRef("theme.update()")}} to change the header theme, as in this code snippet from the same example:

- -
function setTheme(theme) {
-  if (currentTheme === theme) {
-    // No point in changing the theme if it has already been set.
-    return;
-  }
-  currentTheme = theme;
-  browser.theme.update(themes[theme]);
-}
- -

Learn more about dynamic themes and see an additional example in the following video:

- -

{{EmbedYouTube("ycckyrUN0AY")}}

- -

 

- -

If you have not built a browser extension before, check out Your first extension for a step-by-step guide.

- -

Cross browser compatibility

- -

There is currently limited compatibility between themes in the major browsers. Opera takes an entirely different approach, and Microsoft Edge themes are not yet open to developers.

- -

There is some compatibility between Firefox static themes and Chrome themes, providing the ability to port a single header image theme from Firefox to Chrome. This would be done by amending the manifest.json keys as follows:

- - - -

Noting that "frame": and "tab_text": support RGB color definition only.

- -

So, in the single image theme example (weta_fade) could be supported in Chrome using the following manifest.json file:

- -
{
-  "manifest_version": 2,
-  "version": "1.0",
-  "name": "<your_theme_name>",
-  "theme": {
-    "images": {
-      "theme_frame": "weta.png"
-    },
-    "colors": {
-      "frame": [ 173 , 176 , 159 ],
-      "tab_text": [ 0 , 0 , 0 ]
-    }
-  }
-}
- -

However, there will be a couple of differences:

- - - -

The basic theme example using the Chrome compatible manifest.json keys, showing the differences in how those keys are implemented.

- -

For more information, see the notes on Chrome compatibility.

diff --git a/files/es/thunderbird_localization/index.html b/files/es/thunderbird_localization/index.html deleted file mode 100644 index 18dc50a274..0000000000 --- a/files/es/thunderbird_localization/index.html +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Localización de Thundebird -slug: Thunderbird_Localization -tags: - - Localización - - Thunderbird 3 - - Traducción - - thunderbird -translation_of: Mozilla/Projects/Thunderbird/Thunderbird_Localization ---- -

Esta página está dirigida a todos los traductores (tanto presentes como futuros) de Thunderbird, el cliente de correo electrónico y grupos de noticias de Mozilla. Esta página abarca muchos aspectos que un traductor de Thunderbird debe tener en cuenta, como por ejemplo, conocer las herramientas necesarias y saber cómo obtener información sobre los eventos de traducción más importantes, así como otros artículos de interés.

- -

Crear una localización de Thundebird

- -

Crear una nueva localización (Mercurial) - En este artículo se describe cómo puedes crear una nueva localización para Thunderbird.

- -

Sobre los repositorios y las ramas

- -

Hay 3 repositorios activos para el desarrollo de Thunderbird. El trabajo de desarrollo de Thunderbird se fusiona de una rama a otra cada seis semanas.

- - - -

La mayoría de los localizadores trabajan en la rama comm-aurora. En lo que se refiere a las cadenas, este repositorio/rama se mantiene estable durante un período de seis semanas. Cuando se finaliza aquí el trabajo significa que está listo para la primera beta y no tendrás que trabajar la rama beta. Tu trabajo, a partir de este punto, se llevara a la versión final de Thunderbird automáticamente.

- -

Requisitos de localización

- -

No hay restricciones importantes sobre los cambios que pueden realizar los traductores. Sin embargo, tenemos que trabajar juntos para proporcionar los motores de búsqueda adecuados a los usuarios de Thunderbird y conseguir un equilibrio perfecto entre los motores de búsqueda y su conjunto de opciones. Para más información, puedes consultar esta página.

- -

Panel de localización.

- -

El panel de localización de Thunderbird proporciona a los localizadores una visión precisa del estado actual de sus localizaciones. Puedes ver más información detallada en la página del panel de localización.

- -

Las traducciones se añaden al panel de localización a petición cuando se ha alcanzado un alto nivel de finalización (> 80%), tal y como se muestra por la salida compare-locales. Para solicitar que se añada una traducción al panel de localización, abre una nueva incidencia en el producto Thunderbird, en el componente Build Config.

- -

Obtener información relevante sobre la localización de Thunderbird

- -

Grupos de noticias y Listas de correo

- -

Los traductores de Thunderbird deben leer los grupos de noticias de localización (mozilla.dev.l10n.announce mozilla.dev.l10n) para estar informados de los temás de Thunderbird que les puedan resultar interesantes, tanto los más específicos como los generales. Tambien se les anima a leer el grupo de noticias de desarrollo de Thunderbird (mozilla.dev.apps.thunderbird) para mantenerse informado de las últimas novedades relacionadas con el desarrollo de Thunderbird.

- -

También se puede acceder a estos grupos de noticias a través de las listas dev-l10n-announce@lists.mozilla.org y dev-l10n@lists.mozilla.org (listas de correo de localización) o de la lista de correo dev-apps-thunderbird@lists.mozilla.org (lista de correo de desarrollo), que reflejan los grupos de noticias mencionados anteriormente. Puedes suscribirte o darte de baja de estas listas de correo a través de la interfaz web que se encuentra en lists.mozilla.org.

- -

Bugzilla

- -

Los localizadores deberían echarle un vistazo a la dirección de correo thunderbird@localization.bugs (o a su alias :tb-l10n) para mantenerse informados de los bugs que puedan afectar a la localización de Thunderbird. Para poder acceder a ella, solo tienes que añadir la dirección de correo a la sección "User Watching" de tus preferencias de correo en bugzilla.

- -

Algunos enlaces útiles

- - - -

Locale Tiers

- -

Los niveles de traducción reflejan las traducciones que necesitan estar en un buen estado para su liberación. Hay 10 traducciones en el nivel 1, que son las más importantes para Thunderbird debido al número de usuarios de Thunderbird o a su potencial de crecimiento.

- -

Estas localizaciones se tratan como ciudadanos de primera clase, son igual de importantes que la locale es-US, lo que quiere decir que cualquier traducción de nivel 1 que no cumpla los requisitos mínimos puede bloquear una versión final de Thunderbird.

- -

Nivel 1

- -

Las siguientes localizaciones son P1 (prioridad 1) en orden de prioridad:

- -
* de             -  Alemán
-* fr             -  Fracnés
-* ja, ja-JP-mac  -  Japonés
-* en-GB          -  Inglés británico
-* es-ES          -  Español (Continente europeo)
-* it             -  Italiano
-* pl             -  Polaco
-* ru             -  Ruso
-* nl             -  Holandés
-* pt-BR          -  Portugués brasileño
-
- -

Nivel 2

- -

El resto de localizaciones admitidas se encuentra en la categoria Nivel 2.

diff --git a/files/es/tools/webide/index.html b/files/es/tools/webide/index.html deleted file mode 100644 index e2a8c54122..0000000000 --- a/files/es/tools/webide/index.html +++ /dev/null @@ -1,298 +0,0 @@ ---- -title: WebIDE -slug: Tools/WebIDE -translation_of: Archive/WebIDE ---- -
-

WebIDE está disponible desde Firefox 34 en adelante.

- -

También puede habilitarlo en Firefox 33, modificando una opción: Visite about:config, encuentre la opción llamada devtools.webide.enabled y cambie su valor a true.

-
- -
-

WebIDE es el sustituto de App Manager. Al igual que App Manager, este permite ejecutar y depurar aplicaciones Firefox OS  utilizando el Firefox OS Simulator o un dispositivo Firefox OS real.

- -

Además, proporciona un entorno de edición para crear y desarrollar aplicaciones para FireFox OS, incluye una vista de árbol jerárquica de todos los archivos de la aplicación con la posibilidad de editarlos y grabar los cambios realizados, y también dos plantillas de aplicación para ayudar a comenzar a desarrollar.

- -

Por último, WebIDE le permite conectarse a Firefox Developer Tools (Herramientas de Desarrollo Firefox) a otros navegadores, incluyendo Firefox para Android, Chrome para Android, y Safari para iOS. Vea la página de Remote Debugging (Depuración Remota) para instrucciones de como conectar con un navegador específico.

-
- -

Con WebIDE, primero configura uno o varios runtimes. Un runtime es un entorno en el que podrás ejecutar y depurar la aplicación. Un runtime podría ser un dispositivo Firefox OS conectado al escritorio a través de USB, o podría ser un Simulador de Firefox OS instalado en el propio escritorio.

- -

Luego, cree una aplicación, o abra una aplicación existente. Si está creando una nueva aplicación, empiece con una plantilla que incluya la estructura y el contenido mínimo que necesita para empezar, o una plantilla más completa que muestre cómo utilizar una API privilegiada. WebIDE muestra los archivos de su aplicación en un árbol, que se pueden editar y guardar usando su editor de código incorporado. Por supuesto, usted no tiene que utilizar el editor integrado: puede desarrollar su aplicación completamente fuera del WebIDE, y sólo utilizarlo para la depuración.

- -

Finalmente, puede instalar la aplicción en uno de los runtimes y ejecutarla. Usted puede abrir la suite de herramientas para desarrolladores - el Inspector, la Consola, el JavaScript Debugger (Depurador de JavaScript), etc. - para examinar y modificar la aplicación en ejecución.

- -

Requisitos del Sistema

- -

Para desarrollar y depurar aplicaciones utilizando la WebIDE, todo lo que necesita es Firefox versión 33 o posterior. Para hacer pruebas en un dispositivo de Firefox OS real, necesita un dispositivo que ejecute Firefox OS 1.2 o posterior, y un cable USB.
-
- Sólo se puede utilizar el WebIDE si usted está pensando en Firefox OS 1.2 o posterior.

- -

Ejecutando WebIDE

- -

Hay tres maneras de abrir WebIDE:

- - - -

- -

Así es como luce WebIDE:El menú desplegable de la izquierda con la etiqueta "Abrir aplicación" (Open App) le permite abrir aplicaciones existentes o crear otras nuevas. El menú desplegable de la derecha con la etiqueta "Seleccionar Runtime" (Select Runtime) le permite seleccionar un runtime o configurar uno nuevo.
-
- Los botones en el medio ejecutan, detienen, y depuran la aplicación: sólo se activan cuando se ha abierto una aplicación y se selecciona un runtime.

- -

Desde Firefox versión 36, puede cambiar el tamaño de la fuente de todo el WebIDE usando los atajos de teclado estándares (Use Command en vez de Control en OS X):

- - - -

Configurando runtimes

- -

En el el menú desplegable "Seleccione Runtime", los rumtimes se agrupan en tres tipos:

- - - -

La primera vez que hace clic en el menú desplegable, es posible que no vea los runtimes aquí:

- -

El resto de esta sección describe cómo se pueden agregar algunos runtimes.

- -

Conectando un dispositivo Firefox OS

- -

Antes de conectar un dispositivo Firefox OS, algunas configuraciones que debes revisar:

- - - -
-

Solo Linux :

- - -
- -
-

Solo Windows:

- - -
- -

Si existe otro dispositivo Android conectado a tu ordenador, desconectelo(s). Ahora conecta el dispositivo al ordenador mediante el USB. Tu podrás ver que tu dispositivo aparecer bajo "USB DEVICES":

- -

- -

Si no visualizas el dispositivo, dirigete a la página Solucionador de problemas.

- -

Añadiendo un Simulador

- -

Firefox OS Simulator es una versión de altas capas de Firefox OS que simula un dispositivo Firefox OS, pero se ejecuta runs en el escritorio. Corre en una ventana del mismo tamaño de un dispositivo Firefox OS, incluye la interface de usuario Firefox OS, una terminal de construcción built-in apps, y simula varios APIs para dispositivos Firefox OS.

- -

Esto significa que en muchos casos, no necesitas un dispositivo real para probar y depurar su app.

- -

El Simulator es grande, tanto que no se desplaza al interior de Firefox sino como un Firefox add-on. Si oprime "Install Simulator" en el menú Runtimes dropdown, irá a la página desde la cual puede instalar Simuladores para varias versiones de Firefox OS.

- -

Lo puede instalar tantas veces como quieras. Sea paciente: el Simulador es grande y puede llevar unos minutos para descargarlo. Una vez ha instalado algunos Simuladores, puede cerrar la ventana de "Componentes Extra", y los simuladores que ha instalado aparecerán como opciones en el menú desplegable del runtime.

- -

Para aprender más sobre el Simulador, mire su página de documentación.

- -

Runtimes personalizados

- -

Con un runtime personalizado puede usar on nombre de host un un puerto arbitrario para conectarte a un dispositivo remoto.

- -

Bajo el capó, los dispositivos con el SO Firefox y Android se conectan al escritorio llamado Android Debug Bridge (Puente de Depuración Android), o ADB. Por defecto, el WebIDE usa un complemento llamado ADB Helper: esto simplifica el proceso para usted, puesto que instala el ADB y configura un puerto para que el escritorio de herramientas de Firefox pueda intercambiar mensajes con el dispositivo.

- -

Esto es conveniente en la mayoría de casos, pero a veces querrá usar el ADB fuera del WebIDE: por ejemplo, podría estar usando el ADB directamente desde línea de comandos. En ese caso, se conectará al dispositivo especificando un host y puerto, usando el  comando adb forward.

- -

Si, entonces, quiere conectar el WebIDE también, debería desactivar el complemento ADB Helper y conectar el WebIDE usando la opción de Runtime personalizado, introduciendo el host y puerto que has pasqdo a adb forward.

- -

Tampoco, ADB Helper permite aún conectar a Firefox para Android, así si quiere conectar WebIDE a Firefox para Android, necesitará establecer su propio puerto forwarding y usar la custom runtime. Ver más sobre conexión a Firefox para Android usando ADB.

- -

Seleccionando un runtime

- -

Una vez haya configurado un runtime, puede seleccionarlo usando el menú "Select Runtime" (Seleccionar runtime).

- - - -

Ahora el botón "play" en el centro de la barra de herramientas del WebIDE está habilitado: clícalo para instalar y ejecutar la app en el runtime seleccionado.

- -

Acciones de los runtime

- -

Cuando un runtime es seleccionado, el menú desplegable de Runtimes tendrá tres objetos extras:

- - - -

- -

- -

Creando y abriendo apps

- -

En el menú "Open App" (Abrir App) tiene tres opciones: crear una nueva app, abrir una app empaquetada y abrir una app como anfitrión.

- -

- -

Crear una nueva app

- -

Seleccione "New App..." (Nueva App...) para crear una nueva app. Verá una ventana ofreciéndole dos opciones de plantillas, "App Privilegiada y vacía" y "App Privilegiada".

- -

- -

Ambas plantillas son de la colección de plantillas para apps de Mozilla, y le proporcionan la estructura básica que necesita para empezar. La "App Privilegiada" muestra cómo una app puede usar permisos para cargar contenido cross-origin.

- -

Una vez haya seleccionado una plantilla, deberá poner un nombre a la app y seleccionar un directorio para guardar los archivos, y luego la app será abierta en el editor de proyectos.

- -

Abrir una app empaquetada

- -

Seleccione "Open a Packaged App..." (Abrir una app empaquetada) para abrir una app empaquetada. Deberá seleccionar un directorio que contenga el  manifiesto de la app, y esta se abrirá en el editor de proyecto.

- -

Abrir una app alojada

- -

Seleccione "Open Hosted App..." (Abrir una app alojada) para abrir una app alojada. Deberá introdducir la URL apuntando al manifiesto de la app, y esta se abrirá en el editor de proyecto

- -

Editando apps

- -

El editor de proyecto proporciona un entorno para edición de apps. Hay una visión en arbol a la izquierda con todos los archivos en la app: puedes añadir y borrar archivos usando un menú contextual. Hay un panel de editor a la derecha.

- -

La página sumario de la app

- -

Cuando por primera vez abra una app, el panel del editor estará ocupado por la página sumario de la app, mostrada debajo:

- -

- -

Puede volver siempre a la página de sumario de la app clicando en la raíz del árbol en la izquierda.

- -

Validación del manifiesto

- -

WebIDE automáticamente comprueba el manifiesto por algunos problemas comunes. Si encuentra algún problema, indicará que la app es inválida, y describirá el problema en el sumario de la app.

- -

- -

Por supuesto, puede editar el archivo manifest.webapp directamente en el editor de proyecto.

- -

El editor fuente

- -

WebIDE usa el editor fuente CodeMirror.

- -

Atajos de teclado del editor fuente

- -

{{ Page ("en-US/docs/tools/Keyboard_shortcuts", "source-editor") }}

- -

Autocompletado de código

- -

Cuando se edite CSS y JavaScript, el editor proporciona sugerencias de autocompletado. El autocompletado en CSS está siempre habilitado:

- -

Para mostrar las sugerencias de autocompletado en JavaScript, pulse Control + Espacio:

- -

- -

Documentación en línea

- -

El editor también muestra documentación en línea para JavaScript. Pulsa Shift + Espacio para ver un popup con el contenido de la documentación para el símbolo en el que su cursor está sobrevolando:

- -

- -

Clicando el link [docs] en el popup le llevará a la página MDN para el símbolo.

- -

Guardando archivos

- -

Para que los cambios en sus archivos tengan efecto necesitas guardarlos. Los archivos no guardaddos tendrán un asterisco junto a su nombre en la vista de árbol, y podrá guardarlos usando el menú o con Control+S (Command+S en Mac OS X).

- -

Borrando proyectos

- -

Para borrar una app del WebIDE, vaya a la págnia de sumario de la app y clique "Remove Project" (Borrar Proyecto).

- -

Ejecutando y depurando apps

- -

Cuando esté preparado para ejecutar la app, necesitará seleccionar un runtime del menú desplegable "Select Runtime". Si no tiene ningún runtime disponible, compruebe cómo se añaden algunos runtimes en Configurando runtimes.

- -

El botón "play" en el centro de la bara de herramientas de WebIDE está habilitado ahora: clique para instalar y ejecutar la app en el runtime seleccionado:

- -

Para depurar la app, da click en el botón de Pausa y las herramientas de la Toolbox de Desarrollador aparecerá, conectada a su app:

- -

Exactamente, cuáles tools herramientas tiene disponibles depende del runtime, pero tendrá al menos las básicas:  Inspector, Console, JavaScript Debugger, Style Editor, Profiler y Scratchpad. Tal como en una página web, algunos cambios que haga con las herramientas son visibles inmediatamente en la app, pero no son permanentes. Al contrario, algunos cambios que haga en el panel de editor pane pueden ser grabados como respaldo definitivo del disco, pero no son visibles sin reiniciar la app.

- -

Depurando apps certificadas

- -

Con el Simulador, si le das click en el menu desplegable de la aplicación mientras el tiempo de ejecucion esta seleccionado , puedes ver y depurar no solo tu aplicacion, sino todas las que esten corriendo en tiempo de ejecucion, incluidas las apps certificadas:

- -

- -


- Pero, para depurar certified apps en un dispositivo real:

- - - -

Para habilitar la depuración certified app, conéctese al proceso runtime, y entonces, en el menú, vaya a Runtime > Runtime Info. Desde allí, si ve "DevTools restricted privileges: yes", esto significa que las certified apps no pueden ser depuradas. La ruta entonces difiere dependiendo de que depuración usted enfreta:

- - - -

Ahora (o después del reinicio de B2G desktop client) en WebIDE podrá ver todas las certified apps del dispositivo.

- -

Monitoriando desempeño

- -

Si le intereza la ejecución de sus apps, hay maneras de medir su impacto en la ejecución runtime en WebIDE:

- - - -

Corrección de problemas

- -

Si tiene algunos problemas trabajando con WebIDE, vea la página Troubleshooting.

- -

 

- -

 

diff --git a/files/es/tools/webide/monitor/index.html b/files/es/tools/webide/monitor/index.html deleted file mode 100644 index c48c5a8d06..0000000000 --- a/files/es/tools/webide/monitor/index.html +++ /dev/null @@ -1,158 +0,0 @@ ---- -title: Monitor -slug: Tools/WebIDE/Monitor -translation_of: Archive/WebIDE/Monitor ---- -
-

El WebIDE Monitor es una herramienta de datos de propósito general diseñada para ayudar a controlar el desempeño de las aplicaciones y dispositivos Firefox OS.

-
- -

The WebIDE Monitor

- -

El Monitor es capaz de mostrar gráficos interactivos en tiempo real para visualizar series de tiempo.

- -

Gráficos disponibles

- -

El Monitor viene con algunos gráficos diferentes. Ellos se muestran usualmente una vez que el WebIDE es conectado a un Firefox OS runtime.

- -

Selección de medida única

- -

Unique Set Size

- -

Este gráfico muestra el footprint de la memoria de todos los procesos de Firefox OS a través del tiempo. Si quieres saber el consumo de memoria de una app de Firefox OS, lanzalo y podrás ver la memoria privada usada por el proceso.

- -

Mostrando tus propios datos

- -

Es relativamente fácil mostrar cualquier tipo de dato en el Monitor, porque acepta actualizaciones de forma-libre desde muchos orígenes diferentes.

- -

Desde un dispositivo Firefox OS

- -

Es posible enviar datos desde un dispositivo conectado enviando notificaciones de observación.

- -

Nota: Si quieres hacer esto en una  aplicación certificada, por favor sigue las siguientes instrucciones.

- -

JavaScript

- -

Services.obs.notifyObservers(null, 'devtools-monitor-update', data);

- -

Puedes enviar datos desde cualquier código Javascript con privilegios de chrome. Aqui hay un ejemplo completo midiendo el run time de un codigo en Javascript:

- -

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);

- -

Puedes enviar datos desde cualquier parte en Gecko. Aqui hay un ejemplo completo midiendo el run time de un codigo:

- -

#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());
- }

- -

Desde el computador

- -

Puedes facilmente enviar datos al Monitor sobre un servidor WebSocket. Esto puede ser útil si estás escribiendo una extensión para Firefox, una herramienta de línea de comandos o un servicio web..

- -

Por defecto, el Monitor busca un servidor corriendo en el puerto 9000 de tu computador. Puedes cambiar esto actualizando las preferencias en devtools.webide.monitorWebSocketURL.

- -

Incluso puedes hacer que acepte datos desde tu red local, o desde cualquier parte de Internet.

- -

Node.js

- -

TODO

- -

Python

- -

TODO

- -

Formatos soportados

- -

El Monitor acepta datos en formato de objetos JSON que generalmente lucen similares a esto:

- -

{
-   "graph": "myGraph",
-   "curve": "myCurve",
-   "value": 42,
-   "time": 1234567890
- }

- -

Ese formato está destinado a ser muy flexible. Si no existe un gráfico o curva especificada , se creará automáticamente.

- -

Nombres arbitrarios

- -

Las entradas no reconocidas serán consideradas como curvas de nombre y valor.

- -

El paquete de datos más pequeño que puedes enviar es algo como:

- -

{ "myCurve": 42 }

- -

Esto añadirá un punto de datos para "myCurve" en un gráfico sin nombre. El tiempo faltante será por defecto cuando el monitor recibe el paquete .

- -

Para mayor precisión, es probablemente mejor especificar un timestamp para tus datos:

- -

{
-   "current": 60,

-   "voltage": 500,
-   "time": 1234567890
- }

- -

Multiples variables

- -

En una simple actualización, puedes enviar datos para multiples curvas:

- -

{
-   "graph": "myGraph",
-   "myCurve1": 50,
-   "myCurve2": 300,
-   "myCurve3": 9000,
-   "time": 1234567890
- }

- -

O varios puntos de datos para una sola curva:

- -

{
-   "graph": "myGraph",
-   "curve": "myCurve",
-   "values": [
-     { "time": 1234567890, "value": 42 },
-     { "time": 1234567981, "value": 51 }
-   ]
- }

- -

Múltiples actualizaciones

- -

Y también puedes enviar multiples actualizaciones de datos en forma de un Array:

- -

[
-   { "graph": "Memory", "time": 1234567890, "System": 2600, "My App": 1000 },
-   { "graph": "Power", "time": 1234567890, "current": 60, "voltage": 500 }
- ]

- -

Eventos puntuales

- -

Para marcar eventos especiales en un gráfico con una barra vertical, agrega una clave event a tu actualización:

- -

{
-   "graph": "myGraph",
-   "event": "myEvent",
-   "time": 1234567980
- }

diff --git a/files/es/tools/webide/troubleshooting/index.html b/files/es/tools/webide/troubleshooting/index.html deleted file mode 100644 index 73d94afd9a..0000000000 --- a/files/es/tools/webide/troubleshooting/index.html +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Resolución de problemas con WebIDE -slug: Tools/WebIDE/Troubleshooting -translation_of: Archive/WebIDE/Troubleshooting ---- -

Conectando un dispositivo Firefox OS

-

Si estas intentando conectar un dispositivo Firefox OS a WebIDE y no aparece, aquí hay una serie de cosas que puedes probar

- -

Desarrollo limitado (incluyendo aplicaciones certificadas, aplicaciones incorporadas, aplicaciones ya instaladas en un dispositivo)

-

Si no puedes desarrollar aplicaciones certificadas, aplicaciones incorporadas, o aplicaciones instaladas en un dispositivo real, entonces puede que estés siendo restringido sobre la política de seguridad de privilegios de WebIDE's . Para mas información, acceda a la sección Desarrolo no restringido de aplicaciones (incluyendo aplicaciones certificadas, procesos principales, etc.).

-

Conectando a otros navegadores (Chrome, Safari)

-

WebIDE hace el uso de Valence (Adaptador Formal de Herramientas de Firefox ) para comunicarse con otros navegadores, como Chrome and Safari. 

-

Si esta teniendo problemas al conectarse a estos otros navegadores, revisa los pasos de configuración y otras anotaciones para estos navegadores en la página Valence.

-

Activando el log

-

También puedes activar el logging para recompilar información de diagnostico:

-
    -
  1. accede a about:config, y añade una nueva preferencia llamada .console.logLevel, con el valor de String all, y establece extensions.adbhelper@mozilla.org.debug a true
  2. -
  3. En el Add-ons Manager, desactiva y reactiva el add-on ADB Helper.
  4. -
  5. Abre la Consola del navegador y veras mensajes de consola con el prefijo adb. Si el mensaje no te dice nada, busca ayuda.
  6. -
-

Obtén ayuda

-

Accede a #devtools cuarto en IRC y nosotros te ayudaremos.

diff --git a/files/es/uso_de_nsiloginmanager/index.html b/files/es/uso_de_nsiloginmanager/index.html deleted file mode 100644 index 785f9e8681..0000000000 --- a/files/es/uso_de_nsiloginmanager/index.html +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: Uso de nsILoginManager -slug: Uso_de_nsILoginManager -tags: - - Firefox 3 - - Interfaces - - Todas_las_Categorías - - páginas_a_traducir -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">
-  Please log in.
-  Username: <input type="text"     name="uname">
-  Password: <input type="password" name="pword">
-  </form>
-  
-
- -

Creating a site authentication login

- -
 var authLoginInfo = new nsLoginInfo('http://www.example.com',
-                       null, 'ExampleCo Login',
-                       'alice', 'SeCrEt321', null, null);
-
- -

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',
-                      'User Registration', null,
-                      'bob', '123sEcReT', null, null);
-
- -

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.

- -

Almacenar una contraseña

- -

Para almacenar una contraseña en el Gestor de Accesos, primero necesitas crear un objeto nsILoginInfo como se define arriba. Entonces simplemente necesitas llamar al método nsILoginManager addLogin().

- -
 myLoginManager.addLogin(loginInfo);
-
- -

Esto provocará una excepción si tanto el parámetro httprealm como el parámetro formSubmitURL son NULL. Uno debe ser especificado cuando se almacena una contraseña. Los parámetros hostname, username y password también son obligatorios.

- -

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);
- -

Depuración

- -

La implementación del gestor de accesos tiene la capacidad de enviar mensajes de depuración a la Consola de Errores, lo que puede provocar algo de visibilidad en lo que se está haciendo. Para habilitar la depuración de accesos, véase http://wiki.mozilla.org/Firefox:Pass...ager_Debugging.

- -

Soporte de versiones anteriores de Firefox

- -

Si quieres implementar tu extensión para que soporte Firefox 3 y versiones anteriores será necesario implementar tanto el componente nsILoginManager como el componente nsIPasswordManager. Un método simple para hacer ésto se expone a continuación:

- -
if ("@mozilla.org/passwordmanager;1" in Components.classes) {
-   // El gestor de contraseñas existe así que no es Firefox 3 (puede ser Firefox 2, Netscape, SeaMonkey, etc).
-   // Código del gestor de contraseñas
-}
-else if ("@mozilla.org/login-manager;1" in Components.classes) {
-   // El gestor de accesos existe así que es Firefox 3
-   // Código del gestor de accesos
-}
-
diff --git a/files/es/venkman/index.html b/files/es/venkman/index.html deleted file mode 100644 index eb55384f38..0000000000 --- a/files/es/venkman/index.html +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: Venkman -slug: Venkman -tags: - - Desarrollo_Web - - 'Desarrollo_Web:Herramientas' - - 'Extensiones:Herramientas' - - JavaScript - - 'JavaScript:Herramientas' - - Todas_las_Categorías - - Venkman - - extensiones -translation_of: Archive/Mozilla/Venkman ---- -

 

-

Venkman es el nombre en código del depurador de JavaScript de Mozilla. Su objetivo es proporcionar un poderoso entorno de depuración de JavaScript para navegadores basados ​​en Mozilla es decir, Firefox, Netscape 7.x/9.x y SeaMonkey. Ten en cuenta que no está incluido en los navegadores basados ​​en Gecko como K-Meleon, Netscape 8.x y Galeon. Venkman se ofrece como parte de la distribución de instalación de Mozilla desde octubre de 2001, así como un paquete de extensiones en formato XPI.

- -

Documentación

-
Introducción a Venkman
Una visión general y algunos ejemplos prácticos del uso del depurador de JavaScript en el desarrollo web.
-
-
Utilizar puntos de rutura en Venkman
Este artículo describe los puntos de interrupción en JavaScript y cómo utilizar Venkman para establecerlos y examinarlos.
-
-
Conocer el depurador de JavaScript Venkman
Escrito por Svend Tofte para los programadores de JavaScript que no están familiarizados con otras herramientas de depuración.
-
-
Preguntas frecuentes sobre Venkman
Respuestas a preguntas comunes sobre Venkman.
-
-
Información interna acerca de Venkman
Notas sobre el código fuente de Venkman.
-
-
Página de desarrollo de Venkman
Novedades y lanzamientos anteriores.
-

Breve historia

-

En 1998, John Bandhauer fue el encargado de crear el depurador JavaScript de Netscape 4.x . Con el fin de mantener un desarrollo modular, empezó por la creación de una API de depuración de JavaScript de nivel medio llamada js / jsd. Esta API aumenta la API de JavaScript existente, proporcionando a los clientes un conjunto muy útil de funciones de depuración implementadas en C. John, a continuación, pasó a reflejar esa API en Java, y creó su interfaz multiplataforma, que con el tiempo daría lugar al depurador de JavaScript para Netscape 1.0 y 1.1.

-

En abril de 2001, Robert Ginda comenzó a trabajar en un depurador de JavaScript para Mozilla, llamado Venkman. Venkman se basa en la parte de js / jsd del trabajo que realizó John en 1998, exposing it como un componente XPCOM. Esto permite que la user interface se escriba en JavaScript y XUL , lo que permite que Venkman sea una totalmente multiplataforma.

Conseguir Venkman

Firefox y Thunderbird
La última versión de JavaScript Debugger está disponible en Complementos de Firefox .
Mozilla Suite y SeaMonkey
Estas versiones vienen con Venkman preinstalado. En Windows es una opción de instalación, así que elige Avanzada. También está disponible en Complementos de Firefox como extensión.
Nvu y KompoZer
La versión 0.9.84 de la extensión de JavaScript Debugger está disponible en la página de descargas de Nvu . Le animamos a usar con Firefox la última versión disponible 0.9.87.1 (o superior).
Código fuente
El código fuente para Venkman se puede encontrar en Mercurial en la siguiente URL: http://hg.mozilla.org/venkman/summary

Comunidad

-
  • Ver foros de Mozilla...
  • -
-

-

Informar de un error en Venkman

-

Si encuentras un problema con Venkman, por favor, sigue las directivas mencionadas en la sección 5.4 de preguntas frecuentes sobre Venkman y, después, podrás informar de un error en el componente depurador de JavaScript.

Temas relacionados

-
JavaScript, Desarrollo web, Desarrollo de Mozilla
-
-

Información del documento original

-
-

diff --git a/files/es/vigilancia_de_plugins/index.html b/files/es/vigilancia_de_plugins/index.html deleted file mode 100644 index 111ddef8c3..0000000000 --- a/files/es/vigilancia_de_plugins/index.html +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: Vigilancia de plugins -slug: Vigilancia_de_plugins -tags: - - Firefox 3 - - Plugins - - Todas_las_Categorías - - páginas_a_traducir -translation_of: Archive/Plugins/Monitoring_plugins ---- -

{{ Fx_minversion_header(3) }}

- -

Sumario

- -

Un nuevo componente del sistema plugin está ahora disponible para medir cuanto le toma a los plugins (e.g., Adobe Flash) ejecutar sus tareas. Este componente reporta el tiempo de ejecución del plugin usando el observador de servicios a quién esté registrado para recibir las notificaciones. Este artículo discute como los desarrolladores pueden hacer uso de esta nueva característica.

- -

Datos de tiempos de ejecución (Runtime Data)

- -

La información de tiempo de ejecución reportada es siempre en fracciones de segundo. Debido a que el componente mide el tiempo reloj que le toma al plugin ejecutar las órdenes, el valor incluye ambos tiempos de CPU, el tiempo requerido para el proceso al igual que el tiempo para operaciones de disco. Por lo tanto es técnicamente incorrecto decir que el tiempo de ejecución es una medida del uso del CPU, sin embargo, es una buena representación of todos los recursos que están siendo consumidos por el plugin.

- -

Uso

- -

Para hacer uso del nuevo componente debes registrarte para recibir sus notificaciones de tiempo de ejecución usando el observador de servicios. El tema de la notificación es experimental-notify-plugin-call. Si eres nuevo con el observador de servicios de Mozilla, quizás quieras familiarizarte con este antes de proseguir. Puedes hallar más información sobre el observador de servicios aquí y aquí.

- -

Abajo hay un número de recortes de JavaScript que podrían ser útiles para desarrolladores que intenten usar esta característica:

- -

Registro

- -

Para registrarse en las notificaciones de tiempo de ejecución con el observador de servicios debes crear una clase con un método observe que reciba 3 parámetros (tema, asunto y dato) así como un método register que contenga el siguiente código:

- -

 

- -
var observerService = Components.classes["@mozilla.org/observer-service;1"]
-                        .getService (Components.interfaces.nsIObserverService);
-observerService.addObserver(this, "experimental-notify-plugin-call", false);
-
- -

 

- -

 

- -

Observando

- -

Como se discutió arriba, para especificar que quieres hacer cuando llegue una notificación tu clase debe tener un método observe, recibiendo 3 parámetros (tema, asunto y dato). El asunto contiene el asunto de la notificación - experimental-notify-plugin-call en este caso, el  dato es el tiempo de ejecución en milisegundos y el tema es siempre null y no debería ser usado.

- -

Aquí hay un ejemplo que muestra el tiempo de ejecución en una caja de alerta al usuario si el tiempo de ejecución excede el medio segundo:

- -

 

- -
 observe: function(subject, topic, data) {
-   if (topic == "experimental-notify-plugin-call" ) {
-     if (data > 0.500) {
-       alert("Runtime is: " + data);
-     }
-   }
- }
-
- -

 

- -

NOTA: Este es solo un ejemplo simplificado y el uso de  alert() es muy moderado ya que el componente puede enviar cientos de notificaciones por segundo y puede provocar que el browser deje de funcionar si un número excesivo de cajas de alerta son desplegadas.

- -

Además note que en el ejemplo de arriba una sentencia if se asegura que el tema de la notificación entrante es el correcto. Esto es muy útil en casos donde tu clase está registrada para recibir notificaciones para más de un tema con el observador de servicios.

- -

Limpieza

- -

Para eliminar el registro de tu clase con observador de servicios - cuando ya no quieras recibir más notificaciones de tiempos de ejecución - tu clase debe incluir un método unregister que contenga el siguiente código:

- -

 

- -
var observerService = Components.classes["@mozilla.org/observer-service;1"]
-                       .getService(Components.interfaces.nsIObserverService);
-observerService.removeObserver(this, "experimental-notify-plugin-call");
-
- -

 

- -

 

- -

Esqueleto (estructura) de clases para el observador

- -

Abajo está un esqueleto de clase que podrías usar para recibir notificaciones de tiempos de ejecución:

- -

 

- -
 function PluginObserver() {
-   this.registered = false;
-   this.register();	//takes care of registering this class with observer services as an observer for plugin runtime notifications
- }
-
- PluginWatcherObserver.prototype = {
-   observe: function(subject, topic, data) {
-
-     if (topic == "experimental-notify-plugin-call") //In case your class is registered to listen to other topics
-       //This gets executed each time a runtime notification arrives
-       // --YOUR CODE GOES HERE--
-     }
-
-
-   },
-   //Takes care of registering the observer services for the "experimental-notify-plugin-call" topic
-   register: function() {
-     if (this.registered == false) { //This check prevents double registration -- something you want to avoid!!
-       var observerService = Components.classes["@mozilla.org/observer-service;1"]
-                                       .getService(Components.interfaces.nsIObserverService);
-       observerService.addObserver(this, "experimental-notify-plugin-call", false);
-       this.registered = true;
-     }
-   },
-   //Unregisters from the observer services
-   unregister: function() {
-     if (this.registered == true) {
-       var observerService = Components.classes["@mozilla.org/observer-service;1"]
-                                       .getService(Components.interfaces.nsIObserverService);
-       observerService.removeObserver(this, "experimental-notify-plugin-call");
-       this.registered = false;
-     }
-   }
- }
-
- -

 

- -

Recursos adicionales

- -

Más información sobre el observador de servicios:

- - diff --git a/files/es/vigilar_descargas/index.html b/files/es/vigilar_descargas/index.html deleted file mode 100644 index b2e1160452..0000000000 --- a/files/es/vigilar_descargas/index.html +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: Vigilar descargas -slug: Vigilar_descargas -tags: - - Download Manager - - Firefox 3 -translation_of: Archive/Mozilla/Monitoring_downloads ---- -

Con Firefox 3 es más fácil que nunca vigilar el estado de las descargas. Aunque ya era posible hacer esto en versiones previas de Firefox, solo era posible hacer posible tener un observador en cada momento. Firefox 3 introduce un nuevo API que permite cualquier numero de observadores para las descargas.

-

Este articulo demuestra como vigilar las descargas en Firefox 3, usando el administrador de descargas. Como un bonito añadido adicional, demuestra demás cómo usar el API Storage para crear instrucciones sqlite en una base de datos. El resultado es una ventana que puedes abrir seleccionando "Registro de descargas" en el menú herramientas, que muestra todas las descargas que se han iniciado desde que se instaló la extensión. En la lista está el nombre del archivo, las horas de comienzo y final de la descarga, la velocidad de descarga y el estado de la descarga. Se incluye un título emergente que muestra la URL completa de la fuente del archivo.

-

Descarga un ejemplo completo en samples/extension-samples/DownloadLogger.zip

-

Configuración

-

Al cargar la extensión, se realizarán algunas tareas de limpieza rutinaria. En particular, necesita que exista una versión de la interfaz del administrador de descargas nsIDownloadManager y crea una base de datos en donde almacenará sus datos.

-

 

-
 onLoad: function() {
-   // código de inicialización
-   this.initialized = true;
-   this.strings = document.getElementById("downloadlogger-strings");
-
-   this.dlMgr = Components.classes["@mozilla.org/download-manager;1"]
-                          .getService(Components.interfaces.nsIDownloadManager);
-
-   this.dlMgr.addListener(downloadlogger);
-
-   // Abre la base de datos, poniendo su archivo en el directorio de perfil (profile)
-
-   this.dbFile = Components.classes["@mozilla.org/file/directory_service;1"]
-                    .getService(Components.interfaces.nsIProperties)
-                    .get("ProfD", Components.interfaces.nsIFile);
-   this.dbFile.append("downloadlogger.sqlite");
-
-   // Accede al servicio de almacenamiento y abre la base de datos
-
-   this.storageService = Components.classes["@mozilla.org/storage/service;1"]
-                       .getService(Components.interfaces.mozIStorageService);
-
-   var dbConn = this.storageService.openDatabase(this.dbFile);
-
-   // Ahora crea la tabla; si ya existe, esto produce un error, pero ¡no importa!
-
-   dbConn.executeSimpleSQL("CREATE TABLE items (source TEXT, size INTEGER," +
-                           " startTime INTEGER, endTime INTEGER," +
-                           " speed REAL, status INTEGER)");
-   dbConn.close();
- },
-
-

Esto es bastante simple. El administrador de descargas es almacenado en una variable en el objeto downloadlogger para ser usado más tarde y llama a su método addListener() para empezar la escucha de los cambios de estado de descargas. El archivo de la base de datos se abre y se ejecuta la instrucción sqlite: CREATE TABLE para crear la tabla.

-

Finalmente, se cierra la base de datos.

-
Nota: El método close() de mozIStorageConnection se añade en la versión alpha 8 de Firefox 3. En versiones anteriores de Firefox, no hay forma explícita de cerrar la base de datos; Se cierra cuando el colector de desperdicios desecha el objeto conexión.
-

Seguir los cambios de estados de las descargas

-

Una vez que el código mostrado más arriba se ejecuta, cada vez que hay un cambio de estado se produce una llamada a nuestro método onDownloadStateChange(). Esto es parte de la interfaz nsIDownloadProgressListener.

-

Ese código es parecido a esto:

-
 onDownloadStateChange: function(aState, aDownload) {
-   var statement;
-
-   switch(aDownload.state) {
-     case Components.interfaces.nsIDownloadManager.DOWNLOAD_DOWNLOADING:
-
-       // Agregar una fila para la nueva descarga que comienza; cada fila incluye
-       // la URI del origen, tamaño y hora de comienzo. La hora de final y la velocidad de descarga
-       // se ponen ambas a cero ya que no las conocemos aún.
-
-       // status es el valor del estado llegado desde el administrador de descargas.
-
-       var dbConn = this.storageService.openDatabase(this.dbFile);
-       statement = dbConn.createStatement("REPLACE INTO items VALUES " +
-                                          "(?1, ?2, ?3, 0, 0.0, 0)");
-
-       statement.bindStringParameter(0, aDownload.source.spec);
-       statement.bindInt64Parameter(1, aDownload.size);
-       statement.bindInt64Parameter(2, aDownload.startTime);
-       statement.execute();
-       statement.reset();
-       dbConn.close();
-       break;
-
-     // Registra si se ha completado (o ha fallado) la descarga
-
-     case Components.interfaces.nsIDownloadManager.DOWNLOAD_FINISHED:
-     case Components.interfaces.nsIDownloadManager.DOWNLOAD_FAILED:
-     case Components.interfaces.nsIDownloadManager.DOWNLOAD_CANCELED:
-       this.logTransferCompleted(aDownload);
-       break;
-   }
- },
-
-

Nos interesan cuatro estados. Si el estado de la descarga, indicado por el campo aDownload.state es Components.interfaces.nsIDownloadManager.DOWNLOAD_DOWNLOADING, se ha comenzado la descarga del archivo. El objeto aDownload es un objeto nsIDownload.

-

En este caso, creamos una nueva fila en nuestra base de datos para el nuevo archivo, abriendo la base de datos y construyendo una instrucción sqlite: REPLACE INTO. Las primeras tres filas se comlpetan con el valor de la URI de origen, tamaño del archivo y hora de comienzo del objeto descarga (download). Las demás filas se ponen a cero ya que esa información no la tenemos ahora.

-

Si el estado de la descarga indica que ésta ha terminado, se ha cancelado o ha fallado, llamamos a nuestra rutina logTransferCompleted para actualizar el registro indicando el cambio de estado. El código es como:

-
 logTransferCompleted: function(aDownload) {
-     var endTime = new Date();                // La hora actual es la hora de final
-
-     // Utiliza la instrucción sqlite REPLACE para actualizar el registro. Encontramos un
-     // registro para cada URI y hora de comienzo y actualizamos la hora de final,
-     // tamaño y velocidad en el registro. Haciendo coincidir la URI y la hora de comienzo,
-     // podemos tener varias entradas de múltiples descargas del mismo archivo.
-
-

 

-
     var dbConn = this.storageService.openDatabase(this.dbFile);
-     var statement = dbConn.createStatement("UPDATE items SET size=?1, " +
-         "endTime=?2, speed=?3, status=?4 WHERE source=?5 and startTime=?6");
-     statement.bindInt64Parameter(0, aDownload.size);
-     statement.bindInt64Parameter(1, endTime.getTime());
-     statement.bindDoubleParameter(2, aDownload.speed);
-     statement.bindInt32Parameter(3, aDownload.state);
-     statement.bindStringParameter(4, aDownload.source.spec);
-     statement.bindInt64Parameter(5, aDownload.startTime);
-     statement.execute();
-     statement.reset();
-     dbConn.close();
- },
-
-

Esto simplemente abre la base de datos y ejecuta la instrucción sqlite: UPDATE que encuentra la descarga cuya URI de origen y su hora de inicio coinciden con la descarga que se ha completado y actualiza su información. Buscando por un registro con igual URI y hora de comienzo, implementamos la posibilidad de que un usuario descargue el mismo archivo varias veces.

-

 

-

Mostrando el registro de descargas

-

El código de la ventana de registro está encapsulado en un objeto llamado downloadlogger_dlwindow. Ya que este es un ejemplo simple, es una ventana de registro de una única descarga; no nos preocupamos de cambios posteriores del registro. Simplemente mostramos el estado de la descarga en el momento en que la ventana se abre.

-

Esto significa que todo el trabajo puede hacerse en el manejador del evento de carga, que es algo así:

-
 onLoad: function() {
-   // Abre la base de datos
-
-   this.dbFile = Components.classes["@mozilla.org/file/directory_service;1"]
-                    .getService(Components.interfaces.nsIProperties)
-                    .get("ProfD", Components.interfaces.nsIFile);
-   this.dbFile.append("downloadlogger.sqlite");
-
-   // Consigue acceso al servicio de almacenamiento y abre la base de datos
-
-   this.storageService = Components.classes["@mozilla.org/storage/service;1"]
-                       .getService(Components.interfaces.mozIStorageService);
-
-   var dbConn = this.storageService.openDatabase(this.dbFile);
-
-   var loglist = document.getElementById("loglist");
-
-   var statement = dbConn.createStatement("SELECT * FROM items");   // Get all items in table
-   try {
-     while (statement.executeStep()) {
-       var row = document.createElement('listitem');
-
-       // Agrega las celdas al registro (fila de la tabla)
-
-       var cell = document.createElement('listcell');
-       var sourceStr = statement.getString(0);
-       row.setAttribute("tooltiptext", sourceStr);
-       sourceStr = sourceStr.slice(sourceStr.lastIndexOf("/")+1, sourceStr.length);
-       cell.setAttribute("label", sourceStr);   // Source
-       row.appendChild(cell);
-
-       cell = document.createElement('listcell');
-       cell.setAttribute("label", (statement.getInt64(1) / 1024).toFixed(1) + "KB");    // Size
-       cell.setAttribute("style", "text-align:right");
-       row.appendChild(cell);
-
-       var theDate = new Date(statement.getInt64(2) / 1000);        // Start time
-       cell = document.createElement('listcell');
-       var dateStr = theDate.toLocaleString();
-       cell.setAttribute("label", dateStr);
-       row.appendChild(cell);
-
-       theDate = new Date(statement.getInt64(3));            // End time
-       cell = document.createElement('listcell');
-       dateStr = theDate.toLocaleString();
-       cell.setAttribute("label", dateStr);
-       row.appendChild(cell);
-
-       var speed = statement.getDouble(4) / 1024.0;
-       cell = document.createElement('listcell');
-       cell.setAttribute("label", speed.toFixed(1) + "KB/sec");
-       cell.setAttribute("style", "text-align:right");
-       row.appendChild(cell);
-
-       var status = statement.getInt32(5);
-       var style = "color:black";
-       cell = document.createElement('listcell');
-
-       var statusStr;
-
-       switch(status) {
-         case 0:
-           statusStr = "Descargando";
-           break;
-         case 1:
-           statusStr = "Completada";
-           style = "color:green";
-           break;
-         case 2:
-           statusStr = "Fallida";
-           style = "color:red";
-           break;
-         case 3:
-           statusStr = "Cancelada";
-           style = "color:purple";
-           break;
-         case 4:
-           statusStr = "Pausada";
-           style = "color:blue";
-           break;
-         case 5:
-           statusStr = "En cola";
-           style = "color:teal";
-           break;
-         case 6:
-           statusStr = "Bloqueada";
-           style = "color:white background-color:red";
-           break;
-         case 7:
-           statusStr = "Escaneando";
-           style = "color:silver";
-           break;
-         default:
-           statusStr = "Desconocido";
-           break;
-       }
-       cell.setAttribute("label", statusStr);
-       cell.setAttribute("style", style);
-       row.appendChild(cell);
-
-       loglist.appendChild(row);
-     }
-   } finally {
-     statement.reset();
-     dbConn = null;
-   }
- }
-
-

Este código es bastante simple. Comienza abriendo la base de datos sqlite que contiene la información de registro y entonces crea una sentencia SQL: SELECT para leer las entradas de la base de datos.

-

Para reiterar sobre los resultados, usamos un bucle while que llama al método executeStep() del objeto mozIStorageStatement. Cada vez que este método es llamado, se recoge una fila de resultados.

-

Después de esto, se crea el objeto fila y cada entrada del resultado de la búsqueda, se pone en su respectiva celda.

-

Los puntos a resaltar son:

- - - -

Ejercicios para el lector

-

Hay algunas cosas obvias que podrían hacerse para mejorar esta extensión. Si estás aprendiendo a usar el gestor de descargas o el API Storage, hay algunas cosas que convendría que miraras para practicar:

- - - - -

Ver también

-

Storage, nsIDownloadManager, nsIDownload, nsIDownloadProgressListener

diff --git a/files/es/web/api/cameracapabilities/effects/index.html b/files/es/web/api/cameracapabilities/effects/index.html deleted file mode 100644 index 1204fb0c34..0000000000 --- a/files/es/web/api/cameracapabilities/effects/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: CameraCapabilities.effects -slug: Web/API/CameraCapabilities/effects -translation_of: Archive/B2G_OS/API/CameraCapabilities/effects ---- -

{{ ApiRef() }}

-

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('certified') }}

-

Resumen

-

El valor de la propiedad effects en un Array que identifica los efectos  (tales como normal, sepia, mono, etc.) que soporta la camara.

-

Sintaxis

-
var effects = instanceOfCameraControl.capabilities.effects
-

Valor

-

Devuelve un Array de cadenas.

-

Ejemplo

-
var options = {
-  camera: navigator.mozCameras.getListOfCameras()[0]
-};
-
-function onSuccess(camera) {
-  var effects = camera.capabilities.effects;
-
-  effects.forEach(function (value) {
-    console.log(value)
-  });
-};
-
-navigator.mozCameras.getCamera(options, onSuccess)
-
-

Especifiacion

-

No forma parte de ninguna especifiacion; en cualquier caso, esta API deberia ser eliminada cuando la WebRTC Capture and Stream API haya sido implementada.

-

Ver tambien

- diff --git a/files/es/web/api/cameracapabilities/fileformats/index.html b/files/es/web/api/cameracapabilities/fileformats/index.html deleted file mode 100644 index 5193200866..0000000000 --- a/files/es/web/api/cameracapabilities/fileformats/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: CameraCapabilities.fileFormats -slug: Web/API/CameraCapabilities/fileFormats -translation_of: Archive/B2G_OS/API/CameraCapabilities/fileFormats ---- -

{{ ApiRef() }}

-

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('certified') }}

-

Summary

-

La propiedad fileFormats es un Array que identifica los formatos de archivo que soporta la camara, tales como jpeg, rgb565, etc.

-

Sintaxis

-
var formats = instanceOfCameraControl.capabilities.fileFormats
-

Valor

-

Devuelve un Array de cadenas.

-

Ejemplo

-
var options = {
-  camera: navigator.mozCameras.getListOfCameras()[0]
-};
-
-function onSuccess(camera) {
-  var formats = camera.capabilities.fileFormats;
-
-  formats.forEach(function (value) {
-    console.log(value)
-  });
-};
-
-navigator.mozCameras.getCamera(options, onSuccess)
-
-

Especificacion

-

No es parte de ninguna especificacion; en cualquier caso, esta API deberia ser eliminada cuando la WebRTC Capture and Stream API haya sido implementada.

-

Ver tambien

- diff --git a/files/es/web/api/cameracapabilities/flashmodes/index.html b/files/es/web/api/cameracapabilities/flashmodes/index.html deleted file mode 100644 index be89eac3ac..0000000000 --- a/files/es/web/api/cameracapabilities/flashmodes/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: CameraCapabilities.flashModes -slug: Web/API/CameraCapabilities/flashModes -translation_of: Archive/B2G_OS/API/CameraCapabilities/flashModes ---- -

{{ ApiRef() }}

-

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('certified') }}

-

Resumen

-

La propiedad flashModes es un Array de cadenas que identifican cada modo de flash soportado por la camara. Los posibles valores son auto, off, on o torch.

-

Sintaxis

-
var flash = instanceOfCameraControl.capabilities.flashModes
-

Valor

-

Devuelve un  Array de cadenas.

-

Ejemplo

-
var options = {
-  camera: navigator.mozCameras.getListOfCameras()[0]
-};
-
-function onSuccess(camera) {
-  var flash = camera.capabilities.flashModes;
-
-  flash.forEach(function (value) {
-    console.log(value)
-  });
-};
-
-navigator.mozCameras.getCamera(options, onSuccess)
-
-

Especifiacion

-

No es parte de ninguna especificacion; en cualquier caso, esta API deberia ser eliminada cuando la WebRTC Capture and Stream API haya sido implementada.

-

Ver tambien

- diff --git a/files/es/web/api/cameracapabilities/index.html b/files/es/web/api/cameracapabilities/index.html deleted file mode 100644 index a534b51ab5..0000000000 --- a/files/es/web/api/cameracapabilities/index.html +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: CameraCapabilities -slug: Web/API/CameraCapabilities -translation_of: Archive/B2G_OS/API/CameraCapabilities ---- -

{{ Apiref() }}

-

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('certified') }}

-

The {{domxref("CameraControl.capabilities")}} property returns a CameraCapabilities object, which describes all the camera's capabilities.

-

Properties

-
-
- {{domxref("CameraCapabilities.effects")}} {{readonlyinline}}
-
- An Array of strings identifying the effects (such as normal, sepia, mono, etc.) that the camera supports.
-
- {{domxref("CameraCapabilities.fileFormats")}} {{readonlyinline}}
-
- An Array of strings identifying the file formats supported by the camera, such as jpeg, rgb565, etc.
-
- {{domxref("CameraCapabilities.flashModes")}} {{readonlyinline}}
-
- An Array of strings identifying each of the flash modes supported by the camera. Possible values are auto, off, on or torch.
-
- {{domxref("CameraCapabilities.focusModes")}} {{readonlyinline}}
-
- An Array of strings identifying each of the focus modes supported by the camera such as auto, fixed, macro, etc.
-
- {{domxref("CameraCapabilities.maxExposureCompensation")}} {{readonlyinline}}
-
- A number that defines the maximum supported exposure compensation value.
-
- {{domxref("CameraCapabilities.maxFocusAreas")}} {{readonlyinline}}
-
- A number that defines the maximum number of focus areas supported by the camera.
-
- {{domxref("CameraCapabilities.maxMeteringAreas")}} {{readonlyinline}}
-
- A number that defines the maximum number of metering areas supported by the camera.
-
- {{domxref("CameraCapabilities.minExposureCompensation")}} {{readonlyinline}}
-
- A number that defines the minimum supported exposure compensation value.
-
- {{domxref("CameraCapabilities.pictureSizes")}} {{readonlyinline}}
-
- An Array of objects containing the height and width properties supported for picture taking.
-
- {{domxref("CameraCapabilities.previewSizes")}} {{readonlyinline}}
-
- An Array of objects containing the height and width properties supported for the video preview stream.
-
- {{domxref("CameraCapabilities.recorderProfiles")}} {{readonlyinline}}
-
- An object with attributes for each of the supported recorder profiles.
-
- {{domxref("CameraCapabilities.sceneModes")}} {{readonlyinline}}
-
- An Array of strings identifying each of the scene modes supported by the camera such as auto, night, beach, etc.
-
- {{domxref("CameraCapabilities.stepExposureCompensation")}} {{readonlyinline}}
-
- A number that defines the exposure compensation minimum step-size.
-
- {{domxref("CameraCapabilities.videoSizes")}} {{readonlyinline}}
-
- An Array of objects containing the height and width properties supported for video recording.
-
- {{domxref("CameraCapabilities.whiteBalanceModes")}} {{readonlyinline}}
-
- An Array of strings identifiers for each white balance modes supported by the camera such as auto, fluorecent, etc.
-
- {{domxref("CameraCapabilities.zoomRatios")}} {{readonlyinline}}
-
- An Array of numbers representing all the supported zoom ratios. If the camera has no zoom capabilities, the value is null.
-
-

Methods

-

None.

-

Specification

-

Not part of any specification; however, this API should be removed when the WebRTC Capture and Stream API has been implemented.

-

See also

- diff --git a/files/es/web/api/cameracapabilities/maxexposurecompensation/index.html b/files/es/web/api/cameracapabilities/maxexposurecompensation/index.html deleted file mode 100644 index 2baf025df3..0000000000 --- a/files/es/web/api/cameracapabilities/maxexposurecompensation/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: CameraCapabilities.maxExposureCompensation -slug: Web/API/CameraCapabilities/maxExposureCompensation -translation_of: Archive/B2G_OS/API/CameraCapabilities/maxExposureCompensation ---- -

{{ ApiRef() }}

-

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('certified') }}

-

Resumen

-

La propiedad maxExposureCompensation es un número que define el valor máximo de compensación de exposición soportado.

-

Sintaxis

-
var max = instanceOfCameraControl.capabilities.maxExposureCompensation
-

Valor

-

Devuelve un número.

-

Ejemplo

-
var options = {
-  camera: navigator.mozCameras.getListOfCameras()[0]
-};
-
-function onSuccess(camera) {
-  console.log(camera.capabilities.maxExposureCompensation);
-};
-
-navigator.mozCameras.getCamera(options, onSuccess)
-
-

Especificación

-

No forma parte de ninguna especificación; No obstante, esta API debería ser eliminada cuando la WebRTC Capture and Stream API haya sido implementada.

-

Ver también

- diff --git a/files/es/web/api/cameracapabilities/maxfocusareas/index.html b/files/es/web/api/cameracapabilities/maxfocusareas/index.html deleted file mode 100644 index 6d0024bebb..0000000000 --- a/files/es/web/api/cameracapabilities/maxfocusareas/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: CameraCapabilities.maxFocusAreas -slug: Web/API/CameraCapabilities/maxFocusAreas -translation_of: Archive/B2G_OS/API/CameraCapabilities/maxFocusAreas ---- -

{{ Apiref() }}

-

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('certified') }}

-

Resumen

-

La propiedad maxFocusAreas es un numero que define el numero maximo de areas de foco que permite la camara.

-

Sintaxis

-
var max = instanceOfCameraControl.capabilities.maxFocusAreas
-

Valor

-

Devuelve un numero.

-

Ejemplo

-
var options = {
-  camera: navigator.mozCameras.getListOfCameras()[0]
-};
-
-function onSuccess(camera) {
-  console.log(camera.capabilities.maxFocusAreas);
-};
-
-navigator.mozCameras.getCamera(options, onSuccess)
-
-

Especificacion

-

No es parte de ninguna especificacion; en cualquier caso, esta API deberia ser eliminada cuando la  WebRTC Capture and Stream API haya sido implementada.

-

Ver tambien

- diff --git a/files/es/web/api/domapplicationsregistry/checkinstalled/index.html b/files/es/web/api/domapplicationsregistry/checkinstalled/index.html deleted file mode 100644 index 5c2d298aa9..0000000000 --- a/files/es/web/api/domapplicationsregistry/checkinstalled/index.html +++ /dev/null @@ -1,49 +0,0 @@ ---- -title: Apps.checkInstalled -slug: Web/API/DOMApplicationsRegistry/checkInstalled -tags: - - API - - Apps - - Apps API - - Firefox OS - - Procedimiento -translation_of: Archive/Marketplace/API/DOMApplicationsRegistry/checkInstalled ---- -

{{ ApiRef() }}

-

{{ non-standard_header() }}

-

Resúmen

-

Obtiene información acerca de la aplicación dada. Esto puede ser usado para determinar si se ha instalado la aplicación.

-

Sintaxis

-
var request = window.navigator.mozApps.checkInstalled(url);
-
-

Parámetros

-
-
- url
-
- Una cadena de URL que contiene la ubicación de el manifiesto de la aplicación.
-
-

Resultados

-

La función checkInstalled() devuelve un objeto {{ domxref("DOMRequest") }}. La propiedad DOMRequest.result contiene un App object, que es un objeto JavaScript que describe la aplicación instalada. Si la aplicación no se encuentra instalada, entonces DOMRequest.result es null (nulo).

-

Ejemplo

-
var request = window.navigator.mozApps.checkInstalled("http://ejemplo.com/manifest.webapp");
-request.onerror = function(e) {
-  alert("Error de llamada checkInstalled: " + request.error.name);
-};
-request.onsuccess = function(e) {
-  if (request.result) {
-    console.log("La aplicación está instalada!");
-  }
-  else {
-    console.log("La aplicación no está instalada!");
-  }
-};
-

Se espera a las personas que llaman para establecer las propiedades de devolución de llamada onsuccess y onerror del objeto devuelto, como se muestra en este ejemplo. Si la llamada se realiza correctamente,  un App object se devuelve en la propiedad result del objeto devuelto. En el ejemplo esto es request.result.

-

Errores

-

La cadena ERROR pueden ser devueltos en DOMRequest.error.

-

Una excepción NS_ERROR_DOM_BAD_URI se produce si el manifiesto está en un dominio diferente a la página en que se solicita la información. Este se produce tan pronto como se invoca checkInstalled.

-

Temas relacionados

- diff --git a/files/es/web/api/domapplicationsregistry/getinstalled/index.html b/files/es/web/api/domapplicationsregistry/getinstalled/index.html deleted file mode 100644 index a1b96ee7ff..0000000000 --- a/files/es/web/api/domapplicationsregistry/getinstalled/index.html +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Apps.getInstalled -slug: Web/API/DOMApplicationsRegistry/getInstalled -tags: - - API - - Apps - - Apps API - - Firefox OS - - Procedimiento -translation_of: Archive/Marketplace/API/DOMApplicationsRegistry/getInstalled ---- -

{{ ApiRef() }}

-

{{ non-standard_header() }}

-

Resumen

-

Obtenga una lista de todas las aplicaciones instaladas desde este origen. Por ejemplo, si se llama a esto en el Firefox Marketplace, obtendrá la lista de aplicaciones instaladas por el Firefox Marketplace.

-
-

Note: Múltiples aplicaciones por origen no son compatibles. Para alojar varias aplicaciones de un dominio, establezca un subdominio para cada aplicación; por ejemplo: miapp.midominio.com, otraapp.midominio.com, y así sucesivamente.

-
-

Sintaxis

-
var request = window.navigator.mozApps.getInstalled();
-
-

Parámetros

-

Ninguno.

-

Ejemplo

-
var request = window.navigator.mozApps.getInstalled();
-request.onerror = function(e) {
-  alert("Error de llamada getInstalled: " + request.error.name);
-};
-request.onsuccess = function(e) {
-  alert("Éxito, numero de apps: " + request.result.length);
-  var appsRecord = request.result;
-};
-

Se espera a las personas que llaman para establecer las propiedades de devolución onsuccess y onerror del objeto devuelto, como se muestra en este ejemplo. Si la llamada se realiza correctamente un array de App objects se devuelve en la propiedad result del objeto devuelto. En el ejemplo esto es request.result.

-

Errores

-

La cadena ERROR puede ser devuelta en DOMRequest.error.

-

Temas relacionados

- diff --git a/files/es/web/api/domapplicationsregistry/index.html b/files/es/web/api/domapplicationsregistry/index.html deleted file mode 100644 index e9d68ecf20..0000000000 --- a/files/es/web/api/domapplicationsregistry/index.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: DOMApplicationsRegistry -slug: Web/API/DOMApplicationsRegistry -tags: - - API - - Apps - - B2G - - Firefox OS - - No estandar - - Referencia -translation_of: Archive/Marketplace/API/DOMApplicationsRegistry ---- -

{{ ApiRef("Apps") }}

- -

{{ non-standard_header() }}

- -

Provides support for installing, managing, and controlling Open Web apps in a browser. Currently implemented as {{ domxref('window.navigator.mozApps') }}.

- -

Propiedad

- -
-
{{domxref("DOMApplicationsRegistry.mgmt")}}
-
Un objeto mgmt que define funciones que le permiten a los tableros manejar y arrancar apps  a favor del usuario.
-
- -

Metodos

- -
-
{{ domxref("DOMApplicationsRegistry.checkInstalled()") }}
-
Verifica cuando una app se ha instalado tomando el manifiesto como su parametro.
-
{{ domxref("DOMApplicationsRegistry.install()") }}
-
Desencade la instalación de una app. Durante el proceso de instalación, la app es validada y se le pregunta al usuario si desea aprovar la instalación.
-
{{ domxref("DOMApplicationsRegistry.getSelf()") }}
-
Returna un objeto que contiene un {{ domxref('app') }} para la app.
-
{{ domxref("DOMApplicationsRegistry.getInstalled()") }}
-
Obtine una lista de todas las apps instaladas.
-
- -

Compatibilidad de navegadores

- -

{{ CompatibilityTable() }}

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Soporte basico{{ CompatUnknown() }}16.0{{ CompatUnknown() }}{{ CompatUnknown() }}{{ CompatUnknown() }}
-
- -
- - - - - - - - - - - - - - - - - - - -
FeatureAndroidFirefox Mobile (Gecko)IE PhoneOpera MobileSafari Mobile
Soporte basico{{ CompatUnknown() }}16.0{{ CompatUnknown() }}{{ CompatUnknown() }}{{ CompatUnknown() }}
-
- -

 

diff --git a/files/es/web/api/domapplicationsregistry/install/index.html b/files/es/web/api/domapplicationsregistry/install/index.html deleted file mode 100644 index 56f18e777b..0000000000 --- a/files/es/web/api/domapplicationsregistry/install/index.html +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Apps.install -slug: Web/API/DOMApplicationsRegistry/install -translation_of: Archive/Marketplace/API/DOMApplicationsRegistry/install ---- -
- {{ ApiRef() }} {{non-standard_header}}
-

Resumen

-

Activa la instalación de una aplicación. Durante este proceso la aplicación es validada y el usuario se le solicita aprovar la instalación .

-

Si la aplicación estaba previamente instalada desde el mismo dominio, llamando install()otra vez puede silenciosamente reescribir los datos de instalación. This can be used to modify the purchase receipt, for example, when a user upgrades from a free app to a premium app.

-

Syntax

-
var request = window.navigator.mozApps.install(url, [receipt1, …]);
-

Parameters

-
- Note: There is currently (May 2012) a bug with passing a relative path in the url parameter. See {{ Bug("745928") }}.
-
-
- url
-
- A string URL containing the location of the manifest to be installed. In the case of self distribution (where the installing origin is the same as the app origin), the installing site may omit the origin part of the URL and provide an absolute path (beginning with /).
-
- receipts
-
- (Optional) An array of one or more receipts. Example:
-
-
window.navigator.mozApps.install(url, ["receipt"])
-
-
- If receipts is omitted it is treated as null. For more information see Validating a receipt.
-
-

The install() function throws an exception if the required argument (url) is missing, or if unsupported arguments are present.

-

Returns

-

The install() function returns a {{ domxref("DOMRequest") }} object. The DOMRequest.result field contains an App object, which is a JavaScript object that describes the app that was just installed. Before the operation is finished, DOMRequest.result is null.

-

If the installation is not successful, DOMRequest.error contains a DOMError object, which has information about the error.

-

Example

-

An example that shows how to use install() with the DOMRequest.onsuccess and DOMRequest.onerror callback properties.

-
var request = window.navigator.mozApps.install(manifestUrl);
-request.onsuccess = function () {
-  // Save the App object that is returned
-  var appRecord = this.result;
-  alert('Installation successful!');
-};
-request.onerror = function () {
-  // Display the error information from the DOMError object
-  alert('Install failed, error: ' + this.error.name);
-};
-
-

The onsuccess callback is called if the installation is successful. This means that the installation actions described here have occurred.

-

If the installation is not successful the onerror callback is called. On a failed installation, DOMRequest.error contains a DOMError object that has information about the error.

-

The code above may look unusual to you, with listeners being added after the function has already been invoked. However, this is the way the DOMRequest object operates. The function invocation will wait until the listeners are defined, and then the listeners will fire appropriately. The install() function also works by itself, without the .onsuccess and .onerror listeners.

-

Errors

-

When the installation is unsuccessful, one of the following errors can be returned in DOMRequest.error.

-
-
- DENIED
-
- The user cancelled the installation.
-
- INVALID_MANIFEST
-
- The manifest, while well-formed JSON, does not have some required field or is somehow invalid.
-
- MANIFEST_URL_ERROR
-
- Something other than an HTTP 200 status code was received, or some connection errors.
-
- MANIFEST_PARSE_ERROR
-
- Bad JSON in the manifest.
-
- NETWORK_ERROR
-
- Connection error.
-
- REINSTALL_FORBIDDEN
-
- Reinstalls of apps are forbidden.
-
- MULTIPLE_APPS_PER_ORIGIN_FORBIDDEN
-
- Installable apps have a "single app per origin" security policy; basically, you can't host more than one installable app per origin.
-
- - diff --git a/files/es/web/api/domapplicationsregistry/installpackage/index.html b/files/es/web/api/domapplicationsregistry/installpackage/index.html deleted file mode 100644 index c269240c60..0000000000 --- a/files/es/web/api/domapplicationsregistry/installpackage/index.html +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Apps.installPackage -slug: Web/API/DOMApplicationsRegistry/installPackage -translation_of: Archive/Marketplace/API/DOMApplicationsRegistry/installPackage ---- -
- {{ApiRef}} {{non-standard_header}}
-

Resumen

-

Instala una aplicación empaquetada.

-
- Solo disponible en Firefox OS.
-

Sintaxis

-
installPackage: function(aURL[, aParams])
-

Parametros

- -

Resultados

-
-
- aURL
-
- El URL del paquete de aplicación a instalar. Esta debe ser una URL completa y absoluta.
-
- aParams
-
- Opcionalmente, un objeto con información adicional:
-
- DOMRequest
-
-

Véase también

- diff --git a/files/es/web/api/mozsocial/closepanel/index.html b/files/es/web/api/mozsocial/closepanel/index.html deleted file mode 100644 index 1b2305967f..0000000000 --- a/files/es/web/api/mozsocial/closepanel/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: MozSocial.closePanel -slug: Web/API/MozSocial/closePanel -tags: - - Social -translation_of: Archive/Social_API/MozSocial/closePanel ---- -

{{ ApiRef() }}

-

{{non-standard_header()}}

-

{{fx_minversion_header("17.0")}}

-

Resumen

-

Cierra el panel social que está actualmente abierto en el panel del proveedor de servicios sociales de nivel superior.

-

Sintaxis

-
MozSocial.closePanel();
-
-

Parametros

-

Ninguno.

-

Especificación

-

No es parte de ninguna especificación.

diff --git a/files/es/web/api/mozsocial/getattention/index.html b/files/es/web/api/mozsocial/getattention/index.html deleted file mode 100644 index e362749b56..0000000000 --- a/files/es/web/api/mozsocial/getattention/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: MozSocial.getAttention -slug: Web/API/MozSocial/getAttention -tags: - - Social -translation_of: Archive/Social_API/MozSocial/getAttention ---- -

{{ ApiRef() }}

-

{{non-standard_header()}}

-

{{fx_minversion_header("17.0")}}

-

Resumen

-

Ejecuta algunas acciones, posiblemente específicas de la plataforma, diseñadas para obtener la atención del usuario. Esto puede involucrar la reproducción de un efecto de sonido, parpadeo en la pantalla, o mostrando alguna otra forma de efecto.

-

Sintaxis

-
MozSocial.getAttention();
-
-

Parámetros

-

Ninguno.

-

Especificación

-

No es parte de ninguna especificación.

diff --git a/files/es/web/api/mozsocial/getworker/index.html b/files/es/web/api/mozsocial/getworker/index.html deleted file mode 100644 index e32cc7b240..0000000000 --- a/files/es/web/api/mozsocial/getworker/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: MozSocial.getWorker -slug: Web/API/MozSocial/getWorker -translation_of: Archive/Social_API/MozSocial/getWorker ---- -

{{ ApiRef() }}

-

{{non-standard_header()}}

-

{{fx_minversion_header("17.0")}}

-

Resumen

-

Devuelve una referencia al  worker del servicio de contenidos de redes sociales. Una vez obtenido, puedes llamar a su método postMessage() para comunicarte con él. Puedes usar uno de los  mensajes estándares para redes sociales, o mensajes específicos de ese servicio.

-

Sintaxis

-
var socialWorker = MozSocial.getWorker();
-
-

Parámetros

-

Ninguno.

-

Valor devuelto

-

Una referencia al worker del servicio.

-

Especificación

-

No forma parte de ninguna especificación.

diff --git a/files/es/web/api/mozsocial/index.html b/files/es/web/api/mozsocial/index.html deleted file mode 100644 index a2f559a9df..0000000000 --- a/files/es/web/api/mozsocial/index.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: MozSocial -slug: Web/API/MozSocial -tags: - - API -translation_of: Archive/Social_API/MozSocial ---- -
{{ ApiRef("Social API") }} {{non-standard_header}}{{fx_minversion_header("17.0")}}
- -

The MozSocial object, returned by the navigator.mozSocial property, is available within the social media provider's panel to provide functionality it may need.

- -
-

Note: Although Mozilla hopes to submit this API for standardization eventually, it has not yet done so.

-
- -

Properties

- -
-
{{domxref("MozSocial.isVisible")}}
-
Returns a Boolean value; the result is true if the content is visible, otherwise it's false.
-
- -

Methods

- -
-
{{domxref("MozSocial.closePanel()")}}
-
Closes the currently open flyout panel.
-
{{domxref("MozSocial.getAttention()")}}
-
Performs some action designed to get the user's attention; the exact behavior may vary from platform to platform. This might display a visual effect, play an audible notification, flash the screen, or use some other technique.
-
{{domxref("MozSocial.getWorker()")}}
-
Returns a reference to the service worker; once content has this reference, it can call worker.port.postMessage() method to communicate with the service.
-
{{domxref("MozSocial.openChatWindow()")}}
-
Opens a chat window that is anchored to the bottom of the browser window. Each chat window is expected to be a singular chat, but functionality may vary by provider.
-
{{domxref("MozSocial.openPanel()")}}
-
Opens a flyout panel attached to the sidebar at a given vertical offset. This might be, for example, used to display the actual conversation corresponding to a notification in the sidebar.
-
{{domxref("MozSocial.share()")}}
-
Initiates a share action via the SocialAPI Share panel.  One argument is passed, an object containing "url", "title", "description", "source" and "image".
-
- -

See also

- - diff --git a/files/es/web/api/mozsocial/isvisible/index.html b/files/es/web/api/mozsocial/isvisible/index.html deleted file mode 100644 index 7bc90e47da..0000000000 --- a/files/es/web/api/mozsocial/isvisible/index.html +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: MozSocial.isVisible -slug: Web/API/MozSocial/isVisible -tags: - - Social -translation_of: Archive/Social_API/MozSocial/isVisible ---- -

{{non-standard_header()}}

-

{{fx_minversion_header("17.0")}}

-

{{ ApiRef() }}

-

Resumen

-

Indica si la barra lateral del contenido del proveedor de social media está o no visible actualmente.

-

Sintaxis

-
var visible = navigator.MozSocial.isVisible
-
-

Al retornar, visible es true si la barra lateral es visible actualmente; de otro modo es false.

-

Especificación

-

No es parte de ninguna especificación.

-

Ver también

- diff --git a/files/es/web/api/mozsocial/openchatwindow/index.html b/files/es/web/api/mozsocial/openchatwindow/index.html deleted file mode 100644 index 26f6b97643..0000000000 --- a/files/es/web/api/mozsocial/openchatwindow/index.html +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: MozSocial.openChatWindow -slug: Web/API/MozSocial/openChatWindow -translation_of: Archive/Social_API/MozSocial/openChatWindow ---- -

{{ ApiRef() }}

-

{{non-standard_header()}}

-

{{fx_minversion_header("17.0")}}

-

Resumen

-

Abre una ventana de chat, anclada en la parte inferior de la ventana del navegador. Cada ventana de chat suele ser un one-on-one chat, pero esta funcionalidad puede variar dependiendo del proveedor.

-

Sintaxis

-
MozSocial.openChatWindow(toUrl, callback);
-
-

Parametros

-
-
- toUrl
-
- URL a la que se abre la conexión de chat.
-
- callback
-
- Un objeto para recibir notificaciones de devolución de llamada en la conexión. La devolución de llamada recibe como entrada una referencia a la ventana de chat. Vease Implementing chat functionality para más detalles.
-
-

Especificaciones

-

No es parte de ninguna especificación.

diff --git a/files/es/web/api/mozsocial/openpanel/index.html b/files/es/web/api/mozsocial/openpanel/index.html deleted file mode 100644 index 9ea96cd5bd..0000000000 --- a/files/es/web/api/mozsocial/openpanel/index.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: MozSocial.openPanel -slug: Web/API/MozSocial/openPanel -translation_of: Archive/Social_API/MozSocial/openPanel ---- -

{{ ApiRef() }}

-

{{non-standard_header()}}

-

{{fx_minversion_header("17.0")}}

-

Resumen

-

Abre un panel desplegable sujeto a la barra lateral del proveedor de medios sociales con una distancia vertical dada.

-

Sintaxis

-
MozSocial.openPanel(toUrl, offset, callback);
-
-

Parámetros

-
-
- toUrl
-
- La URL al contenido a presentar en el panel.
-
- offset
-
- La distancia vertical, en pixeles, a la cual posicionar el panel desplegable.
-
- callback
-
- Un objeto para recibir notificaciones devueltas por la conexión. La llamada de vuelta recibe como entrada una referencia al panel desplegable. <<<OCUPA ENLACE A DETALLES>>>
-
-

Especificación

-

No es parte de ninguna especificación.

diff --git a/files/es/web/api/navigator/id/index.html b/files/es/web/api/navigator/id/index.html deleted file mode 100644 index 707d9a6255..0000000000 --- a/files/es/web/api/navigator/id/index.html +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: navigator.id -slug: Web/API/Navigator/id -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/es/web/api/navigator/mozsocial/index.html b/files/es/web/api/navigator/mozsocial/index.html deleted file mode 100644 index cf5dd808f8..0000000000 --- a/files/es/web/api/navigator/mozsocial/index.html +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: navigator.mozSocial -slug: Web/API/Navigator/mozSocial -translation_of: Archive/mozSocial ---- -

{{non-standard_header()}}

-

{{fx_minversion_header("17.0")}}

-

{{ ApiRef() }}

-

El objeto MozSocial , regresado por la propiedad navigator.mozSocial , esta disponible dentro del tablero del proveedor de medios de comunicación para proporcionar la funcionalidad que pueda necesitar.

-
-

Nota: Aunque mozilla espera enviar eventualmente este API para su  estandarización, aun no se ha hecho.

-
-

Atributos

-
-
- {{domxref("MozSocial.isVisible")}}
-
- Regresa un valor Booleano; el resultado es true si el contenido es visible, de otra manera es false.
-
-

Métodos

-
-
- {{domxref("MozSocial.closePanel()")}}
-
- Cierra el tablero flotante abierto actualmente.
-
- {{domxref("MozSocial.getAttention()")}}
-
- Realiza algunas acciones diseñadas para obtener la atención del usuario; el mismo comportamiento puede variar de plataforma a plataforma. Esto puede mostrar un efecto visual, reproducir una notificación audible, parpadear la pantalla, o utilizar alguna otra técnica.
-
- {{ domxref("MozSocial.getWorker()") }}
-
- Regresa una referencia al trabajador de servicios; una vez el  contenido tiene esta referencia, puede llamar a su método postMessage() para comunicarse con el servicio.
-
- {{domxref("MozSocial.openChatWindow()")}}
-
- Abre una ventana de chat que es anclada al pie de la ventana del navegador. Se espera que cada ventana de chat sea un chat singular, pero su funcionalidad va a variar dependiento del proveedor.
-
- {{domxref("MozSocial.openPanel()")}}
-
- Abre un tablero flotante adjunto a la barra lateral en una vertical dada para compensar. Esto puede ser, por ejemplo, utilizado para mostrar la conversación actual correspondiente a una notificación en la barra lateral.
-
-  
-
- Vease Tambien
-
- Social API
-
diff --git a/files/es/web/api/simple_push_api/index.html b/files/es/web/api/simple_push_api/index.html deleted file mode 100644 index d3d4dd4d1a..0000000000 --- a/files/es/web/api/simple_push_api/index.html +++ /dev/null @@ -1,235 +0,0 @@ ---- -title: Simple Push -slug: Web/API/Simple_Push_API -translation_of: Archive/B2G_OS/API/Simple_Push_API ---- -

{{ non-standard_header() }}

- -
-

Nota: Esta documentación cubre el mecanismo propietario Simple Push de Firefox OS; si usted está buscando la documentación sobre el W3C Push API, diríjase a Push API.

-
- -

El Simple Push API, también conocido como Push Notification API, provee a las aplicaciones la habilidad de ser despertadas para recibir notificaciones. Usted puede utilizar Simple Push como un mecanismo de sincronización, o incluso para traer datos desde servidores de terceros.

- -

Un "push" (empujón) no es más que un evento enviado a un servidor remoto. Así es como funciona: una aplicación usa el Simple Push API para solicitar una URL especial y única llamada endpoint (punto final). Esta solicitud viaja hacia un servidor existente mantenido por Mozilla especialmente para este proposito (este se denomina "push server"). Cuando la aplicación recibe el endpoint de vuelta desde el push server, la aplicación envía el endpoint a su propio servidor (su servidor de aplicación). El servidor de aplicación guarda este endpoint, luego cuando quiere despertar la aplicación, llama al endpoint con un número de versión, y el push server contacta a la aplicación con una notificación del número de versión. La aplicación puede hacer cualquier cosa al momento de recibir la notificación, incluso ignorarla.

- -

El Simple Push API extiende Window.navigator con una propiedad push que es un objeto {{domxref("PushManager")}}, e incluye algunos eventos nuevos que usted puede recibir para monitorear el estado del empuje.

- -

Ejemplo mostrando los conceptos básicos

- -

Existen varias formas de usar la Simple Push API. Este ejemplos cubren los conceptos básicos de como usarla. El ejemplo consta de los siguientes pasos generales. Consulte las siguientes secciones para obtener información completa sobre cada paso.

- -
    -
  1. Añadir configuración push al manifiesto de la aplicación
  2. -
  3. LLamar a PushManager.register para solicitar un endpoint
  4. -
  5. Enviar un endpoint a su servidor
  6. -
  7. Agregar a su aplicación controladores de mensajes para notificaciones push
  8. -
  9. Enviar una notificación desde su servidor utilizando el endpoint
  10. -
- -

1. Añadir configuración push al manifiesto de la aplicación

- -

Usted necesita cambiar dos cosas en el manifiesto de la aplicación para poder utilizar Simple Push:

- -
    -
  1. Campo messages - Añadir push y push-register a messages.
    - Esto le hace saber a la página de aplicación que recibirá cada uno de estos eventos (push y push-register). En este ejemplo, ambos van a la misma página: "/index.html", pero también pueden usar otras páginas. Observe a continuación para mayor información sobre cada uno de estos eventos.
  2. -
  3. Campo permissions - Añadir que su aplicación quiere recibir notificaciones push.
    - Es una buena idea proveer una descripción clara en este campo para que el usuario final entienda por qué usted necesita permisos de empuje ("push").
  4. -
- -
"messages": [
-   { "push": "/index.html"},
-   { "push-register": "/index.html"}
-],
-"permissions": {
-  "push": {
-    "description": "Required for being updated with new goals in soccer matches"
-  }
-}
- -

2. LLamar a PushManager.register() para solicitar un endpoint

- -

La aplicación necesita solicitar un endpoint llamando {{domxref("PushManager.register")}}. Usted debe decidir cuando este debe ser llamado. Usted podría llamarlo cuando el usuario ha iniciado sesión en el servicio, o cuando el usuario decide comenzar a ver un partido de fútbol, o en cualquier otro momento. El código a continuación es una forma de hacerlo.

- -
if (navigator.push) {
-  // Solicitar el endpoint. Esto usa PushManager.register().
-  var req = navigator.push.register();
-
-  req.onsuccess = function(e) {
-    var endpoint = req.result;
-      console.log("New endpoint: " + endpoint );
-      // En este punto, usted deberá usar algunos llamados para enviar el
-      // endpoint a su servidor. Por ejemplo:
-      /*
-      var post = XMLHTTPRequest();
-      post.open("POST", "https://your.server.here/registerEndpoint");
-      post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
-      post.send("endpoint=" + encodeURIComponents( endpoint ) );
-      */
-      // Obviamente usted querrá añadir controladores .onload y .onerror,
-      // añadir información de id del usuario, y cualquier otra cosa que podría
-      // necesitar para asocial el endpoint con el usuario.
-    }
-
-   req.onerror = function(e) {
-     console.error("Error getting a new endpoint: " + JSON.stringify(e));
-   }
-} else {
-  // push no se encuentra disponible en el DOM, así que haga algo diferente.
-}
- -

3. Enviar un endpoint a su servidor

- -

Una vez que la aplicación ha recibido un endpoint, esta necesita enviarla a su servidor de aplicación. Hay más de una forma de hacer esto. Por ejemplo usted puede enviarla por email, o enviarla a través de POST, PUT, o incluso GET. Nosotros recomendamos que almacene el endpoint con algunos datos de usuario desde la aplicación, tales como una cookie, un username, o lo que sea que usted utilice para identificar su par enpoint-user.

- -

Pero si usted está enviando a su servidor, nosotros recomendamos que siga estas buenas prácticas:

- - - -

4. Agregar a su aplicación controladores de mensajes para notificaciones push

- -

Una vez haya configurado su endpoint siguiendo los pasos anteriores, usted está listo para hacer que su aplicación comience a escuchar mensajes push y push-register utilizando los controladores de mensajes.

- -

Añadir un controlador de mensajes push

- -

El controlador de mensajes push puede encontrarse en su archivo index.html o en su script main.js, o incluso en un archivo específico push-message.html que contiene solamente el controlador de mensajes. Esto puede ser útil si un mensaje push es enviado y su aplicación se encuentra cerrada, porque cargará solamente una pequeña porción del código HTML/JavaScript, y usted puede decidir si la aplicación necesita estar completamente abierta o puede hacer algo en segundo plano. Donde sea que usted decida ubicar el controlador de mensajes push, asegurese de que el manifiesto apunte a la ubicación correcta (ver el primer paso anterior), de otro modo su aplicación podría no obtener actualizaciones. Aquí hay un ejemplo de un controlador de mensajes push:

- -
if (window.navigator.mozSetMessageHandler) {
-  window.navigator.mozSetMessageHandler('push', function(e) {
-    console.log('My endpoint is ' + e.pushEndpoint);
-    console.log('My new version is ' +  e.version);
-    // Recuerde que usted puede controlar aquí si tiene más de
-    // un pushEndpoint
-    if (e.pushEndpoint === emailEndpoint) {
-      emailHandler(e.version);
-    } else if (e.pushEndpoint === imEndpoint) {
-      imHandler(e.version);
-    }
-  });
-} else {
-  // Controlador No message
-}
- -

Añadir un controlador de mensajes push-register

- -
-

Nota: Asegurese de añadir este controlador y verificar que funciona. Si ustedes no registra de nuevo sus endpoints cuando este mensaje es recibido por su aplicación, la aplicación NO SERÁ CAPAZ de recibir nuevas notificaciones push.

-
- -

Un mensaje push-register será enviado a todas las aplicaciones cuando el dispositivo cambie su identificador interno (llamado el UAID o User Agent Identifier). Esto puede deberse a que el servidor push ha cambiado, o se ha caido y necesita recuperarse, o cualquier otra circunstancia. Si cualquiera de estas cosas llegara a ocurrir, ustedes DEBE registrar de nuevo todos sus endpoints, porque sus previos endpoints ya no serán válidos. Por lo tanto su aplicación necesita implementar un controlador de mensajes push-register. Observe el siguiente código de ejemplo.

- -
if (window.navigator.mozSetMessageHandler) {
-  window.navigator.mozSetMessageHandler('push-register', function(e) {
-    console.log('push-register received, I need to register my endpoint(s) again!');
-
-    var req = navigator.push.register();
-    req.onsuccess = function(e) {
-      var endpoint = req.result;
-      console.log("New endpoint: " + endpoint );
-      localStorage.endpoint = endpoint;
-    }
-
-    req.onerror = function(e) {
-      console.error("Error getting a new endpoint: " + JSON.stringify(e));
-    }
-  });
-} else {
-  // Controlador No message
-}
- -

5. Enviar una notificación desde su servidor utilizando el endpoint

- -

Una vez usted tiene el endpoint en su servidor, usted puede enviar una notificación simplemente enviando una petición HTTP PUT al endpoint con el cuerpo version=<version>. Por ejemplo, imagine un endpoint con la siguiente URL:

- -
https://updates.push.services.mozilla.com/update/abcdef01234567890abcdefabcdef01234567890abcdef
- -

y con la version 5:

- -
version=5
- -

Así es como la notificación se verá utilizando curl:

- -
curl -X PUT -d "version=5" https://updates.push.services.mozilla.com/update/abcdef01234567890abcdefabcdef01234567890abcdef
- -

Si el servidor push esta corriendo correctamente, usted recibirá una respuesta con un 200 Status (OK) y un {} como cuerpo. También podría recibir un 200 Status indicando que el mensaje fue aceptado, pero que pudo haber sido controlado por un sistema alternativo. Si no, una respuesta error HTTP valida con un JSON explicando el error será retornada.

- -
-

Por favor recuerde: Solo porque Simple Push ha aceptado el mensaje, esto no garantiza que el mensaje será entregado exitosamente a la aplicación. Muchos factores, desde un dispositivo desconectado a varios fallos de transmisión de datos, pueden ocacionar que no se entregue exitosamente una notificación. Nosotros hacemos nuestro mejor esfuerzo, pero a veces el universo tiene otros planes.

-
- -

Recuerde que el valor de version debe ser números enteros, e incrementales. Las aplicaciones no recibirán nuevas notificaciones si la versión en menor a aquella almacenada en el servidor y/o dispositivo. Las versiones pueden ser útiles para que la aplicación indique si existen eventos "perdidos" que realmente debería verificar. Usted también podriá simplemente usar el UTC (el número de segundos desde la media noche del 1 de enero de 1970, GMT) actual si el valor de la versión no es muy importante para usted.

- -

Anular el registro de un endpoint

- -

Una vez haya terminado de utilizar el endpoint y no desee recibir más notificaciones, le rogamos anular el registro del antiguo endpoint mediante {{domxref("PushManager.unregister")}}. Esto limpiará la cantidad de datos que el dispositivo envía al servidor push, y además disminuirá el consumo de batería al no enviar notificaciones de las aplicaciones que no las usen.

- -

Especificaciones

- -

{{page("/en-US/docs/Web/API/PushManager","Specifications")}}

- -

Conpatibilidad con navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver también

- - diff --git a/files/es/web/api/using_the_browser_api/index.html b/files/es/web/api/using_the_browser_api/index.html deleted file mode 100644 index 31fb24d2fb..0000000000 --- a/files/es/web/api/using_the_browser_api/index.html +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: Using the browser API -slug: Web/API/Using_the_Browser_API -translation_of: Mozilla/Gecko/Chrome/API/Browser_API/Using ---- -

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('privileged') }}

-

Summary

-

The HTML Browser API is an extension of the HTML {{HTMLElement("iframe")}} element that allows web apps to implement browsers or browser-like applications. This entails two major aspects:

- -

In addition to that, it's also possible to express the notion that the embedded content is an Open Web App. In that case the content is loaded within the appropriate app context (such as permissions).

-

Usage

-

An {{HTMLElement("iframe")}} is turned into a browser frame by setting the {{htmlattrxref("mozbrowser","iframe")}} attribute:

-
<iframe src="http://hostname.tld" mozbrowser>
-

In order to embed an Open Web App, the {{htmlattrxref("mozapp","iframe")}} attribute must also be supplied, with the path to the app's manifest:

-
<iframe src="http://hostname.tld" mozapp='http://path/to/manifest.webapp' mozbrowser>
-

At last the content of the {{HTMLElement("iframe")}} can be loaded in its own child process, separate to the page embedding this frame by using the {{htmlattrxref("remote","iframe")}} attribute.

-
<iframe src="http://hostname.tld" mozbrowser remote>
-
-

Warning: That last attribute is necessary for security reasons if you plan to load content from an untrusted/unknown origin. If you don't use it, you take the risk of your application being compromised by a malicious web site.

-
-

Permissions

-

Any application that wants to embed a browser frame must have the browser permission within its app manifest.

-
{
-  "permissions": {
-    "browser": {}
-  }
-}
-

Additionally, to embed an Open Web App, the app must have the embed-apps permission.

-
{
-  "permissions": {
-    "browser": {},
-    "embed-apps": {}
-  }
-}
-

Extra methods

-

To support the requirement of a browser {{HTMLElement("iframe")}}, Firefox OS extends the {{domxref("HTMLIFrameElement")}} DOM interface. Those new methods gives the {{HTMLElement("iframe")}} some super powers:

- -

Those methods allow navigating through the browsing history of the {{HTMLElement("iframe")}}. They are necessary to be able to implement back, forward, stop, and reload buttons.

- -

Performance methods

-

Those methods are used to manage the resources used by a browser {{HTMLElement("iframe")}}. This is especially useful for implementing tabbed browser application.

- -

Event methods

-

In order to manage the browser {{HTMLElement("iframe")}}'s content, many new events were added (see below). The following methods are used to deal with those events:

- -

Miscellaneous methods

-

Those methods are utilities, useful for apps that host a browser {{HTMLElement("iframe")}}.

- -

Events

-

In order to allow an application to manage the browser {{HTMLElement("iframe")}}, the application can listen for new events about what's happening within the browser {{HTMLElement("iframe")}}. The following new events can be listened for:

- -

Example

-

In this example we'll see how to implement a very basic browser app.

-

HTML

-

In the HTML we just add a URL bar, a "Go" and "Stop" button, and a browser {{HTMLElement("iframe")}}.

-
<header>
-  <input id="url">
-  <button id="go">Go</button>
-  <button id="stop">Stop</button>
-</header>
-
-<iframe src="about:blank" mozbrowser remote></iframe>
-
-

CSS

-

We switch between the go and stop button with a little css trick.

-
button:disabled {
-  display: none;
-}
-

JavaScript

-

Now we can add the required functionalities:

-
document.addEventListener("DOMContentLoaded", function () {
-  var url  = document.getElementById("url");
-  var go   = document.getElementById("go");
-  var stop = document.getElementById("stop");
-
-  var browser = document.getElementsByTagName("iframe")[0];
-
-  // This function is used to switch the Go and Stop button
-  // If the browser is loading content, "Go" is disabled and "Stop" is enabled
-  // Otherwise, "Go" is enabled and "Stop" is disabled
-  function uiLoading(isLoading) {
-      go.disabled =  isLoading;
-    stop.disabled = !isLoading;
-  }
-
-  go.addEventListener("touchend", function () {
-    browser.setAttribute("src", url.value);
-  });
-
-  stop.addEventListener("touchend", function () {
-    browser.stop();
-  });
-
-  // When the browser starts loading content, we switch the "Go" and "Stop" buttons
-  browser.addEventListener('mozbrowserloadstart', function () {
-    uiLoading(true);
-  });
-
-  // When the browser finishes loading content, we switch back the "Go" and "Stop" buttons
-  browser.addEventListener('mozbrowserloadend', function () {
-    uiLoading(false);
-  });
-
-  // In case of error, we also switch back the "Go" and "Stop" buttons
-  browser.addEventListener('mozbrowsererror', function (event) {
-    uiLoading(false);
-    alert("Loading error: " + event.detail);
-  });
-
-  // When a user follows a link, we make sure the new location is displayed in the address bar
-  browser.addEventListener('mozbrowserlocationchange', function (event) {
-    url.value = event.detail;
-  });
-});
-

See also

- diff --git a/files/es/web/css/-moz-binding/index.html b/files/es/web/css/-moz-binding/index.html deleted file mode 100644 index 0280bb44b8..0000000000 --- a/files/es/web/css/-moz-binding/index.html +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: '-moz-binding' -slug: Web/CSS/-moz-binding -tags: - - CSS - - No estándar(2) - - Referencia CSS - - XBL -translation_of: Archive/Web/CSS/-moz-binding ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Resumen

- -

La propiedad CSS -moz-binding CSS es usada por las aplicaciones basadas en Mozilla para adjuntar una asociación o enlace XBL a un elemento del DOM

- -

{{cssinfo}}

- -

Síntaxis

- -
/* <uri> value */
--moz-binding: url(http://www.example.org/xbl/htmlBindings.xml#checkbox);
-
-/* Global values */
--moz-binding: inherited;
--moz-binding: initial;
--moz-binding: unset;
-
- -

Valores

- -
-
<uri>
-
La URI del enlace XBL (incluyendo el identificador de fragmento).
-
none
-
No se aplica ninguna asociación o enlace XBL al elemento.
-
- -

Síntaxis Formal

- -
{{csssyntax}}
- -

Ejemplo

- -
.exampleone {
-  -moz-binding: url(http://www.example.org/xbl/htmlBindings.xml#radiobutton);
-}
- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores.

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Soporte básico{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver además

- - diff --git a/files/es/web/css/-moz-border-bottom-colors/index.html b/files/es/web/css/-moz-border-bottom-colors/index.html deleted file mode 100644 index 75dea0131a..0000000000 --- a/files/es/web/css/-moz-border-bottom-colors/index.html +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: '-moz-border-bottom-colors' -slug: Web/CSS/-moz-border-bottom-colors -tags: - - CSS - - No estándar(2) - - Propiedad CSS - - Referencia CSS -translation_of: Archive/Web/CSS/-moz-border-bottom-colors ---- -
{{Non-standard_header}}{{CSSRef}}
- -

En la aplicaciones de Mozilla como Firefox la propiedad CSS {{cssxref("-moz-border-bottom-colors")}} establece una lista de colores para el borde inferior.

- -

Cuando un elemento tiene un borde que es mayor de un único pixel CSS, cada línea de pixels usa el siguiente color especificado con esta propiedad, desde fuera hacia adentro. Esto elimina la necesidad de cajas anidadas. Si el borde es mayor que el número colores especificados, la parte restante del borde mantendrá el último color interno especificado

- -

{{cssinfo}}

- -

No se aplica

- -
    -
  1. Si {{Cssxref("border-style")}} es dashed o dotted.
  2. -
  3. En tablas con border-collapse: collapse.
  4. -
- -

Síntaxis

- -
/* Valor de <color> único */
--moz-border-bottom-colors: #f0f0f0;
-
-/* Valores de <color> múltiples */
--moz-border-bottom-colors: #f0f0f0 #a0a0a0 #505050 #000000;
-
-/* Valores globales */
--moz-border-bottom-colors: inherit;
--moz-border-bottom-colors: initial;
--moz-border-bottom-colors: unset;
-
- -

Valores

- -

Acepta una lista de colores separados por espacios en blanco.

- -
-
<color>
-
Especifica el color de una línea de pixels para el borde inferiror. transparent (transparente) es un color válido. Ver  valores de {{cssxref("<color>")}} para ver las posibles unidades.
-
none
-
Valor por defecto, si se establece no se muestra ningún color  ni se usa {{cssxref("border-color")}}
-
- -

Síntaxis formal

- -
{{csssyntax}}
- -

Ejemplo

- -
<div id="example">Ejemplo</div>
-
- -
#example {
-  padding: 20px;
-  background-color: gray;
-  border: 10px solid black;
-  -moz-border-top-colors: #e00 #c30 #c50 #c60 #c70 #c80 #c90 #ca0 #cb0 #cc0;
-  -moz-border-right-colors: red #f60 #f80 #f90 #fa0 #fb0 #fc0 #fd0 #fe0 #ff0;
-  -moz-border-bottom-colors: red #f60 #f80 #f90 #fa0 #fb0 #fc0 #fd0 #fe0 #ff0;
-  -moz-border-left-colors: #e00 #c30 #c50 #c60 #c70 #c80 #c90 #ca0 #cb0 #cc0;
-}
-
- -

{{EmbedLiveSample("Example", 120, 90)}}

- -

Especificaciones

- -

Esta propiedad no forma parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.7")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver además

- - diff --git a/files/es/web/css/-moz-border-left-colors/index.html b/files/es/web/css/-moz-border-left-colors/index.html deleted file mode 100644 index 81eb29d51f..0000000000 --- a/files/es/web/css/-moz-border-left-colors/index.html +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: '-moz-border-left-colors' -slug: Web/CSS/-moz-border-left-colors -tags: - - CSS - - No estándar(2) - - Propiedad CSS - - Referencia CSS -translation_of: Archive/Web/CSS/-moz-border-left-colors ---- -
{{Non-standard_header}}{{CSSRef}}
- -

En aplicaciones de Mozilla, como Firefox, la propiedad CSS {{cssxref("-moz-border-left-colors")}} aplica una lista de colores al borde derecho.

- -

Cuando un elemento tiene un borde que es mayor de un único pixel CSS, cada línea de pixels usa el siguiente color especificado con esta propiedad, desde fuera hacia adentro. Esto elimina la necesidad de cajas anidadas. Si el borde es mayor que el número colores especificados, la parte restante del borde mantendrá el último color interno especificado.

- -

 

- -

{{cssinfo}}

- -

 

- -

No se aplica

- -
    -
  1. Si  {{Cssxref("border-style")}} es dashed o dotted.
  2. -
  3. A tablas con border-collapse: collapse.
  4. -
- -

Síntaxis

- -
/* Valor de <color> único */
--moz-border-left-colors: #f0f0f0;
-
-/* Valor de <color> único */
--moz-border-left-colors: #f0f0f0 #a0a0a0 #505050 #000000;
-
-/* Valores globales */
--moz-border-left-colors: inherit;
--moz-border-left-colors: initial;
--moz-border-left-colors: unset;
-
- -

Valores

- -

Acepta una lista de colores separados por espacios en blanco.

- -
-
<color>
-
Especifica el color de una línea de pixels para el borde inferiror. transparent (transparente) es un color válido. Ver  valores de {{cssxref("<color>")}} para ver las posibles unidades.
-
none
-
Valor por defecto, si se establece no se muestra ningún color  ni se usa {{cssxref("border-color")}}.
-
- -

 

- -

Síntaxis Formal

- -

 

- -
{{csssyntax}}
- -

Ejemplo

- -
<div id="example">Ejemplo</div>
-
- -
#example {
-  padding: 20px;
-  background-color: gray;
-  border: 10px solid black;
-  -moz-border-top-colors: #e00 #c30 #c50 #c60 #c70 #c80 #c90 #ca0 #cb0 #cc0;
-  -moz-border-right-colors: red #f60 #f80 #f90 #fa0 #fb0 #fc0 #fd0 #fe0 #ff0;
-  -moz-border-bottom-colors: red #f60 #f80 #f90 #fa0 #fb0 #fc0 #fd0 #fe0 #ff0;
-  -moz-border-left-colors: #e00 #c30 #c50 #c60 #c70 #c80 #c90 #ca0 #cb0 #cc0;
-}
-
- -

{{EmbedLiveSample("Example", 120, 90)}}

- -

Especificaciones

- -

Esta propiedad no forma parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.7")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver además

- - diff --git a/files/es/web/css/-moz-border-right-colors/index.html b/files/es/web/css/-moz-border-right-colors/index.html deleted file mode 100644 index 5939baf82f..0000000000 --- a/files/es/web/css/-moz-border-right-colors/index.html +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: '-moz-border-right-colors' -slug: Web/CSS/-moz-border-right-colors -tags: - - CSS - - No estándar(2) - - Propiedad CSS - - Referencia CSS -translation_of: Archive/Web/CSS/-moz-border-right-colors ---- -
{{Non-standard_header}}{{CSSRef}}
- -

En la aplicaciones de Mozilla como Firefox la propiedad CSS {{cssxref("-moz-border-right-colors")}} establece una lista de colores para el borde derecho.

- -

Cuando un elemento tiene un borde que es mayor de un único pixel CSS, cada línea de pixels usa el siguiente color especificado con esta propiedad, desde fuera hacia adentro. Esto elimina la necesidad de cajas anidadas. Si el borde es mayor que el número colores especificados, la parte restante del borde mantendrá el último color interno especificado

- -

{{cssinfo}}

- -

No se aplica

- -
    -
  1. Si {{Cssxref("border-style")}} es dashed o dotted.
  2. -
  3. a tablas con border-collapse: collapse.
  4. -
- -

Síntaxis

- -
/* Valor de <color> único */
--moz-border-right-colors: #f0f0f0;
-
-/* Valor de <color> múltiple */
--moz-border-right-colors: #f0f0f0 #a0a0a0 #505050 #000000;
-
-/* Valores gloables */
--moz-border-right-colors: inherit;
--moz-border-right-colors: initial;
--moz-border-right-colors: unset;
-
- -

Valores

- -

Acepta una lista de colores separados por espacios en blanco.

- -
-
<color>
-
Especifica el color de una línea de pixels para el borde inferiror. transparent (transparente) es un color válido. Ver  valores de {{cssxref("<color>")}} para ver las posibles unidades.
-
none
-
Valor por defecto, si se establece no se muestra ningún color  ni se usa {{cssxref("border-color")}}
-
- -

Síntaxis Formal

- -
{{csssyntax}}
- -

Ejemplo

- -
<div id="example">Ejemplo</div>
-
- -
#example {
-  padding: 20px;
-  background-color: gray;
-  border: 10px solid black;
-  -moz-border-top-colors: #e00 #c30 #c50 #c60 #c70 #c80 #c90 #ca0 #cb0 #cc0;
-  -moz-border-right-colors: red #f60 #f80 #f90 #fa0 #fb0 #fc0 #fd0 #fe0 #ff0;
-  -moz-border-bottom-colors: red #f60 #f80 #f90 #fa0 #fb0 #fc0 #fd0 #fe0 #ff0;
-  -moz-border-left-colors: #e00 #c30 #c50 #c60 #c70 #c80 #c90 #ca0 #cb0 #cc0;
-}
-
- -

{{EmbedLiveSample("Example", 120, 90)}}

- -

Especificaciones

- -

Esta propiedad no forma parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores.

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.7")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver además

- - diff --git a/files/es/web/css/-moz-border-top-colors/index.html b/files/es/web/css/-moz-border-top-colors/index.html deleted file mode 100644 index 2db9dffac6..0000000000 --- a/files/es/web/css/-moz-border-top-colors/index.html +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: '-moz-border-top-colors' -slug: Web/CSS/-moz-border-top-colors -tags: - - CSS - - No estándar(2) - - Propiedad CSS - - Referencia CSS -translation_of: Archive/Web/CSS/-moz-border-top-colors ---- -
{{Non-standard_header}}{{CSSRef}}
- -

En la aplicaciones de Mozilla como Firefox la propiedad CSS {{cssxref("-moz-border-top-colors")}} establece una lista de colores para el borde inferior.

- -

Cuando un elemento tiene un borde que es mayor de un único pixel CSS, cada línea de pixels usa el siguiente color especificado con esta propiedad, desde fuera hacia adentro. Esto elimina la necesidad de cajas anidadas. Si el borde es mayor que el número colores especificados, la parte restante del borde mantendrá el último color interno especificado

- -

{{cssinfo}}

- -

No se aplica

- -
    -
  1. Si {{Cssxref("border-style")}} es dashed o dotted.
  2. -
  3. En tablas con border-collapse: collapse.
  4. -
- -

 

- -

Síntaxis

- -

 

- -
/* Valores de <color> único */
--moz-border-top-colors: #f0f0f0;
-
-/* Valores de color <color> múltiple */
--moz-border-top-colors: #f0f0f0 #a0a0a0 #505050 #000000;
-
-/* Valores gloables */
--moz-border-top-colors: inherit;
--moz-border-top-colors: initial;
--moz-border-top-colors: unset;
-
- -

Valores

- -

Acepta una lista de colores separados por espacios en blanco.

- -
-
<color>
-
Especifica el color de una línea de pixels para el borde inferiror. transparent (transparente) es un color válido. Ver  valores de {{cssxref("<color>")}} para ver las posibles unidades.
-
none
-
Valor por defecto, si se establece no se muestra ningún color  ni se usa {{cssxref("border-color")}}
-
- -

Síntaxis Formal

- -
{{csssyntax}}
- -

Ejemplo

- -
<div id="example">Ejemplo</div>
-
- -
#example {
-  padding: 20px;
-  background-color: gray;
-  border: 10px solid black;
-  -moz-border-top-colors: #e00 #c30 #c50 #c60 #c70 #c80 #c90 #ca0 #cb0 #cc0;
-  -moz-border-right-colors: red #f60 #f80 #f90 #fa0 #fb0 #fc0 #fd0 #fe0 #ff0;
-  -moz-border-bottom-colors: red #f60 #f80 #f90 #fa0 #fb0 #fc0 #fd0 #fe0 #ff0;
-  -moz-border-left-colors: #e00 #c30 #c50 #c60 #c70 #c80 #c90 #ca0 #cb0 #cc0;
-}
-
- -

{{EmbedLiveSample("Example", 120, 90)}}

- -

Especificaciones

- -

Esta propiedad no forma parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.7")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver además

- - diff --git a/files/es/web/css/-moz-stack-sizing/index.html b/files/es/web/css/-moz-stack-sizing/index.html deleted file mode 100644 index 639c05d4a5..0000000000 --- a/files/es/web/css/-moz-stack-sizing/index.html +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: '-moz-stack-sizing' -slug: Web/CSS/-moz-stack-sizing -tags: - - CSS - - No estandar - - Referencia CSS - - XUL -translation_of: Archive/Web/CSS/-moz-stack-sizing ---- -

{{Non-standard_header}}{{CSSRef}} {{gecko_minversion_header("1.9.1")}}

- -

Resumen

- -

-moz-stack-sizing es una propiedad de CSS extendido. Normalmente, una {{XULElem("stack")}} cambiará su tamaño para que todos los elementos hijo sean completamente visibles. Por ejemplo, al mover un hijo de la pila lo suficientemente a la derecha anchará la plia para que el hijo permanezca visible.

- -

Si quieres evitar que la pila cambie de tamaño automáticamente puedes establecer -moz-stack-sizing a ignore en el hijo. La propiedad no se estable en la misma pila si no que se establece en los hijos de la pila. Esto permite ignorar a ciertos elementos hijos pero no a otros.

- -

Nota: En versiones anteriores de Gecko  era posible solucionar el problema estableciendo un valor negativo muy grande como margen derecho e inferior para la pila y de igual manera unos márgenes inferior y derecho con grandes valores positivos para los hijos cuyo tamaño no quería ignorar. (El problema no afecta los hijos que se muevan en la parte inferior o izquierda de la pila.)

- -

{{cssinfo}}

- -

Síntaxis

- -
/* Palabras clave de los valores */
--moz-stack-sizing: stretch-to-fit;
--moz-stack-sizing: ignore;
-
-/* valores gloables */
--moz-stack-sizing: inherit;
--moz-stack-sizing: initial;
--moz-stack-sizing: unset;
-
- -

Valores

- -
-
stretch-to-fit
-
El hijo influirá en el tamaño de la pila.
-
ignore
-
La pila no tendrá en cuenta el hijo al calcular su tamaño..
-
- -

Síntaxis Formal

- -
{{csssyntax}}
- -

Ejemplos

- -
.mainsheet {
-  -moz-stack-sizing: ignore;
-}
-
- -

Ver además

- -

{{bug("346189")}}

diff --git a/files/es/web/css/-moz-text-blink/index.html b/files/es/web/css/-moz-text-blink/index.html deleted file mode 100644 index 95f6961609..0000000000 --- a/files/es/web/css/-moz-text-blink/index.html +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: '-moz-text-blink' -slug: Web/CSS/-moz-text-blink -tags: - - CSS - - 'CSS:Entensiones de Mozilla' - - Referencia CSS -translation_of: Archive/Web/CSS/-moz-text-blink ---- -
{{CSSRef}} {{non-standard_header}}{{deprecated_header}}
- -

Resumen

- -

La extensión de Mozilla no estándar  -moz-text-blink especifica si se establece el modo parpadeo.

- -
-

Firefox, que era el único de entre los navegadores más conocidos que lo soportaba, dejó de soportarla a partir de la versión 26. Esta propiedad no es soportadoa por ningún navegador en la actualizad.

-
- -

{{cssinfo}}

- -

Síntaxis

- -
{{csssyntax}}
- -

Valores

- -
-
none
-
No produce parpadeo
-
blink
-
El texto parpade. Destacar que el hecho de que el texto no parpadee es una técnica para satisfacer checkpoint 3.3 of WAI-UAAG.
-
- -

Ejemplo

- -
.example {
-  -moz-text-blink: blink;
-}
- -

Especificaciones

- -

Esta propiedad fue definida en un antiguo borrador de la especificación CSS 3 . La versiones nuevas eliminaron esta definición.

- -

Compatibilidad con los distintos navegadores

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaFirefox (Gecko)ChromeInternet ExplorerOperaSafari
Soporte básico{{CompatGeckoDesktop("6.0")}}
- Removed in {{CompatGeckoDesktop("26.0")}}
{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaFirefox Mobile (Gecko)AndroidIE PhoneOpera MobileSafari Mobile
Soporte básico{{CompatGeckoMobile("6.0")}}
- Removed in {{CompatGeckoMobile("26.0")}}
{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/-moz-window-shadow/index.html b/files/es/web/css/-moz-window-shadow/index.html deleted file mode 100644 index fb2d15bdf0..0000000000 --- a/files/es/web/css/-moz-window-shadow/index.html +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: '-moz-window-shadow' -slug: Web/CSS/-moz-window-shadow -tags: - - CSS - - No estandar - - Propiedad CSS - - Referencia - - XUL -translation_of: Archive/Web/CSS/-moz-window-shadow ---- -
{{Non-standard_header}}{{CSSRef}}{{gecko_minversion_header("1.9.1")}}
- -

Resumen

- -

La propiedad  CSS -moz-window-shadow especifica si una ventana tendrá sombra. Sólo funciona en Mac OS X.

- -
-

Esta propiedad no estándar y a partir de Firefox 44 no puede ser usada más en sitios Web.

-
- -

{{cssinfo}}

- -

Firefox 3 añadió el soporte para ventanas transparentes en Mac OS X. Sin embargo, para este tipo de ventanas,  se quitaron las sombras y no había manera de habilitarlas.

- -

En Firefox 3.5 cambiamos el comportamiento por defecto; todas las ventanas tienen ahora sombra. Introducimos la propiedad CSS -moz-window-shadow para proporcionar una manera de quitar las sombras no deseadas.

- -

Síntaxis

- -
{{csssyntax}}
- -

Valores

- -
-
default
-
La ventana tendrá sombra con el estilo por defecto de la ventana.
-
menu {{gecko_minversion_inline("2.0")}}
-
La ventana tendrá el estilo de sombra que es apropiado para los menús.
-
tooltip {{gecko_minversion_inline("2.0")}}
-
La ventana tendrá el estilo de sombra que es apropiado para las herramientas.
-
sheet {{gecko_minversion_inline("2.0")}}
-
La ventana tendrá el estilo de sombra que es apropiado para las ventanas de datos
-
none
-
La ventana no tendrá sombra.
-
- -

Ejemplos

- -
.KUI-panel {
-  -moz-window-shadow: none;
-}
-
diff --git a/files/es/web/css/-ms-accelerator/index.html b/files/es/web/css/-ms-accelerator/index.html deleted file mode 100644 index 33f1a38f9e..0000000000 --- a/files/es/web/css/-ms-accelerator/index.html +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: '-ms-accelerator' -slug: Web/CSS/-ms-accelerator -tags: - - CSS - - Non-standard - - Propiedad CSS - - Referencia -translation_of: Archive/Web/CSS/-ms-accelerator ---- -
{{CSSRef}}
- -
{{non-standard_header}}
- -

La propiedad CSS -ms-accelerator es una  esxtensión Microsoft que establece o recupera una cadena que indica si el objeto representa un método abreviado de teclado.

- -

{{cssinfo}}

- -

Sintaxis

- -
/* El objeto no es un atajo de teclado (por defecto) */
--ms-accelerator: false
-/* El objeto es un atajo de teclado */
--ms-accelerator: true
-
- -

Values

- -
-
false
-
-

El objeto no es un atajo de teclado

-
-
true
-
-

El objeto es un atajo de teclado

-
-
- -

Formal syntax

- -
{{csssyntax}}
- -

Ejemplos

- -

Este ejemplo usa el atributo -ms-accelerator en un  elemento {{HTMLElement("u")}} para especificar que la "N" en el elemento {{HTMLElement("label")}} es un atajo de teclado. Cuando la opción de "Ocultar los indicadores de navegación del teclado hasta que use la tecla Alt" está habilitada en las propiedades de pantalla del usuario la "N" no estará subrayada hasta que el usuario presione la tecla Alt . Cuando Alt + N son presionadas,el elemento {{HTMLElement("input")}} que define un atributo {{htmlattrxref("accessKey","input")}} valor de atributo de "N" recibe el foco.

- -
<!DOCTYPE html>
-
-<html>
-  <head>
-    <title>Acelerador</title>
-  </head>
-  <body>
-    <label for="oName"><u style="-ms-accelerator: true; accelerator: true">N</u>ame: </label>
-    <input type="text"
-      id="oName"
-      size="25"
-      accesskey="N"
-      value="Your name here" />
-  </body>
-</html>
-
- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Observaciones

- -

Esta propiedad está soportada por Windows 2000 y versiones posteriores. permite a los usuarios ocultar los indicadores de navegación para los elementos del menú y los controles hasta que se presiona la tecla  Alt

- -

Una clave de acceso es un solo carácter que se utiliza como método abreviado de teclado para seleccionar un objeto. El usuario presiona la tecla Alt y la mantiene presionada mientras presiona el carácter para mover el enfoque de entrada al objeto e invocar el evento predeterminado asociado con el objeto.

- -

En Internet Explorer 8 (IE8) el atributo -ms-accelerator es una extensión de CSS, y se puede usar como un sinónimo para accelerator en el modo estándar de IE8.

diff --git a/files/es/web/css/-ms-overflow-style/index.html b/files/es/web/css/-ms-overflow-style/index.html deleted file mode 100644 index 8e2295067a..0000000000 --- a/files/es/web/css/-ms-overflow-style/index.html +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: '-ms-overflow-style' -slug: Web/CSS/-ms-overflow-style -tags: - - CSS - - No estándar(2) - - Propiedad - - Propiedad CSS - - Referencia - - Referencia CSS -translation_of: Archive/Web/CSS/-ms-overflow-style ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

-ms-overflow-style es una propiedad CSS propietaria, específica de  Internet Explorer y Microsoft Edge, que controla el compartamiento de la barra de desplazamiento (scroll) cuando el contenido de un elemento se desborda.

- -

{{cssinfo}}

- -

Valores

- -
-
auto
-
Valor inicial. Lo mismo que  inherit.
-
none
-
La barras de desplazamiento (Scrollbars) no son nuncas mostradas, aunque se puede hacer el scroll sobre el elemento si el contenido lo desoborda.
-
scrollbar
-
Las  barras de desplazamiento(sroll) "Tradicionales" se muestran si el contenido desborda el elemento. Estas barras no se auto ocultan ni se solapan con el contenido del elemento. Por consiguente, las dimensiones del aréa de contenido son reducidas en una cantidad igual al tamaño de las barras de desplazamiento.
-
-ms-autohiding-scrollbar
-
Se muestran barras de desplazamiento que se auto ocultan si el contenido desborda el elemento. Estas barras se muestran mientras se hace el desplzamiento o scroll y brevemente después de realizar el desplazamiento y cuando la interacción ha terminado se ocultan. Mientras estén visibles se supeponen al contenido del elemento..
-
- -

Síntaxis Formal

- -
{{csssyntax}}
- -

Especificciones

- -

No es parte de ninguna especificación. Microsoft tiene una descripción suya en MSDN.

diff --git a/files/es/web/css/_colon_-moz-full-screen-ancestor/index.html b/files/es/web/css/_colon_-moz-full-screen-ancestor/index.html deleted file mode 100644 index 3163a3e07e..0000000000 --- a/files/es/web/css/_colon_-moz-full-screen-ancestor/index.html +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: ':-moz-full-screen-ancestor' -slug: 'Web/CSS/:-moz-full-screen-ancestor' -tags: - - CSS - - NeedsExample - - No estandar - - Pseudo clase - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-full-screen-ancestor' ---- -
{{CSSRef}}{{non-standard_header}}
- -

Resumen

- -

La  pseudo-clase CSS :-moz-full-screen-ancestor se aplica a todos los ancestros de el elemento full-screen(pantalla completa) exceptuando los frames (marcos) que pueda contener en los documentos padre, que son los elementos full-screen(pantalla completa) es sus propios documentos. Sin embargo, sí que se aplica la clase a los antecesores de esos elementos.

- -

Ejemplos

- -

Necesita un ejemplo

- -

Compatibilidad con distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatUnknown}}{{CompatGeckoDesktop("10.0")}}{{property_prefix("-moz")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatUnknown}}{{CompatGeckoMobile("10.0")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
-
- -

Ver además.

- - diff --git a/files/es/web/css/_colon_-moz-lwtheme-brighttext/index.html b/files/es/web/css/_colon_-moz-lwtheme-brighttext/index.html deleted file mode 100644 index 16421aa6f1..0000000000 --- a/files/es/web/css/_colon_-moz-lwtheme-brighttext/index.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: ':-moz-lwtheme-brighttext' -slug: 'Web/CSS/:-moz-lwtheme-brighttext' -tags: - - CSS - - NeedsCompatTable - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/:-moz-lwtheme-brighttext' ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Resumen

- -

La  pseudo-clase :-moz-lwtheme-brighttext es seleccionada en los documentos chrome cuando  {{cssxref(":-moz-lwtheme")}} es true (verdadero) y se ha seleccionado un tema ligero con un color de texto brillante.

- -

Ver además

- - diff --git a/files/es/web/css/_colon_-moz-lwtheme-darktext/index.html b/files/es/web/css/_colon_-moz-lwtheme-darktext/index.html deleted file mode 100644 index 4cc595e8d1..0000000000 --- a/files/es/web/css/_colon_-moz-lwtheme-darktext/index.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: ':-moz-lwtheme-darktext' -slug: 'Web/CSS/:-moz-lwtheme-darktext' -tags: - - CSS - - NeedsCompatTable - - NeedsExample - - No estandar - - Referencia CSS - - Temas -translation_of: 'Mozilla/Gecko/Chrome/CSS/:-moz-lwtheme-darktext' ---- -
{{CSSRef}}{{non-standard_header}}
- -

Resumen

- -

La pseudo-clase :-moz-lwtheme-darktext es seleccionada en los documentos chrome cuando  {{cssxref(":-moz-lwtheme")}} es verdadero (true) y se ha seleccionado un tema ligero con un color de texto oscuro.

- -

Ver además

- - diff --git a/files/es/web/css/_colon_-moz-lwtheme/index.html b/files/es/web/css/_colon_-moz-lwtheme/index.html deleted file mode 100644 index 7ce4770c52..0000000000 --- a/files/es/web/css/_colon_-moz-lwtheme/index.html +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: ':-moz-lwtheme' -slug: 'Web/CSS/:-moz-lwtheme' -tags: - - CSS - - NeedsCompatTable - - NeedsExample - - No estandar - - Referencia CSS - - Temas - - Temas Ligeros -translation_of: 'Mozilla/Gecko/Chrome/CSS/:-moz-lwtheme' ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Resumen

- -

La  pseudo-clase :-moz-lwtheme es verdadera y seleccionada en los documento chrome cuando el atributo {{xulattr("lightweightthemes")}} del elemento raíz es true (verdadero) y se ha seleccionado un tema

- -

Ver además

- - diff --git a/files/es/web/css/_colon_-moz-system-metric(images-in-menus)/index.html b/files/es/web/css/_colon_-moz-system-metric(images-in-menus)/index.html deleted file mode 100644 index b99e17b59f..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(images-in-menus)/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: ':-moz-system-metric(images-in-menus)' -slug: 'Web/CSS/:-moz-system-metric(images-in-menus)' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/images-in-menus' ---- -
{{CSSRef}}{{Non-standard_header}}{{Fx_minversion_header(3)}}
- -

Resumen

- -

La   pseudo-class CSS :-moz-system-metric(images-in-menus) selecciona un elemento si el interfaz de usuario del equipo soporta imágenes en menús.

- -

Está pensado sobre todo para desarrolladores de temas.

diff --git a/files/es/web/css/_colon_-moz-system-metric(mac-graphite-theme)/index.html b/files/es/web/css/_colon_-moz-system-metric(mac-graphite-theme)/index.html deleted file mode 100644 index 981760b5de..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(mac-graphite-theme)/index.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: ':-moz-system-metric(mac-graphite-theme)' -slug: 'Web/CSS/:-moz-system-metric(mac-graphite-theme)' -tags: - - CSS - - NeedsCompatTable - - No estandar - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/mac-graphite-theme' ---- -
{{Non-standard_header}}{{CSSRef}}{{gecko_minversion_header("1.9.1")}}
- -

Resumen

- -

La pseudo-clase CSS :-moz-system-metric(mac-graphite-theme) seleccionará cualquier elemento si el usuario ha elegido la apariencia "Graphite" en el panel de preferencias  "Appearance"  dentro de la sección de preferencias de sistema de Mac OS X.

- -

Este selector está pensado sobre todo para desarrolladores de temas

- -

Ejemplos

- -

Demo

- -

Bugzilla

- -

{{Bug(448767)}}

diff --git a/files/es/web/css/_colon_-moz-system-metric(scrollbar-end-backward)/index.html b/files/es/web/css/_colon_-moz-system-metric(scrollbar-end-backward)/index.html deleted file mode 100644 index 00239c5bd1..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(scrollbar-end-backward)/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: ':-moz-system-metric(scrollbar-end-backward)' -slug: 'Web/CSS/:-moz-system-metric(scrollbar-end-backward)' -tags: - - CSS - - NeedsContent - - NeedsExample - - No estándar(2) - - Pseudo clase CSS - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/scrollbar-end-backward' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

La pseudo-clase CSS :-moz-system-metric(scrollbar-end-backward) seleccionará un elemento  si el interfaz de usuario del equipo incluye un botón de flecha hacia atrás al final de las barras de desplazamiento o barras de scroll.

- -

Está pensado sobre todo para desarrolladores de temas

- -

Especificaciones

- -

No es parte de ningún estándar.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.9")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/_colon_-moz-system-metric(scrollbar-end-forward)/index.html b/files/es/web/css/_colon_-moz-system-metric(scrollbar-end-forward)/index.html deleted file mode 100644 index 2712092b3c..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(scrollbar-end-forward)/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: ':-moz-system-metric(scrollbar-end-forward)' -slug: 'Web/CSS/:-moz-system-metric(scrollbar-end-forward)' -tags: - - CSS - - NeedsContent - - NeedsExample - - No estándar(2) - - Pseudo clase CSS - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/scrollbar-end-forward' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

La  pseudo-clase CSS :-moz-system-metric(scrollbar-end-forward) seleccionará un elemento si el interfaz de usuario del equpo incluye una flecha hacia adelante al final de las barras de desplazamiento o barras de scroll.

- -

Está pensado sobre todo para desarrolldores de temas.

- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.9")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/_colon_-moz-system-metric(scrollbar-start-backward)/index.html b/files/es/web/css/_colon_-moz-system-metric(scrollbar-start-backward)/index.html deleted file mode 100644 index a3a5c21e82..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(scrollbar-start-backward)/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: ':-moz-system-metric(scrollbar-start-backward)' -slug: 'Web/CSS/:-moz-system-metric(scrollbar-start-backward)' -tags: - - CSS - - NeedsContent - - NeedsExample - - No estándar(2) - - Pseudo clase CSS - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/scrollbar-start-backward' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

La  pseudo-clase CSS:-moz-system-metric(scrollbar-start-backward) seleccionará un elemento si el interfaz de usuario del equipo incluye una flecha hacia atrás al principio de las barras de desplazamiento o barras de scroll.

- -

Este selector está pensado sobre todo para desarrolladores de temas.

- -

Especificaciones

- -

No es parte de niguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.9")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/_colon_-moz-system-metric(scrollbar-start-forward)/index.html b/files/es/web/css/_colon_-moz-system-metric(scrollbar-start-forward)/index.html deleted file mode 100644 index f309dabd5c..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(scrollbar-start-forward)/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: ':-moz-system-metric(scrollbar-start-forward)' -slug: 'Web/CSS/:-moz-system-metric(scrollbar-start-forward)' -tags: - - CSS - - NeedsContent - - NeedsExample - - No estándar(2) - - Pseudo clase CSS - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/scrollbar-start-forward' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

La  pseudo-clase CSS:-moz-system-metric(scrollbar-start-forward) seleccionará un elemento si el interfaz de usuario del equipo incluye una flecha hacia atrás al principio de las barras de desplazamiento o barras de scroll.

- -

Este selector está pensado sobre todo para desarrolladores de temas.

- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.9")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/_colon_-moz-system-metric(scrollbar-thumb-proportional)/index.html b/files/es/web/css/_colon_-moz-system-metric(scrollbar-thumb-proportional)/index.html deleted file mode 100644 index 1cbef2d0ec..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(scrollbar-thumb-proportional)/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: ':-moz-system-metric(scrollbar-thumb-proportional)' -slug: 'Web/CSS/:-moz-system-metric(scrollbar-thumb-proportional)' -tags: - - CSS - - NeedsContent - - NeedsExample - - No estándar(2) - - Pseudo clase CSS - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/scrollbar-thumb-proportional' ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Resumen

- -

La pseudo-clase CSS:-moz-system-metric(scrollbar-thumb-proportional) seleccionará un elemento si el interfaz de usuario del equipo proporciona miniaturas (thumbnails) proporcionales en las barras de desplazamiento o barras de scroll; es decir, la miniatura o parte arrastrable en la barra de desplazamiento cambia de tamaño para indicar el tamaño relativo del área visible del documento.

- -

Está pensado sobre todo para desarrolladores de temas.

- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.9")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/_colon_-moz-system-metric(touch-enabled)/index.html b/files/es/web/css/_colon_-moz-system-metric(touch-enabled)/index.html deleted file mode 100644 index 5ee2a63aa2..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(touch-enabled)/index.html +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: ':-moz-system-metric(touch-enabled)' -slug: 'Web/CSS/:-moz-system-metric(touch-enabled)' -tags: - - CSS - - NeedsContent - - NeedsExample - - No estándar(2) - - Pseudo clase CSS - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/touch-enabled' ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Resumen

- -

La   pseudo-clase CSS :-moz-system-metric(touch-enabled) seleccionará un elemento si el dispositivo en el cuál se está mostrando el contenido soporta un interfaz táctil.

- -
Nota: No está pensado para contenido web. Para eso se debería usar la consulta de medios  (media query) -moz-touch-enabled
- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.9.2")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/_colon_-moz-system-metric(windows-default-theme)/index.html b/files/es/web/css/_colon_-moz-system-metric(windows-default-theme)/index.html deleted file mode 100644 index 8d134cb531..0000000000 --- a/files/es/web/css/_colon_-moz-system-metric(windows-default-theme)/index.html +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: ':-moz-system-metric(windows-default-theme)' -slug: 'Web/CSS/:-moz-system-metric(windows-default-theme)' -tags: - - CSS - - NeedsMobileBrowserCompatibility - - No estándar(2) - - Psuedo clase CSS - - Referencia CSS -translation_of: 'Archive/Web/CSS/:-moz-system-metric/windows-default-theme' ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Resumen

- -

La pseudo-clase CSS :-moz-system-metric(windows-default-theme)  selecciona un elemento si el usuario está usando en esos momento uno de los siguientes temas de Windows: Luna, Royale, Zune, or Aero (por ejemplo  Vista Basic, Vista Standard, or Aero Glass). Esto excluye los temas clásicos de Windows y los temas realizados por terceros.

- -

Este selector está pensado sobre todo para desarrolladores de temas.

- -

Ejemplo

- -

Contenido HTML

- -
<p id="defaultThemes">
-  Este párrafo debería tener un fondo verde con los temas de Windows Luna/Royale/Zune/Aero
-  y un fondo rojo con otros temas.
-</p>
-
-<p id="nonDefaultThemes">
-  Este párrafo debería tener fondo verde con el tema clásico de Window o con temas de terceros
-  y fondo rojo con otros temas
-</p>
-
-<p id="notSupported">La detección de temas no está soportada.</p>
- -

Contenido CSS

- -
#defaultThemes,
-#nonDefaultThemes {
-  background-color: #FFA0A0;
-}
-
-#defaultThemes:-moz-system-metric(windows-default-theme) {
-  background-color: #A0FFA0;
-}
-
-#nonDefaultThemes:not(-moz-system-metric(windows-default-theme)) {
-  background-color: #A0FFA0;
-}
-
-#notSupported:-moz-system-metric(windows-default-theme),
-#notSupported:not(:-moz-system-metric(windows-default-theme)) {
-  display: none;
-}
-
- -

{{EmbedLiveSample("Example", "100%", 170)}}

- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("1.9")}}[1]{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

[1] Implementando en {{Bug("426660")}}. Cambió el comportamiento de los temas  Royale y Zone para que funcionaran igual que el tema Luna {{Bug("429176")}}.

diff --git a/files/es/web/css/_colon_-moz-tree-cell-text(hover)/index.html b/files/es/web/css/_colon_-moz-tree-cell-text(hover)/index.html deleted file mode 100644 index c0ef648273..0000000000 --- a/files/es/web/css/_colon_-moz-tree-cell-text(hover)/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: ':-moz-tree-cell-text(hover)' -slug: 'Web/CSS/:-moz-tree-cell-text(hover)' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-cell-text(hover)' ---- -
{{Non-standard_header}}{{CSSRef}}{{gecko_minversion_header(1.9)}}
- -

Resumen

- -

La pseudo-clase CSS :-moz-tree-cell-text(hover) seleccionará un elemento si el cursor del ratón está actualmente sobre el texto en una celda o elemento del árbol

- -

Está pensado principalmente para desarrolladores.

diff --git a/files/es/web/css/_colon_-moz-tree-cell-text/index.html b/files/es/web/css/_colon_-moz-tree-cell-text/index.html deleted file mode 100644 index c6dcc5f378..0000000000 --- a/files/es/web/css/_colon_-moz-tree-cell-text/index.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: ':-moz-tree-cell-text' -slug: 'Web/CSS/:-moz-tree-cell-text' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-cell-text' ---- -

{{Non-standard_header}}{{CSSRef}}

- -

Activado por el atributo  properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - diff --git a/files/es/web/css/_colon_-moz-tree-cell/index.html b/files/es/web/css/_colon_-moz-tree-cell/index.html deleted file mode 100644 index cf8ee0162c..0000000000 --- a/files/es/web/css/_colon_-moz-tree-cell/index.html +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: ':-moz-tree-cell' -slug: 'Web/CSS/:-moz-tree-cell' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-cell' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Activado por el attributo  properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - - -

Ver además

- - diff --git a/files/es/web/css/_colon_-moz-tree-column/index.html b/files/es/web/css/_colon_-moz-tree-column/index.html deleted file mode 100644 index 62376be975..0000000000 --- a/files/es/web/css/_colon_-moz-tree-column/index.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: ':-moz-tree-column' -slug: 'Web/CSS/:-moz-tree-column' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-column' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Activado por el atributo  properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - diff --git a/files/es/web/css/_colon_-moz-tree-drop-feedback/index.html b/files/es/web/css/_colon_-moz-tree-drop-feedback/index.html deleted file mode 100644 index 320955cddf..0000000000 --- a/files/es/web/css/_colon_-moz-tree-drop-feedback/index.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: ':-moz-tree-drop-feedback' -slug: 'Web/CSS/:-moz-tree-drop-feedback' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Pseudo clase - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-drop-feedback' ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Activado por el atributo properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - diff --git a/files/es/web/css/_colon_-moz-tree-image/index.html b/files/es/web/css/_colon_-moz-tree-image/index.html deleted file mode 100644 index 65e270ddb5..0000000000 --- a/files/es/web/css/_colon_-moz-tree-image/index.html +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: ':-moz-tree-image' -slug: 'Web/CSS/:-moz-tree-image' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsLiveSample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/:-moz-tree-image' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Activado por el atributo properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - - -

Ejemplos

- -

Bookmark icons in the Places window - Mozillazine Forum

diff --git a/files/es/web/css/_colon_-moz-tree-indentation/index.html b/files/es/web/css/_colon_-moz-tree-indentation/index.html deleted file mode 100644 index bce9310aaf..0000000000 --- a/files/es/web/css/_colon_-moz-tree-indentation/index.html +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: ':-moz-tree-indentation' -slug: 'Web/CSS/:-moz-tree-indentation' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-indentation' ---- -

{{CSSRef}}{{Non-standard_header}}

- -

Activado por el atributo properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - diff --git a/files/es/web/css/_colon_-moz-tree-line/index.html b/files/es/web/css/_colon_-moz-tree-line/index.html deleted file mode 100644 index 67d05a7b74..0000000000 --- a/files/es/web/css/_colon_-moz-tree-line/index.html +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: ':-moz-tree-line' -slug: 'Web/CSS/:-moz-tree-line' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-line' ---- -

{{Non-standard_header}}{{CSSRef}}

- -

Activado por el atributo properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - diff --git a/files/es/web/css/_colon_-moz-tree-progressmeter/index.html b/files/es/web/css/_colon_-moz-tree-progressmeter/index.html deleted file mode 100644 index 57cdb929bd..0000000000 --- a/files/es/web/css/_colon_-moz-tree-progressmeter/index.html +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: ':-moz-tree-progressmeter' -slug: 'Web/CSS/:-moz-tree-progressmeter' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-progressmeter' ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Activado cuando al atributo type se le da el valor progressmeter.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - diff --git a/files/es/web/css/_colon_-moz-tree-row(hover)/index.html b/files/es/web/css/_colon_-moz-tree-row(hover)/index.html deleted file mode 100644 index 6a5a723a12..0000000000 --- a/files/es/web/css/_colon_-moz-tree-row(hover)/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: ':-moz-tree-row(hover)' -slug: 'Web/CSS/:-moz-tree-row(hover)' -tags: - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Pseudo clase CSS - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-row(hover)' ---- -
{{Non-standard_header}}{{CSSRef}}{{Fx_minversion_header(3)}}
- -

Resumen

- -

La   pseudo-clase CSS :-moz-tree-row(hover) seleccionará un elemento si el cursor del ratón está sobre una fila de un árbol.

- -

Está pensado principalmente para ser usado por desarrolladores de temas.

diff --git a/files/es/web/css/_colon_-moz-tree-row/index.html b/files/es/web/css/_colon_-moz-tree-row/index.html deleted file mode 100644 index b334d502f9..0000000000 --- a/files/es/web/css/_colon_-moz-tree-row/index.html +++ /dev/null @@ -1,50 +0,0 @@ ---- -title: ':-moz-tree-row' -slug: 'Web/CSS/:-moz-tree-row' -tags: - - CSS - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-row' ---- -

{{CSSRef}}{{Non-standard_header}}

- -

Resumen

- -

El  pseudo-elemento::-moz-tree-row CSS  se usa para seleccionar filas y para aplicar estilos a las filas de los árboles.

- -

Elementos asociados

- - - -

Síntaxis

- -
treechildren::-moz-tree-row {propiedades de estilo }
-
- -

Propiedades de estilo

- - - -

Ejemplos

- -
treechildren::-moz-tree-row( foo bar )
-{
-    margin: 2%;
-}
-
- -

...donde...

- -
  <treerow properties="foo">...</treerow>
-
diff --git a/files/es/web/css/_colon_-moz-tree-separator/index.html b/files/es/web/css/_colon_-moz-tree-separator/index.html deleted file mode 100644 index c3d15f89f8..0000000000 --- a/files/es/web/css/_colon_-moz-tree-separator/index.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: ':-moz-tree-separator' -slug: 'Web/CSS/:-moz-tree-separator' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-separator' ---- -
{{Non-standard_header}}{{CSSRef}}
- -

Activado por el atributo properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - diff --git a/files/es/web/css/_colon_-moz-tree-twisty/index.html b/files/es/web/css/_colon_-moz-tree-twisty/index.html deleted file mode 100644 index 80f03fadec..0000000000 --- a/files/es/web/css/_colon_-moz-tree-twisty/index.html +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: ':-moz-tree-twisty' -slug: 'Web/CSS/:-moz-tree-twisty' -tags: - - CSS - - NeedsCompatTable - - NeedsContent - - NeedsExample - - No estandar - - Referencia CSS -translation_of: 'Mozilla/Gecko/Chrome/CSS/::-moz-tree-twisty' ---- -

{{ CSSRef() }}{{Non-standard_header}}

- -

Activado por el atributo properties.

- -

Elementos asociados

- - - -

Propiedades de estilo

- - diff --git a/files/es/web/css/_doublecolon_-ms-browse/index.html b/files/es/web/css/_doublecolon_-ms-browse/index.html deleted file mode 100644 index 7ad4e3c6ec..0000000000 --- a/files/es/web/css/_doublecolon_-ms-browse/index.html +++ /dev/null @@ -1,97 +0,0 @@ ---- -title: '::-ms-browse' -slug: 'Web/CSS/::-ms-browse' -tags: - - CSS - - No estándar(2) - - Pseudo-elemento - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-browse' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

El pseudo-elemento CSS  ::-ms-browse representa el botón para abrir el selector de archivos de un  {{HTMLElement("input")}} con type="file".

- -
-

Nota: No se pueden usar todas las propiedades con este pseudo-elemento. Hay una  lista de propiedades permitidas en la documentación MSDN.

-
- -

Ejemplo

- -

Contenido HTML

- -
<label>Select image: <input type="file"></label>
- -

Contenido CSS

- -
input[type="file"]::-ms-browse
-{
-  color: red;
-  background-color: yellow;
-}
- -

Salida

- -

{{EmbedLiveSample('Example')}}

- -

Resultado del ejemplo

- -

- -

Especificaciones

- -

No es parte de ninguna especificación pero Miscrosoft tiene una  descripción de ::-ms-browse en MSDN.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatNo}}10{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/_doublecolon_-ms-check/index.html b/files/es/web/css/_doublecolon_-ms-check/index.html deleted file mode 100644 index ce4c6e1c6b..0000000000 --- a/files/es/web/css/_doublecolon_-ms-check/index.html +++ /dev/null @@ -1,114 +0,0 @@ ---- -title: '::-ms-check' -slug: 'Web/CSS/::-ms-check' -tags: - - CSS - - No estándar(2) - - Pseudo-elemento - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-check' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

El pseudo-elemento CSS ::-ms-check representa la marca de selección de un {{HTMLElement("input")}} con  type="checkbox" o type="radio".

- -

No es un elemento estándar y es únicamente soportado por Internet Explorer y Edge, tal y como indica el prefijo  (-ms que indica Microsoft).

- -

Síntaxis

- -
selector::-ms-check
-
- -

Ejemplos

- -

Contenido HTML

- -
<form>
-    <label for="redButton">Red</label>
-    <input type="radio" id="redButton"><br>
-    <label for="greenCheckbox">Green</label>
-    <input type="checkbox" id="greenCheckbox">
-</form>
- -

Contenido CSS

- -
input, label {
-    display: inline;
-}
-
-input[type=radio]::-ms-check {
-    color: red; /* Hará que la marca de selección sea roja cuando seleccionemos el botón */
-}
-
-input[type=checkbox]::-ms-check {
-    color: green; /* Hará que la marca de selección sea rverde cuando seleccionemos el botón */
-}
-
- -

Más abajo tiene disponible un ejemplo para poder probar. El pantallazo a la izquierda muestra que es lo que sucedería al haer click en caso de que no tengas acceso a Internet Explorer o Edge.

- -

{{ EmbedLiveSample('Examples', '', '', 'https://mdn.mozillademos.org/files/13392/ms_check', 'Web/CSS/::-ms-check') }}

- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Microsoft tienes una descripcón en MSDN que enumera varias propiedades que se pueden modificar en este pseudo-elemento.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatNo}}10.0{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)Firefox OSIE MobileOpera MobileiOS WebKit
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}
-
- -
 
diff --git a/files/es/web/css/_doublecolon_-ms-clear/index.html b/files/es/web/css/_doublecolon_-ms-clear/index.html deleted file mode 100644 index d5fe9d7ffa..0000000000 --- a/files/es/web/css/_doublecolon_-ms-clear/index.html +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: '::-ms-clear' -slug: 'Web/CSS/::-ms-clear' -tags: - - CSS - - No estándar(2) - - Pseudo-elemento - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-clear' ---- -

{{non-standard_header}}{{CSSRef}}

- -

Resumen

- -

El pseudo-elemento CSS  ::-ms-clear sirve para representar un botón (el botón "borrar") en el borde de un elemento  {{HTMLElement("input")}} con type="text". Este botón elimina el valor actual del elemento {{HTMLElement("input")}}. El botón y pseudo-elemento no son parte del estándar y únicamente son soportados por los navegadores Internet Explorer 10 y 11 y Edge 12+, de ahí el prefijo del vendedor  (`-ms` por Microsoft). El botón de borrado sólo se muestra en elementos  {{HTMLElement("input")}} con type="text" que hayan recibido el foco y no estén vacíos.

- -

Síntaxis

- -
 selector::-ms-clear
- -

Ejemplos

- -

Contenido HTML

- -
<form>
-   <label for="firstname">First name:</label>
-   <input type="text" id="firstname" name="firstname" placeholder="First name"><br>
-
-   <label for="lastname">Last name:</label>
-   <input type="text" id="lastname" name="lastname" placeholder="Second name">
-</form>
-
- -

Contenido CSS

- -
input,
-label {
-    display: block;
-}
-
-input[type=text]::-ms-clear {
-    color: red; /* Establece el color de la cruz a rojo */
-    /* La cruz se puede ocultar si fijamos el atributo display a "none" */
-}
- -

{{ EmbedLiveSample('Examples', '', '', '', 'Web/CSS/::-ms-clear') }}

- -

El siguiente pantallazo muestra, para aquellos que no tengan acceso a IE 10/11 o a  Edge 12+, cómo quedaría esta característica:

- -

 

- -

Especificaciones

- -

No es parte de ninguna especificación

- -

Microsoft tiene una descripción en MSDN que enumera las distintas propiedades que podemos establecer para este tipo de pseudo-elementos.

- -
-

Esta característica sólo está disponible para IE 10-11, ha sido eliminada en la versión más reciente de Microsoft Edge.

-
- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatNo}}10.0 [1]
- Edge 12+
{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}
-
- -

[1] En un {{HTMLElement("input")}} de texto al que se le haya dada estilo con  {{cssxref("text-align")}}: right,  si se muestra el botón de borrado,  éste cortará el borde derecho del valor contenido en el {{HTMLElement("input")}}. Una solución es esconder el botón usando  {{cssxref("display")}}: none.

diff --git a/files/es/web/css/_doublecolon_-ms-expand/index.html b/files/es/web/css/_doublecolon_-ms-expand/index.html deleted file mode 100644 index 99c3a18ccd..0000000000 --- a/files/es/web/css/_doublecolon_-ms-expand/index.html +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: '::-ms-expand' -slug: 'Web/CSS/::-ms-expand' -tags: - - CSS - - NeedsBrowserCompatibility - - NeedsExample - - No estandar - - Pesudo-elemento - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-expand' ---- -
{{ CSSRef() }}
- -

{{ Non-standard_header() }}

- -

Resumen

- -

El pseudo-elemento CSS ::-ms-expand representa el botón dentro un {{HTMLElement("select")}} que abre y cierra el menú desplegable que contiene los disferentes elementos {{HTMLElement("option")}}. Normalemente tiene apariencia de triángulo que apunta hacia abajo..

- -

Especificaciones

- -

No es parte de ninguna especificación

- -

Microsoft tiene una descripción en MSDN.

diff --git a/files/es/web/css/_doublecolon_-ms-fill-lower/index.html b/files/es/web/css/_doublecolon_-ms-fill-lower/index.html deleted file mode 100644 index 33ba4292b4..0000000000 --- a/files/es/web/css/_doublecolon_-ms-fill-lower/index.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: '::-ms-fill-lower' -slug: 'Web/CSS/::-ms-fill-lower' -tags: - - CSS - - NeedsExample - - No estándar(2) - - Pseudo-elemento - - Pseudo-elemento CSS - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-fill-lower' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

El pseudo-elemento CSS ::-ms-fill-lower representa la porción de la "ruta" (la ranura sobre la cual el indicador desliza) de un {{HTMLElement("input")}} con type="range", lo que corresponde a los valores inferiores al actualmente seleccionador por el indicador.

- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Microsoft tiene  una  descriptción en MSDN.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaFirefox (Gecko)ChromeInternet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaFirefox Mobile (Gecko)AndroidIE PhoneOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}
-
- -

Ver además

- - diff --git a/files/es/web/css/_doublecolon_-ms-fill-upper/index.html b/files/es/web/css/_doublecolon_-ms-fill-upper/index.html deleted file mode 100644 index 1806c2890f..0000000000 --- a/files/es/web/css/_doublecolon_-ms-fill-upper/index.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: '::-ms-fill-upper' -slug: 'Web/CSS/::-ms-fill-upper' -tags: - - CSS - - NeedsExample - - No estándar(2) - - Pseudo-elemento - - Pseudo-elemento CSS - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-fill-upper' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

El pseudo-elemento  CSS ::-ms-fill-upper representa la parte de la ruta  (la ranura sobre la que el indicador desliza) de un  {{HTMLElement("input")}} con type="range", que corresponde a valores mayores que el valor actual en el que se encuentra el indicador.

- -

Especificaciones

- -

No es parte de ninguna especificación

- -

Microsoft tiene una descripción en MSDN.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaFirefox (Gecko)ChromeInternet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaFirefox Mobile (Gecko)AndroidIE PhoneOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}
-
- -

Ver además

- - diff --git a/files/es/web/css/_doublecolon_-ms-fill/index.html b/files/es/web/css/_doublecolon_-ms-fill/index.html deleted file mode 100644 index 6da2a8a77b..0000000000 --- a/files/es/web/css/_doublecolon_-ms-fill/index.html +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: '::-ms-fill' -slug: 'Web/CSS/::-ms-fill' -tags: - - CSS - - No estándar(2) - - Pseudo-lemento - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-fill' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

El pseudo-elemento CSS ::-ms-fill CSS representa la porción rellena de un elemento {{HTMLElement("progress")}}. Es un pseudo-elemento no estándar y específico de Internet Explorer 10+, de ahí el prefijo del vendedor.

- -

Síntaxis

- -
{{csssyntax}}
- -

Especificaciones

- -

No es parte de ninguna especificación. Microsoft tiene una descripción en MSDN.

- -

Ejemplo

- -

Contenido CSS

- -
progress::-ms-fill {
-  background-color: orange;
-}
- -

Contenido HTML

- -
<progress value="10" max="50">
-
- -

Salida

- -

{{EmbedLiveSample("Example", 300, 50)}}

- -

Una barra de progreso a la que se aplique ese estilo tendrá una apariencia similar a la siguiente:

- -

Progress Bar with Orange Fill

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatNo}}10.0{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatUnknown}}{{CompatNo}}{{CompatNo}}
-
- -

Ver además

- - diff --git a/files/es/web/css/_doublecolon_-ms-reveal/index.html b/files/es/web/css/_doublecolon_-ms-reveal/index.html deleted file mode 100644 index ed8e17278d..0000000000 --- a/files/es/web/css/_doublecolon_-ms-reveal/index.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: '::-ms-reveal' -slug: 'Web/CSS/::-ms-reveal' -tags: - - CSS - - NeedsExample - - No estándar(2) - - Pseudo-elemento - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-reveal' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

El pseudo-elemento CSS  ::-ms-reveal se usa para mostrar y aplicar estilos al botón "mostrar contraseña" que normalmente se pone al lado de un elemento  {{HTMLElement("input")}} con type="password" en Internet Explorer 10+. Este botón revela el valor del campo contraseña en texto plano (en vez de los asteriscos que son usados por motivos de privacidad). Este botón y el pseudo-elemento no son estándar y son específicos de Internet Explorer 10+,  de ahí ese prefijo de vendedor.

- -

Especificaciones

- -

No es parte de ninguna especificación.

- -

Microsoft tiene una descripción en MSDN.

- -

Compatibilidad con los distintos navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaFirefox (Gecko)ChromeInternet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaFirefox Mobile (Gecko)AndroidIE PhoneOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}
-
diff --git a/files/es/web/css/_doublecolon_-ms-thumb/index.html b/files/es/web/css/_doublecolon_-ms-thumb/index.html deleted file mode 100644 index 3e81694509..0000000000 --- a/files/es/web/css/_doublecolon_-ms-thumb/index.html +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: '::-ms-thumb' -slug: 'Web/CSS/::-ms-thumb' -tags: - - CSS - - NeedsBrowserCompatibility - - NeedsCompatTable - - NeedsExample - - NeedsMobileBrowserCompatibility - - No estándar(2) - - Pseudo-elemento - - Pseudo-elementos CSS - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-thumb' ---- -
{{CSSRef}}{{Non-standard_header}}
- -

Resumen

- -

El pseudo-elemento CSS  ::-ms-thumb representa el indicador que el usuario puede mover a través de la pista o ranura de un elemento  {{HTMLElement("input")}} con type="range" para alterar su valor numérico.

- -

Especificación

- -

No es parte de ninguna especificación, aunque  Microsoft tiene una descripción en MSDN.

- -

Ver además

- - diff --git a/files/es/web/css/_doublecolon_-ms-ticks-after/index.html b/files/es/web/css/_doublecolon_-ms-ticks-after/index.html deleted file mode 100644 index 5f49d4a9b0..0000000000 --- a/files/es/web/css/_doublecolon_-ms-ticks-after/index.html +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: '::-ms-ticks-after' -slug: 'Web/CSS/::-ms-ticks-after' -tags: - - CSS - - No standard - - Pseudo-elementos - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-ticks-after' ---- -
{{CSSRef}}
- -
{{non-standard_header}}
- -
 
- -

El  CSS pseudo-elemento  ::-ms-ticks-after es una extensión de extensión de Microsoft que aplica uno o más estilos, a las marcas de tick que aparecen despues del marcador de un control slider.  El control slider es una posible representación de una entrada tipo rango( <input type="range"> ).

- -

Esas marcas no son mostradas por omisión.  Para mostrarlas, se debe de establecer la propiedad display del control a block  {{cssxref("display")}}.

- -

Es posible usar los pseudo elementos  ::-ms-ticks-after, {{ cssxref("::-ms-ticks-before") }},  y {{ cssxref("::-ms-track") }} a la vez. Para hacerlo debe crear tres tres conjuntos de marcas, pero la mejor experiencia deusuario es con un conjunto. Par quitar todas las marcas , establezca la propiedad color {{ cssxref("color") }} a transparente.

- -

Allowable Properties

- -

Solo una de las siguientes propiedades CSS puede ser usada con  ::-ms-ticks-after en su selector. Otras propiedadess seran ignoradas.

- - - -

Syntax

- -
  {{csssyntax}}
-
diff --git a/files/es/web/css/_doublecolon_-ms-track/index.html b/files/es/web/css/_doublecolon_-ms-track/index.html deleted file mode 100644 index e4feb900b5..0000000000 --- a/files/es/web/css/_doublecolon_-ms-track/index.html +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: '::-ms-track' -slug: 'Web/CSS/::-ms-track' -tags: - - CSS - - NeedsBrowserCompatibility - - NeedsCompatTable - - NeedsExample - - NeedsMobileBrowserCompatibility - - No estádar - - Pseudo-elemento - - Pseudo-elemento CSS - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-track' ---- -
{{ CSSRef() }}
- -

{{ Non-standard_header() }}

- -

Resumen

- -

El  pseudo-elemento CSS ::-ms-track representa la trayectoria (la ranura sobre la cual se desliza el indicador) de un  {{HTMLElement("input")}} con type="range".

- -

Specification

- -

No es parte de ninguna especificación

- -

Microsoft tiene una descripción en MSDN.

- -

Ver además

- - diff --git a/files/es/web/css/_doublecolon_-ms-value/index.html b/files/es/web/css/_doublecolon_-ms-value/index.html deleted file mode 100644 index 618063cb2b..0000000000 --- a/files/es/web/css/_doublecolon_-ms-value/index.html +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: '::-ms-value' -slug: 'Web/CSS/::-ms-value' -tags: - - CSS - - NeedsCompatTable - - NeedsExample - - No estandar - - Pseudo-elemento - - Referencia -translation_of: 'Archive/Web/CSS/::-ms-value' ---- -
{{ CSSRef() }}
- -

{{ Non-standard_header() }}

- -

Resumen

- -

El pseudo-elemento CSS ::-ms-value aplica reglas al valor / contenido de un {{HTMLElement("input")}} o de un {{HTMLElement("select")}}. En este pseudo-elemento sólo se pueden establecer ciertas propiesdades, las demás no tendrán efecto.

- -

Síntaxis

- -
input::-ms-value { propiedades de estilo }
-
-select::-ms-value { propiedades de estilo } 
- -

Especificaciones

- -

No es parte de ninguna espeficiación

- -

Microsoft tiene una descripción en MSDN.

diff --git a/files/es/web/css/azimuth/index.html b/files/es/web/css/azimuth/index.html deleted file mode 100644 index b4ccce8e37..0000000000 --- a/files/es/web/css/azimuth/index.html +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: azimuth -slug: Web/CSS/azimuth -tags: - - CSS - - 'CSS:Referencias' - - Todas_las_Categorías -translation_of: Archive/Web/CSS/azimuth ---- -

-

<< Referencia CSS -


-

-

Resumen

-

En combinación con elevación, azimuth permite posicionar en el espacio/lugar diferentes fuentes de audio para una presentación auditiva (aural). Es importante ya que es un medio natural de definir varias fuentes de audio que pueden ser colocadas en lugares diferentes en la escena auditiva. Una salida estéreo produce una escena lateral, mientras que los cascos o los sistemas de múltiples altavoces permiten obtener una audición en 3D. -

- -

Sintaxis

-
azimuth: angle | [[ left-side | far-left | left |
-    center-left | center | center-right | right |
-    far-right | right-side ] || behind ] | leftwards |
-    rightwards | inherit
-
-

Valores

-
ángulo (angle
La posición de la fuente audible se describe por un ángulo comprendido en tre -360deg y 360deg. El valor 0deg se encuentra directamente en el centro del escenario auditivo (valor por defecto), 90deg es a la derecha, 180deg es detrás y 270deg o -90deg es a la izquierda. -
-

Palabras claves de posición

- -

Ejemplos

-
h1   { azimuth: 30deg }
-td.a { azimuth: far-right }          /*  60deg */
-#12  { azimuth: behind far-right }   /* 120deg */
-p.comment { azimuth: behind }        /* 180deg */
-
-

Especificaciones

- -

Compatibilidad con navegadores

-

Por definir. -

-

Ver también

-

{{ Cssxref("elevation") }} -

{{ languages( { "en": "en/Image/Azimuth.png", "en": "en/CSS/azimuth", "fr": "fr/CSS/azimuth", "pl": "pl/CSS/azimuth", "zh-cn": "cn/CSS/azimuth" } ) }} diff --git a/files/es/web/events/domsubtreemodified/index.html b/files/es/web/events/domsubtreemodified/index.html deleted file mode 100644 index 5fddfab433..0000000000 --- a/files/es/web/events/domsubtreemodified/index.html +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: DOMSubtreeModified -slug: Web/Events/DOMSubtreeModified -tags: - - DOM - - DOM Events - - Eventos del DOM - - ejemplos - - eventos -translation_of: Archive/Events/DOMSubtreeModified ---- -

{{ draft() }}

- -

Resumen

- -

Se produce cuando se añaden o eliminan nodos en el subárbol de un documento o elemento.

- -

Ejemplo

- -

Siguiente código mostrará la hora de la última modificación del DOM en el  título de la página.

- -
Hay que ser muy cuidadoso, con este evento es muy fácil crear un bucle infinito si tu decides que el nodo que cambia esta dentro de un manejador.
- -
document.body.addEventListener('DOMSubtreeModified', function () {
-  document.title = 'DOM Changed at ' + new Date();
-}, false);
-
diff --git a/files/es/web/guide/api/camera/index.html b/files/es/web/guide/api/camera/index.html deleted file mode 100644 index e3d291bfc3..0000000000 --- a/files/es/web/guide/api/camera/index.html +++ /dev/null @@ -1,244 +0,0 @@ ---- -title: Introducción a la API de Cámara -slug: Web/Guide/API/Camera -tags: - - DOM - - Intermedio - - Medios - - NecesitaActualización - - Referencia DOM Gecko - - Web API - - cámara -translation_of: Archive/B2G_OS/API/Camera_API/Introduction ---- -

Mediante la API de Cámara, es posible tomar fotografías con la cámara de su dispositivo y subirlas a una página web. Esto se logra a través de un elemento input con los atributos type="file" y accept para declarar que el elemento acepta imágenes. El HTML se parece a esto:

- -
<input type="file" id="take-picture" accept="image/*">
-
- -

Cuando los usuarios eligen activar este elemento HTML, se les presenta la opción de seleccionar un fichero, donde la cámara del dispositivo es una de las opciones. Si seleccionan la cámara, se accede al modo de toma de fotografía. Tras realizar la fotografía, al usuario se le presenta la posibilidad de aceptarla o rechazarla. Si se acepta, es enviada al elemento <input type="file"> y se lanza su evento onchange.

- -

Obtener una referencia a la fotografía tomada

- -

Con la ayuda de la API de Fichero usted puede acceder a la fotografía tomada o el fichero elegido:

- -
var takePicture = document.querySelector("#take-picture");
-takePicture.onchange = function (event) {
-    // Obtener una referencia a la fotografía tomada o fichero seleccionado
-    var files = event.target.files,
-        file;
-    if (files && files.length > 0) {
-        file = files[0];
-    }
-};
-
- -

Presentando la fotografía en la página web

- -

Una vez que tiene una referencia a la fotografía tomada (ej.: fichero), puede entonces usar {{ domxref("window.URL.createObjectURL()") }} para crear una URL referenciando la fotografía y estableciéndola como src de una imagen:

- -
// Referencia de la imagen
-var showPicture = document.querySelector("#show-picture");
-
-// Crear ObjectURL
-var imgURL = window.URL.createObjectURL(file);
-
-// Establecer ObjectURL como img src
-showPicture.src = imgURL;
-
-// Por razones de rendimiento, revocar los ObjectURL usados
-URL.revokeObjectURL(imgURL);
-
- -

Si createObjectURL() no es soportado, una alternativa es retroceder a {{ domxref("FileReader") }}:

- -
// Retroceder a FileReader si createObjectURL no está soportado
-var fileReader = new FileReader();
-fileReader.onload = function (event) {
-    showPicture.src = event.target.result;
-};
-fileReader.readAsDataURL(file);
-
- -

Ejemplo completo

- -

Si desea verlo en acción, eche un vistazo al ejemplo completo de la API de Cámara funcionando.

- -

Aquí está el código usado para esa demostración:

- -

Página HTML

- -
<!DOCTYPE html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <title>Camera API</title>
-        <link rel="stylesheet" href="css/base.css" type="text/css" media="screen">
-    </head>
-
-    <body>
-
-        <div class="container">
-            <h1>Camera API</h1>
-
-            <section class="main-content">
-                <p>A demo of the Camera API, currently implemented in Firefox and Google Chrome on Android. Choose to take a picture with your device's camera and a preview will be shown through createObjectURL or a FileReader object (choosing local files supported too).</p>
-
-                <p>
-                    <input type="file" id="take-picture" accept="image/*">
-                </p>
-
-                <h2>Preview:</h2>
-                <p>
-                    <img src="about:blank" alt="" id="show-picture">
-                </p>
-
-                <p id="error"></p>
-
-            </section>
-
-            <p class="footer">All the code is available in the <a href="https://github.com/robnyman/robnyman.github.com/tree/master/camera-api">Camera API repository on GitHub</a>.</p>
-        </div>
-
-
-        <script src="js/base.js"></script>
-
-
-    </body>
-</html>
-
- -

Fichero JavaScript

- -
(function () {
-    var takePicture = document.querySelector("#take-picture"),
-        showPicture = document.querySelector("#show-picture");
-
-    if (takePicture && showPicture) {
-        // Establecer eventos
-        takePicture.onchange = function (event) {
-            // Obtener una referencia a la fotografía tomada o fichero seleccionado
-            var files = event.target.files,
-                file;
-            if (files && files.length > 0) {
-                file = files[0];
-                try {
-                    // Crear ObjectURL
-                    var imgURL = window.URL.createObjectURL(file);
-
-                    // Establecer ObjectURL como img src
-                    showPicture.src = imgURL;
-
-                    // Revocar ObjectURL
-                    URL.revokeObjectURL(imgURL);
-                }
-                catch (e) {
-                    try {
-                        // Regresar a FileReader si createObjectURL no está soportado
-                        var fileReader = new FileReader();
-                        fileReader.onload = function (event) {
-                            showPicture.src = event.target.result;
-                        };
-                        fileReader.readAsDataURL(file);
-                    }
-                    catch (e) {
-                        //
-                        var error = document.querySelector("#error");
-                        if (error) {
-                            error.innerHTML = "Neither createObjectURL or FileReader are supported";
-                        }
-                    }
-                }
-            }
-        };
-    }
-})();
-
- -

Compatibilidad con navegadores

- -

{{ CompatibilityTable() }}

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Camera API{{ CompatNo() }}{{ CompatNo() }}{{ CompatNo() }}{{ CompatNo() }}{{ CompatNo() }}
createObjectURL()16{{CompatGeckoDesktop("8.0")}}10+{{CompatNo()}}{{CompatNo()}}
{{domxref("FileReader")}}16{{CompatGeckoDesktop("1.9.2")}}10+11.6+{{CompatNo()}}
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Camera API3.0{{ CompatVersionUnknown() }}{{ CompatGeckoMobile("10.0") }}{{ CompatNo() }}{{ CompatNo() }}{{ CompatNo() }}
createObjectURL()4{{CompatVersionUnknown()}}{{CompatGeckoMobile("10.0")}}{{CompatNo()}}{{CompatNo()}}{{CompatNo()}}
{{domxref("FileReader")}}3{{CompatVersionUnknown()}}{{CompatGeckoMobile("10.0")}}{{CompatNo()}}11.1{{CompatNo()}}
-
- -

 

diff --git a/files/es/web/javascript/novedades_en_javascript/1.1/index.html b/files/es/web/javascript/novedades_en_javascript/1.1/index.html deleted file mode 100644 index 985692f96c..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.1/index.html +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Nuevo en JavaScript 1.1 -slug: Web/JavaScript/Novedades_en_JavaScript/1.1 -tags: - - JavaScript - - Versiones -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.1 ---- -
{{jsSidebar("New_in_JS")}}
- -

Lo siguiente es una bitácora de cambios en JavaScript desde Netscape Navigator 2.0 al 3.0. La documentación del viejo Netscape se refiere a ésto como "Características agregadas luego de la versión 1". Netscape Navigator 3.0 se lanzó el 19 de agosto de 1996. Netscape Navigator 3.0 fue la segunda versión principal del navegador con soporte JavaScript.

- -

Versiones JavaScript

- -

Netscape Navigator 3.0 también introdujo versiones del lenguage JavaScript.

- -
<SCRIPT LANGUAGE="JavaScript">    <!-- JavaScript for Navigator 2.0. -->
-<SCRIPT LANGUAGE="JavaScript1.1"> <!-- JavaScript for Navigator 3.0. -->
- -

Características nuevas en JavaScript 1.1

- -

Objetos nuevos

- - - -

Propiedades nuevas

- - - -

Método nuevos

- - - -

Operadores nuevos

- - - -

Otras características nuevas

- - - -

Modificaciones en funcionalidad en  JavaScript 1.1

- - diff --git a/files/es/web/javascript/novedades_en_javascript/1.2/index.html b/files/es/web/javascript/novedades_en_javascript/1.2/index.html deleted file mode 100644 index 722e0d21f1..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.2/index.html +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: New in JavaScript 1.2 -slug: Web/JavaScript/Novedades_en_JavaScript/1.2 -tags: - - JavaScript - - Versiones -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.2 ---- -
{{jsSidebar("New_in_JS")}}
- -
Lo siguiente es una lista de cambios de JavaScript del Navegador Netscape 3.0 a 4.0. La antigua Documentación del Navegador Netscape puede ser localizada en Archivo.org. Netscape Navegador 4.0 fue lanzado en el 11 de Junio de 1997. Netscape Navegador 4.0 fue la tercera principal del navegador con soporte a JavaScript.
- -

 

- -

JavaScript versiones

- -

 

- -

El Navegador Netscape 4.0 ejecuta las versiones del lenguaje JavaScript hasta el 1.2. Tenga en cuenta que el Navegador Netscape 3.0 y anteriores ignoraban script con el atributo de lenguaje colocando "JavaScript1.2" y superior.

- -

 

- -
<SCRIPT LANGUAGE="JavaScript1.1"> <!-- JavaScript para Navegador 3.0. -->
-<SCRIPT LANGUAGE="JavaScript1.2"> <!-- JavaScript para Navegador 4.0. -->
- -

 

- -

Las nuevas características en JavaScript 1.2

- -

Los nuevos objetos

- - - -

Nuevas Propiedades

- - - -

Nuevos Metodos

- - - -

Nuevos Operadores

- - - -

Nuevas Declaraciones

- - - -

Otras nuevas características

- - - -

Cambios en la funcionalidad de JavaScript 1.2

- - diff --git a/files/es/web/javascript/novedades_en_javascript/1.3/index.html b/files/es/web/javascript/novedades_en_javascript/1.3/index.html deleted file mode 100644 index 9fb442d96c..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.3/index.html +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: Nuevo en JavaScript 1.3 -slug: Web/JavaScript/Novedades_en_JavaScript/1.3 -tags: - - JavaScript - - Versiones -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.3 ---- -
{{jsSidebar("New_in_JS")}}
- -

Lo siguiente es el archivo de cambios de JavaScript desde Netscape Navigator 4.0 al 4.5. La documentación antigua de Netscape puede encontrarse en archive.org. Netscape Navigator 4.5 fue lanzado el 19 de octubre de 1998.

- -

El cambio más importante en JavaScript 1.3 fue conseguir que estuviera en conformidad con ECMA-262 y Unicode eliminando las inconsistencias entre JavaScritp 1.2 y el nuevo estándar ECMA (publicado en junio de 1997). Características adicionales de la versión 1.2. (que en ese momento todavía no era ECMA-262) se mantuvieron en el lenguaje JavaScript (ver más adelante para una lista de las diferencias.)

- -

Versiones de JavaScript

- -

Netscape Communicator y Netscape Navigator 4.06 y 4.5 ejecutan versiones del lenguaje JavaScript hasta la 1.3. Se hace notar que Communicator y Navigator 4.0-4.5 y anteriores ignoraban los scripts con el atributo de lenguaje "JavaScript1.3" y superior.

- -
<SCRIPT LANGUAGE="JavaScript1.2"> <!-- JavaScript para Navigator 4.0. -->
-<SCRIPT LANGUAGE="JavaScript1.3"> <!-- JavaScript para Navigator 4.5. -->
- -

Nuevas características en JavaScript 1.3

- -

Nuevos globales

- - - -

Nuevos métodos

- - - -

Otras características nuevas

- - - -

Funcionalidades cambiadas en JavaScript 1.3

- - - -

Características no-ECMA-262 de JavaScript 1.3

- -

La siguiente es una comparación entre la versión de junio de 1998 de ECMA-262 y JavaScript 1.3. Las siguientes características no fueron parte del estándar en ese moemtno, pero se implementaron en JavaScript 1.3.

- -

Palabras clave y operadores

- - - -

Sentencias

- - - -

Objetos integrados

- - - -

Métodos de objetos integrados

- - diff --git a/files/es/web/javascript/novedades_en_javascript/1.5/index.html b/files/es/web/javascript/novedades_en_javascript/1.5/index.html deleted file mode 100644 index 62eebd9d61..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.5/index.html +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Novedades en Javascript 1.5 -slug: Web/JavaScript/Novedades_en_JavaScript/1.5 -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.5 ---- -
{{jsSidebar("New_in_JS")}}
- -

JavaScript versión 1.5 provee las siguientes nuevas características y mejoras:

- -

Errores en tiempo de ejecución

- -

Los errores en tiempo de ejecución son ahora reportados como excepciones.

- -

Mejoras para el formato de números

- -

El formato de números ha sido mejorado para incluir los métodos Number.prototype.toExponential, Number.prototype.toFixed y Number.prototype.toPrecision. Véase la página Objeto Number.

- -

Mejoras en expresiones regulares

- -

Las siguientes mejoras para expresiones regulares han sido añadidas:

- - - -

Declaraciones de funciones condicionales

- -

Las funciones ahora pueden ser declaradas dentro de una cláusula if. Véase la página: Definiendo Funciones.

- -

Expresiones funcionales

- -

Las funciones ahora pueden ser declaradas dentro de una expresión. Véase la página: Definiendo Funciones.

- -

Cláusulas Catch múltiples

- -

Las múltiples cláusulas Catch en una sentencia try...catch son soportadas. Véase la página: El bloque catch.

- -

Obtenedores y Modificadores

- -

Los editores de JavaScript ahora pueden añadir obtenedores {{ mediawiki.external('getters') }} y modificadores {{ mediawiki.external('setters') }} a sus objetos. Esta característica está disponible únicamente en la implementación C de JavaScript. Véase la página: Definiendo obtenedores y modificadores.

- -

Constantes

- -

Constantes definidas como sólo de lectura son soportadas. Esta característica está disponible únicamente en la implementación C de JavaScript. Véase la página: Constantes.

diff --git a/files/es/web/javascript/novedades_en_javascript/1.6/index.html b/files/es/web/javascript/novedades_en_javascript/1.6/index.html deleted file mode 100644 index b8393c6b9e..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.6/index.html +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Novedades en JavaScript 1.6 -slug: Web/JavaScript/Novedades_en_JavaScript/1.6 -tags: - - E4X - - JavaScript - - Todas_las_Categorías -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.6 ---- -
{{jsSidebar("New_in_JS")}}
- -

JavaScript 1.6 introduce algunas nuevas características: E4X, algunos métodos nuevos Array y Arreglos y Cadenas genéricos.

- -

JavaScript 1.6 es soportado en Firefox 1.5 y posteriores.

- -

E4X

- -

ECMAScript para XML (E4X) es una poderosa tecnología para creción y procesamiento de contenido XML dentro de JavaScript. Continuamos mejorando nuestro soporte en E4X , incluyendo adiciones transparentes de integración con el existente DOM, pero desarrolladores quienes estan construyendo aplicaciones Web basadas en XML pueden beneficiarse con el soporte de E4X en Firefox 1.5.

- -

Puede seguirse utilizando el estandar de tipo MIME cuando utiliza E4X:

- -
<script type="text/javascript">
-
- -

Sin embargo, la sintaxis de E4X puede entrar en conflicto con la práctica común de poner scripts dentro de comentarios HTML (<!--...-->) para esconderlos de los navegadores antiguos. E4X puede también entrar en conflicto con la práctica más moderna de poner scripts dentro de las secciones XML CDATA (<![CDATA{{ mediawiki.external('...') }}]>) para permitir que los símbolos "<" y ">" en el script (nótese que esto no se aplica a HTML). Si visualiza errores de sintaxis inexplicables, añada "; e4x=1" al tipo MIME:

- -
<script type="text/javascript; e4x=1">
-
- -

Nótese que los scripts en extensiones siempre tratan los comentarios HTML como literales E4X. Esto es, el "e4x=1" está implícito.

- -

Extras de Arreglos

- -

Existen siete nuevos métodos de Array que pueden ser separados en dos categorías, métodos de localización de items y métodos iterativos. Los métodos de localización de items son:

- - - -

Los métodos iterativos son:

- - - -

Arreglos y cadenas genéricos

- -

Algunas veces le gustaría aplicar métodos de arreglos a las cadenas. Para hacer esto, trate a una cadena como un arreglo de caracteres. Por ejemplo, para chequear que cada caracter en la variable cadena es una letra, podría escribir:

- -
function esLetra(caracter) {
-  return (caracter >= "a" && caracter <= "z");
-}
-
-if (Array.prototype.every.call(cadena, esLetra))
-  alert("La cadena '" + cadena + "' contiene solo letras!");
-
- -

Esta notación es demasiado extensa y JavaScript 1.6 introduce un atajo genérico {{ mediawiki.external('generic shorthand') }}:

- -
if (Array.every(cadena, isLetter))
-  alert("La cadena '" + cadena + "' contiene sólo letras!");
-
- -

Similarmente puede fácilmene aplicar métodos de String a cualquier objeto:

- -
var número = 15;
-alert(String.replace(número, /5/, '2'));
-
- -

Véase también

- -

Nuevas características de JavaScript 1.7 introducidas en Firefox 2.

- -

 

diff --git a/files/es/web/javascript/novedades_en_javascript/1.7/index.html b/files/es/web/javascript/novedades_en_javascript/1.7/index.html deleted file mode 100644 index d783fdb0b0..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.7/index.html +++ /dev/null @@ -1,534 +0,0 @@ ---- -title: Novedades en JavaScript 1.7 -slug: Web/JavaScript/Novedades_en_JavaScript/1.7 -tags: - - Guía_de_JavaScript_1.5 - - JavaScript - - Todas_las_Categorías -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.7 ---- -

{{jsSidebar("New_in_JS")}}

- -

JavaScript 1.7 es una actualización del lenguaje que le añade algunas nuevas características, como generadores, iteradores, comprensión de arrays, sentencias let y asignación desestructurada. Evidentemente también incluye todas las características de JavaScript 1.6.

- -

El soporte para JavaScript 1.7 estará disponible a partir de Firefox 2 Beta 1, así como en compilaciones actuales.

- -

Los ejemplos de código incluidos en este artículo pueden ser probados en la consola JavaScript. Si quieres aprender a construir o utilizar esta consola, lee Introducción al shell de JavaScript.

- -

Utilizando JavaScript 1.7

- -

Para usar las nuevas caracteristicas de JavaScript 1.7, es necesario especificar explícitamente el uso de JavaScript 1.7. En HTML o XUL, utiliza:

- -
 <script type="application/javascript;version=1.7"/>
-
- -

Cuando se utilice el shell de JavaScript, debes especificar la versión deseada utilizando la función version():

- -
 version(170);
-
- -

Generadores e iteradores

- -

Cuando se desarrolla código que involucra algoritmos iterativos (como iteraciones sobre listas, o cálculos repetitivos sobre el mismo conjunto de datos), con frecuencia hay variables de estado cuyos valores necesitan ser mantenidos durante el proceso. Tradicionalmente se utilizan funciones callback para obtener los valores intermedios de un algoritmo iterativo.

- -

Generadores

- -

Considera este algoritmo iterativo que obtiene los números de la serie Fibonacci:

- -
function do_callback(num) {
-  document.write(num + "<BR>\n");
-}
-
-function fib() {
-  var i = 0, j = 1, n = 0;
-  while (n < 10) {
-    do_callback(i);
-    var t = i;
-    i = j;
-    j += t;
-    n++;
-  }
-}
-
-fib();
-
- -

Este código utiliza rutinas callback para realizar las operaciones en cada paso del algoritmo. En este caso, cada numero Fibonacci es impreso en la consola.

- -

Los generadores e iteradores trabajan juntos para proveer nuevas y mejores formas de hacer esto. Veamos cómo es la rutina de la serie Fibonacci escrita utilizando generadores:

- -
function fib() {
-  var i = 0, j = 1;
-  while (true) {
-    yield i;
-    var t = i;
-    i = j;
-    j += t;
-  }
-}
-
-var g = fib();
-for (var i = 0; i < 10; i++) {
-  document.write(g.next() + "<BR>\n");
-}
-
- -

La función que contiene la palabra clave yield es un generador. Cuando es llamada, sus parámetros formales son instanciados a los argumentos actuales, pero su cuerpo no es realmente evaluado, si no que se devuelve un - - generator-iterator - . Cada llamada al método next() del - - generator-iterator - realiza otro paso a través de algoritmo iterativo. El valor de cada paso es el valor especificado por la palabra clave yield. Piensa en yield como la versión - - generator-iterator - de return que delimita la frontera entre cada iteración del algoritmo. Cada vez que se llama a next(), el código del generador continúa a partir de la sentencia que va después de yield.

- -

Se realiza un ciclo en el generator-iterator llamando repetidamente a su método next() hasta que se consiga la condición deseada. Con este ejemplo se pueden obtener tantos números de Fibonacci como se quiera llamando simplemente a g.next() hasta que conseguir la cantidad de números que se quiera.

- -
Resumiendo un generador en un punto específico
- -

Una vez que un generador ha sido iniciado por la invocación de su función next(), puede utilizarse send(), pasando un valor específico que será tratado como el resultado de la última producción. El generador entonces retornará el operando de la subsecuente producción.

- -

No se puede iniciar un generador en un punto arbitrario; deberá comenzarse con next() antes de poder enviarle {{ mediawiki.external('send()') }} un valor específico.

- -
Nótese: Como un punto interesante, invocando send(undefined) es equivalente a invocar next(). Sin embargo, iniciando la aparición de un nuevo generador con cualquier otro valor que no sea indefinido {{ mediawiki.external('undefined') }} cuando invoque a send() resultará como una excepción de error de tipo {{ mediawiki.external('TypeError exception') }}.
- -
Excepciones en los generadores
- -

Puede forzar a un generador a lanzar una excepción mediante la invoación de su método throw(), pasándole el valor de la excepción que debe ser lanzada. Esta excepción se lanzará desde el conxtexto actual suspendido del generador, así como si el yield que está actualmente suspendido en lugar del sentencia throw - valor - .

- -

Si una producción no es encontrada durante el procesamiento de la excepción lanzada, entonces la excepción se propagará ascendentemente hasta la invocación del throw() y subsecuentemente invocará a next() que resulta en el lanzamiento de una StopIteration.

- -
Cerrando un generador
- -

Los generadores poseen el método close() que forza al generador a cerrarse por sí mismo. Los efectos de cerrar un generador son:

- -
    -
  1. Cualquier cláusula finally activa en la función del generador es ejecutada.
  2. -
  3. Si una cláusula finally lanza cualquier excepción distinta a StopIteration, la excepción es propagada hacia el invocador del método close().
  4. -
  5. El generador termina.
  6. -
- -
Ejemplo de un Generador
- -

Este código maneja un generador que se producirá cada 100 lazos.

- -
var gen = generator();
-
-function driveGenerator() {
-	if (gen.next()) {
-		window.setTimeout(driveGenerator, 0);
-	} else {
-		gen.close();
-	}
-}
-
-function generator() {
-	while (i < something) {
-		/** stuff **/
-
-		++i;
-		/** 100 loops per yield **/
-		if ((i % 100) == 0) {
-			yield true;
-		}
-	}
-
-	yield false;
-}
-
- -

Iteradores

- -

Un - iterador - es un objeto especial que te permite iterar datos.

- -

En el uso cotidiano, los objetos iteradores son - invisibles - (no se necesita trabajar con ellos explícitamente) y son usados en sentencias for...in y for each...in para recorrer de forma natural las claves y/o los valores de los objetos.

- -
var objectWithIterator = getObjectSomehow();
-
-for (var i in objectWithIterator)
-{
-  document.write(objectWithIterator[i] + "<BR>\n");
-}
-
- -

Si se está implementando un objeto iterador personalizado o se necesita manipular directamente un iterador, será preciso conocer antes el método next(), la excepción StopIteration y la propiedad __iterator__.

- -

traduzco getter como la función get Se puede crear un iterador para un objeto llamando a Iterator( - objectname - ). El iterador para cierto objeto se conoce gracias a la propiedad __iterator__ de dicho objeto, la cual implementa predeterminadamente la iteración de acuerdo al modelo convencional de for..in y for each...in. Si se desea utilizar un iterador personalizado, se debería sobreescribir la función get para que __iterator__ devuelva una instancia del susodicho iterador. Para obtener el iterador de un objeto en un script se debería de usar Iterator( - obj - ) en lugar de acceder directamente a la propiedad __iterator__.

- -

Una vez se tiene el iterador, se puede buscar fácilmente el siguiente elemento en el objeto llamando su método next(). Cuando no hay más datos se lanza la excepción StopIteration.

- -

A continuación se muestra un ejemplo simple de manipulación directa de iteradores:

- -
var obj = {name:"Jack Bauer", username:"JackB", id:12345, agency:"CTU", region:"Los Angeles"};
-
-var it = Iterator(obj);
-
-try {
-  while (true) {
-    document.write(it.next() + "<BR>\n");
-  }
-} catch (err if err instanceof StopIteration) {
-  document.write("End of record.<BR>\n");
-} catch (err) {
-  document.write("Unknown error: " + err.description + "<BR>\n");
-}
-
- -

La salida de este programa tendrá este aspecto:

- -
name,Jack Bauer
-username,JackB
-id,12345
-agency,CTU
-region,Los Angeles
-End of record.
-
- -

Opcionalmente se puede especificar un segundo parámetro durante la creación del iterador, el cual es un valor booleano que indica si sólo se quieren obtener las claves cada vez que se llama al método next() o no. Cambiando var it = Iterator(obj); por var it = Iterator(obj, true); en el ejemplo anterior se obtendría la siguiente salida:

- -
name
-username
-id
-agency
-region
-End of record.
-
- -

En ambos casos, el orden final en el que los datos son devueltos puede variar dependiendo de la implementación por lo que no se garantiza el orden de los datos.

- -

Los iteradores son un método útil de recorrer los datos de los objetos, incluyendo objetos que pueden contener datos inesperados. Esto puede ser especialmente útil si se necesitan recuperar datos para los que la aplicación no está preparada.

- -

Comprensión de arrays

- -

La comprensión de arrays es una forma de utilizar generadores para realizar de manera apropiada potentes inicializaciones de arrays. Por ejemplo:

- -
function range(begin, end) {
-  for (let i = begin; i < end; ++i) {
-    yield i;
-  }
-}
-
- -

range() es un generador que devuelve todos los valores entre <tt>begin</tt> y <tt>end</tt>. Una vez definido eso, se puede utilizar así:

- -
var diez_cuadrados = [i * i for (i in range(0, 10))];
-
- -

Esto pre-inicializa un nuevo array, diez_cuadrados, para que contenga los cuadrados de los valores del rango 0..9.

- -

Se puede usar cualquier sentencia condicional al inicializar un array. Si lo que se quiere es inicializar un array para que contenta los números pares entre 0 y 20, se puede usar este código.

- -
var pares = [i for (i in range(0, 21)) if (i % 2 == 0)];
-
- -

Antes de JavaScript 1.7, lo anterior debería haber sido codificado así:

- -
var evens = [];
-for (var i=0; i <= 20; i++) {
-  if (i % 2 == 0)
-    evens.push(i);
-}
-
- -

La comprensión de arrays no sólo es mucho más compacta sino que de hecho es mucho más fácil de leer una vez que nos hemos familiarizado con el concepto.

- -

Reglas de ámbito

- -

La comprensión de arrays utiliza un bloque implícito en el cual se ubica. Dicho bloque contiene todo el contenido que se halla dentro de los corchetes, además del las declaraciones let implícitas.

- -

''Add details.''

- -

Ámbito de un bloque con let

- -

Existen varias formas en las que let puede ser usado para manejar el ámbito de un bloque de datos y funciones:

- - - -

 

- -

El sentencia let

- -

La sentencia let proporciona un ámbito local para variables, constantes y funciones. Funciona reservando cero o más variables en el ámbito léxico de un único bloque de código. La validez de la sentencia let finaliza cuando termina el bloque.

- -

Por ejemplo:

- -
var x = 5;
-var y = 0;
-
-let (x = x+10, y = 12) {
-  document.write(x+y + "<BR>\n");
-}
-
-document.write(x+y + "<BR>\n");
-
- -

tendrá como salida:

- -
27
-5
-
- -

Las reglas para el bloque de código son las mismas que para cualquier otro bloque de código de JavaScript. Puede tener sus propias variables establecidas usando declaraciones let.

- -
Nota: Cuando se use la sintaxis de las sentencia let, será necesario incluir los paréntesis. El no incluirlos provocará un error de sintaxis.
- -

Reglas de ámbito

- -

El ámbito de las variables definidas usando let es el del mismo bloque de let, además de cualquier bloque interno contenido dentro de él, a menos que esos bloques definan variables con el mismo nombre.

- -

Expresiones let

- -

Se puede usar let para establecer variables cuyo ámbito comprende sólo una única expresión:

- -
var x = 5;
-var y = 0;
-document.write( let(x = x + 10, y = 12) x+y  + "<BR>\n");
-document.write(x+y + "<BR>\n");
-
- -

La salida da como resultado:

- -
27
-5
-
- -

En este caso, el ámbito de las variables x = x+10 e y = 12 es utilizado solamente en la expresión x+y

- -

Reglas de ámbito

- -

Dada la expresión let

- -
let (decls) expr
-
- -

existe un bloque creado implícitamente que comprende el trozo expr.

- -

Definiciones let

- -

La palabra clave let puede además ser usada para definir variables, constantes y funciones dentro de un bloque.

- -
 ** Este código no funciona en FF 2.0 b1. **
-if (x > y)
-{
-   let const k = 37;
-   let gamma : int = 12.7 + k;
-   let i = 10;
-   let function f(n) { return (n/3)+k; }
-   return f(gamma) + f(i);
-}
-
- -

Reglas de ámbito

- -

Las variables, funciones y constantes declaradas usando let, let function y let const tienen como ámbito el bloque en el que están definidas, además de cualquier sub-bloque en el que no sean redefinidas. De este modo, let funciona como var.

- -

En los programas y clases, let no crea propiedades en los objetos y clases globales como hace var. En vez de eso, crea propiedades en un bloque implícito creado para la evaluación de sentencias en dichos contextos. Esto significa esencialmente que let no sobreescribirá las variables previamente definidas usando var. Por ejemplo:

- -
** No funciona en FF 2.0 b1. Devuelve "42", no "global".
-var x = 'global';
-let x = 42;
-document.write(this.x + "<BR>\n");
-
- -

La salida mostrada por este código será "global", no "42".

- -

Un - bloque implícito - es aquel que no está comprendido entre llaves; es creado implícitamente por el motor de JavaScript.

- -

En las funciones, una sentencia let ejecutada dentro de eval() no crea propiedades en el objeto variable Esto hay que traducirlo: (activation object or innermost binding rib) como sí hace var. En vez de eso, lo hace en un bloque creado implícitamente para la evaluación de las sentencias del programa. Esto es consecuencia de la forma de trabajar de eval() unido a la anterior regla.

- -

En otras palabras, cuando se usa eval() para ejecutar código, dicho código es es tratado como un programa independiente el cual tiene su propio bloque implícito alrededor de su código.

- -

Ámbito de variables con let en bucles for

- -

Se puede usar la palabra reservada let para declarar variables localmente en el ámbito de un bucle for, al igual que con var.

- -
** Add obj **
-   var i=0;
-   for ( let i=i ; i < 10 ; i++ )
-     document.write(i + "<BR>\n");
-
-   for ( let [name,value] in obj )
-     document.write("Name: " + name + ", Value: " + value + "<BR>\n");
-
- -

Reglas de ámbito

- -
for (let expr1; expr2; expr3) sentencia
-
- -

En este ejemplo, expr2, expr3 y sentencia están delimitadas por un bloque implícito que contiene a las variables locales al bloque declaradas por let expr1. Esto se demuestra en el primer bucle del ejemplo.

- -
for (expr1 in expr2) sentencia
-
- -

En este caso, existe un bloque implícito que contiene a sentencia. Esto es mostrado en el segundo bucle del ejemplo.

- -

Asignación desestructurada

- -

La asignación desestructurada hace posible extraer datos desde arrays u objetos utilizando una sintaxis que refleja la construcción de arrays y objetos literales.

- -

Las expresiones de objetos y arrays literales proporcionan una forma fácil de crear paquetes de datos ad hoc. Una vez creados estos paquetes de datos, pueden ser usados como se quiera. Se pueden devolver incluso desde funciones.

- -

Una peculiaridad especialmente útil que se puede hacer con la asignación desestructurada es leer una estructura completa desde una única sentencia aunque hay un número de cosas interesantes que se pueden hacer con ella, como muestra la siguiente sección repleta de ejemplos.

- -

Esta capacidad es similar a las características que presentan lenguajes tales como Perl o Python.

- -

Ejemplos

- -

La asignación desestructurada se explica mejor con ejemplos por lo que aquí se muestran un par de ellos con fines didáctico.

- -
Nota: Si tienes ejemplos más interesantes con formas de utilizar la asignación desestructurada, por favor, anímate a añadirlos a esta sección.
- -

Intercambiando valores

- -

Se puede usar la asignación desestructurada para, por ejemplo, intercambiar valores:

- -
var a = 1;
-var b = 3;
-
-[a, b] = [b, a];
-
- -

Tras ejecutar este código, b valdrá 1 y a valdrá 3.

- -

O para rotar valores: (formato de código pobre)

- -
<body bgcolor = "black">
-
-<script type="application/javascript;version=1.7"/>
-
-var a = 'o';
-var b = "<font color = 'green'>o</font>";
-var c = 'o';
-var d = 'o';
-var e = 'o';
-var f = "<font color = 'blue'>o</font>";
-var g = 'o';
-var h = 'o';
-
-for (lp=0;lp<40;lp++)
-	{[a, b, c, d, e, f, g, h] = [b, c, d, e, f, g, h, a];
-	 document.write(a+''+b+''+c+''+d+''+e+''+f+''+g+''+h+''+"<br />");}
-</script>
-
- -

Después de ejecutar este código, se mostrará un espectáculo de colores gracias a la rotación de las variables.

- -

Devolviendo múltiples valores

- -

Gracias a la asignación desestructurada, las funciones pueden devolver múltiples valores. Dado que las funciones siempre han podido devolver funciones, ésto proporciona una vuelta de tuerca a la flexibilidad.

- -
function f() {
-  return [1, 2];
-}
-
- -

Como se puede observar, los resultados se devuelven usando una notación parecida a la utilizada con los arrays, con los valores que se quieren devolver encerrados entre corchetes. Así, se puede devolver un número cualquiera de resultados. En el siguiente ejemplo, f() devuelve el valor {{ mediawiki.external('1, 2') }}.

- -
var a, b;
-[a, b] = f();
-document.write ("A es " + a + " B es " + b + "<BR>\n");
-
- -

El comando {{ mediawiki.external('a, b') }} = f() asigna el resultado de la función a las variables ubicadas por orden entre corchetes: a queda establecido a 1 y b a 2.

- -

También se pueden obtener los valores devueltos como un array:

- -
var a = f();
-document.write ("A es " + a);
-
- -

En este caso, a será un array que contendrá los valores 1 y 2.

- -

Ignorar ciertos valores devueltos

- -

Se pueden ignorar algunos valores devueltos en los que no se esté interesado:

- -
function f() {
-  return [1, 2, 3];
-}
-
-var [a, , b] = f();
-document.write ("A is " + a + " B is " + b + "<BR>\n");
-
- -

Tras ejecutar este código, a valdrá 1 y b, 3. El valor 2 es ignorado.

- -

Iteración sobre objetos

- -

Se puede usar asignación desestructurada para recuperar datos de un objeto.

- -
var obj = { nombre: "Bob", puntos: 1.5, edad: 35 };
-
-for (let[nombre, valor] in obj) {
-  document.write ("Nombre: " + nombre + ", Valor: " + valor + "<BR>\n");
-}
-
- -

Este bucle recorre todos los pares clave/valor del objeto obj y muestra sus nombres y valores. En este caso, la salida será algo así:

- -
Nombre: nombre, Valor: Bob
-Nombre: puntos, Valor: 1.5
-Nombre: edad, Valor: 35
-
- -

Iteración sobre valores en arrays de objetos

- -

Se puede iterar un array de objetos, accediendo a los campos que interesen de cada objeto.

- -
var personas  = [
-  {
-    nombre: "Mike Smith",
-    familia: {
-      madre: "Jane Smith",
-      padre: "Harry Smith",
-      hermana: "Samantha Smith"
-    },
-    edad: 35
-  },
-  {
-    nombre: "Tom Jones",
-    familia: {
-      madre: "Norah Jones",
-      padre: "Richard Jones",
-      hermano: "Howard Jones"
-    },
-    edad: 25
-  }
-];
-
-for each (let {nombre: n, familia: { padre: f } } in personas) {
-  document.write ("Nombre: " + n + ", Padre: " + f + "<BR>\n");
-}
-
- -

Esto copia el valor del campo nombre a n y el del campo familia.padre a f y luego los muestra por pantalla. Esto se hace para cada objeto del array personas. La salida será algo así:

- -
Nombre: Mike Smith, Padre: Harry Smith
-Nombre: Tom Jones, Padre: Richard Jones
-
- -

Categorías enlaces interwikis

- -
 
- -

{{ languages( { "en": "en/New_in_JavaScript_1.7", "fr": "fr/Nouveaut\u00e9s_dans_JavaScript_1.7", "it": "it/Novit\u00e0_in_JavaScript_1.7", "ja": "ja/New_in_JavaScript_1.7", "pl": "pl/Nowo\u015bci_w_JavaScript_1.7", "zh-tw": "zh_tw/JavaScript_1.7_\u65b0\u9bae\u4e8b" } ) }}

diff --git a/files/es/web/javascript/novedades_en_javascript/1.8.1/index.html b/files/es/web/javascript/novedades_en_javascript/1.8.1/index.html deleted file mode 100644 index 7cd586c2cb..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.8.1/index.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Nuevo en JavaScript 1.8.1 -slug: Web/JavaScript/Novedades_en_JavaScript/1.8.1 -tags: - - Firefox 3.5 - - JavaScript - - Versiones -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8.1 ---- -
{{jsSidebar("New_in_JS")}}
- -

El siguiente es un registro de cambios para JavaScript 1.8.1. Esta versión fue incluida en Firefox 3.5.

- -

JavaScript 1.8.1 es una actualización modesta sintácticamente a JavaScript; El principal cambio en esta versión es la adición del compilador Tracemonkey Just-In-Time, que mejora el rendimiento.

- -

Nuevas características en  JavaScript 1.8.1

- - - -

Funcionalidad modificada en JavaScript 1.8.1

- - diff --git a/files/es/web/javascript/novedades_en_javascript/1.8.5/index.html b/files/es/web/javascript/novedades_en_javascript/1.8.5/index.html deleted file mode 100644 index 57761b2971..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.8.5/index.html +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: Novedades en JavaScript 1.8.5 -slug: Web/JavaScript/Novedades_en_JavaScript/1.8.5 -tags: - - ECMAScript5 - - Firefox 4 - - JavaScript - - JavaScript 1.8.5 - - JavaScript_version_overviews -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8.5 ---- -

{{jsSidebar("New_in_JS")}}JavaScript 1.8.5 es una versión de JavaScript incluida en Firefox 4.

- -

Nuevas Funciones

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionDescription
Object.createCrea un nuevo objeto con el objeto prototype especificado y sus propiedades. {{ bug("492840") }}
Object.definePropertyAñade la propiedad nombrada descrita por un descriptor dado a un objeto.
Object.definePropertiesAñade las propiedades descritas por los descriptores dados a un objeto.
Object.getOwnPropertyDescriptorDevuelve una propiedad del descriptor para una propiedad nombrada en un objeto. {{ bug("505587") }}
Object.keysDevuelve un vector de todas las propiedades enumerables de un objeto.{{ bug("307791") }}
Object.getOwnPropertyNames Devuelve un vector de todas las propiedades enumerables y no-enumerables de un objeto. {{ bug("518663") }}
Object.preventExtensionsEvita cualquier extensión de un objeto. {{ bug("492849") }}
Object.isExtensibleDetermina si la extensión de un objeto está permitida. {{ bug("492849") }}
Object.sealEvita otro código proveniente del borrado de las propiedades de un objeto.{{ bug("492845") }}
Object.isSealedDetermina si un objeto está sellado. {{ bug("492845") }}
Object.freezeCongela un objeto: otro código no puede borrar o cambiar ninguna propiedad. {{ bug("492844") }}
Object.isFrozenDetermina si un objeto ha sido congelado. {{ bug("492844") }}
Array.isArray Comprueba si una variable es un Array. {{ bug("510537") }}
Date.toJSONDevuelve un string en formato JSON a partir de un objeto Date.
Function.prototype.bindCrea una nueva función que, cuando es llamada, se llama a esta función en el contexto provisto (con una secuencia de argumentos dados). {{ bug("429507") }}
- -

Nuevas características ECMAScript5

- - - -

Otros trabajos de estandarización

- -

Varias sintaxis no estandar para la definición de getters y setters han sido eliminadas; la sintaxis ECMAScript 5 definida no ha sido cambiada. Todas ellas fueron muy esotéricas y raramente usadas; si ello te afecta, mira este post para más detalles.

- -

Nuevos Objetos

- - - - - - - - - - - - - - -
ObjetoDescripción
ProxyOfrece soporte para la creación de Object y Function proxy que habilitan la meta-programación en JavaScript.
- -

Cambios a objetos globales

- -
-
Soporte ISO 8601 en Date
-
El método parse()&nbspdel objeto Date ahora soporta strings de fecha en el formato simple ISO 8601.
-
Objetos globales hechos de solo lectura
-
Los objetos NaN, Infinity, y undefined han sido hechos de solo lectura, por la especificación ECMAScript 5.
-
- -

Cambios Adicionales

- - - -

Cambios en el API JavaScript (SpiderMonkey)

- -
Nota:  Los Locale callbacks (como se especificó en la estrucutura JSLocaleCallbacks) no debe liberar la memoria del buffer que se les pasa;  este buffer se controla por la rutina SpiderMonkey.
- -

La función JS_NewString() fue eliminada en SpiderMonkey 1.8.5. Use JS_NewStringCopyN() en su lugar.

- -

{{ languages( { "en":"en/JavaScript/New_in_JavaScript/1.8.5" } ) }}

diff --git a/files/es/web/javascript/novedades_en_javascript/1.8/index.html b/files/es/web/javascript/novedades_en_javascript/1.8/index.html deleted file mode 100644 index 6045185e4a..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/1.8/index.html +++ /dev/null @@ -1,150 +0,0 @@ ---- -title: Novedades en JavaScript 1.8 -slug: Web/JavaScript/Novedades_en_JavaScript/1.8 -tags: - - JavaScript - - Todas_las_Categorías - - Visión_general_de_las_versiones_JavaScript -translation_of: Archive/Web/JavaScript/New_in_JavaScript/1.8 ---- -

{{jsSidebar("New_in_JS")}}JavaScript 1.8 esta planificado para integrarse como parte de Gecko 1.9 (el cual sera incorporado en Firefox 3). Esta es una actualización menos sustancial que la descrita en JavaScript 1.7, pero tiene algunas actualizaciones para comprobar el progreso hacia ECMAScript 4/JavaScript 2. Esta versión incluirá todas las nuevas características especificadas en JavaScript 1.6 y JavaScript 1.7.

- -

Lee el {{ Bug(380236) }} para estar al día del progreso de desarrollo de JavaScript 1.8.

- -

Usando JavaScript 1.8

- -

Para poder usar algunas de las nuevas características de JavaScript 1.8 en el HTML, usar:

- -
 <script type="application/javascript;version=1.8"> ... su código aquí ... </script>
-
- -

Cuando uses la Shell de JavaScript, componentes XPCOM de JavaScript, o elementos <script> XUL <script>, se usará automaticamente la última versión de JS (JS1.8 en Mozilla 1.9), lee ({{ Bug(381031) }}, {{ Bug(385159) }}).

- -

Las características que requieren el uso de las nuevas palabras clave "yield" y "let" requiere que especifique la versión 1.7 o mayor ya que el código existente podría usar estas palabras clave como variables o nombres de función. Las características que no introducen nuevas palabras claves (como el generador de expresiones) pueden ser usadas sin especificar la versión de JavaScript.

- -

 

- -

Cierres de Expresión

- -

Esta adición es simplemente una manera más simplificada de escribir funciones sencillas, dándole al lenguaje algo similar al típico cálculo Lambda.

- -

JavaScript 1.7 y versiones anteriores:

- -
 function(x) { return x * x; }
-
- -

JavaScript 1.8:

- -
 function(x) x * x
-
- -

Esta sintaxis te permite dejar fuera las llaves y las declaraciones 'return' - haciéndolas implícitas. No hay beneficio adicional en escribir código de esta manera, sino que el único es tener un código prácticamente mas corto.

- -


- Ejemplos:

- -

Una manera simplificada para vincular event listeners:

- -
 document.addEventListener("click", function() false, true);
-
- -

Usando esta notación con algunas de las funciones desde JavaScript 1.6:

- -
 elems.some(function(elem) elem.type == "text");
-
- -

 

- -

Generador de Expresiones

- -

Esta adición te permite simplemente crear generadores (los cuales fueron introducidos en JavaScript 1.7). Típicamente debería crear una función personalizada la cual podría tener un impacto sobre esta, pero esta adición le permite usar sintaxis de comprensión de arrays para crear una declaración de generador idéntica.

- -


- En JavaScript 1.7, podrías escribir algo como lo siguiente para crear un generador personalizado para un objeto:

- -
 function add3(obj) {
-   for ( let i in obj )
-     yield i + 3;
- }
-
- let it = add3(someObj);
- try {
-   while (true) {
-     document.write(it.next() + "<br>\n");
-   }
- } catch (err if err instanceof StopIteration) {
-   document.write("End of record.<br>\n");
- }
-
- -

En JavaScript 1.8, puedes eludir esto creando una función para un generador personalizado usando una expresión del generador:

- -
 let it = (i + 3 for (i in someObj));
- try {
-   while (true) {
-     document.write(it.next() + "<br>\n");
-   }
- } catch (err if err instanceof StopIteration) {
-   document.write("End of record.<br>\n");
- }
-
- -


- Las expresiones del generador también pueden ser pasadas, como valores, a una función. Esto es particularmente notable ya que los generadores no son ejecutados hasta que sean absolutamente necesarios (no como una situación de comprensión de arrays típica, donde los arrays son construidos antes de tiempo ). Un ejemplo de la diferencia puede verse aquí:

- -


- Usando JavaScript 1.7 Comprensión de Arrays

- -
 handleResults([ i for ( i in obj ) if ( i > 3 ) ]);
-
- function handleResults( results ) {
-   for ( let i in results )
-     // ...
- }
-
- -

Usando JavaScript 1.8 Generador de Expresiones

- -
 handleResults( i for ( i in obj ) if ( i > 3 ) );
-
- function handleResults( results ) {
-   for ( let i in results )
-     // ...
- }
-
- -


- La diferencia entre los dos ejemplos radica en que usando el generador de expresiones, solo tendría que recorrer sobre la estructura 'obj' una sola vez, en total, en lugar de una vez en la comprensión de la matriz, y de nuevo cuando ocurran iteraciones a través de la misma.

- -

Más extras sobre Arrays

- -

Existen dos nuevos métodos de iteracion Array incluidos en JavaScript 1.8, especificamente:

- - - -

Cambios en destructuracion for..in

- -

Novedades en JavaScript_1.7#Iteración sobre objetos ({{ Bug(366941) }}).

- -

Cambios próximos

- -

Los cambios que se espera que lleguen con JavaScript 1.8 incluyen:

- - - -

También puedes ver

- -

Portada JavaScript

- -

 

- -
 
- -

{{ languages( { "en": "en/New_in_JavaScript_1.8", "fr": "fr/Nouveaut\u00e9s_dans_JavaScript_1.8", "ja": "ja/New_in_JavaScript_1.8", "ko": "ko/New_in_JavaScript_1.8", "pl": "pl/Nowo\u015bci_w_JavaScript_1.8", "pt": "pt/Novidades_no_Javascript_1.8" } ) }}

diff --git a/files/es/web/javascript/novedades_en_javascript/ecmascript_5_support_in_mozilla/index.html b/files/es/web/javascript/novedades_en_javascript/ecmascript_5_support_in_mozilla/index.html deleted file mode 100644 index c32f0ecd34..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/ecmascript_5_support_in_mozilla/index.html +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: ECMAScript 5 support in Mozilla -slug: Web/JavaScript/Novedades_en_JavaScript/ECMAScript_5_support_in_Mozilla -translation_of: Archive/Web/JavaScript/New_in_JavaScript/ECMAScript_5_support_in_Mozilla ---- -
{{jsSidebar("New_in_JS")}}
- -

ECMAScript 5.1, es una versión antigua del estándar sobre el cuál se basa Javascript, dicha versión fue aprovada en Junio de 2011.

- -

El motor de JavaScript utilizado en las últimas versiones de los proyectos de Mozilla, incluyendo Firefox y Thunderbird, tienen soporte a todas las características de ECMAScript 5.1. Este artículo cubre las funciones compatibles con diferentes versiones del motor de JavaScript utilizado por Mozilla.

- -

Características soportadas

- -

Añadido en JavaScript 1.8.5 (Gecko 2, Firefox 4 y posteriores)

- -

Firefox 4 tiene soporte completo a ECMAScript 5, incluyendo el constructor Object.* métodos y el modo estrícto (strict mode.) Lee más en New in JavaScript 1.8.5.

- -

Añadido en JavaScript 1.8.1 (Gecko 1.9.1, Firefox 3.5)

- - - -

Las mejoras dispuestas por ECMAScript 5 se han hecho en el algoritmo de análisis sintáctico que impiden la evaluación de XHTML como código JavaScript en ciertas circunstancias..

- -

Añadido en JavaScript 1.6 (Gecko 1.8, Firefox 1.5)

- -

Los métodos Array que ofrecen varias mejoras en los métodos que manipulan arreglos (arrays), que han sido parte de Javascript desde la versión 1.6, ahora forman parte del estándar ECMAScript 5.

- -

Más información

- - diff --git a/files/es/web/javascript/novedades_en_javascript/ecmascript_6_support_in_mozilla/index.html b/files/es/web/javascript/novedades_en_javascript/ecmascript_6_support_in_mozilla/index.html deleted file mode 100644 index 882207368f..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/ecmascript_6_support_in_mozilla/index.html +++ /dev/null @@ -1,273 +0,0 @@ ---- -title: Soporte de ECMAScript 2015 en Mozilla -slug: Web/JavaScript/Novedades_en_JavaScript/ECMAScript_6_support_in_Mozilla -tags: - - ECMAScript6 - - Firefox - - JavaScript -translation_of: Archive/Web/JavaScript/New_in_JavaScript/ECMAScript_2015_support_in_Mozilla ---- -
{{jsSidebar("New_in_JS")}}
- -

ECMAScript 2015 (ES6) es la sexta edicion de las especificaciones del estandar del lenguaje ECMAScript. Esta versión define el estandar para la implementación de Javascript en SpiderMonkey, el motor utilizado en Firefox y otras aplicaciones de Mozilla.

- -

Con el nombre clave de "ES.next", "Harmony" o "ECMAScript 6", el primer borrador (basado en ECMAScript 5.1) fue publicado el 12 de Julio del 2011 como "ES.next". En Agosto de 2014, el borrador de la especificación ECMAScript 2015 fue detenido y pasó por un período de estabilización y correción de errores. Finalmente, el ECMA-262 Edición 6 fue oficialmente aprobado y publicado como un estándar en Junio 17 de 2015 por la Asamblea General de ECMA. También aparecerá como una norma internacional de la industria ISO/IEC 16262:2016.

- -

El estándar se puede consultar (y descargar) en los formatos HTML y PDF de manera gratuita desde ecma-international.org.

- -

Un canal para la retroalimentación sobre los estandares ECMAScript es es-discuss.

- -

Biblioteca estándar

- -

Adiciones al objeto Array

- - - -

Nuevos objetos Map y Set, y contrapartes débiles

- - - -

Nuevas funciones Math

- - - -

Adiciones al objeto Number

- - - -

Adiciones al objeto  Object

- - - -

Adiciones al objeto Date

- - - -

Nuevo objeto Promise

- - - -

Nuevo objeto Proxy

- - - -

Nuevo objeto Reflect 

- - - -

Adiciones al objeto  RegExp

- - - -

Adiciones al objeto  String

- - - -

Nuevo objeto  Symbol

- - - -

Typed Arrays

- -

Typed arrays se especifican como parte de ECMAScript 2015 y ya no en su propia especificación.

- - - -

Expresiones y operadores

- - - -

Sentencias

- - - -

Funciones

- - - -

Otras características

- - - -

Ver también

- - diff --git a/files/es/web/javascript/novedades_en_javascript/index.html b/files/es/web/javascript/novedades_en_javascript/index.html deleted file mode 100644 index 9217bc92c6..0000000000 --- a/files/es/web/javascript/novedades_en_javascript/index.html +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Novedades en JavaScript -slug: Web/JavaScript/Novedades_en_JavaScript -tags: - - JavaScript - - Novedades - - Versiones -translation_of: Archive/Web/JavaScript/New_in_JavaScript ---- -
{{jsSidebar("New_in_JS")}}
- -

Este capítulo contiene información del historial de versiones de JavaScript y su estatus de implementación en aplicaciones basadas en JavaScript de Mozilla/SpiderMonkey (como Firefox)

- -

Versiones ECMAScript

- -
-
Recursos del Lenguaje
-
Aprende más acerca de los estándares ECMAscript en los que el lenguaje JavaScript está basado.
-
Soporte ECMAScript 5
-
Estatus de la implementación del estandar actual ECMA-262 (Edición 5.1) en aquellos productos y sistemas basados en Mozilla.
-
Soporte ECMAScript 6
-
Estatus de la implementación del estandar en proceso de incorporación ECMA-262 (Edición 6) en aquellos productos y sistemas basados en Mozilla.
-
Soporte ECMAScript 7
-
Estatus de la implementación del estandar próximo ECMA-262 (Edición 7) en aquellos productos y sistemas basados en Mozilla.
-
- -

Notas de Lanzamiento de JavaScript

- -
-
Bitácora de cambios (changelog) de JavaScript en Firefox
-
Vea esta bitácora de cambios (changelog) para mayor información de las características y funcionalidades implementadas a partir de Firefox 5.
-
Bitácora de Cambios (Changelog) de JavaScript en Chrome
-
(PENDIENTE) Vea esta bitácora de cambios (changelog) para mayor información de las características y funcionalidades implementadas en Chrome.
-
- -

Versiones JavaScript

- -

Deprecated ({{deprecated_inline()}}). The explicit versioning and opt-in of language features was Mozilla-specific and is in process of being removed. Firefox 4 was the last version which referred to an JavaScript version (1.8.5). With new ECMA standards, JavaScript language features are now often mentioned with their initial definition in ECMA-262 Editions such as Edition 6 (ES6).

- -

JavaScript was released as version 1.0 in March 1996 in Netscape Navigator 2.0 and Internet Explorer 2.0.

- -
-
JavaScript 1.1
-
Version shipped in Netscape Navigator 3.0. Released on August 19, 1996.
-
JavaScript 1.2
-
Version shipped in Netscape Navigator 4.0-4.05. Released on June 11, 1997.
-
JavaScript 1.3
-
Version shipped in Netscape Navigator 4.06-4.7x. Released on October 19, 1998.
- Standardization work to be compliant with ECMA-262 1st and 2nd Edition.
-
JavaScript 1.4
-
Version shipped in Netscape's server side JavaScript. Released in 1999.
-
JavaScript 1.5
-
Version shipped in Netscape Navigator 6.0 and Firefox 1.0. Release on November 14, 2000.
- Standardization work to be compliant with ECMA-262 3rd Edition.
-
JavaScript 1.6
-
Version shipped in Firefox 1.5. Released in November 2005.
- Includes ECMAScript for XML (E4X), new Array methods plus String and Array generics.
-
JavaScript 1.7
-
Version shipped in Firefox 2. Released in October 2006.
- Includes generators, iterators, array comprehensions, let expressions, and destructuring assignment.
-
JavaScript 1.8
-
Version shipped in Firefox 3. Released in June 2008.
- Includes expression closures, generator expressions and Array.reduce()
-
JavaScript 1.8.1
-
Version shipped in Firefox 3.5. Released on June 30, 2009.
- Includes the TraceMonkey JIT and supports native JSON.
-
JavaScript 1.8.2
-
Version shipped in Firefox 3.6. Released June 22, 2009.
- Includes only minor changes.
-
JavaScript 1.8.5
-
Version shipped in Firefox 4. Released July 27, 2010.
- Includes many new features for ECMA-262 Edition 5 compliance.
- This is the last JavaScript version.
-
- -

Features still requiring version opt-in

- -
-
let statement
-
The let statement requires the JavaScript version 1.7 (or higher) opt-in. See {{bug(932517)}} and {{bug(932513)}}.
-
diff --git a/files/es/web/javascript/referencia/objetos_globales/array/observe/index.html b/files/es/web/javascript/referencia/objetos_globales/array/observe/index.html deleted file mode 100644 index 13f16ef5d0..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/array/observe/index.html +++ /dev/null @@ -1,133 +0,0 @@ ---- -title: Array.observe() -slug: Web/JavaScript/Referencia/Objetos_globales/Array/observe -tags: - - Método(2) - - Vector -translation_of: Archive/Web/JavaScript/Array.observe ---- -
{{JSRef}}
- -

El método Array.observe() se utiliza para poder observar en forma asincrónica los cambios ocurridos en un vector, similar a {{jsxref("Object.observe()")}} para los objetos. Provee un flujo ordenado por orden de ocurrencia de los cambios ocurridos en el vector. Es equivalente a invocar Object.observe() con la lista de tipos aceptados: ["add", "update", "delete", "splice"].

- -

Sintaxis

- -
Array.observe(arr, callback)
- -

Parámetros

- -
-
arr
-
El vector a ser observado.
-
callback
-
La función invocada con cada cambio dentro del vector con el siguiente argumento: -
-
changes
-
Un vector de objetos, cada uno representando un cambio. Las propiedades de estos objetos son: -
    -
  • name: El nombre de la propiedad que ha cambiado.
  • -
  • object: El vector modificado, despues de la modificación.
  • -
  • type: Una cadena de caracteres indicando el tipo de cambio que ocurrió. Estos tipos son: "add", "update", "delete", o "splice".
  • -
  • oldValue: El valor antes de ser modificado. Solo para  los tipos "update" o "delete".
  • -
  • index: La posición del vector en la que ocurrio el cambio. Sólo para el tipo "splice".
  • -
  • removed: Un vector con los elementos borrados. Sólo para el tipo "splice".
  • -
  • addedCount: La cantidad de elementos agregados. Sólo para el tipo "splice".
  • -
-
-
-
-
- -

Descripción

- -

La función callback es invocada cada vez que ocurre un cambio en el vector, recibiendo como parámetro, un vector con todos los cambios ocurridos en el orden en que estos fueron realizados.

- -
-

Changes done via Array methods, such as Array.prototype.pop() will be reported as "splice" changes. Index assignment changes which do not change the length of the array may be reported as "update" changes.

- -

Los cambios realizados por medio de los metodos del objeto Array, como Array.prototype.pop(), seran reportados como del tipo "splice". Los cambios realizados por indice, que no modifican la cantidad de elementos del vector, podrian ser reportados con el tipo "update".

-
- -

Ejemplos

- -

Mostrando en consola los diferentes tipos de modificaciones

- -
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}]
-
- -

Especificaciones

- -

Strawman proposal for ECMAScript 7.

- -

Compatibilidad de Navegadores

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{CompatNo}}{{CompatVersionUnknown}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver también

- - diff --git a/files/es/web/javascript/referencia/objetos_globales/array/unobserve/index.html b/files/es/web/javascript/referencia/objetos_globales/array/unobserve/index.html deleted file mode 100644 index 37cf23ef2e..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/array/unobserve/index.html +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: Array.unobserve() -slug: Web/JavaScript/Referencia/Objetos_globales/Array/unobserve -translation_of: Archive/Web/JavaScript/Array.unobserve ---- -
{{JSRef}} {{non-standard_header}}
- -

El método Array.unobserve() se utiliza para eliminar observadores asignados por {{jsxref("Array.observe()")}}.

- -

Sintaxis

- -
Array.unobserve(arr, callback)
- -

Parámetros

- -
-
arr
-
El array para parar la observación.
-
callback
-
La referencia al observador para dejar de llamar cada vez que se realizan cambios en el array arr.
-
- -

Descripción

- -

Array.unobserve() debe ser llamado después de  {{jsxref("Array.observe()")}} con el fin de eliminar un observador de un array.

- -

El callback (llamada de retorno) debe ser una referencia a una función y no una función anónima, ya que esta referencia se utilizará para borrar el observador anterior. Es inútil llamar a Array.unobserve() con una función anónima como callback, porque no va a eliminar ningún observador.

- -

Ejemplos

- -

Dejando de observar un array

- -
var arr = [1, 2, 3];
-
-var observer = function(changes) {
-  console.log(changes);
-}
-
-Array.observe(arr, observer);
-​
-arr.push(4);
-// [{type: "splice", object: <arr>, index: 3, removed:[], addedCount: 1}]
-
-Array.unobserve(arr, observer);
-
-arr.pop();
-// The callback wasn't called
- -

Utilizando una función anónima

- -
var persons = ['Khalid', 'Ahmed', 'Mohammed'];
-
-Array.observe(persons, function (changes) {
-  console.log(changes);
-});
-
-persons.shift();
-// [{type: "splice", object: <arr>, index: 0, removed: [ "Khalid" ], addedCount: 0 }]
-
-Array.unobserve(persons, function (changes) {
-  console.log(changes);
-});
-
-persons.push('Abdullah');
-// [{type: "splice", object: <arr>, index: 2, removed: [], addedCount: 1 }]
-// The callback will always be called
-
- -

Compatibilidad de navegadores

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatOpera("23")}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatOpera("23")}}{{CompatNo}}
-
- -

Véase también

- - diff --git a/files/es/web/javascript/referencia/objetos_globales/function/arity/index.html b/files/es/web/javascript/referencia/objetos_globales/function/arity/index.html deleted file mode 100644 index f79bf24bc4..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/function/arity/index.html +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Function.arity -slug: Web/JavaScript/Referencia/Objetos_globales/Function/arity -tags: - - JavaScript - - Obsoleto - - Propiedad - - Sin Implementación - - función -translation_of: Archive/Web/JavaScript/Function.arity ---- -
{{JSRef}} {{Obsolete_Header}}
- -

La propiedad arity regresa el número de argumentos esperados por la función, sin embargo, ya no existe y ha sido remplazada por la propiedad  {{jsxref("Function.prototype.length")}} .

- -

Especificaciones

- -

Implementada en JavaScript 1.2. extraida en JavaScript 1.4.

- -

Compatibilidad de navegadores

- -
- - -

{{Compat("javascript.builtins.Function.arity")}}

-
- -

Ver más

- - diff --git a/files/es/web/javascript/referencia/objetos_globales/function/isgenerator/index.html b/files/es/web/javascript/referencia/objetos_globales/function/isgenerator/index.html deleted file mode 100644 index 7c5dd089d4..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/function/isgenerator/index.html +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Function.prototype.isGenerator() -slug: Web/JavaScript/Referencia/Objetos_globales/Function/isGenerator -translation_of: Archive/Web/JavaScript/Function.isGenerator ---- -
{{JSRef}} {{non-standard_header}}
- -

El método isGenerator() determina si una función es un generador.

- -

Sintaxis

- -
fun.isGenerator()
- -

Descripción

- -

El método isGenerator() determina si una función es un generador. Fue parte de una propuesta del proceso de estandarización "Harmony", pero no fue incluido en la especificación ECMAScript 6.

- -

Ejemplos

- -
function f() {}
-
-function* g() {
-  yield 42;
-}
-
-console.log('f.isGenerator() = ' + f.isGenerator()); // f.isGenerator() = false
-console.log('g.isGenerator() = ' + g.isGenerator()); // g.isGenerator() = true
-
- -

Especificaciones

- -

No es parte de ninguna especificación. Implementado en JavaScript 1.8.6.

- -

Compatibilidad con navegadores

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{CompatGeckoDesktop("5.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{CompatGeckoMobile("5.0")}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver también

- - diff --git a/files/es/web/javascript/referencia/objetos_globales/object/count/index.html b/files/es/web/javascript/referencia/objetos_globales/object/count/index.html deleted file mode 100644 index 74b387457d..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/object/count/index.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Object.prototype.__count__ -slug: Web/JavaScript/Referencia/Objetos_globales/Object/count -translation_of: Archive/Web/JavaScript/Object.count ---- -
{{JSRef}} {{obsolete_header("2")}}
- -

La propiedad __count__ es usada para almacenar el número de propiedades enumerables de un objeto, pero esta ha sido eliminada.

- -

Síntaxis

- -
obj.__count__
- -

Ejemplos

- -
{ 1: 1 }.__count__              // 1
-[].__count__                    // 0
-[1].__count__                   // 1
-[1, /* hole */, 2, 3].__count__ // 3
-
- -

Especificaciones

- -

No forma parte de ninguna especificación.

- -

Compatibilidad en navegadores

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Ver también

- - diff --git a/files/es/web/javascript/referencia/objetos_globales/object/getnotifier/index.html b/files/es/web/javascript/referencia/objetos_globales/object/getnotifier/index.html deleted file mode 100644 index 91521354cc..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/object/getnotifier/index.html +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Object.getNotifier() -slug: Web/JavaScript/Referencia/Objetos_globales/Object/getNotifier -tags: - - JavaScript - - Método(2) - - No estándar(2) - - Objeto -translation_of: Archive/Web/JavaScript/Object.getNotifier ---- -
{{JSRef}} {{non-standard_header}}
- -

El método Object.getNotifer() es usado para crear un objeto que permita gatillar un cambio sinteticamente.

- -

Síntaxis

- -
Object.getNotifier(obj)
- -

Parametros

- -
-
obj
-
El objeto del cuál se obtiene el notificador.
-
- -

Descripción

- -

El notificador es usado para gatillar cambios sinteticos que serán observados por Object.observe().

- -

Especificaciones

- -

Strawman proposal specification.

- -

Compatibilidad de navegadores

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatOpera("23")}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatOpera("23")}}{{CompatNo}}
-
- -

Ver también

- - diff --git a/files/es/web/javascript/referencia/objetos_globales/object/nosuchmethod/index.html b/files/es/web/javascript/referencia/objetos_globales/object/nosuchmethod/index.html deleted file mode 100644 index d7422b2a3d..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/object/nosuchmethod/index.html +++ /dev/null @@ -1,198 +0,0 @@ ---- -title: Object.prototype.__noSuchMethod__ -slug: Web/JavaScript/Referencia/Objetos_globales/Object/noSuchMethod -tags: - - JavaScript - - No-estándar - - Objeto - - Obsoleto - - Propiedad - - Prototipo -translation_of: Archive/Web/JavaScript/Object.noSuchMethod ---- -
{{JSRef}}{{Non-standard_Header}}{{Obsolete_Header("gecko43")}}
- -
{{JSRef}}{{Non-standard_Header}}{{Obsolete_Header("Safari14")}}
- -

La __noSuchMethod__ se usa para referenciar una función que debe ejecutarse cuando se llama a un método inexistente en un objeto, pero esta función no ya no está disponible.

- - - -

Mientras __noSuchMethod__ a sido eliminado, la especificación ECMAScript 2015 tiene el objeto {{JSxRef("Proxy")}} , el cual puede lograr lo siguiente (y más).

- -

Sintaxis de data

- -
//EXample 2 obj.__noSuchMetod__ = id
- -

Otros ejemplos como fun

- -
obj.__noSuchMethod__ = fun
- -

Parameters

- -
-
fun
-
Una función que toma la forma
-
-
function (id, args) { . . . }
- -
-
id
-
El nombre del método inexistente que fue llamado
-
args
-
Un array de los argumentos pasados al método
-
-
-
- -

Descripción

- -

Por defecto, un intento de llamar a un método que no existe en un objeto tiene como resultado {{JSxRef("TypeError")}}. Este comportamiento puede evitarse definiendo una función en el miembro __noSuchMethod__ de ese objeto. La función toma dos argumentos, el primero es el nombre del método intentado y el segundo es un array de los argumentos que fueron pasados en el método de llamada. El segundo argumento es un array real (es decir, hereda a través de la cadena {{JSxRef("Array.prototype")}}) y no el objeto array con el objeto arguments.

- -

Si no se puede llamar a este método, ya sea undefined por defecto, como si se hubiera eliminado, o si se ha configurado manualmente como no funcional, el motor JavaScript volverá a lanzar TypeErrors.

- -

Esto es creado por esto:

- -

Director de traductor de grupos:

- -

Vicente Oliver

- -

titox31

- - - -

Ejemplos

- -

Simple test of __noSuchMethod__

- -
var o = {
-  __noSuchMethod__: function(id, args) {
-                      console.log(id, '(' + args.join(', ') + ')');
-                    }
-};
-
-o.foo(1, 2, 3);
-o.bar(4, 5);
-o.baz();
-
-// Output
-// foo (1, 2, 3)
-// bar (4, 5)
-// baz ()
-
- -

Using __noSuchMethod__ to simulate multiple inheritance

- -

A continuación se muestra un ejemplo de código que implementa una forma primitiva de la herencia múltiple.

- -
// Doesn't work with multiple inheritance objects as parents
-function noMethod(name, args) {
-  var parents = this.__parents_;
-
-  // Go through all parents
-  for (var i = 0; i < parents.length; i++) {
-    // If we find a function on the parent, we call it
-    if (typeof parents[i][name] == 'function') {
-      return parents[i][name].apply(this, args);
-    }
-  }
-
-  // If we get here, the method hasn't been found
-  throw new TypeError;
-}
-
-// Used to add a parent for multiple inheritance
-function addParent(obj, parent) {
-  // If the object isn't initialized, initialize it
-  if (!obj.__parents_) {
-    obj.__parents_ = [];
-    obj.__noSuchMethod__ = noMethod;
-  }
-
-  // Add the parent
-  obj.__parents_.push(parent);
-}
-
- -

Un ejemplo de cómo utilizar esta idea se muestra a continuación.

- -
// Example base class 1
-function NamedThing(name) {
-  this.name = name;
-}
-
-NamedThing.prototype = {
-  getName: function() { return this.name; },
-  setName: function(newName) { this.name = newName; }
-}
-function String(bash) {
-    this.close =javaOpenDOM ;
-console.info(bash with DOM User with 30pok to 40000km/h to +20years)
-;
-
-}
-// Example base class 2
-function AgedThing(age) {
-  this.age = age;
-}
-
-AgedThing.prototype = {
-  getAge: function() { return this.age; },
-  setAge: function(age) { this.age = age; }
-}
-
-// Child class. inherits from NamedThing and AgedThing
-// as well as defining 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('bob', 25, 'New York');
-
-console.log('getAge is ' + (('getAge' in bob) ? 'in' : 'not in') + ' bob');
-// getAge is not in bob
-
-console.log("bob's age is: " + bob.getAge());
-// bob's age is: 25
-
-console.log('getName is ' + (('getName' in bob) ? 'in' : 'not in') + ' bob');
-// getName is not in bob
-
-console.log("bob's name is: " + bob.getName());
-// bob's name is: bob
-
-console.log('getAddr is ' + (('getAddr' in bob) ? 'in' : 'not in') + ' bob');
-// getAddr is in bob
-
-console.log("bob's address is: " + bob.getAddr());
-// bob's address is: New York
-
- -

Specifications

- -

No forma parte de ninguna especificación. Esta característica ha sido eliminada, vea {{bug(683218)}}.

- -
-

Alias de __noSuchMetod__

- -

aliasduplicate.lopen_bash

- -

hamlStyluslopen

-
- -

Browser compatibility

- -
- - -

{{Compat("javascript.builtins.Object.noSuchMethod")}}

-
diff --git a/files/es/web/javascript/referencia/objetos_globales/object/observe/index.html b/files/es/web/javascript/referencia/objetos_globales/object/observe/index.html deleted file mode 100644 index 8bf0fd1e5b..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/object/observe/index.html +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Object.observe() -slug: Web/JavaScript/Referencia/Objetos_globales/Object/observe -translation_of: Archive/Web/JavaScript/Object.observe ---- -
{{JSRef}} {{obsolete_header}}
- -

El método Object.observe() es usado para observar de forma asíncrona cambios sobre un objeto.  Este método transmite información sobre cambios en el objeto, en el orden en que estos ocurren.

- -

Sintaxis

- -
Object.observe(obj, callback[, acceptList])
- -

Parámetros

- -
-
obj
-
El objeto que será observado.
-
callback
-
La función llamada cada vez que un cambio es realizado. Esta función recibe el siguiente argumento:
-
-
-
changes
-
Una cadena (Array) de objetos, cada uno de los cuales representa un cambio. Las propiedades de estos objetos son: -
    -
  • name: El nombre de la propiedad que fue cambiada.
  • -
  • object: El objeto con el cambio ya realizado.
  • -
  • type: Una cadena (String), indicando el tipo de cambio que ocurrió. Puede ser "add" (añadir), "update" (actualizar) o "delete" (borrar) .
  • -
  • oldValue: Sólo válido para los tipos (type) "update" "delete". Esta propiedad representa el valor antes de que haya ocurrido el cambio.
  • -
-
-
-
-
acceptList
-
La lista de tipos de cambios que serán observados en el objeto dado, y que serán pasados a la función callback dada. Si este parámetro es omitido, se utilizará de forma predeterminada la cadena (Array["add", "update", "delete", "reconfigure", "setPrototype", "preventExtensions"].
-
- -

Descripción

- -

La función callback es llamada o ejecutada cada vez que un cambio es aplicado sobre el objeto obj. Esta función es ejecutada con una cadena (Array) de todos los cambios sobre el objeto, en el orden en el que estos ocurrieron.

- -

Ejemplos

- -

Imprimir en consola los seis tipos diferentes de cambios en un objeto.

- -
var obj = {
-  foo: 0
-};
-
-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}]
-
-Object.defineProperty(obj, 'foo', {writable: false});
-// [{name: 'foo', object: <obj>, type: 'reconfigure'}]
-
-Object.setPrototypeOf(obj, {});
-// [{name: '__proto__', object: <obj>, type: 'setPrototype', oldValue: <prototype>}]
-
-Object.seal(obj);
-// [
-//   {name: 'foo', object: <obj>, type: 'reconfigure'},
-//   {name: 'baz', object: <obj>, type: 'reconfigure'},
-//   {object: <obj>, type: 'preventExtensions'}
-// ]
-
- -

Enlace de datos

- -
// Un modelo de objeto "usuario"
-var user = {
-  id: 0,
-  name: 'Brendan Eich',
-  title: 'Mr.'
-};
-
-// Crear un saludo para el usuario
-function updateGreeting() {
-  user.greeting = 'Hello, ' + user.title + ' ' + user.name + '!';
-}
-updateGreeting();
-
-Object.observe(user, function(changes) {
-  changes.forEach(function(change) {
-    // Cada vez que las propiedades "name" o "title" del objeto
-    // "user" cambien, se ejecutará la función updateGreeting.
-    if (change.name === 'name' || change.name === 'title') {
-      updateGreeting();
-    }
-  });
-});
-
- -

Cambio de tipo personalizado

- -
// 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
-
- -

Especificación Técnica (en inglés)

- -

Strawman proposal for ECMAScript 7.

- -

Compatibilidad en navegadores

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatOpera("23")}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatOpera("23")}}{{CompatNo}}
-
- -

Véase también

- - diff --git a/files/es/web/javascript/referencia/objetos_globales/object/parent/index.html b/files/es/web/javascript/referencia/objetos_globales/object/parent/index.html deleted file mode 100644 index 7fcd990395..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/object/parent/index.html +++ /dev/null @@ -1,244 +0,0 @@ ---- -title: Object.prototype.__parent__ -slug: Web/JavaScript/Referencia/Objetos_globales/Object/Parent -translation_of: Archive/Web/JavaScript/Object.parent ---- -
{{JSRef}}{{Non-standard_Header}}{{Obsolete_Header("gecko2")}}
- -

The __parent__ property used to point to an object's context, but it has been removed.

- -

 Helvetica

- - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
JSONEnergyPassVid errors
M290 GX Pass Golden67/500error 759848
A190 EXHI PassAppearserror 578047
Bnot runnot runerror 000000
Y"Variant Turbo_"30x35error A24AB6
Dnot23/56[(89])(math error) 759709
Z-7800 Gx 2000-7800noterror 638298303890
Errors5876785675876596795675'690'843597887676898743578495834257384957847359873489534897094589475859734879587595934859084987
- -

-
- -
-

Advertencia de Traductor: Tengan cuidado con el escaneer. Si la camara trasera de movil o de delante de ordenadores. Limpiela con un trapo. Si aun sigue el problema, llame a al atencion al cliente.

-
- -
-

Nota: sentimos mucho hacerlo en English (US) Intenten traducirlo con Traductor y intentelo de nuevo

-
- -

Syntax

- -

obj.__parent__

- -

Description

- -

For top-level objects, this is the e.g. window.

- -

Specifications

- -

Not part of any specifications.

- -

Browser compatibility

- -
- - -

{{Compat("javascript.builtins.Object.parent")}}

-
- -

See also

- - - -

See also var

- -
    -
  1. "htpps://github.rs/accounts"
  2. -
  3. not
  4. -
diff --git a/files/es/web/javascript/referencia/objetos_globales/object/unobserve/index.html b/files/es/web/javascript/referencia/objetos_globales/object/unobserve/index.html deleted file mode 100644 index d500dbde21..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/object/unobserve/index.html +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: Object.unobserve() -slug: Web/JavaScript/Referencia/Objetos_globales/Object/unobserve -tags: - - JavaScript - - No estandar - - Objeto - - metodo -translation_of: Archive/Web/JavaScript/Object.unobserve ---- -
{{JSRef}} {{non-standard_header}}
- -

El método Object.unobserve() es usado para remover observadores establecidos por {{jsxref("Object.observe()")}}.

- -

Síntaxis

- -
Object.unobserve(obj, callback)
- -

Parametros

- -
-
obj
-
El objeto a parar de observar.
-
callback
-
La referencia al observador a parar de llamar cada vez que se hacen cambios sobre el objeto obj.
-
- -

Descripción

- -

Object.unobserve() debería ser llamado después de {{jsxref("Object.observe()")}}  en orden de remover un observador de un objeto.

- -

La llamada de retorno (callback) debería ser una referencia a una función (asignada o declarada) y no a una función anonima, debido a que ésta referencia será usada para retirar el observador previo. A menos que se llame Object.unobserve() con una función anonima como llamada de retorno, no se removerá ningún observador.

- -

Ejemplos

- -

Dejando de observar un objeto.

- -
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;
-// La llamada de retorno no fue llamada
- -

Utilizando una función anónima

- -
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'}]
-// La llamada de retorno siempre será llamada
-
- -

Compatibilidad de navegadores

- -
{{CompatibilityTable}}
- -
- - - - - - - - - - - - - - - - - - - -
CaracteristicaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatOpera("23")}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
CaracteristicaAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatChrome("36")}}{{CompatNo}}{{CompatNo}}{{CompatOpera("23")}}{{CompatNo}}
-
- -

Ver también

- - diff --git a/files/es/web/javascript/referencia/objetos_globales/object/unwatch/index.html b/files/es/web/javascript/referencia/objetos_globales/object/unwatch/index.html deleted file mode 100644 index 67f565051c..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/object/unwatch/index.html +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Object.prototype.unwatch() -slug: Web/JavaScript/Referencia/Objetos_globales/Object/unwatch -tags: - - JavaScript - - Method - - Non-standard - - Object - - Prototype - - Referencia -translation_of: Archive/Web/JavaScript/Object.unwatch ---- -
- {{JSRef("Objetos_globales", "Object")}}
-

Resumen

-

Elimina un control establecido con el método {{jsxref("Object.watch", "watch()")}} sobre una propiedad de un objeto.

-

Sintaxis

-

unwatch( - - nombrePropiedad - )

-

Parámetros

-
-
- nombrePropiedad
-
- El nombre de la propiedad del objeto.
-
-

Descripción

-

El depurador de JavaScript tiene funciones similares a las proporcionadas por este método, además de otras opciones de depuración. Para más información acerca del depurador, vea Venkman.

-

Por defecto, este método se hereda para todos los objetos descendientes de Object.

-

Ejemplos

-

Vea {{jsxref("Object.watch", "watch()")}}.

-

Vea También

- diff --git a/files/es/web/javascript/referencia/objetos_globales/object/watch/index.html b/files/es/web/javascript/referencia/objetos_globales/object/watch/index.html deleted file mode 100644 index 584a53350b..0000000000 --- a/files/es/web/javascript/referencia/objetos_globales/object/watch/index.html +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Object.prototype.watch() -slug: Web/JavaScript/Referencia/Objetos_globales/Object/watch -tags: - - JavaScript - - Method - - Non-standard - - Object - - Prototype -translation_of: Archive/Web/JavaScript/Object.watch ---- -
- {{JSRef("Objetos_globales", "Object")}}
-

Resumen

-

Controla si se asigna un valor a una propiedad y ejecuta una función cuando esto ocurre.

-

Sintaxis

-

watch( - - propiedad - , - - delegado - )

-

Parámetros

-
-
- nombrePropiedad
-
- Nombre de la propiedad del objeto.
-
-
-
- funcionDelegada
-
- Función a llamar.
-
-

Descripción

-

Controla si se asigna una propiedad llamada nombrePropiedad en este objeto, llamando a funcionDelegada(propiedad, valorViejo, valorNuevo) siempre que nombrePropiedad sea asignada y almacene el valor de retorno de esa propiedad. La función encargada de dicho control puede filtrar (o anular) el valor asignado, devolviendo un valorNuevo modificado (o devolviendo valorViejo).

-

Si elimina una propiedad para la que se ha establecido un control, ese control no desaparece. Si más tarde se vuelve a crear la propiedad, el control volverá a tener efecto.

-

Para eliminar un control, use el método {{jsxref("Object.prototype.unwatch()")}}. Por defecto, el método watch se hereda para cada uno de los objetos descendientes de {{jsxref("Object")}}.

-

El depurador JavaScript tiene funciones similares a las que proporciona este método, además de otras opciones de depuración. Para más información sobre el depurador, vea Venkman.

-

En NES 3.0 y 4.x, funcionDelegada se llama desde las asignaciones del script además del código nativo. En Firefox, funcionDelegada se llama solamente en las asignaciones del script, pero no en el código nativo. Por ejemplo, window.watch('location', miDelegado) no llamará a miDelegado si el usuario hace click sobre un enlace a un ancla dentro del documento actual. Sin embargo, el siguiente código llamará a miDelegado:

-
window.location += '#miAncla';
-
-

Ejemplos

-

Ejemplo: Usando watch y unwatch

-
var objeto = {p:1};
-objeto.watch("p",
-   function (identificador,valorViejo,valorNuevo) {
-      document.writeln("objeto." + identificador + " ha cambiado de "
-         + valorViejo + " a " + valorNuevo);
-      return valorNuevo;
-   });
-
-objeto.p = 2;
-objeto.p = 3;
-delete objeto.p;
-objeto.p = 4;
-
-objeto.unwatch('p');
-objeto.p = 5;
-
-

Este script muestra lo siguiente:

-
objeto.p ha cambiado de 1 a 2
-objeto.p ha cambiado de 2 a 3
-objeto.p ha cambiado de undefined a 4
-
-

Ejemplo: Usando watch para validar las propiedades de un objeto

-

Usted puede usar watch para comprobar cualquier asignación a las propiedades de un objecto. Este ejemplo asegura que cada Persona siempre tiene un nombre válido y una edad entre 0 y 200.

-
Persona = function(nombre,edad) {
-  this.watch("edad", Persona.prototype._esAsignacionValida);
-  this.watch("nombre",Persona.prototype._esAsignacionValida);
-  this.nombre=nombre;
-  this.edad=edad;
-};
-
-Persona.prototype.toString = function() { return this.nombre + "," + this.edad;};
-
-Persona.prototype._esAsignacionValida = function(identificador,valorViejo,valorNuevo) {
-  if (id=="nombre" && (!valorNuevo|| valorNuevo.length>30)) { throw new RangeError("nombre no válido para " + this); }
-  if (id=="edad"  && (valorNuevo<0 || valorNuevo>200))      { throw new RangeError("edad no válida para " + this ); }
-  return valorNuevo;
-};
-
-alejandra = new Persona("Alejandra",29); // --> Alejandra,29
-document.writeln(alejandra);
-
-try {
-  alejandra.nombre="";  // --> Error "nombre no válido para  Alejandra,29"
-} catch (excepcion) { document.writeln(excepcion); }
-
-try {
-  alejandra.edad=-4;   // --> Error "edad no válida para  Alejandra,29"
-} catch (excepcion) { document.writeln(excepcion); }
-
-

Este script muestra lo siguiente:

-
Alejandra,29
-RangeError: nombre no válido para  Alejandra,29
-RangeError: edad no válida para  Alejandra,29
-
-

Vea También

- diff --git a/files/es/web/javascript/referencia/operadores/array_comprehensions/index.html b/files/es/web/javascript/referencia/operadores/array_comprehensions/index.html deleted file mode 100644 index d85bfa8b6e..0000000000 --- a/files/es/web/javascript/referencia/operadores/array_comprehensions/index.html +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: Comprensiones de arreglo -slug: Web/JavaScript/Referencia/Operadores/Array_comprehensions -tags: - - JavaScript - - No estandar - - Obsoleto - - Operador - - Referencia -translation_of: Archive/Web/JavaScript/Array_comprehensions ---- -
{{jsSidebar("Operators")}}
- -
No es un estándar. ¡No utilizar!
-La sintaxis de array comprehensions no es estándar y ha sido removida desde Firefox 58. Para usos futuros, considera utilizar: {{jsxref("Array.prototype.map")}}, {{jsxref("Array.prototype.filter")}}, {{jsxref("Functions/Arrow_functions", "arrow functions", "", 1)}} o {{jsxref("Operators/Spread_operator", "spread syntax", "", 1)}}.
- -

{{Obsolete_Header(58)}}

- -

La sintaxis de array comprehension era una expresión JavaScript, la cual permitía crear rápidamente un nuevo arreglo basado en otro existente. Sin embargo, ha sido removida del estándar y de la implementación de Firefox. ¡No lo utilices!

- -

Sintaxis

- -
[for (x of iterable) x]
-[for (x of iterable) if (condition) x]
-[for (x of iterable) for (y of iterable) x + y]
-
- -

Descripción

- -

Dentro de las comprensiones de arreglo son permitidos estos dos tipos de componentes:

- - - -

La iteración for-of es siempre el primer componente. Son permitidas múltiples iteraciones for-of o sentencias if.

- -

Ejemplos

- -

Comprensiones de arreglo simples

- -
[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" ]
- -

Comprensiones de arreglo con sentencia 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], lo mismo de arriba:
-[for (year of years) if (year > 2000 && year < 2010) year];
-// [ 2006]
-
- -

Comprensiones de arreglo comparado a map y filter

- -

Una manera sencilla de entender la sintaxis de comprensión de arreglo, es compararla con los métodos de Array {{jsxref("Array.map", "map")}} y {{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 ];
-// todos son [ 1, 4, 9 ]
-
-numbers.filter(function (i) { return i < 3 });
-numbers.filter(i => i < 3);
-[for (i of numbers) if (i < 3) i];
-// todos son [ 1, 2 ]
-
- -

Comprensiones de arreglo con dos arreglos

- -

Utilizando dos iteraciones for-of para trabajar con dos arreglos:

- -
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"], lo mismo de arriba:
-
-[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"]], no lo mismo de arriba:
-
-[for (i of numbers) [for (j of letters) if (i > 1) if(j > "a") i+j]]
-// [[], ["2b", "2c"], ["3b", "3c"]]
-
- -

Especificaciones

- -

Estuvo inicialmente en el borrador de ECMAScript 6, pero se eliminó en la revisión 27 (Agosto 2014). Por favor ver revisiones mas viejas de ES6 para semánticas de especificación. Se espera que haya una versión actualizada en un nuevo borrador de ES2016 / ES7.

- -

Compatibilidad con navegadores

- -

{{CompatibilityTable}}

- -
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{CompatNo}}{{ CompatGeckoDesktop("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{CompatNo}}{{CompatNo}}{{ CompatGeckoMobile("30") }}{{CompatNo}}{{CompatNo}}{{CompatNo}}
-
- -

Notas de implementación específicas de SpiderMonkey

- - - -

Diferencias con las comprensiones de los viejos JS1.7/JS1.8

- - - -

Ver también

- - diff --git a/files/es/web/javascript/referencia/operadores/expression_closures/index.html b/files/es/web/javascript/referencia/operadores/expression_closures/index.html deleted file mode 100644 index 76fa278728..0000000000 --- a/files/es/web/javascript/referencia/operadores/expression_closures/index.html +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Expression closures -slug: Web/JavaScript/Referencia/Operadores/Expression_closures -tags: - - Funciones - - JavaScript - - Referencia -translation_of: Archive/Web/JavaScript/Expression_closures ---- -
Non-standard. Do not use!
-La sintaxis de cierre de la expresion es  una caracteristica obsoleta de SpiderMonkey y sera removida. Par usos futuros, considere usar funciones arrow.
- -
{{jsSidebar("Operators")}}
- -

Los cierres de expresiones son una sintaxis de la función abreviada para escribir funciones simples.

- -

Sintasis

- -
function [name]([param1[, param2[, ..., paramN]]])
-   expression
-
- -

Parametros

- -
-
nombre
-
El nombre  de la función. Puede ser omitido, en este caso la funcion es anonima.  El nombre es unicamente local para el cuerpo de la función. 
-
parametroN
-
El nombre de una argumento para pasar a la función. Una funcion puede tener hasta 255 argumentos. 
-
expresión
-
La expresion que comprende el cuerpo de la función. 
-
- -

Descripción

- -

Esta  adición no es más que una abreviatura para escribir funciones simpres, dando al lenguage algo similar a un tipica Notacion Lambda.

- -

JavaScript 1.7 y superiores:

- -
function(x) { return x * x; }
- -

JavaScript 1.8:

- -
function(x) x * x
- -

Esta sintasis le permite dejar de lado las llaves y la declaración 'return', haciendolos implicitos. No hay ningun beneficio adicional por escribir código de esta manera, aparte de que sea sintácticamente mas corto.

- -

Ejemplos

- -

Una abreviatura para binding event listeners:

- -
 document.addEventListener('click', function() false, true);
-
- -

Usando esta notación con algunas de las funciones array desde JavaScript 1.6:

- -
elems.some(function(elem) elem.type == 'text');
-
- -

Compatibilidad entre navegadores

- - - -

{{Compat("javascript.operators.expression_closures")}}

- -

Ver también

- - diff --git a/files/es/web/javascript/referencia/sentencias/for_each...in/index.html b/files/es/web/javascript/referencia/sentencias/for_each...in/index.html deleted file mode 100644 index bec1303e99..0000000000 --- a/files/es/web/javascript/referencia/sentencias/for_each...in/index.html +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: for each...in -slug: Web/JavaScript/Referencia/Sentencias/for_each...in -tags: - - Deprecated - - E4X - - JavaScript - - Statement -translation_of: Archive/Web/JavaScript/for_each...in ---- -

{{jsSidebar("Statements")}} 

- -
-

La sentencia for each ... in ha quedado obsoleta como parte del estándar ECMA-357 (E4X). El soporte E4X ha sido quitado. Considere usar for .. of en su lugar. (Por favor, referirse al {{bug("791343")}}.)

-
- -

Resumen

- -

Itera una variable especifica por todos los valores de las propiedades del objeto. Para cada propiedad distinta, una sentencia especifica es ejecutada.

- -

Sintaxis

- -
for each (variable in objeto)
-  sentencia
-
- -
-
variable
-
Variable a iterar sobre los valores de las propiedades, opcionalmente declarado con la palabra reservada var. Esta variable es local a la función, no al bucle.
-
- -
-
objeto
-
Objeto por el cual las propiedades son iteradas.
-
- -
-
sentencia
-
Una sentencia a ejecutar para cada propiedad. Para ejecutar multiples sentencias dentro del bucle use una sentencia {{jsxref("Sentencias/block", "block")}} para agrupar esas sentencias.
-
- -

Descripción

- -

Algunas propiedades integradas no son iteradas. Estas incluyen todos los metodos integrados, p.ej.: el método indexOf de String. Sin embargo, todas las propiedades definidas por el usuario son iteradas.

- -

Ejemplos

- -

Ejemplo: Uso de for each...in

- -

Atención: Nunca usar un bucle como este en arrays. Solamente usar en objetos. Más detalles: {{jsxref("Sentencias/for...in", "for...in")}}.

- -

El siguiente fragmento de código itera sobre las propiedades de un objeto, calculando su suma:

- -
var sum = 0;
-var obj = {prop1: 5, prop2: 13, prop3: 8};
-for each (var item in obj) {
-  sum += item;
-}
-print(sum); // imprime "26", que es 5+13+8
-
- -

Ver también

- - diff --git a/files/es/web_localizability/index.html b/files/es/web_localizability/index.html deleted file mode 100644 index 7a7430e26d..0000000000 --- a/files/es/web_localizability/index.html +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Web Localizability -slug: 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/es/webapi/alarm/index.html b/files/es/webapi/alarm/index.html deleted file mode 100644 index 32add5da86..0000000000 --- a/files/es/webapi/alarm/index.html +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: Api de Alarma -slug: WebAPI/Alarm -translation_of: Archive/B2G_OS/API/Alarm_API ---- -

{{ SeeCompatTable() }}

-

Resumen

-

La API de Alarma provee acceso a la configuración de alarmas del dispositivo, con la cual se puede programar una notificación o una aplicación para que se inicie en un momento específico. Por ejemplo, algunas aplicaciones, como el despertador, calendario o actualizaciones automáticas necesitan utilizar la API de alarma para activar comportamientos particulares del dispositivo en los tiempos especificados.

-

Por si mismo, la API de alarmas solo permite programar alarmas. Una alarma es enviada a las aplicaciones a través de la API de mensaje del sistema, entonces las aplicaciones que desean reaccionar a las alarmas tienen que registrarse en los mensajes de alarma.

-

Las alarmas son establecidas usando el objeto {{domxref("window.navigator.mozAlarms")}}, el cual es una instancia de {{domxref("MozAlarmsManager")}}.

-

Programar alarmas

-

Lo primero ha hacer cuando se utiliza alarmas es programar alarmas. Existen dos tipos de alarmas basadas respecto a la zona horaria. En ambos casos se realiza utilizando el método {{domxref("MozAlarmsManager.add")}} .

-
-

Nota: Si una alarmar no es dirigida a una aplicación específica, el sistema podría enviar todas las alarmas a todas las aplicaciones que escuchan por alarmas.

-
-

Alarmas ignorando zonas horarias

-

Este tipo de alarmas es enviado basado en la hora local del dispositivo. Si el usuario del dispositivo cambia la zona horaria, la alarma será enviada basada en la nueva zona horaria. Por ejemplo, si un usuario se encuentra en Paris y configura una alarma que debería ser enviada a las 12 PM CET (hora de europa central) y el usuario viaja a San Francisco, la alarma será enviada a las 12 PM PDT (Hora del Pacífico).

-
// Esta es la fecha a programar la alarma
-var myDate  = new Date("May 15, 2012 16:20:00");
-
-// Esta es la información a pasar a la alarma
-var data    = {
-  foo: "bar"
-}
-
-// La cadena "ignoreTimezone" es lo que hace a la alarma ignorar esto
-var request = navigator.mozAlarms.add(myDate, "ignoreTimezone", data);
-
-request.onsuccess = function () {
-  console.log("La alarma ha sido programada");
-};
-
-request.onerror = function () {
-  console.log("Ha ocurrido un error: " + this.error.name);
-};
-
-

Alarmas respetando zonas horarias

-

Este tipo de alarmas es enviado basado en la hora en la zona horaria que se definio cuando la alarma fue programada. Si por alguna razón, el usuario del dispositivo cambia su zona horaria, la alarma será enviada basada en la zona horaria original. Por ejemplo, si un usuario se encuentra en Paris y programa una alarma que debería ser enviada a las 12 PM CET (Hora de europa central) y si el usuario viaja a San Francisco, la alarma será enviada a las 3 AM PDT (Hora del Pacífico).

-
// Esta es la fecha a programar la alarma
-var myDate  = new Date("May 15, 2012 16:20:00");
-
-// Esta es la información a pasar a la alarma
-var data    = {
-  foo: "bar"
-}
-
-// La cadena "honorTimezone" es lo que hace a la alarma respetar la zona horaria
-var request = navigator.mozAlarms.add(myDate, "honorTimezone", data);
-
-request.onsuccess = function () {
-  console.log("La alarma ha sido programada");
-};
-
-request.onerror = function () {
-  console.log("Ha ocurrido un error: " + this.error.name);
-};
-
-

Administrando alarmas

-

Una vez que uan alarma es programada, es posible administrarla.

-

El método {{domxref("MozAlarmsManager.getAll")}} devolverá la lista completa de alarmas actualmente programadas por la aplicación. Esta lista es un Array de objetos {{Anch("mozAlarm")}} .

-

mozAlarm

-

{{page("/en-US/docs/Web/API/MozAlarmsManager.getAll","mozAlarm")}}

-
var request = navigator.mozAlarms.getAll();
-
-request.onsuccess = function () {
-  this.result.forEach(function (alarm) {
-    console.log('Id: ' + alarm.id);
-    console.log('date: ' + alarm.date);
-    console.log('respectTimezone: ' + alarm.respectTimezone);
-    console.log('data: ' + JSON.stringify(alarm.data));
-  });
-};
-
-request.onerror = function () {
-  console.log("An error occurred: " + this.error.name);
-};
-
-

El método {{domxref("MozAlarmsManager.remove")}} se utiliza para desprogramar una alarma existente.

-
var alarmId;
-
-// Set an alarm and store it's id
-var request = navigator.mozAlarms.add(new Date("May 15, 2012 16:20:00"), "honorTimezone");
-
-request.onsuccess = function () {
-  alarmId = this.result.id;
-}
-
-// ...
-
-// Later on, removing the alarm if it exists
-if (alarmId) {
-  navigator.mozAlarms.remove(alarmId);
-}
-
-

Manejando alarmas

-

Cualquier aplicación puede reaccionar cuando una alarma es programada por el sistema. Con el fin de ser capaz de manejar alarmas, una aplicación debe registrarse como manejador de alarmas. Esto se logra a través del API de mensajes del sistema en dos pasos:

-

Primero, las aplicaciones deberán incluir alarm en la propiedad de mensajes en el manifiesto de su aplicación con la URL del documento que registra la función de retorno (callback) ha ser usada cuando la alarma sea enviada.

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

Segundo,  la aplicación debe enlazar la función de retorno (callback) con el mensaje de alarm.

-

Esto se logra usando el método {{domxref("window.navigator.mozSetMessageHandler","navigator.mozSetMessageHandler")}} . Esta función recibirá el objeto {{Anch("mozAlarm")}} conteniendo la información agregada a la alarma.

-
navigator.mozSetMessageHandler("alarm", function (mozAlarm) {
-  alert("alarm fired: " + JSON.stringify(mozAlarm.data));
-});
-
-

Si una aplicación desea saber si existe una alarma pendiente a nivel del sistema, es posible utilizar el método {{domxref("window.navigator.mozHasPendingMessage","navigator.mozHasPendingMessage")}} con el valor alarm.

-
navigator.mozHasPendingMessage("alarm");
-
-

Especificaciones

- - - - - - - - - - - - - - - -
EspecificaciónEstadoComentario
{{SpecName('Alarm API')}}{{Spec2('Alarm API')}}Especificación inicial.
-

Compatibilidad de navegadores

-

{{ CompatibilityTable() }}

-
- - - - - - - - - - - - - - - - - - - -
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support{{ CompatUnknown()}}{{CompatGeckoDesktop("16")}} {{ property_prefix("moz") }}{{ CompatNo() }}{{ CompatNo() }}{{ CompatNo() }}
-
-
- - - - - - - - - - - - - - - - - - - - - -
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{ CompatUnknown() }}{{ CompatNo() }}{{CompatGeckoMobile("10")}} {{ property_prefix("moz") }}{{ CompatNo() }}{{ CompatNo() }}{{ CompatNo() }}
-
-

Ver también

- diff --git "a/files/es/webapi/c\303\241mara/index.html" "b/files/es/webapi/c\303\241mara/index.html" deleted file mode 100644 index 2cd89a2d8b..0000000000 --- "a/files/es/webapi/c\303\241mara/index.html" +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: API de la Cámara -slug: WebAPI/Cámara -translation_of: Archive/B2G_OS/API/Camera_API ---- -

{{ ApiRef() }}

-

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('certified') }}

-

The Camera API allows applications to manage the camera of the device. It allows them to take photographs, record videos, and get information like the focus, the zoom, the white balance, the flash, … It is a priviledged API and can only be used by certified applications.

-
-

Note: Except if you are implementing a replacement for the default Camera application, you shouldn't use this API. Instead, if you want to use the camera in your device, you should use the Web Activities API.

-
-

See also

- -

 

diff --git a/files/es/webapi/device_storage/index.html b/files/es/webapi/device_storage/index.html deleted file mode 100644 index eb9b4d5fb7..0000000000 --- a/files/es/webapi/device_storage/index.html +++ /dev/null @@ -1,226 +0,0 @@ ---- -title: Device Storage API -slug: WebAPI/Device_Storage -translation_of: Archive/B2G_OS/API/Device_Storage_API ---- -

{{ non-standard_header() }}

-

{{ B2GOnlyHeader2('privileged') }}

-

Resumen

-

La API de Device Storage es usada para acceder al sistema de archivos dentro de una aplicación Web. Acceder al sistema de archivos puede ser muy susceptible, por ese motivo, esta API está disponible sólo para aplicaciones con privilegios.

-
-

Nota: El acceso a un dispositivo de almacenamiento es lento debido a la limitación en el nivel físico. En muchos casos puede resultar más rápido usar una base de datos IndexedDB para almacenar archivos en lugar del dispositivo de almacenamiento físico.

-
-

Acceso a un almacenamiento

-

Punto de entrada

-

Es posible acceder a un área de almacenamiento usando el método {{domxref("window.navigator.getDeviceStorage()","navigator.getDeviceStorage()")}}. Acepta un parámetro de cadena que representa el nombre del alamacenamiento al cual se quiere tener acceso. El método devuelve un objeto {{domxref("DeviceStorage")}} que es usado para acceder al área de almacenamiento relacionada.

-

Firefox OS proporciona el siguiente nombre de almacenamiento:

- -
var pics = navigator.getDeviceStorage('pictures');
-

Para ser capaz de usar cada una de las áreas de almacenamiento, la aplicación debe declararlas en su archivo de manifiesto. Por ejemplo, si la aplicación quiere acceder al área de almacenamiento de la sdcard, debe tener el permiso "device-storage:sdcard" en su manifiesto.

-
"permissions": {
-  "device-storage:videos":{ "access": "readonly" },
-  "device-storage:pictures":{ "access": "readwrite" }
-}
-

El uso de un almacenamiento

-

Una vez que una aplicación tenga acceso de un área de almacenamiento, es posible agregar, obtener y eliminar archivos dentro del área.

-

Agregar un archivo

-

Se puede agregar una archivo utilizando el método {{domxref("DeviceStorage.addNamed()","addNamed")}} o {{domxref("DeviceStorage.add()","add")}}. La primera permite establecer un nombre explícito para guardar un archivo mientras que la segunda crea un nombre automáticamente cuando se guarda el archivo. Ambos nombres son asíncronos y devuelven un objeto {{domxref("DOMRequest")}} para manejar el success o error de la operación. Esto debe considerar importante que tanto agregar, escribir y leer archivos en un soporte físico es un proceso lento.

-

Esos dos métodos esperan un {{domxref("Blob")}} como su primer parámetro. Este objeto será convertido en un archivo y almacenado. Al crear un objeto {{domxref("Blob")}}, es obligatorio darle un tipo. Este tipo, que es un mime type, es importante porque algunas áreas de almacenamiento tienen restricciones basadas en el tipo:

- -
var sdcard = navigator.getDeviceStorage("sdcard");
-var file   = new Blob(["Este es un archivo de texto."], {type: "text/plain"});
-
-var request = sdcard.addNamed(file, "mi-archivo.txt");
-
-request.onsuccess = function () {
-  var name = this.result.name;
-  console.log('El archivo "' + name + '" se escribió correctamente en el área de almacenamiento sdcard');
-}
-
-// Un error suele producirse si un archivo con el mismo nombre ya existe
-request.onerror = function () {
-  console.warn('No se puede escribir el archivo: ' + this.error);
-}
-
-
-

Nota: El repositorio en un área de almacenamiento está implícito. No es posible crear explícitamente un repositorio vacío. Si quiere usar una estructura de repositorio tiene que hacerlo parte del nombre del archivo a almacenar. Así que si quiere almacenar el archivo bar dentro del repositorio foo, tiene que usar el método {{domxref("DeviceStorage.addNamed()","addNamed")}} con el nombre completo de la ruta del archivo addNamed(blob, "foo/bar"). Esto también se aplica cuando quiere recuperar un archivo con su nombre (véase más adelante).

-

Como el archivo es agregado en un área de almacenamiento restringido por razones de seguridad, un nombre de ruta de archivo no puede empezar con "/" ni "../" (y "./" no tiene sentido).

-
-

Obtener un archivo

-

Se puede recuperar un archivo de dos maneras: usando su nombre o iterando toda la lista de archivos.

-

La manera más fácil es recuperar un archivo por su nombre usando los métodos {{domxref("DeviceStorage.get()","get")}} y {{domxref("DeviceStorage.getEditable","getEditable")}}. La primera proporciona un objeto {{domxref("File")}} (que actúa como un archivo de sólo lectura) mientras que la segunda proporciona un objeto {{domxref("FileHandle")}} (que permite actualizar el archivo subyacente). Ambos métodos son asíncronos y devuelven un objeto {{domxref("DOMRequest")}} para manejar el success o error de la operación.

-
var sdcard = navigator.getDeviceStorage('sdcard');
-
-var request = sdcard.get("mi-archivo.txt");
-
-request.onsuccess = function () {
-  var file = this.result;
-  console.log("Obtenido el archivo: " + file.name);
-}
-
-request.onerror = function () {
-  console.warn("No se puede obtener el archivo: " + this.error);
-}
-
-

La otra forma de recuperar archivos es explorar el contenido del área de almacenamiento. Esto es posible usando los métodos {{domxref("DeviceStorage.enumerate()","enumerate")}} y {{domxref("DeviceStorage.enumerateEditable()","enumerateEditable")}}. El primero proporciona objetos {{domxref("File")}} mientras que el segundo proporciona objetos {{domxref("FileHandle")}}. Ambos métodos son asíncronos y devuelven un objeto {{domxref("DOMCursor")}} para recorrer a lo largo de la lista de archivos. Un {{domxref("DOMCursor")}} es nada menos que un objeto {{domxref("DOMRequest")}} con potencia extra para recorrer a lo largo de la lista de cosas (archivos en ese caso) en forma asíncrona.

-
var pics = navigator.getDeviceStorage('pictures');
-
-// Exploremos todas las imágenes disponibles
-var cursor = pics.enumerate();
-
-cursor.onsuccess = function () {
-  var file = this.result;
-  console.log("Archivo encontrado: " + file.name);
-
-  // Una vez que encontremos el archivo verifiquemos si hay otros resultados
-  if (!this.done) {
-    // Entonces nos movemos al siguiente resultado, que llama al cursor
-    // success con el siguiente archivo como resultado.
-    this.continue();
-  }
-}
-
-cursor.onerror = function () {
-  console.warn("Archivo no encontrado: " + this.error);
-}
-
-

Es posible limitar el número de resultados pasando dos parámetros opcionales a los m´todos {{domxref("DeviceStorage.enumerate()","enumerate")}} y {{domxref("DeviceStorage.enumerateEditable()","enumerateEditable")}}.

-

El primer parámetro puede ser una cadena que representa una subcarpeta para buscar dentro.

-

El segundo parámetro puede ser un objeto con una propiedad since, que permite limitar la búsqueda a un determinado periodo de tiempo.

-
var pics = navigator.getDeviceStorage('pictures');
-
-// Recuperamos fotos de la semana pasada
-var param = {
-  since: new Date((+new Date()) - 7*24*60*60*1000)
-}
-
-var cursor = pics.enumerate(param);
-
-cursor.onsuccess = function () {
-  var file = this.result;
-  console.log("Foto tomada en: " + file.lastModifiedDate);
-
-  if (!this.done) {
-    this.continue();
-  }
-}
-
-

Eliminar un archivo

-

Un archivo se puede eliminar del área de almacenamiento usando simplemente el método {{domxref("DeviceStorage.delete()","delete")}}. Este método sólo necesita el nombre del archivo a eliminar. Como todos los demás métodos de la interfaz {{domxref("DeviceStorage")}}, este también es asíncrono y devuelve un objeto {{domxref("DOMRequest")}} para manejar el success o error de la operación.

-
var sdcard = navigator.getDeviceStorage('sdcard');
-
-var request = sdcard.delete("mi-archivo.txt");
-
-request.onsuccess = function () {
-  console.log("Archivo eliminado");
-}
-
-request.onerror = function () {
-  console.log("No se puede eliminar el archivo: " + this.error);
-}
-
-

Información de almacenamiento

-

Además de acceder a los archivos, un área de almacenamiento proporciona algunos métodos para obtener fácilmente información importante.

-

Espacio disponible

-

Una de las cosas más importantes a saber cuando se almacenan archivos en un dispositivo es la cantidad de espacio disponible. La interfaz {{domxref("DeviceStorage")}} proporciona tres funciones útiles dedicadas al espacio:

- -

Como esos métodos son asíncronos, devuelven un objeto {{domxref("DOMRequest")}} para manejar los success o error de la operación.

-
var videos = navigator.getDeviceStorage('videos');
-
-var request = videos.usedSpace();
-
-request.onsuccess = function () {
-  // El resultado es expresado en bytes, permite convertirlo en megabytes
-  var size = this.result / 1000000;
-
-  console.log("Los videos en tu dispositivo ocupan un total de " + size.toFixed(2) + "Mb de espacio.");
-}
-
-request.onerror = function () {
-  console.warn("No se puede obtener el espacio utilizado por videos: " + this.error);
-}
-
-

Escuchar los cambios

-

Como muchas aplicaciones pueden usar un mismo área de almacenamiento al mismo tiempo, a veces es útil para una aplicación ser consciente de un cambio en ese área de almacenamiento. También es útil para una aplicación que quiere realizar la acción asíncrona sin la retransmisión de todos los objetos {{domxref("DOMRequest")}} que devuelven por cada método de la interfaz {{domxref("DeviceStorage")}}.

-

Para ese fin, un evento {{event("change")}} se activa cada vez que se crea, modifica o elimina un archivo. Este evento se puede capturar usando la propiedad {{domxref("DeviceStorage.onchange","onchange")}} o el método {{domxref("EventTarget.addEventListener()","addEventListener()")}}. El controlador de eventos recibe un objeto {{domxref("DeviceStorageChangeEvent")}} que es un objeto {{domxref("Event")}} regular con dos propiedades adicionales:

- -
var sdcard = navigator.getDeviceStorage('sdcard');
-
-sdcard.onchange = function (change) {
-  var reason = change.reason;
-  var path   = change.path;
-
-  console.log('El archivo "' + path + '" ha sido ' + reason);
-}
-
-

Especificación

-

No es parte de ninguna especificación.

-

Compatibilidad del navegador

-

{{ CompatibilityTable() }}

-
- - - - - - - - - - - - - - - - - - - -
CaracterísticaChromeFirefox (Gecko)Internet ExplorerOperaSafari
Soporte básico{{ CompatUnknown() }}{{ CompatUnknown() }}{{ CompatNo() }}{{ CompatNo() }}{{ CompatNo() }}
-
-
- - - - - - - - - - - - - - - - - - - -
CaracterísticaAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Soporte básico{{ CompatUnknown() }}{{ CompatUnknown() }}{{ CompatNo() }}{{ CompatNo() }}{{ CompatNo() }}
-
-

Véase también

- diff --git a/files/es/xforms/index.html b/files/es/xforms/index.html deleted file mode 100644 index 3be77a04b8..0000000000 --- a/files/es/xforms/index.html +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: XForms -slug: XForms -tags: - - Todas_las_Categorías - - XForms -translation_of: Archive/Web/XForms ---- -

 

-
Guía Breve de XForms
-Una breve y clara introducción al tema.
-
-

XForms es la evolución de los formularios en linea que a ideado el W3C. Apoyandose en otros estándares del W3C como Esquema XML, XPath y Eventos XML, trata de solventar algunas de las limitaciones del modelo actual de los formularios HTML.

-

Otras ventajas de XForms son: la separación entre datos y presentación, el tipado fuerte de los datos, la capacidad para enviar los datos como XML en lugar de usar pares name/value, y un modo descriptivo para crear formularios que puedan ser mostrarán en una amplia gama de dispositivos.

-

Para que Firefox y SeaMonkey soporten XForms es necesario instalar la extensión de XForms de Mozilla.

-
- -

Documentación

XForms 1.0 (Second Edition)(en)
W3C Recommendation 14 March 2006
XForms para diseñadores HTML
"XForms es un nuevo lenguaje de marcas para formularios en la Web. Este documento es una introducción rápida a XForms para los diseñadores de formularios HTML."
Preguntas frecuentes sobre XForms 1.0
"Este documento surge por parte de los miembros del Grupo de Trabajo de XForms como un repositorio de preguntas frecuentes sobre XForms 1.0."
XForms Essentials (en)
Libro online que te guiará (en inglés) por XForms.
Soporte a XForms en Mozilla
Explicación de donde esta la implementación de XForms para Mozilla en el camino hacia la especificación 1.0 de XForms.

los comento por que veo demasiado rojo en la portada ; Trucos para XForms: <small>Pequeña colección de trucos para resolver problemas comunes con formularios XForms.</small>  ; Controles XForms: <small>Custom controls lets the form author "skin" each XForms control through XBL, and create f.x. an SVG <code>input</code> control.</small>  ; Preferencias de usuario en XForms: <small>Una breve descripción de la variables de <code>about:config</code> que usa XForms.</small>  ; Referencia del API de XForms: <small>Documentación de las interfaces de XForms.</small> Ver más...

Comunidad

  • Ver foros de Mozilla en inglés.

Ver más...

Herramientas

Ver más...

Temas relacionados

Extensiones, HTML, XHTML, XML, XPath.
-

Categorías

-

Interwiki Language Links

-

 

-

diff --git a/files/es/xforms/soporte_en_mozilla/index.html b/files/es/xforms/soporte_en_mozilla/index.html deleted file mode 100644 index 94d1577000..0000000000 --- a/files/es/xforms/soporte_en_mozilla/index.html +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: Mozilla XForms Specials -slug: XForms/Soporte_en_Mozilla -tags: - - Todas_las_Categorías - - XForms - - páginas_a_traducir -translation_of: Archive/Web/XForms/Mozilla_XForms_Specials ---- -

Introducción

- -

Este artículo dá una vista rápida sobre "dónde" se desvía la extensión Mozilla XForms respecto de la especificación oficial XForms 1.0 . Esto cubre ambas limitaciones, en la extensión y en extensiones personalizadas.

- -

Limitaciones

- -

Repetir usando atributos

- -

Las especificaciones hacen mención ha "Creating Repeating Structures Via Attributes", esto es parcialmente soportadas.

- -

(limitación registrada en error 280368)

- -

Combinando Repeat y table ó ul

- -

No es posible combinar repeat ní con table ó ul. Esto significa que NO ES POSIBLE hacer lo siguiente:

- -
-
<table>
-  <xf:repeat ...>
-    <tr> ... </tr>
-  </xf:repeat>
-</table>
-
-
- -

ó

- -
-
<ul>
-  <xf:repeat ...>
-    <li> ... </li>
-  </xf:repeat>
-</ul>
-
-
- -

La sección 9.3.2 establece que las combinaciones con table probablemente nunca funcionarán. Las combinaciones con ul deben sufrir la misma limitación, aunque no deberían producir errores fatales como tampoco lo hace (error 330022).

- -

Soporte para Pseudo Clases

- -

Actualmente soportamos todas las Pseudo Clases en XForms (:enabled, :disabled, etc. ), a excepción de :read-only y :read-write, por no tener un comportamiento no específico para (X)HTML. En su lugar se debe usar:-moz-read-only and :-moz-read-write, por el momento.

- -

(limitación registrada en error 313111)

- -

Soporte de pseudo elementos

- -

No se soportan los pseudo elementos (::value, ::repeat-item, y ::repeat-index ). En su lugar se deben usar las siguientes clases:

- - - -

Por ejemplo, para tomar el valor de un control input, hay que usar:

- -
@namespace xf url("http://www.w3.org/2002/xforms");
-xf|input .xf-value {
-  ...
-}
-
- -

Los pseudo elementos están definidos en la Especificación de Interfaz Básico para el Usuario CSS3 .

- -

(Limitation registrada en error 271724)

- -

Extensiones

- -

Enumerando instancias

- -

El elemento estandarizado nsIXFormsModelElement no permite enumerar todas las posibles instancias, sino sólo recuperar instancias por sus nombres. En la Extensión XForms de Mozilla hemos añadido una función getInstanceDocuments() a el modelo que retorna todas las instancias modelo del documento. Esto está documentado en nsIXFormsNSModelElement.

- -

Obteniendo un elemento de instancia desde un nodo de dato

- -

En la especificación XForms 1.0 no hay manera de conseguir el elemento instance desde la instancia de un nodo de dato. Hemos añadido una función a través de un llamado tipo getFeature() para cada nodo, lo que permite al autor del formulario hacer eso. Es decir: si instanceNode es un nodo dentro una instancia de un documento, entonces:

- -
instanceNode.getFeature("org.mozilla.xforms.instanceOwner", "1.0")
- -

devolverá el elemento <instance> (dentro del documento principal) al cual pertenece el nodo.

- -

Llegar a la instancia de documento desde la instancia de elemento

- -

Según la especificación XForms 1.0 hay que usar el elemento model para obtener la instance del documento. Parece un poco torpe, cuando ya se dispone del elemento instance, así que hemos añadido una función getInstanceDocument() directamente en el elemento instance como un atajo. Esto está documentado en nsIXFormsNSInstanceElement.

- -

Interfaz de control del usuario

- -

Hemos añadido mucha funcionalidad a nuestro interfaz de usuario, lo cual permite al autor del formulario crear sus propios controles de usuario. Ello implica publicar algo de funcionalidad (en un script) en todos nuestros controles, como output, input, etc., y permitir que el interfaz de usuario se represente en XBL. Más información en XForms:Custom Controls.

- -

Misc

- -

Envíos cruzados a dominios

- -

No es exactamente una limitación ni una extensión, pero es importante mencionarlo aquí. Por razones de seguridad, por fallo no es posible para un XForms enviar datos a otro dominio. Esto se por razones de seguridad. Información de como hacer una lista de confianza puede ser encontrada en la sección Release Notes

- -

El chequeo de envío entre dominios además incluye formas cargadas desde file://. Las formas cargadas desde esa URL deberían ser archivos locales y de confianza, pero no siempre son el caso. Por esto no hay listas de confianza automáticas de archivos locales.

- -

Si estás preguntándote porqué tenemos esta restricción, aquí hay un simple ejemplo del porqué:

- -
<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>
-
- -

Esto traería algo que es accesible únicamente para tí (p.e. detrás de un cortafuegos) http://intranetserver/addrbook.xml, luego enviarlo a http://megaspammer.com/gather tan pronto como veas la XForm.

diff --git a/files/es/xml_en_mozilla/index.html b/files/es/xml_en_mozilla/index.html deleted file mode 100644 index 7e2fa16791..0000000000 --- a/files/es/xml_en_mozilla/index.html +++ /dev/null @@ -1,280 +0,0 @@ ---- -title: XML en Mozilla -slug: XML_en_Mozilla -tags: - - NecesitaRevisiónGramatical - - Todas_las_Categorías - - XML -translation_of: Archive/Mozilla/XML_in_Mozilla ---- -

Mozilla posee un buen soporte para XML. Varias recomendaciones y borradores del consorcio World Wide Web (W3C) para la familia de especificaciones XML están soportadas, al igual que otras tecnologías relacionadas.

- -

Recomendaciones W3C para el núcleo de XML soportadas

- -

El soporte para el núcleo de XML incluye análisis de XML sin validación (utilizando el analizador Expat), visualización de XML con CSS, manipulación de documentos XML con scripts vía DOM, asociación de hojas de estilo con documentos XML y espacios de nombres en XML. El soporte del núcleo es muy bueno y apenas tiene fallos.

- -

DTDs y otras entidades externas

- -

Mozilla no carga entidades externas desde la web sino que las carga internamente si su identificador del sistema utiliza el protocolo chrome. Esta característica es usada principalmente para traducir Mozilla a otros idiomas (las cadenas de texto del UI ("User Interface", Interfaz de usuario) están almacenadas en ficheros DTD externos).

- -

Otra opción son las entidades cuyo identificador del sistema sea un camino relativo y la declaración XML establezca que el documento no sea del tipostandalone (es decir, que tenga un DTD asociado), que es el tipo predeterminado. En ese caso, Mozilla intentará buscar dichas entidades en el directorio <bin>/res/dtd/

- -

Adicionalmente, Mozilla puede hacer una excepción con los documentos XHTML (ver más abajo).

- -

Mozilla leerá los subconjuntos DTD internos y en circunstancias específicas los externos como se ha explicado anteriormente; y usará esta información para reconocer los atributos de tipo ID, los valores predeterminados de los atributos y las entidades generales.

- -

Otras notas

- -

Gran parte del Modelo de Objetos de Documento (DOM, Recomendaciones y borradores del W3C) se aplica a XML. Al igual que las hojas de estilos en cascada (CSS, Recomendaciones y borradores del W3C), el lenguaje de estilo puede ser usado para aplicar estilos a los documentos XML.

- -

Puedes encontrar el código para la mayor parte del núcleo XML en los siguientes directorios del repositorio CVS de Mozilla: content/xml/, parser/expat/ y parser/htmlparser/.

- -

El grupo de noticias para hablar sobre XML en Mozilla varía según la naturaleza de la pregunta. Por ejemplo, las preguntas relativas al DOM deberían de ser habladas en el grupo de noticias mozilla.dev.tech.dom mientras que los problemas de estilo deberían de ser discutidos en mozilla.dev.tech.css, etcétera... El grupo de noticias principal para XML es mozilla.dev.tech.xml.

- -

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Especificación o tecnologíaEstado y/o documentación adicional
XMLRecomendación del W3C
Espacios de nombres en XMLRecomendación del W3C
Asociando hojas de estilos con documentos XMLRecomendación del W3C
Aplicando estilos a documentos XML con CSS 
Manipulando documentos XML con scripts vía DOM 
- -

Otras recomendaciones W3C para XML soportadas

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Especificación o tecnologíaDocumentación
XHTMLRecomendación W3C
XML Base (sólo para enlaces, no usado por las pseudoclases de CSS :visited, etc...)Recomendación W3C
XLink (sólo XLinks simples)Recomendación W3C
FIXptrPropuesta W3C
XPointer FrameworkRecomendación W3C
Esquema element() de XPointerRecomendación W3C
Esquema xmlns() de XPointerRecomendación W3C
Esquema fixptr() de XPointerEste esquema es sólo una capa para FIXptr
Esquema xpath1() de XPointerBorrador de Internet
document.load(), document.asyncParte del módulo Load & Save del DOM nivel 3, un borrador del W3C
- -

XHTML

- -

El soporte existente para XHTML es razonablemente amplio y la mayoría de las cosas deberían de funcionar. El trato que se le da a los documentos XHTML difiere según el tipo MIME (o la extensión del fichero si éste es cargado desde disco). Si un fichero es interpretado como HTML no se comprobará que esté bien formado. También podrás advertir que no todas las características de XHTML son soportadas cuando se trabaja con HTML.

- - - - - - - - - - - - - - - - - - - -
Tipo MIMEExtensiónInterpretación
text/xml
- application/xml
- application/xhtml+xml
xml
- xht
- xhtml
XML
text/htmlhtml
- htm
HTML
- -


- El documento en su totalidad no necesita ser XHTML. Puedes usar elementos propios de XHTML dentro de un document XML cualquiera usando el espacio de nombres de XHTML. Véase la sección Testing and QA para ver algunos ejemplos. El espacio de nombres correcto de XHTML es http://www.w3.org/1999/xhtml.

- -

Por favor, date cuenta de que las entidades XHTML, como &auml; funcionarán sólo en documentos que cumplan el estándar XHTML y que tengan un identificador público formal de XHTML (en otras palabras, una sección DOCTYPE con un identificador PUBLIC). Las entidades de XHTML no funcionarán en cualquier documento XML, ni siquiera empleando el espacio de nombres de XHTML. Los identificadores públicos reconocidos son:

- -
    -
  1. -//W3C//DTD XHTML 1.0 Transitional//EN
  2. -
  3. -//W3C//DTD XHTML 1.1//EN
  4. -
  5. -//W3C//DTD XHTML 1.0 Strict//EN
  6. -
  7. -//W3C//DTD XHTML 1.0 Frameset//EN
  8. -
  9. -//W3C//DTD XHTML Basic 1.0//EN
  10. -
  11. -//W3C//DTD XHTML 1.1 plus MathML 2.0//EN
  12. -
  13. -//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN
  14. -
  15. -//W3C//DTD SVG 20001102//EN
  16. -
  17. -//WAPFORUM//DTD XHTML Mobile 1.0//EN
  18. -
- -

Enlace y apuntado XML

- -

El soporte para enlaces XML incluye XML Base (sólo utilizado cuando el ratón se superpone a o se hace clic en un enlace) y XLinks simple. Puedes convertir cualquier elemento XML en un XLink usando el espacio de nombres de XLink http://www.w3.org/1999/xlink. Puedes utilizar además los elementos enlazados del espacio de nombres de XHTML. Véase la sección Pruebas y seguro de calidad para ver algunos ejemplos.

- -

Para apuntar a recursos en documentos XML Mozilla también soporta FIXptr, una simplificada aunque incompatible versión de XPointer. Aparte de usar FIXptr en enlaces, es posible usarlo en scripts. Véase la interfaz propietaria dom/public/idl/core/nsIDOMXMLDocument.idl. Hay un caso de estudio para enlaces FIXptr y un ejemplo de script.

- -

Desde la versión 1.4 alpha, Mozilla también soporta el XPointer Framework, el esquema element() de XPointer, el esquema xmlns() de XPointer, el esquema fixptr() XPointer y esquema xpath1() de XPointer. El procesador para XPointer es ampliable y es fácil implementar soporte para otros esquemas (echa un vistazo al API). El esquema xpath1() fue implementado usando este mecanismo ampliable. Hay además una API propietaria de scripts para el procesador de XPointer. Existe un caso de estudio para XPointers que quizá te gustaría revisar.

- -

Por último, hay una característica que quizá te gustaría probar (siendo especialmente útil con FIXptr) que seleccionará el enlace destino cuando lo el ratón lo sobrevuele. Desgraciadamente no hay una UI (interfaz de usuario) para activar esta característica por lo que necesitarás editar el fichero de preferencias manualmente añadiendo esta línea:

- -
pref("layout.selectanchor", true);
-
- -

Métodos Load y Save de DOM

- -

document.load() es parte de una antigua versión del Módulo Load & Save Nivel 3. Actualmente, Mozilla sólo implementa el método load() y la propiedad async. Desde la versión 1.4 alpha, ha sido posible cargar documentos de modo síncrono (antes sólo se podían cargar de modo asíncrono). Véase el ejemplo de carga en el directorio de pruebas de XML (la carga del fichero load.html desde la página generada LXR no funcionará porque LXR convertirá el fichero test.xml a HTML y lo servirá como tal. Para probar esta funcionalidad, crea los ficheros en tu disco local o en un servidor web.)

- -

Otras recomendaciones W3C soportadas para XML

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Especificación o tecnologíaDocumentaciónProyecto Mozilla
XSLTRecomendación W3CXSLT
XPathRecomendación W3CXSLT
XMLHttpRequestMicrosoftExtras XML
DOMParser and XMLSerializerMozillaExtras XML
SOAPW3C NoteServicios Web
XML-RPCSoftware de UserLandXML-RPC
RDFRecomendaciones W3CRDF
SVGPropuesta de recomendación W3CSVG
MathMLRecomendación W3CMathML
P3PRecomendación W3CP3P
WSDLNota W3CServicios Web
XBLNota W3C (por Mozilla)XBL
XULMozillaXPToolkit
- -

Hoja de ruta

- -

Las próximas tareas deberían incluir soporte para el esquema xpointer() de XPointer (error 32832), soporte completo de XLink (error 61664), XInclude, Catálogos XML (error 98413), XForms (error 97806), analizador de validez (error 196355), Esquemas XML, mejoras sustanciales en la visualización de los documentos XML (error 18333), y una API de SAX (error 315825).

- -

Para implementar totalmente XLink se necesita algo llamado un administrador de enlaces. Véase algunos documentos de diseño preliminares.

- -

Pruebas y seguro de calidad

- -

Hay un montón de casos de estudio enlazados desde la página de seguro de calidad del cumplimiento de los navegadores estándares.

- -

La mayor parte de los documentos de prueba para el núcleo de XML del servidor CVS están ubicadas en content/xml/tests. Además existen un par de ellos en línea: la demostración de libros y la de la tabla de contenidos IRS. Ambas muestran el funcionamiento de XML, asociaciones de hojas de estilo con XML, visualización de XML con CSS, espacios de nombres en XML, XHTML, XLinks simple y la manipulación de XML con scripts vía DOM.

- -

Existe un componente XML en Bugzilla. Además está la palabra clave "xhtml" para los bugs de XHTML (los cuales se pretende sean cubiertos entre componentes).

- -

Hay bugs abiertos para hacer pruebas NIST DOM (error 51247) y NIST XML en Mozilla, y que actualmente no funcionan.

- -

¿Cómo puedo ayudar?

- -

Esto necesita una revisión de la traducción

- -

Si sabes programar, busca palabras clave solicitadas en bugs de XML.

- -

No siempre lo utilizamos, así que si prefieres para evitarte el tener que hacer trabajo repetido puedes empezar trabajando con los fallos que tiene el futuro milestone, o en otro caso los que tiene uno de los milestone que va camino de ser el futuro.

- -

Siempre puedes poner a prueba el soporte para XML. Preferiríamos conseguir tests que pudieran ser ejecutados automáticamente (esto requiere conocimientos de desarrollo web, document.load() y/o algún que otro añadido XML podría ser necesitado), pero probablemente la mayoría de los fallos que nos son notificados son encontrados por gente normal intentando hacer algo que funciona en otros navegadores y no en Mozilla.

diff --git a/files/es/xmlhttprequest_cambios_en_gecko1.8/index.html b/files/es/xmlhttprequest_cambios_en_gecko1.8/index.html deleted file mode 100644 index abe17e7987..0000000000 --- a/files/es/xmlhttprequest_cambios_en_gecko1.8/index.html +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: XMLHttpRequest cambios en Gecko1.8 -slug: XMLHttpRequest_cambios_en_Gecko1.8 -tags: - - Complementos - - Todas_las_Categorías - - XMLHttpRequest - - extensiones -translation_of: Mozilla/XMLHttpRequest_changes_for_Gecko_1.8 ---- -

-

Este documento muestra algunos cambios que se han hehco a la implementación de XMLHttpRequest de Gecko desde la versión 1.7 (o sea, la versión de Gecko publicada en Firefox 1.0). Estos cambios sólo se aplican a las extensiones y aplicaciones XUL, no a las aplicaciones web. -

-

Cambios en XMLHttpRequest.send

-

Al pasar una instancia de nsIInputStream al método send, ya no se deben incluir las cabeceras <tt>Content-Length</tt> ni <tt>Content-Type</tt> al comienzo del flujo de datos. En lugar de eso, la cabecera <tt>Content-Length</tt> se obtendrá a partir de la longitud del flujo y la cabecera <tt>Content-Type</tt> debe ser especificada manualmente llamando al método setRequestHeader. Estos requerimientos se explican en profundidad en nsIXMLHttpRequest.idl. -

-

Cambios en XMLHttpRequest.onreadystatechange

-

Este atributo es ahora de tipo nsIOnReadyStateChangeHandler en lugar de nsIOnReadystatechangehandler (la "S" y la "C" en el nombre del tipo se han cambiado a mayúscula). -

-
-
-{{ languages( { "en": "en/XMLHttpRequest_changes_for_Gecko1.8", "fr": "fr/Changements_dans_XMLHttpRequest_pour_Gecko_1.8", "it": "it/Cambiamenti_di_XMLHttpRequest_in_Gecko1.8", "ja": "ja/XMLHttpRequest_changes_for_Gecko1.8", "ko": "ko/XMLHttpRequest_changes_for_Gecko1.8", "pl": "pl/Zmiany_w_obiekcie_XMLHttpRequest_w_Gecko_1.8" } ) }} diff --git a/files/es/xpcom_interface_reference/index.html b/files/es/xpcom_interface_reference/index.html deleted file mode 100644 index 4ee346c75e..0000000000 --- a/files/es/xpcom_interface_reference/index.html +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: XPCOM Interface Reference -slug: XPCOM_Interface_Reference -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/es/xpcom_interface_reference/nsiloginmanager/index.html b/files/es/xpcom_interface_reference/nsiloginmanager/index.html deleted file mode 100644 index 6347641a5a..0000000000 --- a/files/es/xpcom_interface_reference/nsiloginmanager/index.html +++ /dev/null @@ -1,372 +0,0 @@ ---- -title: nsILoginManager -slug: XPCOM_Interface_Reference/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.idlScriptable
- - -Used to interface with the built-in Password Manager - - -
- -
1.0
- -
66
- -
- -
- -
Introduced
-
Gecko 1.9
- -
- -
- -
-Inherits from: nsISupports -Last changed in 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.

-

Nota: 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.

-

Nota: 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.

-

Nota: 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.

-

Nota: 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/es/xpcomutils.jsm/index.html b/files/es/xpcomutils.jsm/index.html deleted file mode 100644 index 15d8739fdc..0000000000 --- a/files/es/xpcomutils.jsm/index.html +++ /dev/null @@ -1,509 +0,0 @@ ---- -title: XPCOMUtils.jsm -slug: XPCOMUtils.jsm -tags: - - NeedsContent - - XPConnect - - páginas_a_traducir -translation_of: Mozilla/JavaScript_code_modules/XPCOMUtils.jsm ---- -

The XPCOMUtils.jsm JavaScript code module offers utility routines for JavaScript components loaded by the JavaScript component loader.

- -

To use this, you first need to import the code module into your JavaScript scope:

- -
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
- -

Using XPCOMUtils

- -

Exposing a JavaScript class as a component using these utility methods requires four key steps:

- -
    -
  1. Import XPCOMUtils.jsm, as explained previously.
  2. -
  3. Declare the class (or multiple classes) implementing the component(s).
  4. -
  5. Create an array of component constructors.
  6. -
  7. Define the NSGetFactory() or NSGetModule() entry point.
  8. -
- -

Pseudocode

- -

This section provides some pseudocode that demonstrates how to put together a JavaScript class based on the steps listed above.

- -

Constructor

- -

The constructor is a simple method that handles any required initialization tasks.

- -
function MyComponent() {
-  // initialize the component here
-}
-
- -

Class declaration

- -

Declare the class prototype, using a form similar to this.

- -
MyComponent.prototype = {
-  // properties required for XPCOM registration:
-  classDescription: "unique text description",
-  classID:          Components.ID("{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"),
-  contractID:       "@example.com/xxx;1",
-
-  // [optional] custom factory (an object implementing nsIFactory). If not
-  // provided, the default factory is used, which returns
-  // |(new MyComponent()).QueryInterface(iid)| in its createInstance().
-  _xpcom_factory: { ... },
-
-  // [optional] an array of categories to register this component in.
-  _xpcom_categories: [{
-    // Each object in the array specifies the parameters to pass to
-    // nsICategoryManager.addCategoryEntry(). 'true' is passed for
-    // both aPersist and aReplace params.
-    category: "some-category",
-    // optional, defaults to the object's classDescription
-    entry: "entry name",
-    // optional, defaults to the object's contractID (unless
-    // 'service' is specified)
-    value: "...",
-    // optional, defaults to false. When set to true, and only if 'value'
-    // is not specified, the concatenation of the string "service," and the
-    // object's contractID is passed as aValue parameter of addCategoryEntry.
-    service: true,
-    // optional array of applications' IDs in the form:
-    // [ "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}", ... ]
-    // If this is defined, the component is registered in this
-    // category only on the specified applications.
-    apps: [ ... ]
-  }],
-
-  // QueryInterface implementation, e.g. using the generateQI helper
-  QueryInterface: XPCOMUtils.generateQI(
-    [Components.interfaces.nsIObserver,
-     Components.interfaces.nsIMyInterface,
-     "nsIFoo",
-     "nsIBar" ]),
-
-  // [optional] classInfo implementation, e.g. using the generateCI helper.
-  // Will be automatically returned from QueryInterface if that was
-  // generated with the generateQI helper.
-  classInfo: XPCOMUtils.generateCI(
-    {classID: Components.ID("{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"),
-     contractID: "@example.com/xxx;1",
-     classDescription: "unique text description",
-     interfaces: [Components.interfaces.nsIObserver,
-                  Components.interfaces.nsIMyInterface,
-                  "nsIFoo",
-                  "nsIBar"],
-     flags: Ci.nsIClassInfo.SINGLETON}),
-
-  // ...component implementation...
-};
-
- -
-

Note: The ability to register the component in a category only on specific applications by adding the apps field to a category entry was added in Gecko 2.

-
- -

Notice that the QueryInterface() method implemented by the component simply calls the generateQI() method provided by the XPCOMUtils code module.

- -

Create an array of component constructors

- -

You need to create an array that lists the constructors for each component. This array can of course have just one entry:

- -
var components = [MyComponent];
-
- -

Here, we're calling the array components.

- -

Create the NSGetFactory() or NSGetModule() entry point

- -

Finally, you need to implement the NSGetModule() entry point so Gecko can start up your component:

- -
// "components" is the array created in the previous section
-if ("generateNSGetFactory" in XPCOMUtils)
-  var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);  // Gecko 2.0+
-else
-  var NSGetModule = XPCOMUtils.generateNSGetModule(components);    // Gecko 1.9.x
- -

Method overview

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
function defineLazyGetter(aObject, aName, aLambda);
function defineLazyModuleGetter(aObject, aName, aResource, [optional] aSymbol);
function defineLazyServiceGetter(aObject, aName, aContract, aInterfaceName);
function generateNSGetFactory(componentsArray);
function generateCI(classInfo);
function generateQI(interfaces);
void importRelative(that, path, scope);
generator IterSimpleEnumerator(enumerator, interface);
generator IterStringEnumerator(enumerator);
- -

Attributes

- - - - - - - - - - - - - - -
AttributeTypeDescription
categoryManager{{ interface("nsICategoryManager") }}Returns a reference to {{ interface("nsICategoryManager") }}.
- -

Methods

- -

defineLazyGetter()

- -

Getter functions in JavaScript give you a way to define a property of an object, but not calculate the property's value until it is accessed. A getter defers the cost of calculating the value until the value is needed, and if it is never needed, you never pay the cost.

- -

A "lazy getter" provides an additional optimization: the value is calculated the first time the getter is called, and is then cached (or memoized), so subsequent accesses return the cached value without recalculating it.

- -

This means that you shouldn't use a lazy getter for a property whose value you expect to change, because the getter will not recalculate the value.

- -

defineLazyGetter takes three arguments:

- - - -

Example for this is seen at bottom of this page here.

- -
function defineLazyGetter(
-  aObject,
-  aName,
-  aLambda
-); 
- -
Parameters
- -
-
aObject
-
The object into which to add the new lazy getter function.
-
aName
-
The name of the getter function to create.
-
aLambda
-
A function that returns the value the getter should return. This function is called exactly once. this will reference aObject during execution of the function.
-
- -

defineLazyModuleGetter()

- -

Defines a getter on a specified object for a module. The module will not be imported until first use.

- -
function defineLazyModuleGetter(
-  aObject,
-  aName,
-  aResource,
-  aSymbol
-); 
- -
Parameters
- -
-
aObject
-
The object to define the lazy getter on.
-
aName
-
The name of the getter to define on aObject for the module.
-
aResource
-
The URL used to obtain the module.
-
aSymbol
-
The name of the symbol exported by the module. This parameter is optional and defaults to aName.
-
- -

defineLazyServiceGetter()

- -

Defines a function on a specified object which acts as a getter for a service. The service isn't obtained until the first time it's used.

- -
function defineLazyServiceGetter(
-  aObject,
-  aName,
-  aContract,
-  aInterfaceName
-);
-
- -
Parameters
- -
-
aObject
-
The object into which to add the new lazy service getter function.
-
aName
-
The name of the getter function to create.
-
aContract
-
The contract to use to obtain the service.
-
aInterfaceName
-
The name of the interface to query the service to.
-
- -

 

- -

generateNSGetFactory()

- -

 

- -

Generates the NSGetFactory() function along with the factory definition.

- -
Function generateNSGetFactory(
-  componentsArray
-);
-
- -
Parameters
- -
-
componentsArray
-
An array of component constructors.
-
- -
Return value
- -

A function that will return the factory for the components and can be assigned to NSGetFactory global variable.

- -

 

- -

generateCI()

- -

 

- -

Generates an {{ interface("nsIClassInfo") }} implementation for a component. The returned object should be assigned to the classInfo property of a JS object, the QueryInterface() function generated by generateQI will return it automatically then.

- -
function generateCI(
-  classInfo
-);
-
- -
Parameters
- -
-
classInfo
-
An object containing the optional properties interfaces, contractID, classDescription, classID, flags. This parameter should not be the component itself because that would cause a memory leak.
-
- -
Return value
- -

An {{ interface("nsIClassInfo") }} implementation returning the values of the properties from the classInfo parameter in its various properties.

- -
Exceptions thrown
- -

This method throws an exception with the message "In generateCI, don't use a component for generating classInfo" if classInfo parameter is an XPCOM component.

- -

generateQI()

- -

Generates a QueryInterface() function implementation. You need to assign the returned function to the QueryInterface property of a JavaScript object.

- -

When the generated method is invoked on that object, it checks to see if the specified IID is listed in the array specified by the interfaces parameter; if it is, this (that is, the object itself) is returned. Otherwise, null is returned.

- -
function generateQI(
-  interfaces
-);
-
- -
Parameters
- -
-
interfaces
-
An array of interfaces implemented by the component.
-
- -
Return value
- -

A QueryInterface() function implementation.

- -
Remarks
- -

When you implement an interface that inherits from another one, you should generally list all the base interfaces explicitly, except for {{ Interface("nsISupports") }}. For example, if your component implements {{ Interface("nsIStreamConverter") }}:

- -
MyComponent.prototype = {
-  QueryInterface: XPCOMUtils.generateQI([
-    Components.interfaces.nsIRequestObserver,
-    Components.interfaces.nsIStreamListener,
-    Components.interfaces.nsIStreamConverter,
-  ]),
-
-  // ...methods...
-}
-
- -

importRelative()

- -

Imports a JavaScript code module given the calling JavaScript code module's global object (you should specify this) and a path relative to that module. This lets modules bundled in a package load one another without having to hard-code full paths.

- -
void importRelative(
-  that,
-  path,
-  scope
-);
-
- -
Parameters
- -
-
that
-
The JavaScript Object of the calling JavaScript code module's global scope. You should simply pass this.
-
path
-
The relative path of the JavaScript code module to import.
-
scope
-
An optional object to import into; if omitted, the object passed in for the that parameter is used.
-
- -
Remarks
- -

This lets an extension bundle its own JavaScript code modules within itself and have them load one another. For example, if an extension named "MyExtension" bundles foo.jsm and bar.jsm, and foo.jsm needs to load bar.jsm, it can do so like this:

- -
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-XPCOMUtils.importRelative(this, "bar.jsm"); 
- -

In other words: importRelative will only work from other code modules (such as JSM files). It will NOT work from overlay scripts or bootstrap.js or etc. Details can be found here: {{bug("628669")}}

- -

IterSimpleEnumerator()

- -

Wraps an {{ Interface("nsISimpleEnumerator") }} instance into a JavaScript generator that can be easily iterated over.

- -
generator IterSimpleEnumerator(
-  enumerator,
-  interface
-);
-
- -
Parameters
- -
-
enumerator
-
The {{ Interface("nsISimpleEnumerator") }} instance to iterate over.
-
interface
-
The expected interface for each element.
-
- -
Return value
- -

A generator yielding enumerated objects.

- -
Example
- -
const nsIFile = Components.interfaces.nsIFile;
-for (var file in XPCOMUtils.IterSimpleEnumerator(dir.directoryEntries, nsIFile))
-  console.log(file.path);
-
- -

IterStringEnumerator()

- -

Wraps an {{ Interface("nsIStringEnumerator") }} or {{ Interface("nsIUTF8StringEnumerator") }} instance into a JavaScript generator that can be easily iterated over.

- -
generator IterStringEnumerator(
-  enumerator
-);
-
- -
Parameters
- -
-
enumerator
-
The {{ Interface("nsIStringEnumerator") }} or {{ Interface("nsIUTF8StringEnumerator") }} instance to iterate over.
-
- -
Return value
- -

A generator yielding enumerated strings.

- -
Example
- -
for (var section in XPCOMUtils.IterStringEnumerator(iniParser.getSections()))
-  console.log(section);
-
- -

Post-registration callback

- -

The post-registration callback called by generateModule() should have the following signature:

- -
postRegister(
-  nsIComponentManager compMgr,
-  nsIFile fileSpec,
-  componentsArray
-);
-
- -
Parameters
- -
-
compMgr
-
An {{ interface("nsIComponentManager") }} instance to use for managing the component.
-
fileSpec
-
An {{ interface("nsIFile") }} instance for... what?
-
componentsArray
-
An array of the components, as passed to generateModule().
-
- -

The function doesn't need to return a value.

- -

Pre-unregistration callback

- -

The pre-unregistration callback passed to generateModule() should have the following signature:

- -
preUnregister(
-  nsIComponentManager compMgr,
-  nsIFile fileSpec,
-  componentsArray
-);
-
- -
Parameters
- -
-
compMgr
-
The {{ interface("nsIComponentManager") }} instance to use for managing the component.
-
fileSpec
-
An {{ interface("nsIFile") }} instance for... what?
-
componentsArray
-
The array of components passed to generateModule().
-
- -

This function doesn't need to return a value.

- -

Examples

- -

defineLazyGetter

- -
var myServices = {};
-Cu.import('resource://gre/modules/XPCOMUtils.jsm');
-
-//set it up
-XPCOMUtils.defineLazyGetter(myServices, 'as', function () { return Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService) });
-
-//when you need to use it
-myServices.as.showAlertNotification('chrome://branding/content/icon64.png', 'this was lazyloaded', 'this is a notification from myServices.as', null, null);
- -

See also

- - diff --git a/files/es/xpinstall/index.html b/files/es/xpinstall/index.html deleted file mode 100644 index aa498d05d7..0000000000 --- a/files/es/xpinstall/index.html +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: XPInstall -slug: XPInstall -tags: - - XPInstall -translation_of: Archive/Mozilla/XPInstall ---- -

-

-
La Instalacion Multiplataforma (XPInstall) es una tecnología utilizada por la Suite de Aplicaciones de Mozilla, Mozilla Thunderbird y otras aplicaciones basadas en XUL para instalar extensiones. Un módulo instalador XPI (pronunciado "zippy" y derivado de XPInstall) es un archivo ZIP que contiene un script instalador (titulado install.js o install.rdf) en la raíz del archivo.
- - -
-

Documentación

-
Referencia de API de XPInstall -
-
Aprender Scripting con XPInstaller por ejemplo -
Este articulo usa el script instalador del paquete browser.xpi como la base para discutir instalaciones con XPI en general. -
-
Cómo agregar un módulo instalador al instalador de Windows -
Un módulo instalador es un paquete en Formato ZIP de Phil Katz que contiene un script instalador (nombrado install.js) en la raiz de un XPI. El paquete contiene algunos archivos y el instalador contiene algunas directivas javascript para acciones que se toman durante la instalacion, por ejemplo, para agregar archivos y directorios, borrar archivos viejos u obsoletos, ejecutar herramientas de linea de comandos, etc. -
-
Creando Módulos para el XPInstaller
-
Este articulo describe el esquema de empaquetamiento de Mozilla y ofrece un tutorial para crear un nuevo paquete que pueda ser redistribuido, instalado, y que pueda estar disponible para usuarios. -
-
Asistentes de instalación (Stub Installers)
-
-

View All... -

-
-

Comunidad

-
  • Ver foros de Mozilla... -
-

-

-

Herramientas

- -

Temas Relacionados

-
Extensions, XUL, XPI -
-
-

Categories -

Interwiki Language Links -


-

-
-
diff --git a/files/es/xul_tutorial/index.html b/files/es/xul_tutorial/index.html deleted file mode 100644 index 01a8c9df3d..0000000000 --- a/files/es/xul_tutorial/index.html +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: XUL Tutorial -slug: XUL_Tutorial ---- -{{wiki.localize('System.API.page-generated-for-subpage')}} diff --git a/files/es/zonas/index.html b/files/es/zonas/index.html deleted file mode 100644 index be09f6bf62..0000000000 --- a/files/es/zonas/index.html +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Zonas -slug: Zonas -translation_of: Zones ---- -

Las zonas MDN te proveen el acceso a información acerca de algún tema o producto en específico. Acá tienes una lista de las zonas disponibles para ti.

-
-
-

Desarrollo Web y de aplicaciones

-
-
- App Center
-
- Aprender cómo crear aplicaciones de Web abierta—grandes experiencias que se ejecutan a través de múltiples depósitos—usando los mismos estándares Web y tecnologías libres que ya conoces.
-
- Herramientas de Desarrollador
-
-

Aprende como usar las herramientas de desarrollador de Firefox para depurar, probar, y optimizar tus sitios y aplicaciones Web.

-
-
- Firefox Marketplace
-
-

Un mercado abierto y sin propietario para las aplicaciones Web diseñadas usando HTML, CSS y JavaScript. Envía tus aplicaciones al Firefox Marketplace o aprende a construir tu propio mercado. 

-
-
- Desarrollo de Videojuegos
-
-

Aprende a desarrollar juegos para la Web, como importar juegos existentes a tecnología Web y como convertir tus juegos en aplicaciones Web.

-
-
-
-
-

Productos y proyectos

-
-
- Emscripten
-
-

Un compilador de LLVM a JavaScript; esto te permite compilar, por ejemplo, código de C++ en condigo JavaScript que puede ser ejecutado en cualquier explorador de internet.

-
-
- L20n
-
-

Un framework de localización para JavaScript, que te permite liberar todo el poder de tu idioma con códigos simples.

-
-
- El proyecto MDN
-
- El proyecto de Desarrolladores de Redes de Mozilla (MDN por sus siglas en inglés, es decir: este mismo sitio) confía en la comunidad de lectores y colaboradores para crecer y mejorar. Puedes aprender acá como contribuir a construir el código detrás de MDN!
-
- Persona
-
-

Un nuevo y simple sistema de registro desarrollado por Mozilla que les permite a los usuarios registrarse en una web usando sus direcciones de correo electrónico, liberándote del manejo de contraseñas y mejorando tu privacidad.

-
-
-

Tecnologías de Mozilla

-
-
- Complementos
-
- Aprende a construir e instalar extensiones, temas y complementos para software basado en Mozilla, incluyendo el popular navegador Web Firefox.
-
- Firefox
-
- Aprende todo sobre Firefox, desde cómo construir y revisarlo, hasta como crear complementos específicamente para él.
-
- Firefox OS
-
- Un nuevo sistema operativo para móviles desarrollado por Mozilla que les permite a los usuarios instalar y ejecutar aplicaciones de Web abierta utilizando HTML, CSS y JavaScript.
-
-
-
-

 

-- cgit v1.2.3-54-g00ecf