mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
462ab84b7f
--HG-- rename : mobile/LICENSE => mobile/xul/LICENSE rename : mobile/Makefile.in => mobile/xul/Makefile.in rename : mobile/app/Makefile.in => mobile/xul/app/Makefile.in rename : mobile/app/android/drawable-hdpi/alertaddons.png => mobile/xul/app/android/drawable-hdpi/alertaddons.png rename : mobile/app/android/drawable-hdpi/alertdownloads.png => mobile/xul/app/android/drawable-hdpi/alertdownloads.png rename : mobile/app/android/drawable/alertaddons.png => mobile/xul/app/android/drawable/alertaddons.png rename : mobile/app/android/drawable/alertdownloads.png => mobile/xul/app/android/drawable/alertdownloads.png rename : mobile/app/application.ini => mobile/xul/app/application.ini rename : mobile/app/macbuild/Contents/Info.plist.in => mobile/xul/app/macbuild/Contents/Info.plist.in rename : mobile/app/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in => mobile/xul/app/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in rename : mobile/app/maemo/toolbar_splash.png => mobile/xul/app/maemo/toolbar_splash.png rename : mobile/app/mobile.ico => mobile/xul/app/mobile.ico rename : mobile/app/mobile.js => mobile/xul/app/mobile.js rename : mobile/app/nsBrowserApp.cpp => mobile/xul/app/nsBrowserApp.cpp rename : mobile/app/profile/extensions/Makefile.in => mobile/xul/app/profile/extensions/Makefile.in rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/chrome.manifest => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/chrome.manifest rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/content/content.js => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/content/content.js rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/content/overlay.js => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/content/overlay.js rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/content/overlay.xul => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/content/overlay.xul rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/defaults/preferences/preferences.js => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/defaults/preferences/preferences.js rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/install.rdf.in => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/install.rdf.in rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/skin/beta-hdpi.png => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/skin/beta-hdpi.png rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/skin/dino-32.png => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/skin/dino-32.png rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/skin/happy-32.png => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/skin/happy-32.png rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/skin/overlay.css => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/skin/overlay.css rename : mobile/app/profile/extensions/feedback@mobile.mozilla.org/skin/sad-32.png => mobile/xul/app/profile/extensions/feedback@mobile.mozilla.org/skin/sad-32.png rename : mobile/branding/aurora/Makefile.in => mobile/xul/branding/aurora/Makefile.in rename : mobile/branding/aurora/android-resources.mn => mobile/xul/branding/aurora/android-resources.mn rename : mobile/branding/aurora/configure.sh => mobile/xul/branding/aurora/configure.sh rename : mobile/branding/aurora/content/Makefile.in => mobile/xul/branding/aurora/content/Makefile.in rename : mobile/branding/aurora/content/about.png => mobile/xul/branding/aurora/content/about.png rename : mobile/branding/aurora/content/favicon32.png => mobile/xul/branding/aurora/content/favicon32.png rename : mobile/branding/aurora/content/fennec_26x26.png => mobile/xul/branding/aurora/content/fennec_26x26.png rename : mobile/branding/aurora/content/fennec_40x40.png => mobile/xul/branding/aurora/content/fennec_40x40.png rename : mobile/branding/aurora/content/fennec_48x48.png => mobile/xul/branding/aurora/content/fennec_48x48.png rename : mobile/branding/aurora/content/fennec_72x72.png => mobile/xul/branding/aurora/content/fennec_72x72.png rename : mobile/branding/aurora/content/fennec_maemo_icon26.txt => mobile/xul/branding/aurora/content/fennec_maemo_icon26.txt rename : mobile/branding/aurora/content/fennec_scalable.png => mobile/xul/branding/aurora/content/fennec_scalable.png rename : mobile/branding/aurora/content/jar.mn => mobile/xul/branding/aurora/content/jar.mn rename : mobile/branding/aurora/content/logo.png => mobile/xul/branding/aurora/content/logo.png rename : mobile/branding/aurora/content/logoWordmark.png => mobile/xul/branding/aurora/content/logoWordmark.png rename : mobile/branding/aurora/content/splash.png => mobile/xul/branding/aurora/content/splash.png rename : mobile/branding/aurora/content/splash_v8.9.png => mobile/xul/branding/aurora/content/splash_v8.9.png rename : mobile/branding/aurora/content/splash_v9.9.png => mobile/xul/branding/aurora/content/splash_v9.9.png rename : mobile/branding/aurora/locales/Makefile.in => mobile/xul/branding/aurora/locales/Makefile.in rename : mobile/branding/aurora/locales/en-US/brand.dtd => mobile/xul/branding/aurora/locales/en-US/brand.dtd rename : mobile/branding/aurora/locales/en-US/brand.properties => mobile/xul/branding/aurora/locales/en-US/brand.properties rename : mobile/branding/aurora/locales/jar.mn => mobile/xul/branding/aurora/locales/jar.mn rename : mobile/branding/beta/Makefile.in => mobile/xul/branding/beta/Makefile.in rename : mobile/branding/beta/android-resources.mn => mobile/xul/branding/beta/android-resources.mn rename : mobile/branding/beta/configure.sh => mobile/xul/branding/beta/configure.sh rename : mobile/branding/beta/content/Makefile.in => mobile/xul/branding/beta/content/Makefile.in rename : mobile/branding/beta/content/about.png => mobile/xul/branding/beta/content/about.png rename : mobile/branding/beta/content/favicon32.png => mobile/xul/branding/beta/content/favicon32.png rename : mobile/branding/beta/content/fennec_26x26.png => mobile/xul/branding/beta/content/fennec_26x26.png rename : mobile/branding/beta/content/fennec_40x40.png => mobile/xul/branding/beta/content/fennec_40x40.png rename : mobile/branding/beta/content/fennec_48x48.png => mobile/xul/branding/beta/content/fennec_48x48.png rename : mobile/branding/beta/content/fennec_72x72.png => mobile/xul/branding/beta/content/fennec_72x72.png rename : mobile/branding/beta/content/fennec_maemo_icon26.txt => mobile/xul/branding/beta/content/fennec_maemo_icon26.txt rename : mobile/branding/beta/content/fennec_scalable.png => mobile/xul/branding/beta/content/fennec_scalable.png rename : mobile/branding/beta/content/jar.mn => mobile/xul/branding/beta/content/jar.mn rename : mobile/branding/beta/content/logo.png => mobile/xul/branding/beta/content/logo.png rename : mobile/branding/beta/content/logoWordmark.png => mobile/xul/branding/beta/content/logoWordmark.png rename : mobile/branding/beta/content/splash.png => mobile/xul/branding/beta/content/splash.png rename : mobile/branding/beta/content/splash_v8.9.png => mobile/xul/branding/beta/content/splash_v8.9.png rename : mobile/branding/beta/content/splash_v9.9.png => mobile/xul/branding/beta/content/splash_v9.9.png rename : mobile/branding/beta/locales/Makefile.in => mobile/xul/branding/beta/locales/Makefile.in rename : mobile/branding/beta/locales/en-US/brand.dtd => mobile/xul/branding/beta/locales/en-US/brand.dtd rename : mobile/branding/beta/locales/en-US/brand.properties => mobile/xul/branding/beta/locales/en-US/brand.properties rename : mobile/branding/beta/locales/jar.mn => mobile/xul/branding/beta/locales/jar.mn rename : mobile/branding/nightly/Makefile.in => mobile/xul/branding/nightly/Makefile.in rename : mobile/branding/nightly/android-resources.mn => mobile/xul/branding/nightly/android-resources.mn rename : mobile/branding/nightly/configure.sh => mobile/xul/branding/nightly/configure.sh rename : mobile/branding/nightly/content/Makefile.in => mobile/xul/branding/nightly/content/Makefile.in rename : mobile/branding/nightly/content/about.png => mobile/xul/branding/nightly/content/about.png rename : mobile/branding/nightly/content/favicon32.png => mobile/xul/branding/nightly/content/favicon32.png rename : mobile/branding/nightly/content/fennec_26x26.png => mobile/xul/branding/nightly/content/fennec_26x26.png rename : mobile/branding/nightly/content/fennec_40x40.png => mobile/xul/branding/nightly/content/fennec_40x40.png rename : mobile/branding/nightly/content/fennec_48x48.png => mobile/xul/branding/nightly/content/fennec_48x48.png rename : mobile/branding/nightly/content/fennec_72x72.png => mobile/xul/branding/nightly/content/fennec_72x72.png rename : mobile/branding/nightly/content/fennec_maemo_icon26.txt => mobile/xul/branding/nightly/content/fennec_maemo_icon26.txt rename : mobile/branding/nightly/content/fennec_scalable.png => mobile/xul/branding/nightly/content/fennec_scalable.png rename : mobile/branding/nightly/content/jar.mn => mobile/xul/branding/nightly/content/jar.mn rename : mobile/branding/nightly/content/logo.png => mobile/xul/branding/nightly/content/logo.png rename : mobile/branding/nightly/content/logoWordmark.png => mobile/xul/branding/nightly/content/logoWordmark.png rename : mobile/branding/nightly/content/splash.png => mobile/xul/branding/nightly/content/splash.png rename : mobile/branding/nightly/content/splash_v8.9.png => mobile/xul/branding/nightly/content/splash_v8.9.png rename : mobile/branding/nightly/content/splash_v9.9.png => mobile/xul/branding/nightly/content/splash_v9.9.png rename : mobile/branding/nightly/locales/Makefile.in => mobile/xul/branding/nightly/locales/Makefile.in rename : mobile/branding/nightly/locales/en-US/brand.dtd => mobile/xul/branding/nightly/locales/en-US/brand.dtd rename : mobile/branding/nightly/locales/en-US/brand.properties => mobile/xul/branding/nightly/locales/en-US/brand.properties rename : mobile/branding/nightly/locales/jar.mn => mobile/xul/branding/nightly/locales/jar.mn rename : mobile/branding/official/Makefile.in => mobile/xul/branding/official/Makefile.in rename : mobile/branding/official/android-resources.mn => mobile/xul/branding/official/android-resources.mn rename : mobile/branding/official/configure.sh => mobile/xul/branding/official/configure.sh rename : mobile/branding/official/content/Makefile.in => mobile/xul/branding/official/content/Makefile.in rename : mobile/branding/official/content/about.png => mobile/xul/branding/official/content/about.png rename : mobile/branding/official/content/favicon32.png => mobile/xul/branding/official/content/favicon32.png rename : mobile/branding/official/content/fennec_26x26.png => mobile/xul/branding/official/content/fennec_26x26.png rename : mobile/branding/official/content/fennec_40x40.png => mobile/xul/branding/official/content/fennec_40x40.png rename : mobile/branding/official/content/fennec_48x48.png => mobile/xul/branding/official/content/fennec_48x48.png rename : mobile/branding/official/content/fennec_72x72.png => mobile/xul/branding/official/content/fennec_72x72.png rename : mobile/branding/official/content/fennec_maemo_icon26.txt => mobile/xul/branding/official/content/fennec_maemo_icon26.txt rename : mobile/branding/official/content/fennec_scalable.png => mobile/xul/branding/official/content/fennec_scalable.png rename : mobile/branding/official/content/jar.mn => mobile/xul/branding/official/content/jar.mn rename : mobile/branding/official/content/logo.png => mobile/xul/branding/official/content/logo.png rename : mobile/branding/official/content/logoWordmark.png => mobile/xul/branding/official/content/logoWordmark.png rename : mobile/branding/official/content/splash.png => mobile/xul/branding/official/content/splash.png rename : mobile/branding/official/content/splash_v8.9.png => mobile/xul/branding/official/content/splash_v8.9.png rename : mobile/branding/official/content/splash_v9.9.png => mobile/xul/branding/official/content/splash_v9.9.png rename : mobile/branding/official/locales/Makefile.in => mobile/xul/branding/official/locales/Makefile.in rename : mobile/branding/official/locales/en-US/brand.dtd => mobile/xul/branding/official/locales/en-US/brand.dtd rename : mobile/branding/official/locales/en-US/brand.properties => mobile/xul/branding/official/locales/en-US/brand.properties rename : mobile/branding/official/locales/jar.mn => mobile/xul/branding/official/locales/jar.mn rename : mobile/branding/unofficial/Makefile.in => mobile/xul/branding/unofficial/Makefile.in rename : mobile/branding/unofficial/android-resources.mn => mobile/xul/branding/unofficial/android-resources.mn rename : mobile/branding/unofficial/configure.sh => mobile/xul/branding/unofficial/configure.sh rename : mobile/branding/unofficial/content/Makefile.in => mobile/xul/branding/unofficial/content/Makefile.in rename : mobile/branding/unofficial/content/about.png => mobile/xul/branding/unofficial/content/about.png rename : mobile/branding/unofficial/content/favicon32.png => mobile/xul/branding/unofficial/content/favicon32.png rename : mobile/branding/unofficial/content/fennec_26x26.png => mobile/xul/branding/unofficial/content/fennec_26x26.png rename : mobile/branding/unofficial/content/fennec_40x40.png => mobile/xul/branding/unofficial/content/fennec_40x40.png rename : mobile/branding/unofficial/content/fennec_48x48.png => mobile/xul/branding/unofficial/content/fennec_48x48.png rename : mobile/branding/unofficial/content/fennec_72x72.png => mobile/xul/branding/unofficial/content/fennec_72x72.png rename : mobile/branding/unofficial/content/fennec_maemo_icon26.txt => mobile/xul/branding/unofficial/content/fennec_maemo_icon26.txt rename : mobile/branding/unofficial/content/fennec_scalable.png => mobile/xul/branding/unofficial/content/fennec_scalable.png rename : mobile/branding/unofficial/content/jar.mn => mobile/xul/branding/unofficial/content/jar.mn rename : mobile/branding/unofficial/content/logo.png => mobile/xul/branding/unofficial/content/logo.png rename : mobile/branding/unofficial/content/logoWordmark.png => mobile/xul/branding/unofficial/content/logoWordmark.png rename : mobile/branding/unofficial/content/splash.png => mobile/xul/branding/unofficial/content/splash.png rename : mobile/branding/unofficial/content/splash_v8.9.png => mobile/xul/branding/unofficial/content/splash_v8.9.png rename : mobile/branding/unofficial/content/splash_v9.9.png => mobile/xul/branding/unofficial/content/splash_v9.9.png rename : mobile/branding/unofficial/locales/Makefile.in => mobile/xul/branding/unofficial/locales/Makefile.in rename : mobile/branding/unofficial/locales/en-US/brand.dtd => mobile/xul/branding/unofficial/locales/en-US/brand.dtd rename : mobile/branding/unofficial/locales/en-US/brand.properties => mobile/xul/branding/unofficial/locales/en-US/brand.properties rename : mobile/branding/unofficial/locales/jar.mn => mobile/xul/branding/unofficial/locales/jar.mn rename : mobile/build.mk => mobile/xul/build.mk rename : mobile/chrome/Makefile.in => mobile/xul/chrome/Makefile.in rename : mobile/chrome/content/AlertsHelper.js => mobile/xul/chrome/content/AlertsHelper.js rename : mobile/chrome/content/AnimatedZoom.js => mobile/xul/chrome/content/AnimatedZoom.js rename : mobile/chrome/content/AppMenu.js => mobile/xul/chrome/content/AppMenu.js rename : mobile/chrome/content/AwesomePanel.js => mobile/xul/chrome/content/AwesomePanel.js rename : mobile/chrome/content/BookmarkHelper.js => mobile/xul/chrome/content/BookmarkHelper.js rename : mobile/chrome/content/BookmarkPopup.js => mobile/xul/chrome/content/BookmarkPopup.js rename : mobile/chrome/content/CaptureDialog.js => mobile/xul/chrome/content/CaptureDialog.js rename : mobile/chrome/content/CaptureDialog.xul => mobile/xul/chrome/content/CaptureDialog.xul rename : mobile/chrome/content/CapturePickerUI.js => mobile/xul/chrome/content/CapturePickerUI.js rename : mobile/chrome/content/CharsetMenu.js => mobile/xul/chrome/content/CharsetMenu.js rename : mobile/chrome/content/ContentPopupHelper.js => mobile/xul/chrome/content/ContentPopupHelper.js rename : mobile/chrome/content/ContextCommands.js => mobile/xul/chrome/content/ContextCommands.js rename : mobile/chrome/content/IndexedDB.js => mobile/xul/chrome/content/IndexedDB.js rename : mobile/chrome/content/LoginManagerChild.js => mobile/xul/chrome/content/LoginManagerChild.js rename : mobile/chrome/content/MasterPasswordUI.js => mobile/xul/chrome/content/MasterPasswordUI.js rename : mobile/chrome/content/MenuListHelperUI.js => mobile/xul/chrome/content/MenuListHelperUI.js rename : mobile/chrome/content/OfflineApps.js => mobile/xul/chrome/content/OfflineApps.js rename : mobile/chrome/content/PageActions.js => mobile/xul/chrome/content/PageActions.js rename : mobile/chrome/content/SelectHelperUI.js => mobile/xul/chrome/content/SelectHelperUI.js rename : mobile/chrome/content/SelectionHelper.js => mobile/xul/chrome/content/SelectionHelper.js rename : mobile/chrome/content/SharingUI.js => mobile/xul/chrome/content/SharingUI.js rename : mobile/chrome/content/TabletSidebar.js => mobile/xul/chrome/content/TabletSidebar.js rename : mobile/chrome/content/TabsPopup.js => mobile/xul/chrome/content/TabsPopup.js rename : mobile/chrome/content/Util.js => mobile/xul/chrome/content/Util.js rename : mobile/chrome/content/WebappsUI.js => mobile/xul/chrome/content/WebappsUI.js rename : mobile/chrome/content/about.xhtml => mobile/xul/chrome/content/about.xhtml rename : mobile/chrome/content/aboutCertError.xhtml => mobile/xul/chrome/content/aboutCertError.xhtml rename : mobile/chrome/content/aboutHome.xhtml => mobile/xul/chrome/content/aboutHome.xhtml rename : mobile/chrome/content/aboutRights.xhtml => mobile/xul/chrome/content/aboutRights.xhtml rename : mobile/chrome/content/bindings.xml => mobile/xul/chrome/content/bindings.xml rename : mobile/chrome/content/bindings/arrowbox.xml => mobile/xul/chrome/content/bindings/arrowbox.xml rename : mobile/chrome/content/bindings/browser.js => mobile/xul/chrome/content/bindings/browser.js rename : mobile/chrome/content/bindings/browser.xml => mobile/xul/chrome/content/bindings/browser.xml rename : mobile/chrome/content/bindings/checkbox.xml => mobile/xul/chrome/content/bindings/checkbox.xml rename : mobile/chrome/content/bindings/console.xml => mobile/xul/chrome/content/bindings/console.xml rename : mobile/chrome/content/bindings/dialog.xml => mobile/xul/chrome/content/bindings/dialog.xml rename : mobile/chrome/content/bindings/downloads.xml => mobile/xul/chrome/content/bindings/downloads.xml rename : mobile/chrome/content/bindings/extensions.xml => mobile/xul/chrome/content/bindings/extensions.xml rename : mobile/chrome/content/bindings/pageaction.xml => mobile/xul/chrome/content/bindings/pageaction.xml rename : mobile/chrome/content/blockedSite.xhtml => mobile/xul/chrome/content/blockedSite.xhtml rename : mobile/chrome/content/browser-scripts.js => mobile/xul/chrome/content/browser-scripts.js rename : mobile/chrome/content/browser-ui.js => mobile/xul/chrome/content/browser-ui.js rename : mobile/chrome/content/browser.css => mobile/xul/chrome/content/browser.css rename : mobile/chrome/content/browser.js => mobile/xul/chrome/content/browser.js rename : mobile/chrome/content/browser.xul => mobile/xul/chrome/content/browser.xul rename : mobile/chrome/content/commandUtil.js => mobile/xul/chrome/content/commandUtil.js rename : mobile/chrome/content/common-ui.js => mobile/xul/chrome/content/common-ui.js rename : mobile/chrome/content/config.js => mobile/xul/chrome/content/config.js rename : mobile/chrome/content/config.xul => mobile/xul/chrome/content/config.xul rename : mobile/chrome/content/console.js => mobile/xul/chrome/content/console.js rename : mobile/chrome/content/content.js => mobile/xul/chrome/content/content.js rename : mobile/chrome/content/cursor.css => mobile/xul/chrome/content/cursor.css rename : mobile/chrome/content/downloads.js => mobile/xul/chrome/content/downloads.js rename : mobile/chrome/content/exceptions.js => mobile/xul/chrome/content/exceptions.js rename : mobile/chrome/content/extensions.js => mobile/xul/chrome/content/extensions.js rename : mobile/chrome/content/forms.js => mobile/xul/chrome/content/forms.js rename : mobile/chrome/content/fullscreen-video.js => mobile/xul/chrome/content/fullscreen-video.js rename : mobile/chrome/content/fullscreen-video.xhtml => mobile/xul/chrome/content/fullscreen-video.xhtml rename : mobile/chrome/content/input.js => mobile/xul/chrome/content/input.js rename : mobile/chrome/content/languages.properties => mobile/xul/chrome/content/languages.properties rename : mobile/chrome/content/localePicker.js => mobile/xul/chrome/content/localePicker.js rename : mobile/chrome/content/localePicker.xul => mobile/xul/chrome/content/localePicker.xul rename : mobile/chrome/content/masterPassword.xul => mobile/xul/chrome/content/masterPassword.xul rename : mobile/chrome/content/netError.xhtml => mobile/xul/chrome/content/netError.xhtml rename : mobile/chrome/content/notification.xml => mobile/xul/chrome/content/notification.xml rename : mobile/chrome/content/preferences.js => mobile/xul/chrome/content/preferences.js rename : mobile/chrome/content/prompt/alert.xul => mobile/xul/chrome/content/prompt/alert.xul rename : mobile/chrome/content/prompt/confirm.xul => mobile/xul/chrome/content/prompt/confirm.xul rename : mobile/chrome/content/prompt/prompt.js => mobile/xul/chrome/content/prompt/prompt.js rename : mobile/chrome/content/prompt/prompt.xul => mobile/xul/chrome/content/prompt/prompt.xul rename : mobile/chrome/content/prompt/promptPassword.xul => mobile/xul/chrome/content/prompt/promptPassword.xul rename : mobile/chrome/content/prompt/select.xul => mobile/xul/chrome/content/prompt/select.xul rename : mobile/chrome/content/removeMasterPassword.xul => mobile/xul/chrome/content/removeMasterPassword.xul rename : mobile/chrome/content/sanitize.js => mobile/xul/chrome/content/sanitize.js rename : mobile/chrome/content/share.xul => mobile/xul/chrome/content/share.xul rename : mobile/chrome/content/sync.js => mobile/xul/chrome/content/sync.js rename : mobile/chrome/content/tabs.xml => mobile/xul/chrome/content/tabs.xml rename : mobile/chrome/content/webapps.xul => mobile/xul/chrome/content/webapps.xul rename : mobile/chrome/jar.mn => mobile/xul/chrome/jar.mn rename : mobile/chrome/tests/Makefile.in => mobile/xul/chrome/tests/Makefile.in rename : mobile/chrome/tests/addons/browser_install1_1/bootstrap.js => mobile/xul/chrome/tests/addons/browser_install1_1/bootstrap.js rename : mobile/chrome/tests/addons/browser_install1_1/install.rdf => mobile/xul/chrome/tests/addons/browser_install1_1/install.rdf rename : mobile/chrome/tests/addons/browser_install1_2/install.rdf => mobile/xul/chrome/tests/addons/browser_install1_2/install.rdf rename : mobile/chrome/tests/addons/browser_install1_3/install.rdf => mobile/xul/chrome/tests/addons/browser_install1_3/install.rdf rename : mobile/chrome/tests/addons/browser_locale1/boostrap.js => mobile/xul/chrome/tests/addons/browser_locale1/boostrap.js rename : mobile/chrome/tests/addons/browser_locale1/chrome.manifest => mobile/xul/chrome/tests/addons/browser_locale1/chrome.manifest rename : mobile/chrome/tests/addons/browser_locale1/install.rdf => mobile/xul/chrome/tests/addons/browser_locale1/install.rdf rename : mobile/chrome/tests/browser_addons.js => mobile/xul/chrome/tests/browser_addons.js rename : mobile/chrome/tests/browser_addons_locales.js => mobile/xul/chrome/tests/browser_addons_locales.js rename : mobile/chrome/tests/browser_appmenu.js => mobile/xul/chrome/tests/browser_appmenu.js rename : mobile/chrome/tests/browser_autocomplete.html => mobile/xul/chrome/tests/browser_autocomplete.html rename : mobile/chrome/tests/browser_autocomplete.js => mobile/xul/chrome/tests/browser_autocomplete.js rename : mobile/chrome/tests/browser_autocompletesearch.js => mobile/xul/chrome/tests/browser_autocompletesearch.js rename : mobile/chrome/tests/browser_awesomescreen.js => mobile/xul/chrome/tests/browser_awesomescreen.js rename : mobile/chrome/tests/browser_blank_01.html => mobile/xul/chrome/tests/browser_blank_01.html rename : mobile/chrome/tests/browser_blank_02.html => mobile/xul/chrome/tests/browser_blank_02.html rename : mobile/chrome/tests/browser_blank_03.html => mobile/xul/chrome/tests/browser_blank_03.html rename : mobile/chrome/tests/browser_bookmarks.js => mobile/xul/chrome/tests/browser_bookmarks.js rename : mobile/chrome/tests/browser_bookmarks_star.js => mobile/xul/chrome/tests/browser_bookmarks_star.js rename : mobile/chrome/tests/browser_bookmarks_tags.js => mobile/xul/chrome/tests/browser_bookmarks_tags.js rename : mobile/chrome/tests/browser_click_content.html => mobile/xul/chrome/tests/browser_click_content.html rename : mobile/chrome/tests/browser_click_content.js => mobile/xul/chrome/tests/browser_click_content.js rename : mobile/chrome/tests/browser_contacts.js => mobile/xul/chrome/tests/browser_contacts.js rename : mobile/chrome/tests/browser_contentpopup.html => mobile/xul/chrome/tests/browser_contentpopup.html rename : mobile/chrome/tests/browser_contentpopup.js => mobile/xul/chrome/tests/browser_contentpopup.js rename : mobile/chrome/tests/browser_dragger.js => mobile/xul/chrome/tests/browser_dragger.js rename : mobile/chrome/tests/browser_escape.js => mobile/xul/chrome/tests/browser_escape.js rename : mobile/chrome/tests/browser_find.js => mobile/xul/chrome/tests/browser_find.js rename : mobile/chrome/tests/browser_focus.html => mobile/xul/chrome/tests/browser_focus.html rename : mobile/chrome/tests/browser_focus.js => mobile/xul/chrome/tests/browser_focus.js rename : mobile/chrome/tests/browser_forms.html => mobile/xul/chrome/tests/browser_forms.html rename : mobile/chrome/tests/browser_forms.js => mobile/xul/chrome/tests/browser_forms.js rename : mobile/chrome/tests/browser_formsZoom.html => mobile/xul/chrome/tests/browser_formsZoom.html rename : mobile/chrome/tests/browser_formsZoom.js => mobile/xul/chrome/tests/browser_formsZoom.js rename : mobile/chrome/tests/browser_history.js => mobile/xul/chrome/tests/browser_history.js rename : mobile/chrome/tests/browser_install.xml => mobile/xul/chrome/tests/browser_install.xml rename : mobile/chrome/tests/browser_localepicker.js => mobile/xul/chrome/tests/browser_localepicker.js rename : mobile/chrome/tests/browser_localepicker_escape.js => mobile/xul/chrome/tests/browser_localepicker_escape.js rename : mobile/chrome/tests/browser_localerepository.js => mobile/xul/chrome/tests/browser_localerepository.js rename : mobile/chrome/tests/browser_localerepository_buildid.js => mobile/xul/chrome/tests/browser_localerepository_buildid.js rename : mobile/chrome/tests/browser_localerepository_pref.js => mobile/xul/chrome/tests/browser_localerepository_pref.js rename : mobile/chrome/tests/browser_mainui.js => mobile/xul/chrome/tests/browser_mainui.js rename : mobile/chrome/tests/browser_navigation.js => mobile/xul/chrome/tests/browser_navigation.js rename : mobile/chrome/tests/browser_preferences_fulltoggle.js => mobile/xul/chrome/tests/browser_preferences_fulltoggle.js rename : mobile/chrome/tests/browser_preferences_text.js => mobile/xul/chrome/tests/browser_preferences_text.js rename : mobile/chrome/tests/browser_rect.js => mobile/xul/chrome/tests/browser_rect.js rename : mobile/chrome/tests/browser_rememberPassword.js => mobile/xul/chrome/tests/browser_rememberPassword.js rename : mobile/chrome/tests/browser_scroll.html => mobile/xul/chrome/tests/browser_scroll.html rename : mobile/chrome/tests/browser_scroll.js => mobile/xul/chrome/tests/browser_scroll.js rename : mobile/chrome/tests/browser_scrollbar.js => mobile/xul/chrome/tests/browser_scrollbar.js rename : mobile/chrome/tests/browser_scrollbar.sjs => mobile/xul/chrome/tests/browser_scrollbar.sjs rename : mobile/chrome/tests/browser_select.html => mobile/xul/chrome/tests/browser_select.html rename : mobile/chrome/tests/browser_select.js => mobile/xul/chrome/tests/browser_select.js rename : mobile/chrome/tests/browser_sessionstore.js => mobile/xul/chrome/tests/browser_sessionstore.js rename : mobile/chrome/tests/browser_sidebars.js => mobile/xul/chrome/tests/browser_sidebars.js rename : mobile/chrome/tests/browser_tabs.js => mobile/xul/chrome/tests/browser_tabs.js rename : mobile/chrome/tests/browser_tap_content.html => mobile/xul/chrome/tests/browser_tap_content.html rename : mobile/chrome/tests/browser_tap_contentedit.html => mobile/xul/chrome/tests/browser_tap_contentedit.html rename : mobile/chrome/tests/browser_tapping.js => mobile/xul/chrome/tests/browser_tapping.js rename : mobile/chrome/tests/browser_tapping_edit.js => mobile/xul/chrome/tests/browser_tapping_edit.js rename : mobile/chrome/tests/browser_test.js => mobile/xul/chrome/tests/browser_test.js rename : mobile/chrome/tests/browser_thumbnails.js => mobile/xul/chrome/tests/browser_thumbnails.js rename : mobile/chrome/tests/browser_title.sjs => mobile/xul/chrome/tests/browser_title.sjs rename : mobile/chrome/tests/browser_upgrade.rdf => mobile/xul/chrome/tests/browser_upgrade.rdf rename : mobile/chrome/tests/browser_viewport.js => mobile/xul/chrome/tests/browser_viewport.js rename : mobile/chrome/tests/browser_viewport.sjs => mobile/xul/chrome/tests/browser_viewport.sjs rename : mobile/chrome/tests/browser_vkb.js => mobile/xul/chrome/tests/browser_vkb.js rename : mobile/chrome/tests/head.js => mobile/xul/chrome/tests/head.js rename : mobile/chrome/tests/locales_list.sjs => mobile/xul/chrome/tests/locales_list.sjs rename : mobile/chrome/tests/mock_autocomplete.json => mobile/xul/chrome/tests/mock_autocomplete.json rename : mobile/chrome/tests/remote_autocomplete.js => mobile/xul/chrome/tests/remote_autocomplete.js rename : mobile/chrome/tests/remote_contentpopup.js => mobile/xul/chrome/tests/remote_contentpopup.js rename : mobile/chrome/tests/remote_focus.js => mobile/xul/chrome/tests/remote_focus.js rename : mobile/chrome/tests/remote_forms.js => mobile/xul/chrome/tests/remote_forms.js rename : mobile/chrome/tests/remote_formsZoom.js => mobile/xul/chrome/tests/remote_formsZoom.js rename : mobile/chrome/tests/remote_head.js => mobile/xul/chrome/tests/remote_head.js rename : mobile/chrome/tests/remote_vkb.js => mobile/xul/chrome/tests/remote_vkb.js rename : mobile/components/AboutRedirector.js => mobile/xul/components/AboutRedirector.js rename : mobile/components/AddonUpdateService.js => mobile/xul/components/AddonUpdateService.js rename : mobile/components/AlertsService.js => mobile/xul/components/AlertsService.js rename : mobile/components/AutoCompleteCache.js => mobile/xul/components/AutoCompleteCache.js rename : mobile/components/BlocklistPrompt.js => mobile/xul/components/BlocklistPrompt.js rename : mobile/components/BrowserCLH.js => mobile/xul/components/BrowserCLH.js rename : mobile/components/BrowserStartup.js => mobile/xul/components/BrowserStartup.js rename : mobile/components/CapturePicker.js => mobile/xul/components/CapturePicker.js rename : mobile/components/ContentDispatchChooser.js => mobile/xul/components/ContentDispatchChooser.js rename : mobile/components/ContentPermissionPrompt.js => mobile/xul/components/ContentPermissionPrompt.js rename : mobile/components/DirectoryProvider.js => mobile/xul/components/DirectoryProvider.js rename : mobile/components/DownloadManagerUI.js => mobile/xul/components/DownloadManagerUI.js rename : mobile/components/FormAutoComplete.js => mobile/xul/components/FormAutoComplete.js rename : mobile/components/HelperAppDialog.js => mobile/xul/components/HelperAppDialog.js rename : mobile/components/LoginManager.js => mobile/xul/components/LoginManager.js rename : mobile/components/LoginManagerPrompter.idl => mobile/xul/components/LoginManagerPrompter.idl rename : mobile/components/LoginManagerPrompter.js => mobile/xul/components/LoginManagerPrompter.js rename : mobile/components/Makefile.in => mobile/xul/components/Makefile.in rename : mobile/components/MobileComponents.manifest => mobile/xul/components/MobileComponents.manifest rename : mobile/components/PromptService.js => mobile/xul/components/PromptService.js rename : mobile/components/SafeBrowsing.js => mobile/xul/components/SafeBrowsing.js rename : mobile/components/SessionStore.idl => mobile/xul/components/SessionStore.idl rename : mobile/components/SessionStore.js => mobile/xul/components/SessionStore.js rename : mobile/components/Sidebar.js => mobile/xul/components/Sidebar.js rename : mobile/components/UpdatePrompt.js => mobile/xul/components/UpdatePrompt.js rename : mobile/components/XPIDialogService.js => mobile/xul/components/XPIDialogService.js rename : mobile/components/build/Makefile.in => mobile/xul/components/build/Makefile.in rename : mobile/components/build/nsBrowserComponents.h => mobile/xul/components/build/nsBrowserComponents.h rename : mobile/components/build/nsBrowserModule.cpp => mobile/xul/components/build/nsBrowserModule.cpp rename : mobile/components/build/nsIShellService.idl => mobile/xul/components/build/nsIShellService.idl rename : mobile/components/build/nsShellService.cpp => mobile/xul/components/build/nsShellService.cpp rename : mobile/components/build/nsShellService.h => mobile/xul/components/build/nsShellService.h rename : mobile/config/mozconfigs/android/debug => mobile/xul/config/mozconfigs/android/debug rename : mobile/config/mozconfigs/android/nightly => mobile/xul/config/mozconfigs/android/nightly rename : mobile/config/mozconfigs/linux-desktop/l10n-mozconfig => mobile/xul/config/mozconfigs/linux-desktop/l10n-mozconfig rename : mobile/config/mozconfigs/linux-desktop/nightly => mobile/xul/config/mozconfigs/linux-desktop/nightly rename : mobile/config/mozconfigs/macosx-desktop/l10n-mozconfig => mobile/xul/config/mozconfigs/macosx-desktop/l10n-mozconfig rename : mobile/config/mozconfigs/macosx-desktop/nightly => mobile/xul/config/mozconfigs/macosx-desktop/nightly rename : mobile/config/mozconfigs/win32-desktop/l10n-mozconfig => mobile/xul/config/mozconfigs/win32-desktop/l10n-mozconfig rename : mobile/config/mozconfigs/win32-desktop/nightly => mobile/xul/config/mozconfigs/win32-desktop/nightly rename : mobile/confvars.sh => mobile/xul/confvars.sh rename : mobile/installer/Makefile.in => mobile/xul/installer/Makefile.in rename : mobile/installer/debian/backup.in => mobile/xul/installer/debian/backup.in rename : mobile/installer/debian/changelog.in => mobile/xul/installer/debian/changelog.in rename : mobile/installer/debian/compat.in => mobile/xul/installer/debian/compat.in rename : mobile/installer/debian/control.in => mobile/xul/installer/debian/control.in rename : mobile/installer/debian/fennec-cud.sh.in => mobile/xul/installer/debian/fennec-cud.sh.in rename : mobile/installer/debian/fennec-rfs.sh.in => mobile/xul/installer/debian/fennec-rfs.sh.in rename : mobile/installer/debian/fennec.aegis.in => mobile/xul/installer/debian/fennec.aegis.in rename : mobile/installer/debian/fennec.conf.in => mobile/xul/installer/debian/fennec.conf.in rename : mobile/installer/debian/fennec.desktop.in => mobile/xul/installer/debian/fennec.desktop.in rename : mobile/installer/debian/fennec.links.in => mobile/xul/installer/debian/fennec.links.in rename : mobile/installer/debian/fennec.policy.in => mobile/xul/installer/debian/fennec.policy.in rename : mobile/installer/debian/fennec.postinst.in => mobile/xul/installer/debian/fennec.postinst.in rename : mobile/installer/debian/fennec.preinst.in => mobile/xul/installer/debian/fennec.preinst.in rename : mobile/installer/debian/fennec.prerm.in => mobile/xul/installer/debian/fennec.prerm.in rename : mobile/installer/debian/fennec.service.in => mobile/xul/installer/debian/fennec.service.in rename : mobile/installer/debian/files.in => mobile/xul/installer/debian/files.in rename : mobile/installer/debian/menu.in => mobile/xul/installer/debian/menu.in rename : mobile/installer/debian/restore.in => mobile/xul/installer/debian/restore.in rename : mobile/installer/mobile-l10n.js => mobile/xul/installer/mobile-l10n.js rename : mobile/installer/package-manifest.in => mobile/xul/installer/package-manifest.in rename : mobile/installer/removed-files.in => mobile/xul/installer/removed-files.in rename : mobile/locales/Makefile.in => mobile/xul/locales/Makefile.in rename : mobile/locales/all-locales => mobile/xul/locales/all-locales rename : mobile/locales/en-US/chrome/about.dtd => mobile/xul/locales/en-US/chrome/about.dtd rename : mobile/locales/en-US/chrome/aboutCertError.dtd => mobile/xul/locales/en-US/chrome/aboutCertError.dtd rename : mobile/locales/en-US/chrome/aboutHome.dtd => mobile/xul/locales/en-US/chrome/aboutHome.dtd rename : mobile/locales/en-US/chrome/browser.dtd => mobile/xul/locales/en-US/chrome/browser.dtd rename : mobile/locales/en-US/chrome/browser.properties => mobile/xul/locales/en-US/chrome/browser.properties rename : mobile/locales/en-US/chrome/checkbox.dtd => mobile/xul/locales/en-US/chrome/checkbox.dtd rename : mobile/locales/en-US/chrome/config.dtd => mobile/xul/locales/en-US/chrome/config.dtd rename : mobile/locales/en-US/chrome/feedback.dtd => mobile/xul/locales/en-US/chrome/feedback.dtd rename : mobile/locales/en-US/chrome/localepicker.properties => mobile/xul/locales/en-US/chrome/localepicker.properties rename : mobile/locales/en-US/chrome/notification.dtd => mobile/xul/locales/en-US/chrome/notification.dtd rename : mobile/locales/en-US/chrome/overrides/appstrings.properties => mobile/xul/locales/en-US/chrome/overrides/appstrings.properties rename : mobile/locales/en-US/chrome/overrides/netError.dtd => mobile/xul/locales/en-US/chrome/overrides/netError.dtd rename : mobile/locales/en-US/chrome/overrides/passwordmgr.properties => mobile/xul/locales/en-US/chrome/overrides/passwordmgr.properties rename : mobile/locales/en-US/chrome/phishing.dtd => mobile/xul/locales/en-US/chrome/phishing.dtd rename : mobile/locales/en-US/chrome/preferences.dtd => mobile/xul/locales/en-US/chrome/preferences.dtd rename : mobile/locales/en-US/chrome/prompt.dtd => mobile/xul/locales/en-US/chrome/prompt.dtd rename : mobile/locales/en-US/chrome/region.properties => mobile/xul/locales/en-US/chrome/region.properties rename : mobile/locales/en-US/chrome/sync.dtd => mobile/xul/locales/en-US/chrome/sync.dtd rename : mobile/locales/en-US/chrome/sync.properties => mobile/xul/locales/en-US/chrome/sync.properties rename : mobile/locales/en-US/chrome/webapps.dtd => mobile/xul/locales/en-US/chrome/webapps.dtd rename : mobile/locales/en-US/crashreporter/crashreporter-override.ini => mobile/xul/locales/en-US/crashreporter/crashreporter-override.ini rename : mobile/locales/en-US/defines.inc => mobile/xul/locales/en-US/defines.inc rename : mobile/locales/en-US/installer/setup.ini => mobile/xul/locales/en-US/installer/setup.ini rename : mobile/locales/en-US/mobile-l10n.js => mobile/xul/locales/en-US/mobile-l10n.js rename : mobile/locales/en-US/profile/bookmarks.inc => mobile/xul/locales/en-US/profile/bookmarks.inc rename : mobile/locales/en-US/searchplugins/amazondotcom.xml => mobile/xul/locales/en-US/searchplugins/amazondotcom.xml rename : mobile/locales/en-US/searchplugins/google.xml => mobile/xul/locales/en-US/searchplugins/google.xml rename : mobile/locales/en-US/searchplugins/list.txt => mobile/xul/locales/en-US/searchplugins/list.txt rename : mobile/locales/en-US/searchplugins/twitter.xml => mobile/xul/locales/en-US/searchplugins/twitter.xml rename : mobile/locales/en-US/searchplugins/wikipedia.xml => mobile/xul/locales/en-US/searchplugins/wikipedia.xml rename : mobile/locales/en-US/searchplugins/yahoo.xml => mobile/xul/locales/en-US/searchplugins/yahoo.xml rename : mobile/locales/en-US/updater/updater.ini => mobile/xul/locales/en-US/updater/updater.ini rename : mobile/locales/filter.py => mobile/xul/locales/filter.py rename : mobile/locales/generic/install.rdf => mobile/xul/locales/generic/install.rdf rename : mobile/locales/generic/profile/bookmarks.json.in => mobile/xul/locales/generic/profile/bookmarks.json.in rename : mobile/locales/jar.mn => mobile/xul/locales/jar.mn rename : mobile/locales/l10n-central.ini => mobile/xul/locales/l10n-central.ini rename : mobile/locales/l10n-mozilla-1.9.2.ini => mobile/xul/locales/l10n-mozilla-1.9.2.ini rename : mobile/locales/l10n-mozilla-2.0.ini => mobile/xul/locales/l10n-mozilla-2.0.ini rename : mobile/locales/l10n.ini => mobile/xul/locales/l10n.ini rename : mobile/locales/maemo-locales => mobile/xul/locales/maemo-locales rename : mobile/makefiles.sh => mobile/xul/makefiles.sh rename : mobile/modules/LocaleRepository.jsm => mobile/xul/modules/LocaleRepository.jsm rename : mobile/modules/Makefile.in => mobile/xul/modules/Makefile.in rename : mobile/modules/contacts.jsm => mobile/xul/modules/contacts.jsm rename : mobile/modules/linuxTypes.jsm => mobile/xul/modules/linuxTypes.jsm rename : mobile/modules/video.jsm => mobile/xul/modules/video.jsm rename : mobile/themes/core/Makefile.in => mobile/xul/themes/core/Makefile.in rename : mobile/themes/core/about.css => mobile/xul/themes/core/about.css rename : mobile/themes/core/aboutHome.css => mobile/xul/themes/core/aboutHome.css rename : mobile/themes/core/aboutPage.css => mobile/xul/themes/core/aboutPage.css rename : mobile/themes/core/browser.css => mobile/xul/themes/core/browser.css rename : mobile/themes/core/config.css => mobile/xul/themes/core/config.css rename : mobile/themes/core/content.css => mobile/xul/themes/core/content.css rename : mobile/themes/core/defines.inc => mobile/xul/themes/core/defines.inc rename : mobile/themes/core/forms.css => mobile/xul/themes/core/forms.css rename : mobile/themes/core/gingerbread/browser.css => mobile/xul/themes/core/gingerbread/browser.css rename : mobile/themes/core/gingerbread/content.css => mobile/xul/themes/core/gingerbread/content.css rename : mobile/themes/core/gingerbread/defines.inc => mobile/xul/themes/core/gingerbread/defines.inc rename : mobile/themes/core/gingerbread/forms.css => mobile/xul/themes/core/gingerbread/forms.css rename : mobile/themes/core/gingerbread/images/aboutBackground.jpg => mobile/xul/themes/core/gingerbread/images/aboutBackground.jpg rename : mobile/themes/core/gingerbread/images/addons-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/addons-default-hdpi.png rename : mobile/themes/core/gingerbread/images/alert-addons-30.png => mobile/xul/themes/core/gingerbread/images/alert-addons-30.png rename : mobile/themes/core/gingerbread/images/alert-downloads-30.png => mobile/xul/themes/core/gingerbread/images/alert-downloads-30.png rename : mobile/themes/core/gingerbread/images/allpages-48.png => mobile/xul/themes/core/gingerbread/images/allpages-48.png rename : mobile/themes/core/gingerbread/images/appmenu-active-hdpi.png => mobile/xul/themes/core/gingerbread/images/appmenu-active-hdpi.png rename : mobile/themes/core/gingerbread/images/appmenu-addons-hdpi.png => mobile/xul/themes/core/gingerbread/images/appmenu-addons-hdpi.png rename : mobile/themes/core/gingerbread/images/appmenu-downloads-hdpi.png => mobile/xul/themes/core/gingerbread/images/appmenu-downloads-hdpi.png rename : mobile/themes/core/gingerbread/images/appmenu-findinpage-hdpi.png => mobile/xul/themes/core/gingerbread/images/appmenu-findinpage-hdpi.png rename : mobile/themes/core/gingerbread/images/appmenu-more-hdpi.png => mobile/xul/themes/core/gingerbread/images/appmenu-more-hdpi.png rename : mobile/themes/core/gingerbread/images/appmenu-preferences-hdpi.png => mobile/xul/themes/core/gingerbread/images/appmenu-preferences-hdpi.png rename : mobile/themes/core/gingerbread/images/appmenu-share-hdpi.png => mobile/xul/themes/core/gingerbread/images/appmenu-share-hdpi.png rename : mobile/themes/core/gingerbread/images/appmenu-site-hdpi.png => mobile/xul/themes/core/gingerbread/images/appmenu-site-hdpi.png rename : mobile/themes/core/gingerbread/images/arrowbox-down.png => mobile/xul/themes/core/gingerbread/images/arrowbox-down.png rename : mobile/themes/core/gingerbread/images/arrowbox-horiz.png => mobile/xul/themes/core/gingerbread/images/arrowbox-horiz.png rename : mobile/themes/core/gingerbread/images/arrowbox-up.png => mobile/xul/themes/core/gingerbread/images/arrowbox-up.png rename : mobile/themes/core/gingerbread/images/arrowdown-16.png => mobile/xul/themes/core/gingerbread/images/arrowdown-16.png rename : mobile/themes/core/gingerbread/images/arrowdowndark-16.png => mobile/xul/themes/core/gingerbread/images/arrowdowndark-16.png rename : mobile/themes/core/gingerbread/images/arrowleft-16.png => mobile/xul/themes/core/gingerbread/images/arrowleft-16.png rename : mobile/themes/core/gingerbread/images/arrowleftdark-16.png => mobile/xul/themes/core/gingerbread/images/arrowleftdark-16.png rename : mobile/themes/core/gingerbread/images/arrowright-16.png => mobile/xul/themes/core/gingerbread/images/arrowright-16.png rename : mobile/themes/core/gingerbread/images/arrowrightdark-16.png => mobile/xul/themes/core/gingerbread/images/arrowrightdark-16.png rename : mobile/themes/core/gingerbread/images/arrowup-16.png => mobile/xul/themes/core/gingerbread/images/arrowup-16.png rename : mobile/themes/core/gingerbread/images/arrowupdark-16.png => mobile/xul/themes/core/gingerbread/images/arrowupdark-16.png rename : mobile/themes/core/gingerbread/images/autocomplete-bookmarked-hdpi.png => mobile/xul/themes/core/gingerbread/images/autocomplete-bookmarked-hdpi.png rename : mobile/themes/core/gingerbread/images/autocomplete-desktop-hdpi.png => mobile/xul/themes/core/gingerbread/images/autocomplete-desktop-hdpi.png rename : mobile/themes/core/gingerbread/images/autocomplete-search-hdpi.png => mobile/xul/themes/core/gingerbread/images/autocomplete-search-hdpi.png rename : mobile/themes/core/gingerbread/images/back-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/back-default-hdpi.png rename : mobile/themes/core/gingerbread/images/bookmark-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/bookmark-default-hdpi.png rename : mobile/themes/core/gingerbread/images/bookmark-starred-hdpi.png => mobile/xul/themes/core/gingerbread/images/bookmark-starred-hdpi.png rename : mobile/themes/core/gingerbread/images/bookmarks-48.png => mobile/xul/themes/core/gingerbread/images/bookmarks-48.png rename : mobile/themes/core/gingerbread/images/browseaddons-bg.jpg => mobile/xul/themes/core/gingerbread/images/browseaddons-bg.jpg rename : mobile/themes/core/gingerbread/images/button-bg.png => mobile/xul/themes/core/gingerbread/images/button-bg.png rename : mobile/themes/core/gingerbread/images/check-30.png => mobile/xul/themes/core/gingerbread/images/check-30.png rename : mobile/themes/core/gingerbread/images/check-selected-hdpi.png => mobile/xul/themes/core/gingerbread/images/check-selected-hdpi.png rename : mobile/themes/core/gingerbread/images/check-unselected-hdpi.png => mobile/xul/themes/core/gingerbread/images/check-unselected-hdpi.png rename : mobile/themes/core/gingerbread/images/close-active-hdpi.png => mobile/xul/themes/core/gingerbread/images/close-active-hdpi.png rename : mobile/themes/core/gingerbread/images/close-active-tablet-hdpi.png => mobile/xul/themes/core/gingerbread/images/close-active-tablet-hdpi.png rename : mobile/themes/core/gingerbread/images/close-background-hdpi-rtl.png => mobile/xul/themes/core/gingerbread/images/close-background-hdpi-rtl.png rename : mobile/themes/core/gingerbread/images/close-background-hdpi.png => mobile/xul/themes/core/gingerbread/images/close-background-hdpi.png rename : mobile/themes/core/gingerbread/images/close-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/close-default-hdpi.png rename : mobile/themes/core/gingerbread/images/close-default-tablet-hdpi.png => mobile/xul/themes/core/gingerbread/images/close-default-tablet-hdpi.png rename : mobile/themes/core/gingerbread/images/close-inactive-tab-hdpi.png => mobile/xul/themes/core/gingerbread/images/close-inactive-tab-hdpi.png rename : mobile/themes/core/gingerbread/images/close-inactive-tab-tablet-hdpi.png => mobile/xul/themes/core/gingerbread/images/close-inactive-tab-tablet-hdpi.png rename : mobile/themes/core/gingerbread/images/console-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/console-default-hdpi.png rename : mobile/themes/core/gingerbread/images/downloads-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/downloads-default-hdpi.png rename : mobile/themes/core/gingerbread/images/dropmarker-hdpi.png => mobile/xul/themes/core/gingerbread/images/dropmarker-hdpi.png rename : mobile/themes/core/gingerbread/images/endcap-active-bg.png => mobile/xul/themes/core/gingerbread/images/endcap-active-bg.png rename : mobile/themes/core/gingerbread/images/endcap-default-bg.png => mobile/xul/themes/core/gingerbread/images/endcap-default-bg.png rename : mobile/themes/core/gingerbread/images/endcap-ev-active-bg.png => mobile/xul/themes/core/gingerbread/images/endcap-ev-active-bg.png rename : mobile/themes/core/gingerbread/images/endcap-ev-default-bg.png => mobile/xul/themes/core/gingerbread/images/endcap-ev-default-bg.png rename : mobile/themes/core/gingerbread/images/endcap-ssl-active-bg.png => mobile/xul/themes/core/gingerbread/images/endcap-ssl-active-bg.png rename : mobile/themes/core/gingerbread/images/endcap-ssl-default-bg.png => mobile/xul/themes/core/gingerbread/images/endcap-ssl-default-bg.png rename : mobile/themes/core/gingerbread/images/errorpage-larry-black.png => mobile/xul/themes/core/gingerbread/images/errorpage-larry-black.png rename : mobile/themes/core/gingerbread/images/errorpage-larry-white.png => mobile/xul/themes/core/gingerbread/images/errorpage-larry-white.png rename : mobile/themes/core/gingerbread/images/errorpage-warning.png => mobile/xul/themes/core/gingerbread/images/errorpage-warning.png rename : mobile/themes/core/gingerbread/images/favicon-default-32.png => mobile/xul/themes/core/gingerbread/images/favicon-default-32.png rename : mobile/themes/core/gingerbread/images/folder-32.png => mobile/xul/themes/core/gingerbread/images/folder-32.png rename : mobile/themes/core/gingerbread/images/forward-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/forward-default-hdpi.png rename : mobile/themes/core/gingerbread/images/handle-end.png => mobile/xul/themes/core/gingerbread/images/handle-end.png rename : mobile/themes/core/gingerbread/images/handle-start.png => mobile/xul/themes/core/gingerbread/images/handle-start.png rename : mobile/themes/core/gingerbread/images/history-48.png => mobile/xul/themes/core/gingerbread/images/history-48.png rename : mobile/themes/core/gingerbread/images/identity-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/identity-default-hdpi.png rename : mobile/themes/core/gingerbread/images/identity-ev-hdpi.png => mobile/xul/themes/core/gingerbread/images/identity-ev-hdpi.png rename : mobile/themes/core/gingerbread/images/identity-ssl-hdpi.png => mobile/xul/themes/core/gingerbread/images/identity-ssl-hdpi.png rename : mobile/themes/core/gingerbread/images/locked-hdpi.png => mobile/xul/themes/core/gingerbread/images/locked-hdpi.png rename : mobile/themes/core/gingerbread/images/mute-hdpi.png => mobile/xul/themes/core/gingerbread/images/mute-hdpi.png rename : mobile/themes/core/gingerbread/images/navigation-magnifier-30.png => mobile/xul/themes/core/gingerbread/images/navigation-magnifier-30.png rename : mobile/themes/core/gingerbread/images/newtab-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/newtab-default-hdpi.png rename : mobile/themes/core/gingerbread/images/newtab-default-tablet-hdpi.png => mobile/xul/themes/core/gingerbread/images/newtab-default-tablet-hdpi.png rename : mobile/themes/core/gingerbread/images/next-disabled-hdpi.png => mobile/xul/themes/core/gingerbread/images/next-disabled-hdpi.png rename : mobile/themes/core/gingerbread/images/next-hdpi.png => mobile/xul/themes/core/gingerbread/images/next-hdpi.png rename : mobile/themes/core/gingerbread/images/pause-hdpi.png => mobile/xul/themes/core/gingerbread/images/pause-hdpi.png rename : mobile/themes/core/gingerbread/images/play-hdpi.png => mobile/xul/themes/core/gingerbread/images/play-hdpi.png rename : mobile/themes/core/gingerbread/images/popup-selected-item-hdpi.png => mobile/xul/themes/core/gingerbread/images/popup-selected-item-hdpi.png rename : mobile/themes/core/gingerbread/images/preferences-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/preferences-default-hdpi.png rename : mobile/themes/core/gingerbread/images/previous-disabled-hdpi.png => mobile/xul/themes/core/gingerbread/images/previous-disabled-hdpi.png rename : mobile/themes/core/gingerbread/images/previous-hdpi.png => mobile/xul/themes/core/gingerbread/images/previous-hdpi.png rename : mobile/themes/core/gingerbread/images/radio-selected-hdpi.png => mobile/xul/themes/core/gingerbread/images/radio-selected-hdpi.png rename : mobile/themes/core/gingerbread/images/radio-unselected-hdpi.png => mobile/xul/themes/core/gingerbread/images/radio-unselected-hdpi.png rename : mobile/themes/core/gingerbread/images/reload-hdpi.png => mobile/xul/themes/core/gingerbread/images/reload-hdpi.png rename : mobile/themes/core/gingerbread/images/remotetabs-32.png => mobile/xul/themes/core/gingerbread/images/remotetabs-32.png rename : mobile/themes/core/gingerbread/images/remotetabs-48.png => mobile/xul/themes/core/gingerbread/images/remotetabs-48.png rename : mobile/themes/core/gingerbread/images/row-header-bg.png => mobile/xul/themes/core/gingerbread/images/row-header-bg.png rename : mobile/themes/core/gingerbread/images/scrubber-hdpi.png => mobile/xul/themes/core/gingerbread/images/scrubber-hdpi.png rename : mobile/themes/core/gingerbread/images/search-clear-30.png => mobile/xul/themes/core/gingerbread/images/search-clear-30.png rename : mobile/themes/core/gingerbread/images/search-glass-30.png => mobile/xul/themes/core/gingerbread/images/search-glass-30.png rename : mobile/themes/core/gingerbread/images/settings-default-hdpi.png => mobile/xul/themes/core/gingerbread/images/settings-default-hdpi.png rename : mobile/themes/core/gingerbread/images/stop-hdpi.png => mobile/xul/themes/core/gingerbread/images/stop-hdpi.png rename : mobile/themes/core/gingerbread/images/tab-active-hdpi.png => mobile/xul/themes/core/gingerbread/images/tab-active-hdpi.png rename : mobile/themes/core/gingerbread/images/tab-closed-hdpi.png => mobile/xul/themes/core/gingerbread/images/tab-closed-hdpi.png rename : mobile/themes/core/gingerbread/images/tab-inactive-hdpi.png => mobile/xul/themes/core/gingerbread/images/tab-inactive-hdpi.png rename : mobile/themes/core/gingerbread/images/tab-reopen-hdpi.png => mobile/xul/themes/core/gingerbread/images/tab-reopen-hdpi.png rename : mobile/themes/core/gingerbread/images/tab-reopen-tablet-hdpi.png => mobile/xul/themes/core/gingerbread/images/tab-reopen-tablet-hdpi.png rename : mobile/themes/core/gingerbread/images/task-back-hdpi.png => mobile/xul/themes/core/gingerbread/images/task-back-hdpi.png rename : mobile/themes/core/gingerbread/images/task-back-rtl-hdpi.png => mobile/xul/themes/core/gingerbread/images/task-back-rtl-hdpi.png rename : mobile/themes/core/gingerbread/images/task-close-hdpi.png => mobile/xul/themes/core/gingerbread/images/task-close-hdpi.png rename : mobile/themes/core/gingerbread/images/task-switch-hdpi.png => mobile/xul/themes/core/gingerbread/images/task-switch-hdpi.png rename : mobile/themes/core/gingerbread/images/textbox-bg.png => mobile/xul/themes/core/gingerbread/images/textbox-bg.png rename : mobile/themes/core/gingerbread/images/throbber.png => mobile/xul/themes/core/gingerbread/images/throbber.png rename : mobile/themes/core/gingerbread/images/toggle-off.png => mobile/xul/themes/core/gingerbread/images/toggle-off.png rename : mobile/themes/core/gingerbread/images/toggle-on.png => mobile/xul/themes/core/gingerbread/images/toggle-on.png rename : mobile/themes/core/gingerbread/images/unlocked-hdpi.png => mobile/xul/themes/core/gingerbread/images/unlocked-hdpi.png rename : mobile/themes/core/gingerbread/images/unmute-hdpi.png => mobile/xul/themes/core/gingerbread/images/unmute-hdpi.png rename : mobile/themes/core/gingerbread/images/urlbar-bg.png => mobile/xul/themes/core/gingerbread/images/urlbar-bg.png rename : mobile/themes/core/gingerbread/localePicker.css => mobile/xul/themes/core/gingerbread/localePicker.css rename : mobile/themes/core/gingerbread/platform.css => mobile/xul/themes/core/gingerbread/platform.css rename : mobile/themes/core/header.css => mobile/xul/themes/core/header.css rename : mobile/themes/core/honeycomb/browser.css => mobile/xul/themes/core/honeycomb/browser.css rename : mobile/themes/core/honeycomb/defines.inc => mobile/xul/themes/core/honeycomb/defines.inc rename : mobile/themes/core/honeycomb/forms.css => mobile/xul/themes/core/honeycomb/forms.css rename : mobile/themes/core/honeycomb/images/aboutBackground.jpg => mobile/xul/themes/core/honeycomb/images/aboutBackground.jpg rename : mobile/themes/core/honeycomb/images/addons-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/addons-default-hdpi.png rename : mobile/themes/core/honeycomb/images/alert-addons-30.png => mobile/xul/themes/core/honeycomb/images/alert-addons-30.png rename : mobile/themes/core/honeycomb/images/alert-downloads-30.png => mobile/xul/themes/core/honeycomb/images/alert-downloads-30.png rename : mobile/themes/core/honeycomb/images/allpages-48.png => mobile/xul/themes/core/honeycomb/images/allpages-48.png rename : mobile/themes/core/honeycomb/images/appmenu-active-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-active-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-addons-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-addons-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-addsearch-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-addsearch-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-downloads-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-downloads-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-findinpage-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-findinpage-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-more-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-more-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-preferences-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-preferences-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-saveas-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-saveas-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-share-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-share-hdpi.png rename : mobile/themes/core/honeycomb/images/appmenu-site-hdpi.png => mobile/xul/themes/core/honeycomb/images/appmenu-site-hdpi.png rename : mobile/themes/core/honeycomb/images/arrowbox-down.png => mobile/xul/themes/core/honeycomb/images/arrowbox-down.png rename : mobile/themes/core/honeycomb/images/arrowbox-horiz.png => mobile/xul/themes/core/honeycomb/images/arrowbox-horiz.png rename : mobile/themes/core/honeycomb/images/arrowbox-up.png => mobile/xul/themes/core/honeycomb/images/arrowbox-up.png rename : mobile/themes/core/honeycomb/images/arrowdown-16.png => mobile/xul/themes/core/honeycomb/images/arrowdown-16.png rename : mobile/themes/core/honeycomb/images/arrowdowndark-16.png => mobile/xul/themes/core/honeycomb/images/arrowdowndark-16.png rename : mobile/themes/core/honeycomb/images/arrowleft-16.png => mobile/xul/themes/core/honeycomb/images/arrowleft-16.png rename : mobile/themes/core/honeycomb/images/arrowleftdark-16.png => mobile/xul/themes/core/honeycomb/images/arrowleftdark-16.png rename : mobile/themes/core/honeycomb/images/arrowright-16.png => mobile/xul/themes/core/honeycomb/images/arrowright-16.png rename : mobile/themes/core/honeycomb/images/arrowrightdark-16.png => mobile/xul/themes/core/honeycomb/images/arrowrightdark-16.png rename : mobile/themes/core/honeycomb/images/arrowup-16.png => mobile/xul/themes/core/honeycomb/images/arrowup-16.png rename : mobile/themes/core/honeycomb/images/arrowupdark-16.png => mobile/xul/themes/core/honeycomb/images/arrowupdark-16.png rename : mobile/themes/core/honeycomb/images/autocomplete-all-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-all-hdpi.png rename : mobile/themes/core/honeycomb/images/autocomplete-all-selected-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-all-selected-hdpi.png rename : mobile/themes/core/honeycomb/images/autocomplete-bookmarked-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-bookmarked-hdpi.png rename : mobile/themes/core/honeycomb/images/autocomplete-bookmarked-selected-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-bookmarked-selected-hdpi.png rename : mobile/themes/core/honeycomb/images/autocomplete-desktop-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-desktop-hdpi.png rename : mobile/themes/core/honeycomb/images/autocomplete-desktop-selected-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-desktop-selected-hdpi.png rename : mobile/themes/core/honeycomb/images/autocomplete-history-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-history-hdpi.png rename : mobile/themes/core/honeycomb/images/autocomplete-history-selected-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-history-selected-hdpi.png rename : mobile/themes/core/honeycomb/images/autocomplete-search-hdpi.png => mobile/xul/themes/core/honeycomb/images/autocomplete-search-hdpi.png rename : mobile/themes/core/honeycomb/images/back-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/back-default-hdpi.png rename : mobile/themes/core/honeycomb/images/bookmark-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/bookmark-default-hdpi.png rename : mobile/themes/core/honeycomb/images/bookmark-starred-hdpi.png => mobile/xul/themes/core/honeycomb/images/bookmark-starred-hdpi.png rename : mobile/themes/core/honeycomb/images/bookmarks-48.png => mobile/xul/themes/core/honeycomb/images/bookmarks-48.png rename : mobile/themes/core/honeycomb/images/browseaddons-bg.jpg => mobile/xul/themes/core/honeycomb/images/browseaddons-bg.jpg rename : mobile/themes/core/honeycomb/images/button-bg.png => mobile/xul/themes/core/honeycomb/images/button-bg.png rename : mobile/themes/core/honeycomb/images/check-selected-hdpi.png => mobile/xul/themes/core/honeycomb/images/check-selected-hdpi.png rename : mobile/themes/core/honeycomb/images/check-selected-tap-hdpi.png => mobile/xul/themes/core/honeycomb/images/check-selected-tap-hdpi.png rename : mobile/themes/core/honeycomb/images/check-unselected-hdpi.png => mobile/xul/themes/core/honeycomb/images/check-unselected-hdpi.png rename : mobile/themes/core/honeycomb/images/check-unselected-tap-hdpi.png => mobile/xul/themes/core/honeycomb/images/check-unselected-tap-hdpi.png rename : mobile/themes/core/honeycomb/images/close-active-hdpi.png => mobile/xul/themes/core/honeycomb/images/close-active-hdpi.png rename : mobile/themes/core/honeycomb/images/close-active-tablet-hdpi.png => mobile/xul/themes/core/honeycomb/images/close-active-tablet-hdpi.png rename : mobile/themes/core/honeycomb/images/close-background-hdpi-rtl.png => mobile/xul/themes/core/honeycomb/images/close-background-hdpi-rtl.png rename : mobile/themes/core/honeycomb/images/close-background-hdpi.png => mobile/xul/themes/core/honeycomb/images/close-background-hdpi.png rename : mobile/themes/core/honeycomb/images/close-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/close-default-hdpi.png rename : mobile/themes/core/honeycomb/images/close-default-tablet-hdpi.png => mobile/xul/themes/core/honeycomb/images/close-default-tablet-hdpi.png rename : mobile/themes/core/honeycomb/images/close-inactive-tab-hdpi.png => mobile/xul/themes/core/honeycomb/images/close-inactive-tab-hdpi.png rename : mobile/themes/core/honeycomb/images/close-inactive-tab-tablet-hdpi.png => mobile/xul/themes/core/honeycomb/images/close-inactive-tab-tablet-hdpi.png rename : mobile/themes/core/honeycomb/images/console-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/console-default-hdpi.png rename : mobile/themes/core/honeycomb/images/downloads-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/downloads-default-hdpi.png rename : mobile/themes/core/honeycomb/images/dropmarker-hdpi.png => mobile/xul/themes/core/honeycomb/images/dropmarker-hdpi.png rename : mobile/themes/core/honeycomb/images/errorpage-larry-black.png => mobile/xul/themes/core/honeycomb/images/errorpage-larry-black.png rename : mobile/themes/core/honeycomb/images/errorpage-larry-white.png => mobile/xul/themes/core/honeycomb/images/errorpage-larry-white.png rename : mobile/themes/core/honeycomb/images/errorpage-warning.png => mobile/xul/themes/core/honeycomb/images/errorpage-warning.png rename : mobile/themes/core/honeycomb/images/favicon-default-32.png => mobile/xul/themes/core/honeycomb/images/favicon-default-32.png rename : mobile/themes/core/honeycomb/images/folder-32.png => mobile/xul/themes/core/honeycomb/images/folder-32.png rename : mobile/themes/core/honeycomb/images/forward-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/forward-default-hdpi.png rename : mobile/themes/core/honeycomb/images/history-48.png => mobile/xul/themes/core/honeycomb/images/history-48.png rename : mobile/themes/core/honeycomb/images/identity-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/identity-default-hdpi.png rename : mobile/themes/core/honeycomb/images/identity-ev-hdpi.png => mobile/xul/themes/core/honeycomb/images/identity-ev-hdpi.png rename : mobile/themes/core/honeycomb/images/identity-ssl-hdpi.png => mobile/xul/themes/core/honeycomb/images/identity-ssl-hdpi.png rename : mobile/themes/core/honeycomb/images/locked-hdpi.png => mobile/xul/themes/core/honeycomb/images/locked-hdpi.png rename : mobile/themes/core/honeycomb/images/menu-hdpi.png => mobile/xul/themes/core/honeycomb/images/menu-hdpi.png rename : mobile/themes/core/honeycomb/images/menu-top-insideglow-green.png => mobile/xul/themes/core/honeycomb/images/menu-top-insideglow-green.png rename : mobile/themes/core/honeycomb/images/menu-top-insideglow-grey.png => mobile/xul/themes/core/honeycomb/images/menu-top-insideglow-grey.png rename : mobile/themes/core/honeycomb/images/menu-top-insideglow.png => mobile/xul/themes/core/honeycomb/images/menu-top-insideglow.png rename : mobile/themes/core/honeycomb/images/mute-hdpi.png => mobile/xul/themes/core/honeycomb/images/mute-hdpi.png rename : mobile/themes/core/honeycomb/images/navigation-magnifier-30.png => mobile/xul/themes/core/honeycomb/images/navigation-magnifier-30.png rename : mobile/themes/core/honeycomb/images/newtab-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/newtab-default-hdpi.png rename : mobile/themes/core/honeycomb/images/newtab-default-tablet-hdpi.png => mobile/xul/themes/core/honeycomb/images/newtab-default-tablet-hdpi.png rename : mobile/themes/core/honeycomb/images/newtab-tabmenu-tablet-hdpi.png => mobile/xul/themes/core/honeycomb/images/newtab-tabmenu-tablet-hdpi.png rename : mobile/themes/core/honeycomb/images/next-disabled-hdpi.png => mobile/xul/themes/core/honeycomb/images/next-disabled-hdpi.png rename : mobile/themes/core/honeycomb/images/next-hdpi.png => mobile/xul/themes/core/honeycomb/images/next-hdpi.png rename : mobile/themes/core/honeycomb/images/panelrow-active-hdpi.png => mobile/xul/themes/core/honeycomb/images/panelrow-active-hdpi.png rename : mobile/themes/core/honeycomb/images/panelrow-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/panelrow-default-hdpi.png rename : mobile/themes/core/honeycomb/images/panelrow-selected-hdpi.png => mobile/xul/themes/core/honeycomb/images/panelrow-selected-hdpi.png rename : mobile/themes/core/honeycomb/images/pause-hdpi.png => mobile/xul/themes/core/honeycomb/images/pause-hdpi.png rename : mobile/themes/core/honeycomb/images/play-hdpi.png => mobile/xul/themes/core/honeycomb/images/play-hdpi.png rename : mobile/themes/core/honeycomb/images/popup-bg-hdpi.png => mobile/xul/themes/core/honeycomb/images/popup-bg-hdpi.png rename : mobile/themes/core/honeycomb/images/popup-selected-item-hdpi.png => mobile/xul/themes/core/honeycomb/images/popup-selected-item-hdpi.png rename : mobile/themes/core/honeycomb/images/preferences-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/preferences-default-hdpi.png rename : mobile/themes/core/honeycomb/images/previous-disabled-hdpi.png => mobile/xul/themes/core/honeycomb/images/previous-disabled-hdpi.png rename : mobile/themes/core/honeycomb/images/previous-hdpi.png => mobile/xul/themes/core/honeycomb/images/previous-hdpi.png rename : mobile/themes/core/honeycomb/images/reload-hdpi.png => mobile/xul/themes/core/honeycomb/images/reload-hdpi.png rename : mobile/themes/core/honeycomb/images/remotetabs-32.png => mobile/xul/themes/core/honeycomb/images/remotetabs-32.png rename : mobile/themes/core/honeycomb/images/remotetabs-48.png => mobile/xul/themes/core/honeycomb/images/remotetabs-48.png rename : mobile/themes/core/honeycomb/images/row-header-bg.png => mobile/xul/themes/core/honeycomb/images/row-header-bg.png rename : mobile/themes/core/honeycomb/images/scrubber-hdpi.png => mobile/xul/themes/core/honeycomb/images/scrubber-hdpi.png rename : mobile/themes/core/honeycomb/images/search-clear-30.png => mobile/xul/themes/core/honeycomb/images/search-clear-30.png rename : mobile/themes/core/honeycomb/images/search-glass-30.png => mobile/xul/themes/core/honeycomb/images/search-glass-30.png rename : mobile/themes/core/honeycomb/images/settings-default-hdpi.png => mobile/xul/themes/core/honeycomb/images/settings-default-hdpi.png rename : mobile/themes/core/honeycomb/images/sidebarbutton-active-hdpi.png => mobile/xul/themes/core/honeycomb/images/sidebarbutton-active-hdpi.png rename : mobile/themes/core/honeycomb/images/stop-hdpi.png => mobile/xul/themes/core/honeycomb/images/stop-hdpi.png rename : mobile/themes/core/honeycomb/images/tab-active-hdpi.png => mobile/xul/themes/core/honeycomb/images/tab-active-hdpi.png rename : mobile/themes/core/honeycomb/images/tab-closed-hdpi.png => mobile/xul/themes/core/honeycomb/images/tab-closed-hdpi.png rename : mobile/themes/core/honeycomb/images/tab-inactive-hdpi.png => mobile/xul/themes/core/honeycomb/images/tab-inactive-hdpi.png rename : mobile/themes/core/honeycomb/images/tab-reopen-hdpi.png => mobile/xul/themes/core/honeycomb/images/tab-reopen-hdpi.png rename : mobile/themes/core/honeycomb/images/tab-reopen-tablet-hdpi.png => mobile/xul/themes/core/honeycomb/images/tab-reopen-tablet-hdpi.png rename : mobile/themes/core/honeycomb/images/tabs-default-bg-rtl.png => mobile/xul/themes/core/honeycomb/images/tabs-default-bg-rtl.png rename : mobile/themes/core/honeycomb/images/tabs-default-bg.png => mobile/xul/themes/core/honeycomb/images/tabs-default-bg.png rename : mobile/themes/core/honeycomb/images/tabs-hdpi.png => mobile/xul/themes/core/honeycomb/images/tabs-hdpi.png rename : mobile/themes/core/honeycomb/images/tabs-selected-bg-rtl.png => mobile/xul/themes/core/honeycomb/images/tabs-selected-bg-rtl.png rename : mobile/themes/core/honeycomb/images/tabs-selected-bg.png => mobile/xul/themes/core/honeycomb/images/tabs-selected-bg.png rename : mobile/themes/core/honeycomb/images/task-back-hdpi.png => mobile/xul/themes/core/honeycomb/images/task-back-hdpi.png rename : mobile/themes/core/honeycomb/images/task-back-rtl-hdpi.png => mobile/xul/themes/core/honeycomb/images/task-back-rtl-hdpi.png rename : mobile/themes/core/honeycomb/images/task-close-hdpi.png => mobile/xul/themes/core/honeycomb/images/task-close-hdpi.png rename : mobile/themes/core/honeycomb/images/task-switch-hdpi.png => mobile/xul/themes/core/honeycomb/images/task-switch-hdpi.png rename : mobile/themes/core/honeycomb/images/textbox-bg.png => mobile/xul/themes/core/honeycomb/images/textbox-bg.png rename : mobile/themes/core/honeycomb/images/throbber.png => mobile/xul/themes/core/honeycomb/images/throbber.png rename : mobile/themes/core/honeycomb/images/toggle-off.png => mobile/xul/themes/core/honeycomb/images/toggle-off.png rename : mobile/themes/core/honeycomb/images/toggle-on.png => mobile/xul/themes/core/honeycomb/images/toggle-on.png rename : mobile/themes/core/honeycomb/images/unlocked-hdpi.png => mobile/xul/themes/core/honeycomb/images/unlocked-hdpi.png rename : mobile/themes/core/honeycomb/images/unmute-hdpi.png => mobile/xul/themes/core/honeycomb/images/unmute-hdpi.png rename : mobile/themes/core/honeycomb/images/urlbar-border-bottom-active.png => mobile/xul/themes/core/honeycomb/images/urlbar-border-bottom-active.png rename : mobile/themes/core/honeycomb/images/urlbar-border-bottom.png => mobile/xul/themes/core/honeycomb/images/urlbar-border-bottom.png rename : mobile/themes/core/honeycomb/images/urlbar-border-side-active.png => mobile/xul/themes/core/honeycomb/images/urlbar-border-side-active.png rename : mobile/themes/core/honeycomb/images/urlbar-border-side.png => mobile/xul/themes/core/honeycomb/images/urlbar-border-side.png rename : mobile/themes/core/honeycomb/platform.css => mobile/xul/themes/core/honeycomb/platform.css rename : mobile/themes/core/images/aboutBackground.jpg => mobile/xul/themes/core/images/aboutBackground.jpg rename : mobile/themes/core/images/addons-32.png => mobile/xul/themes/core/images/addons-32.png rename : mobile/themes/core/images/addons-default-hdpi.png => mobile/xul/themes/core/images/addons-default-hdpi.png rename : mobile/themes/core/images/alert-addons-30.png => mobile/xul/themes/core/images/alert-addons-30.png rename : mobile/themes/core/images/alert-downloads-30.png => mobile/xul/themes/core/images/alert-downloads-30.png rename : mobile/themes/core/images/allpages-48.png => mobile/xul/themes/core/images/allpages-48.png rename : mobile/themes/core/images/appmenu-active-hdpi.png => mobile/xul/themes/core/images/appmenu-active-hdpi.png rename : mobile/themes/core/images/appmenu-addons-hdpi.png => mobile/xul/themes/core/images/appmenu-addons-hdpi.png rename : mobile/themes/core/images/appmenu-downloads-hdpi.png => mobile/xul/themes/core/images/appmenu-downloads-hdpi.png rename : mobile/themes/core/images/appmenu-findinpage-hdpi.png => mobile/xul/themes/core/images/appmenu-findinpage-hdpi.png rename : mobile/themes/core/images/appmenu-more-hdpi.png => mobile/xul/themes/core/images/appmenu-more-hdpi.png rename : mobile/themes/core/images/appmenu-preferences-hdpi.png => mobile/xul/themes/core/images/appmenu-preferences-hdpi.png rename : mobile/themes/core/images/appmenu-share-hdpi.png => mobile/xul/themes/core/images/appmenu-share-hdpi.png rename : mobile/themes/core/images/appmenu-site-hdpi.png => mobile/xul/themes/core/images/appmenu-site-hdpi.png rename : mobile/themes/core/images/arrowbox-down.png => mobile/xul/themes/core/images/arrowbox-down.png rename : mobile/themes/core/images/arrowbox-horiz.png => mobile/xul/themes/core/images/arrowbox-horiz.png rename : mobile/themes/core/images/arrowbox-up.png => mobile/xul/themes/core/images/arrowbox-up.png rename : mobile/themes/core/images/arrowdown-16.png => mobile/xul/themes/core/images/arrowdown-16.png rename : mobile/themes/core/images/arrowdowndark-16.png => mobile/xul/themes/core/images/arrowdowndark-16.png rename : mobile/themes/core/images/arrowleft-16.png => mobile/xul/themes/core/images/arrowleft-16.png rename : mobile/themes/core/images/arrowleftdark-16.png => mobile/xul/themes/core/images/arrowleftdark-16.png rename : mobile/themes/core/images/arrowright-16.png => mobile/xul/themes/core/images/arrowright-16.png rename : mobile/themes/core/images/arrowrightdark-16.png => mobile/xul/themes/core/images/arrowrightdark-16.png rename : mobile/themes/core/images/arrowup-16.png => mobile/xul/themes/core/images/arrowup-16.png rename : mobile/themes/core/images/arrowupdark-16.png => mobile/xul/themes/core/images/arrowupdark-16.png rename : mobile/themes/core/images/aurora-lightbox-bg.jpg => mobile/xul/themes/core/images/aurora-lightbox-bg.jpg rename : mobile/themes/core/images/aurora-lightbox-close.png => mobile/xul/themes/core/images/aurora-lightbox-close.png rename : mobile/themes/core/images/aurora-lightbox-logo.png => mobile/xul/themes/core/images/aurora-lightbox-logo.png rename : mobile/themes/core/images/autocomplete-bookmarked-hdpi.png => mobile/xul/themes/core/images/autocomplete-bookmarked-hdpi.png rename : mobile/themes/core/images/autocomplete-desktop-hdpi.png => mobile/xul/themes/core/images/autocomplete-desktop-hdpi.png rename : mobile/themes/core/images/autocomplete-search-hdpi.png => mobile/xul/themes/core/images/autocomplete-search-hdpi.png rename : mobile/themes/core/images/back-default-hdpi.png => mobile/xul/themes/core/images/back-default-hdpi.png rename : mobile/themes/core/images/bookmark-default-hdpi.png => mobile/xul/themes/core/images/bookmark-default-hdpi.png rename : mobile/themes/core/images/bookmark-starred-hdpi.png => mobile/xul/themes/core/images/bookmark-starred-hdpi.png rename : mobile/themes/core/images/bookmarks-48.png => mobile/xul/themes/core/images/bookmarks-48.png rename : mobile/themes/core/images/browseaddons-bg.jpg => mobile/xul/themes/core/images/browseaddons-bg.jpg rename : mobile/themes/core/images/button-bg.png => mobile/xul/themes/core/images/button-bg.png rename : mobile/themes/core/images/check-30.png => mobile/xul/themes/core/images/check-30.png rename : mobile/themes/core/images/check-selected-30.png => mobile/xul/themes/core/images/check-selected-30.png rename : mobile/themes/core/images/check-unselected-30.png => mobile/xul/themes/core/images/check-unselected-30.png rename : mobile/themes/core/images/checkmark-hdpi.png => mobile/xul/themes/core/images/checkmark-hdpi.png rename : mobile/themes/core/images/close-active-hdpi.png => mobile/xul/themes/core/images/close-active-hdpi.png rename : mobile/themes/core/images/close-active-tablet-hdpi.png => mobile/xul/themes/core/images/close-active-tablet-hdpi.png rename : mobile/themes/core/images/close-background-hdpi-rtl.png => mobile/xul/themes/core/images/close-background-hdpi-rtl.png rename : mobile/themes/core/images/close-background-hdpi.png => mobile/xul/themes/core/images/close-background-hdpi.png rename : mobile/themes/core/images/close-default-hdpi.png => mobile/xul/themes/core/images/close-default-hdpi.png rename : mobile/themes/core/images/close-default-tablet-hdpi.png => mobile/xul/themes/core/images/close-default-tablet-hdpi.png rename : mobile/themes/core/images/close-inactive-tab-hdpi.png => mobile/xul/themes/core/images/close-inactive-tab-hdpi.png rename : mobile/themes/core/images/close-inactive-tab-tablet-hdpi.png => mobile/xul/themes/core/images/close-inactive-tab-tablet-hdpi.png rename : mobile/themes/core/images/console-default-hdpi.png => mobile/xul/themes/core/images/console-default-hdpi.png rename : mobile/themes/core/images/downloads-default-hdpi.png => mobile/xul/themes/core/images/downloads-default-hdpi.png rename : mobile/themes/core/images/dropmarker-hdpi.png => mobile/xul/themes/core/images/dropmarker-hdpi.png rename : mobile/themes/core/images/endcap-active-bg.png => mobile/xul/themes/core/images/endcap-active-bg.png rename : mobile/themes/core/images/endcap-default-bg.png => mobile/xul/themes/core/images/endcap-default-bg.png rename : mobile/themes/core/images/endcap-ev-active-bg.png => mobile/xul/themes/core/images/endcap-ev-active-bg.png rename : mobile/themes/core/images/endcap-ev-default-bg.png => mobile/xul/themes/core/images/endcap-ev-default-bg.png rename : mobile/themes/core/images/endcap-ssl-active-bg.png => mobile/xul/themes/core/images/endcap-ssl-active-bg.png rename : mobile/themes/core/images/endcap-ssl-default-bg.png => mobile/xul/themes/core/images/endcap-ssl-default-bg.png rename : mobile/themes/core/images/errorpage-larry-black.png => mobile/xul/themes/core/images/errorpage-larry-black.png rename : mobile/themes/core/images/errorpage-larry-white.png => mobile/xul/themes/core/images/errorpage-larry-white.png rename : mobile/themes/core/images/errorpage-warning.png => mobile/xul/themes/core/images/errorpage-warning.png rename : mobile/themes/core/images/favicon-default-32.png => mobile/xul/themes/core/images/favicon-default-32.png rename : mobile/themes/core/images/folder-32.png => mobile/xul/themes/core/images/folder-32.png rename : mobile/themes/core/images/forward-default-hdpi.png => mobile/xul/themes/core/images/forward-default-hdpi.png rename : mobile/themes/core/images/handle-end.png => mobile/xul/themes/core/images/handle-end.png rename : mobile/themes/core/images/handle-start.png => mobile/xul/themes/core/images/handle-start.png rename : mobile/themes/core/images/history-48.png => mobile/xul/themes/core/images/history-48.png rename : mobile/themes/core/images/homescreen-blank-hdpi.png => mobile/xul/themes/core/images/homescreen-blank-hdpi.png rename : mobile/themes/core/images/homescreen-default-hdpi.png => mobile/xul/themes/core/images/homescreen-default-hdpi.png rename : mobile/themes/core/images/identity-default-hdpi.png => mobile/xul/themes/core/images/identity-default-hdpi.png rename : mobile/themes/core/images/identity-ev-hdpi.png => mobile/xul/themes/core/images/identity-ev-hdpi.png rename : mobile/themes/core/images/identity-ssl-hdpi.png => mobile/xul/themes/core/images/identity-ssl-hdpi.png rename : mobile/themes/core/images/locked-hdpi.png => mobile/xul/themes/core/images/locked-hdpi.png rename : mobile/themes/core/images/menu-hdpi.png => mobile/xul/themes/core/images/menu-hdpi.png rename : mobile/themes/core/images/mozilla-32.png => mobile/xul/themes/core/images/mozilla-32.png rename : mobile/themes/core/images/mute-hdpi.png => mobile/xul/themes/core/images/mute-hdpi.png rename : mobile/themes/core/images/navigation-magnifier-30.png => mobile/xul/themes/core/images/navigation-magnifier-30.png rename : mobile/themes/core/images/newtab-default-hdpi.png => mobile/xul/themes/core/images/newtab-default-hdpi.png rename : mobile/themes/core/images/newtab-default-tablet-hdpi.png => mobile/xul/themes/core/images/newtab-default-tablet-hdpi.png rename : mobile/themes/core/images/next-disabled-hdpi.png => mobile/xul/themes/core/images/next-disabled-hdpi.png rename : mobile/themes/core/images/next-hdpi.png => mobile/xul/themes/core/images/next-hdpi.png rename : mobile/themes/core/images/panelrow-active-hdpi.png => mobile/xul/themes/core/images/panelrow-active-hdpi.png rename : mobile/themes/core/images/panelrow-default-hdpi.png => mobile/xul/themes/core/images/panelrow-default-hdpi.png rename : mobile/themes/core/images/panelrow-selected-hdpi.png => mobile/xul/themes/core/images/panelrow-selected-hdpi.png rename : mobile/themes/core/images/pause-hdpi.png => mobile/xul/themes/core/images/pause-hdpi.png rename : mobile/themes/core/images/play-hdpi.png => mobile/xul/themes/core/images/play-hdpi.png rename : mobile/themes/core/images/popup-bg-hdpi.png => mobile/xul/themes/core/images/popup-bg-hdpi.png rename : mobile/themes/core/images/popup-selected-item-hdpi.png => mobile/xul/themes/core/images/popup-selected-item-hdpi.png rename : mobile/themes/core/images/preferences-default-hdpi.png => mobile/xul/themes/core/images/preferences-default-hdpi.png rename : mobile/themes/core/images/previous-disabled-hdpi.png => mobile/xul/themes/core/images/previous-disabled-hdpi.png rename : mobile/themes/core/images/previous-hdpi.png => mobile/xul/themes/core/images/previous-hdpi.png rename : mobile/themes/core/images/ratings-18.png => mobile/xul/themes/core/images/ratings-18.png rename : mobile/themes/core/images/reload-hdpi.png => mobile/xul/themes/core/images/reload-hdpi.png rename : mobile/themes/core/images/remotetabs-32.png => mobile/xul/themes/core/images/remotetabs-32.png rename : mobile/themes/core/images/remotetabs-48.png => mobile/xul/themes/core/images/remotetabs-48.png rename : mobile/themes/core/images/row-header-bg.png => mobile/xul/themes/core/images/row-header-bg.png rename : mobile/themes/core/images/scrubber-hdpi.png => mobile/xul/themes/core/images/scrubber-hdpi.png rename : mobile/themes/core/images/search-clear-30.png => mobile/xul/themes/core/images/search-clear-30.png rename : mobile/themes/core/images/search-glass-30.png => mobile/xul/themes/core/images/search-glass-30.png rename : mobile/themes/core/images/section-collapsed-16.png => mobile/xul/themes/core/images/section-collapsed-16.png rename : mobile/themes/core/images/section-expanded-16.png => mobile/xul/themes/core/images/section-expanded-16.png rename : mobile/themes/core/images/settings-default-hdpi.png => mobile/xul/themes/core/images/settings-default-hdpi.png rename : mobile/themes/core/images/sidebarbutton-active-hdpi.png => mobile/xul/themes/core/images/sidebarbutton-active-hdpi.png rename : mobile/themes/core/images/stop-hdpi.png => mobile/xul/themes/core/images/stop-hdpi.png rename : mobile/themes/core/images/tab-active-hdpi.png => mobile/xul/themes/core/images/tab-active-hdpi.png rename : mobile/themes/core/images/tab-closed-hdpi.png => mobile/xul/themes/core/images/tab-closed-hdpi.png rename : mobile/themes/core/images/tab-inactive-hdpi.png => mobile/xul/themes/core/images/tab-inactive-hdpi.png rename : mobile/themes/core/images/tab-reopen-hdpi.png => mobile/xul/themes/core/images/tab-reopen-hdpi.png rename : mobile/themes/core/images/tab-reopen-tablet-hdpi.png => mobile/xul/themes/core/images/tab-reopen-tablet-hdpi.png rename : mobile/themes/core/images/tabs-hdpi.png => mobile/xul/themes/core/images/tabs-hdpi.png rename : mobile/themes/core/images/task-back-hdpi.png => mobile/xul/themes/core/images/task-back-hdpi.png rename : mobile/themes/core/images/task-back-rtl-hdpi.png => mobile/xul/themes/core/images/task-back-rtl-hdpi.png rename : mobile/themes/core/images/task-close-hdpi.png => mobile/xul/themes/core/images/task-close-hdpi.png rename : mobile/themes/core/images/task-switch-hdpi.png => mobile/xul/themes/core/images/task-switch-hdpi.png rename : mobile/themes/core/images/textbox-bg.png => mobile/xul/themes/core/images/textbox-bg.png rename : mobile/themes/core/images/throbber.png => mobile/xul/themes/core/images/throbber.png rename : mobile/themes/core/images/toggle-off.png => mobile/xul/themes/core/images/toggle-off.png rename : mobile/themes/core/images/toggle-on.png => mobile/xul/themes/core/images/toggle-on.png rename : mobile/themes/core/images/unlocked-hdpi.png => mobile/xul/themes/core/images/unlocked-hdpi.png rename : mobile/themes/core/images/unmute-hdpi.png => mobile/xul/themes/core/images/unmute-hdpi.png rename : mobile/themes/core/jar.mn => mobile/xul/themes/core/jar.mn rename : mobile/themes/core/localePicker.css => mobile/xul/themes/core/localePicker.css rename : mobile/themes/core/netError.css => mobile/xul/themes/core/netError.css rename : mobile/themes/core/notification.css => mobile/xul/themes/core/notification.css rename : mobile/themes/core/platform.css => mobile/xul/themes/core/platform.css rename : mobile/themes/core/tablet.css => mobile/xul/themes/core/tablet.css rename : mobile/themes/core/touchcontrols.css => mobile/xul/themes/core/touchcontrols.css
1623 lines
59 KiB
JavaScript
1623 lines
59 KiB
JavaScript
// -*- Mode: js2; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
|
|
// This stays here because otherwise it's hard to tell if there's a parsing error
|
|
dump("###################################### content loaded\n");
|
|
|
|
let Cc = Components.classes;
|
|
let Ci = Components.interfaces;
|
|
let Cu = Components.utils;
|
|
let Cr = Components.results;
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
XPCOMUtils.defineLazyGetter(this, "Services", function() {
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
return Services;
|
|
});
|
|
|
|
XPCOMUtils.defineLazyGetter(this, "Rect", function() {
|
|
Cu.import("resource://gre/modules/Geometry.jsm");
|
|
return Rect;
|
|
});
|
|
|
|
XPCOMUtils.defineLazyGetter(this, "Point", function() {
|
|
Cu.import("resource://gre/modules/Geometry.jsm");
|
|
return Point;
|
|
});
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "gFocusManager",
|
|
"@mozilla.org/focus-manager;1", "nsIFocusManager");
|
|
XPCOMUtils.defineLazyServiceGetter(this, "gDOMUtils",
|
|
"@mozilla.org/inspector/dom-utils;1", "inIDOMUtils");
|
|
|
|
let XULDocument = Ci.nsIDOMXULDocument;
|
|
let HTMLHtmlElement = Ci.nsIDOMHTMLHtmlElement;
|
|
let HTMLIFrameElement = Ci.nsIDOMHTMLIFrameElement;
|
|
let HTMLFrameElement = Ci.nsIDOMHTMLFrameElement;
|
|
let HTMLFrameSetElement = Ci.nsIDOMHTMLFrameSetElement;
|
|
let HTMLSelectElement = Ci.nsIDOMHTMLSelectElement;
|
|
let HTMLOptionElement = Ci.nsIDOMHTMLOptionElement;
|
|
|
|
// Blindly copied from Safari documentation for now.
|
|
const kViewportMinScale = 0;
|
|
const kViewportMaxScale = 10;
|
|
const kViewportMinWidth = 200;
|
|
const kViewportMaxWidth = 10000;
|
|
const kViewportMinHeight = 223;
|
|
const kViewportMaxHeight = 10000;
|
|
|
|
const kReferenceDpi = 240; // standard "pixel" size used in some preferences
|
|
|
|
const kStateActive = 0x00000001; // :active pseudoclass for elements
|
|
|
|
/** Watches for mouse click in content and redirect them to the best found target **/
|
|
const ElementTouchHelper = {
|
|
get radius() {
|
|
let prefs = Services.prefs;
|
|
delete this.radius;
|
|
return this.radius = { "top": prefs.getIntPref("browser.ui.touch.top"),
|
|
"right": prefs.getIntPref("browser.ui.touch.right"),
|
|
"bottom": prefs.getIntPref("browser.ui.touch.bottom"),
|
|
"left": prefs.getIntPref("browser.ui.touch.left")
|
|
};
|
|
},
|
|
|
|
get weight() {
|
|
delete this.weight;
|
|
return this.weight = { "visited": Services.prefs.getIntPref("browser.ui.touch.weight.visited")
|
|
};
|
|
},
|
|
|
|
/* Retrieve the closest element to a point by looking at borders position */
|
|
getClosest: function getClosest(aWindowUtils, aX, aY) {
|
|
if (!this.dpiRatio)
|
|
this.dpiRatio = aWindowUtils.displayDPI / kReferenceDpi;
|
|
|
|
let dpiRatio = this.dpiRatio;
|
|
|
|
let target = aWindowUtils.elementFromPoint(aX, aY,
|
|
true, /* ignore root scroll frame*/
|
|
false); /* don't flush layout */
|
|
|
|
// return early if the click is just over a clickable element
|
|
if (this._isElementClickable(target))
|
|
return target;
|
|
|
|
let nodes = aWindowUtils.nodesFromRect(aX, aY, this.radius.top * dpiRatio,
|
|
this.radius.right * dpiRatio,
|
|
this.radius.bottom * dpiRatio,
|
|
this.radius.left * dpiRatio, true, false);
|
|
|
|
let threshold = Number.POSITIVE_INFINITY;
|
|
for (let i = 0; i < nodes.length; i++) {
|
|
let current = nodes[i];
|
|
if (!current.mozMatchesSelector || !this._isElementClickable(current))
|
|
continue;
|
|
|
|
let rect = current.getBoundingClientRect();
|
|
let distance = this._computeDistanceFromRect(aX, aY, rect);
|
|
|
|
// increase a little bit the weight for already visited items
|
|
if (current && current.mozMatchesSelector("*:visited"))
|
|
distance *= (this.weight.visited / 100);
|
|
|
|
if (distance < threshold) {
|
|
target = current;
|
|
threshold = distance;
|
|
}
|
|
}
|
|
|
|
return target;
|
|
},
|
|
|
|
_isElementClickable: function _isElementClickable(aElement) {
|
|
const selector = "a,:link,:visited,[role=button],button,input,select,textarea,label";
|
|
for (let elem = aElement; elem; elem = elem.parentNode) {
|
|
if (this._hasMouseListener(elem))
|
|
return true;
|
|
if (elem.mozMatchesSelector && elem.mozMatchesSelector(selector))
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
|
|
_computeDistanceFromRect: function _computeDistanceFromRect(aX, aY, aRect) {
|
|
let x = 0, y = 0;
|
|
let xmost = aRect.left + aRect.width;
|
|
let ymost = aRect.top + aRect.height;
|
|
|
|
// compute horizontal distance from left/right border depending if X is
|
|
// before/inside/after the element's rectangle
|
|
if (aRect.left < aX && aX < xmost)
|
|
x = Math.min(xmost - aX, aX - aRect.left);
|
|
else if (aX < aRect.left)
|
|
x = aRect.left - aX;
|
|
else if (aX > xmost)
|
|
x = aX - xmost;
|
|
|
|
// compute vertical distance from top/bottom border depending if Y is
|
|
// above/inside/below the element's rectangle
|
|
if (aRect.top < aY && aY < ymost)
|
|
y = Math.min(ymost - aY, aY - aRect.top);
|
|
else if (aY < aRect.top)
|
|
y = aRect.top - aY;
|
|
if (aY > ymost)
|
|
y = aY - ymost;
|
|
|
|
return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
|
|
},
|
|
|
|
_els: Cc["@mozilla.org/eventlistenerservice;1"].getService(Ci.nsIEventListenerService),
|
|
_clickableEvents: ["mousedown", "mouseup", "click"],
|
|
_hasMouseListener: function _hasMouseListener(aElement) {
|
|
let els = this._els;
|
|
let listeners = els.getListenerInfoFor(aElement, {});
|
|
for (let i = 0; i < listeners.length; i++) {
|
|
if (this._clickableEvents.indexOf(listeners[i].type) != -1)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @param x,y Browser coordinates
|
|
* @return Element at position, null if no active browser or no element found
|
|
*/
|
|
function elementFromPoint(x, y) {
|
|
// browser's elementFromPoint expect browser-relative client coordinates.
|
|
// subtract browser's scroll values to adjust
|
|
let cwu = Util.getWindowUtils(content);
|
|
let scroll = ContentScroll.getScrollOffset(content);
|
|
x = x - scroll.x;
|
|
y = y - scroll.y;
|
|
let elem = ElementTouchHelper.getClosest(cwu, x, y);
|
|
|
|
// step through layers of IFRAMEs and FRAMES to find innermost element
|
|
while (elem && (elem instanceof HTMLIFrameElement || elem instanceof HTMLFrameElement)) {
|
|
// adjust client coordinates' origin to be top left of iframe viewport
|
|
let rect = elem.getBoundingClientRect();
|
|
x -= rect.left;
|
|
y -= rect.top;
|
|
let windowUtils = elem.contentDocument.defaultView.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
|
|
elem = ElementTouchHelper.getClosest(windowUtils, x, y);
|
|
}
|
|
|
|
return elem;
|
|
}
|
|
|
|
function getBoundingContentRect(aElement) {
|
|
if (!aElement)
|
|
return new Rect(0, 0, 0, 0);
|
|
|
|
let document = aElement.ownerDocument;
|
|
while(document.defaultView.frameElement)
|
|
document = document.defaultView.frameElement.ownerDocument;
|
|
|
|
let offset = ContentScroll.getScrollOffset(content);
|
|
offset = new Point(offset.x, offset.y);
|
|
|
|
let r = aElement.getBoundingClientRect();
|
|
|
|
// step out of iframes and frames, offsetting scroll values
|
|
for (let frame = aElement.ownerDocument.defaultView; frame != content; frame = frame.parent) {
|
|
// adjust client coordinates' origin to be top left of iframe viewport
|
|
let rect = frame.frameElement.getBoundingClientRect();
|
|
let left = frame.getComputedStyle(frame.frameElement, "").borderLeftWidth;
|
|
let top = frame.getComputedStyle(frame.frameElement, "").borderTopWidth;
|
|
offset.add(rect.left + parseInt(left), rect.top + parseInt(top));
|
|
}
|
|
|
|
return new Rect(r.left + offset.x, r.top + offset.y, r.width, r.height);
|
|
}
|
|
|
|
function getOverflowContentBoundingRect(aElement) {
|
|
let r = getBoundingContentRect(aElement);
|
|
|
|
// If the overflow is hidden don't bother calculating it
|
|
let computedStyle = aElement.ownerDocument.defaultView.getComputedStyle(aElement);
|
|
let blockDisplays = ["block", "inline-block", "list-item"];
|
|
if ((blockDisplays.indexOf(computedStyle.getPropertyValue("display")) != -1 && computedStyle.getPropertyValue("overflow") == "hidden") || aElement instanceof HTMLSelectElement)
|
|
return r;
|
|
|
|
for (let i = 0; i < aElement.childElementCount; i++)
|
|
r = r.union(getBoundingContentRect(aElement.children[i]));
|
|
|
|
return r;
|
|
}
|
|
|
|
function getContentClientRects(aElement) {
|
|
let offset = ContentScroll.getScrollOffset(content);
|
|
offset = new Point(offset.x, offset.y);
|
|
|
|
let nativeRects = aElement.getClientRects();
|
|
// step out of iframes and frames, offsetting scroll values
|
|
for (let frame = aElement.ownerDocument.defaultView; frame != content; frame = frame.parent) {
|
|
// adjust client coordinates' origin to be top left of iframe viewport
|
|
let rect = frame.frameElement.getBoundingClientRect();
|
|
let left = frame.getComputedStyle(frame.frameElement, "").borderLeftWidth;
|
|
let top = frame.getComputedStyle(frame.frameElement, "").borderTopWidth;
|
|
offset.add(rect.left + parseInt(left), rect.top + parseInt(top));
|
|
}
|
|
|
|
let result = [];
|
|
for (let i = nativeRects.length - 1; i >= 0; i--) {
|
|
let r = nativeRects[i];
|
|
result.push({ left: r.left + offset.x,
|
|
top: r.top + offset.y,
|
|
width: r.width,
|
|
height: r.height
|
|
});
|
|
}
|
|
return result;
|
|
};
|
|
|
|
|
|
let Content = {
|
|
get formAssistant() {
|
|
delete this.formAssistant;
|
|
return this.formAssistant = new FormAssistant();
|
|
},
|
|
|
|
init: function init() {
|
|
this._isZoomedToElement = false;
|
|
|
|
addMessageListener("Browser:Blur", this);
|
|
addMessageListener("Browser:MouseOver", this);
|
|
addMessageListener("Browser:MouseLong", this);
|
|
addMessageListener("Browser:MouseDown", this);
|
|
addMessageListener("Browser:MouseClick", this);
|
|
addMessageListener("Browser:MouseCancel", this);
|
|
addMessageListener("Browser:SaveAs", this);
|
|
addMessageListener("Browser:ZoomToPoint", this);
|
|
addMessageListener("Browser:MozApplicationCache:Fetch", this);
|
|
addMessageListener("Browser:SetCharset", this);
|
|
addMessageListener("Browser:ContextCommand", this);
|
|
addMessageListener("Browser:CanUnload", this);
|
|
addMessageListener("Browser:CanCaptureMouse", this);
|
|
|
|
if (Util.isParentProcess())
|
|
addEventListener("DOMActivate", this, true);
|
|
|
|
addEventListener("MozApplicationManifest", this, false);
|
|
addEventListener("DOMContentLoaded", this, false);
|
|
addEventListener("pagehide", this, false);
|
|
addEventListener("keypress", this, false, false);
|
|
|
|
// Attach a listener to watch for "click" events bubbling up from error
|
|
// pages and other similar page. This lets us fix bugs like 401575 which
|
|
// require error page UI to do privileged things, without letting error
|
|
// pages have any privilege themselves.
|
|
addEventListener("click", this, false);
|
|
|
|
docShell.QueryInterface(Ci.nsIDocShellHistory).useGlobalHistory = true;
|
|
},
|
|
|
|
handleEvent: function handleEvent(aEvent) {
|
|
switch (aEvent.type) {
|
|
// If the keypress is a trusted event and has not been consume by content
|
|
// let's send it back to the chrome process to have it handle shortcuts
|
|
case "keypress":
|
|
let timer = new Util.Timeout(function() {
|
|
let eventData = {
|
|
ctrlKey: aEvent.ctrlKey,
|
|
altKey: aEvent.altKey,
|
|
shiftKey: aEvent.shiftKey,
|
|
metaKey: aEvent.metaKey,
|
|
keyCode: aEvent.keyCode,
|
|
charCode: aEvent.charCode,
|
|
preventDefault: aEvent.getPreventDefault()
|
|
};
|
|
sendAsyncMessage("Browser:KeyPress", eventData);
|
|
});
|
|
timer.once(0);
|
|
break;
|
|
|
|
case "DOMActivate": {
|
|
// In a local tab, open remote links in new tabs.
|
|
let target = aEvent.originalTarget;
|
|
let href = Util.getHrefForElement(target);
|
|
if (/^http(s?):/.test(href)) {
|
|
aEvent.preventDefault();
|
|
sendAsyncMessage("Browser:OpenURI", { uri: href,
|
|
referrer: target.ownerDocument.documentURIObject.spec,
|
|
bringFront: true });
|
|
}
|
|
break;
|
|
}
|
|
|
|
case "MozApplicationManifest": {
|
|
let doc = aEvent.originalTarget;
|
|
sendAsyncMessage("Browser:MozApplicationManifest", {
|
|
location: doc.documentURIObject.spec,
|
|
manifest: doc.documentElement.getAttribute("manifest"),
|
|
charset: doc.characterSet
|
|
});
|
|
break;
|
|
}
|
|
|
|
case "click": {
|
|
// Don't trust synthetic events
|
|
if (!aEvent.isTrusted)
|
|
return;
|
|
|
|
let ot = aEvent.originalTarget;
|
|
let errorDoc = ot.ownerDocument;
|
|
|
|
// If the event came from an ssl error page, it is probably either the "Add
|
|
// Exception…" or "Get me out of here!" button
|
|
if (/^about:certerror\?e=nssBadCert/.test(errorDoc.documentURI)) {
|
|
let perm = errorDoc.getElementById("permanentExceptionButton");
|
|
let temp = errorDoc.getElementById("temporaryExceptionButton");
|
|
if (ot == temp || ot == perm) {
|
|
let action = (ot == perm ? "permanent" : "temporary");
|
|
sendAsyncMessage("Browser:CertException", { url: errorDoc.location.href, action: action });
|
|
} else if (ot == errorDoc.getElementById("getMeOutOfHereButton")) {
|
|
sendAsyncMessage("Browser:CertException", { url: errorDoc.location.href, action: "leave" });
|
|
}
|
|
} else if (/^about:blocked/.test(errorDoc.documentURI)) {
|
|
// The event came from a button on a malware/phishing block page
|
|
// First check whether it's malware or phishing, so that we can
|
|
// use the right strings/links
|
|
let isMalware = /e=malwareBlocked/.test(errorDoc.documentURI);
|
|
|
|
if (ot == errorDoc.getElementById("getMeOutButton")) {
|
|
sendAsyncMessage("Browser:BlockedSite", { url: errorDoc.location.href, action: "leave" });
|
|
} else if (ot == errorDoc.getElementById("reportButton")) {
|
|
// This is the "Why is this site blocked" button. For malware,
|
|
// we can fetch a site-specific report, for phishing, we redirect
|
|
// to the generic page describing phishing protection.
|
|
let action = isMalware ? "report-malware" : "report-phising";
|
|
sendAsyncMessage("Browser:BlockedSite", { url: errorDoc.location.href, action: action });
|
|
} else if (ot == errorDoc.getElementById("ignoreWarningButton")) {
|
|
// Allow users to override and continue through to the site,
|
|
// but add a notify bar as a reminder, so that they don't lose
|
|
// track after, e.g., tab switching.
|
|
let webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
|
|
webNav.loadURI(content.location, Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_CLASSIFIER, null, null, null);
|
|
|
|
// TODO: We'll need to impl notifications in the parent process and use the preference code found here:
|
|
// http://hg.mozilla.org/mozilla-central/file/855e5cd3c884/browser/base/content/browser.js#l2672
|
|
// http://hg.mozilla.org/mozilla-central/file/855e5cd3c884/browser/components/safebrowsing/content/globalstore.js
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case "DOMContentLoaded":
|
|
this._maybeNotifyErroPage();
|
|
break;
|
|
|
|
case "pagehide":
|
|
if (aEvent.target == content.document)
|
|
this._resetFontSize();
|
|
break;
|
|
}
|
|
},
|
|
|
|
receiveMessage: function receiveMessage(aMessage) {
|
|
let json = aMessage.json;
|
|
let x = json.x;
|
|
let y = json.y;
|
|
let modifiers = json.modifiers;
|
|
|
|
switch (aMessage.name) {
|
|
case "Browser:ContextCommand": {
|
|
let wrappedTarget = elementFromPoint(x, y);
|
|
if (!wrappedTarget || !(wrappedTarget instanceof Ci.nsIDOMNSEditableElement))
|
|
break;
|
|
let target = wrappedTarget.QueryInterface(Ci.nsIDOMNSEditableElement);
|
|
if (!target)
|
|
break;
|
|
switch (json.command) {
|
|
case "select-all":
|
|
target.editor.selectAll();
|
|
break;
|
|
case "paste":
|
|
target.editor.paste(Ci.nsIClipboard.kGlobalClipboard);
|
|
break;
|
|
}
|
|
target.focus();
|
|
break;
|
|
}
|
|
|
|
case "Browser:Blur":
|
|
gFocusManager.clearFocus(content);
|
|
break;
|
|
|
|
case "Browser:CanUnload":
|
|
let canUnload = docShell.contentViewer.permitUnload();
|
|
sendSyncMessage("Browser:CanUnload:Return", { permit: canUnload });
|
|
break;
|
|
|
|
case "Browser:MouseOver": {
|
|
let element = elementFromPoint(x, y);
|
|
if (!element)
|
|
return;
|
|
|
|
// Sending a mousemove force the dispatching of mouseover/mouseout
|
|
this._sendMouseEvent("mousemove", element, x, y);
|
|
break;
|
|
}
|
|
|
|
case "Browser:MouseDown": {
|
|
let element = elementFromPoint(x, y);
|
|
if (!element)
|
|
return;
|
|
|
|
// There is no need to have a feedback for disabled element
|
|
let isDisabled = element instanceof HTMLOptionElement ? (element.disabled || element.parentNode.disabled) : element.disabled;
|
|
if (isDisabled)
|
|
return;
|
|
|
|
// Calculate the rect of the active area
|
|
this._doTapHighlight(element);
|
|
break;
|
|
}
|
|
|
|
case "Browser:MouseCancel": {
|
|
this._cancelTapHighlight();
|
|
break;
|
|
}
|
|
|
|
case "Browser:MouseLong": {
|
|
let element = elementFromPoint(x, y);
|
|
if (!element)
|
|
return;
|
|
|
|
#ifdef MOZ_PLATFORM_MAEMO
|
|
if (element instanceof Ci.nsIDOMHTMLEmbedElement) {
|
|
// Generate a right click mouse event to make possible to show
|
|
// context menu for plugins:
|
|
this._sendMouseEvent("mousedown", element, x, y, 2);
|
|
this._sendMouseEvent("mouseup", element, x, y, 2);
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
ContextHandler.messageId = json.messageId;
|
|
|
|
let event = content.document.createEvent("MouseEvent");
|
|
event.initMouseEvent("contextmenu", true, true, content,
|
|
0, x, y, x, y, false, false, false, false,
|
|
0, null);
|
|
event.x = x;
|
|
event.y = y;
|
|
element.dispatchEvent(event);
|
|
break;
|
|
}
|
|
|
|
case "Browser:MouseClick": {
|
|
this.formAssistant.focusSync = true;
|
|
let element = elementFromPoint(x, y);
|
|
if (modifiers == Ci.nsIDOMNSEvent.CONTROL_MASK) {
|
|
let uri = Util.getHrefForElement(element);
|
|
if (uri)
|
|
sendAsyncMessage("Browser:OpenURI", { uri: uri,
|
|
referrer: element.ownerDocument.documentURIObject.spec });
|
|
break;
|
|
}
|
|
|
|
if (!this.formAssistant.open(element, x, y))
|
|
sendAsyncMessage("FindAssist:Hide", { });
|
|
|
|
// don't fire mouse events on selects, see bug 685197
|
|
if (this._highlightElement && !(element instanceof HTMLSelectElement)) {
|
|
this._sendMouseEvent("mousemove", this._highlightElement, x, y);
|
|
this._sendMouseEvent("mousedown", this._highlightElement, x, y);
|
|
this._sendMouseEvent("mouseup", this._highlightElement, x, y);
|
|
}
|
|
this._cancelTapHighlight();
|
|
ContextHandler.reset();
|
|
this.formAssistant.focusSync = false;
|
|
break;
|
|
}
|
|
|
|
case "Browser:SaveAs":
|
|
if (json.type != Ci.nsIPrintSettings.kOutputFormatPDF)
|
|
return;
|
|
|
|
let printSettings = Cc["@mozilla.org/gfx/printsettings-service;1"]
|
|
.getService(Ci.nsIPrintSettingsService)
|
|
.newPrintSettings;
|
|
printSettings.printSilent = true;
|
|
printSettings.showPrintProgress = false;
|
|
printSettings.printBGImages = true;
|
|
printSettings.printBGColors = true;
|
|
printSettings.printToFile = true;
|
|
printSettings.toFileName = json.filePath;
|
|
printSettings.printFrameType = Ci.nsIPrintSettings.kFramesAsIs;
|
|
printSettings.outputFormat = Ci.nsIPrintSettings.kOutputFormatPDF;
|
|
|
|
//XXX we probably need a preference here, the header can be useful
|
|
printSettings.footerStrCenter = "";
|
|
printSettings.footerStrLeft = "";
|
|
printSettings.footerStrRight = "";
|
|
printSettings.headerStrCenter = "";
|
|
printSettings.headerStrLeft = "";
|
|
printSettings.headerStrRight = "";
|
|
|
|
let listener = {
|
|
onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
|
|
if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP) {
|
|
sendAsyncMessage("Browser:SaveAs:Return", { type: json.type, id: json.id, referrer: json.referrer });
|
|
}
|
|
},
|
|
onProgressChange : function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {},
|
|
|
|
// stubs for the nsIWebProgressListener interfaces which nsIWebBrowserPrint doesn't use.
|
|
onLocationChange : function() { throw "Unexpected onLocationChange"; },
|
|
onStatusChange : function() { throw "Unexpected onStatusChange"; },
|
|
onSecurityChange : function() { throw "Unexpected onSecurityChange"; }
|
|
};
|
|
|
|
let webBrowserPrint = content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebBrowserPrint);
|
|
webBrowserPrint.print(printSettings, listener);
|
|
break;
|
|
|
|
case "Browser:ZoomToPoint": {
|
|
let rect = null;
|
|
if (this._isZoomedToElement) {
|
|
this._resetFontSize();
|
|
} else {
|
|
this._isZoomedToElement = true;
|
|
let element = elementFromPoint(x, y);
|
|
let win = element.ownerDocument.defaultView;
|
|
while (element && win.getComputedStyle(element,null).display == "inline")
|
|
element = element.parentNode;
|
|
if (element) {
|
|
rect = getBoundingContentRect(element);
|
|
if (Services.prefs.getBoolPref("browser.ui.zoom.reflow")) {
|
|
sendAsyncMessage("Browser:ZoomToPoint:Return", { x: x, y: y, zoomTo: rect });
|
|
|
|
let fontSize = Services.prefs.getIntPref("browser.ui.zoom.reflow.fontSize");
|
|
this._setMinFontSize(Math.max(1, rect.width / json.width) * fontSize);
|
|
|
|
let oldRect = rect;
|
|
rect = getBoundingContentRect(element);
|
|
y += rect.top - oldRect.top;
|
|
}
|
|
}
|
|
}
|
|
content.setTimeout(function() {
|
|
sendAsyncMessage("Browser:ZoomToPoint:Return", { x: x, y: y, zoomTo: rect });
|
|
}, 0);
|
|
break;
|
|
}
|
|
|
|
case "Browser:MozApplicationCache:Fetch": {
|
|
let currentURI = Services.io.newURI(json.location, json.charset, null);
|
|
let manifestURI = Services.io.newURI(json.manifest, json.charset, currentURI);
|
|
let updateService = Cc["@mozilla.org/offlinecacheupdate-service;1"]
|
|
.getService(Ci.nsIOfflineCacheUpdateService);
|
|
updateService.scheduleUpdate(manifestURI, currentURI, content);
|
|
break;
|
|
}
|
|
|
|
case "Browser:SetCharset": {
|
|
let docCharset = docShell.QueryInterface(Ci.nsIDocCharset);
|
|
docCharset.charset = json.charset;
|
|
|
|
let webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
|
|
webNav.reload(Ci.nsIWebNavigation.LOAD_FLAGS_CHARSET_CHANGE);
|
|
break;
|
|
}
|
|
|
|
case "Browser:CanCaptureMouse": {
|
|
sendAsyncMessage("Browser:CanCaptureMouse:Return", {
|
|
contentMightCaptureMouse: content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils).mayHaveTouchEventListeners
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
|
|
_maybeNotifyErroPage: function _maybeNotifyErroPage() {
|
|
// Notify browser that an error page is being shown instead
|
|
// of the target location. Necessary to get proper thumbnail
|
|
// updates on chrome for error pages.
|
|
if (content.location.href !== content.document.documentURI)
|
|
sendAsyncMessage("Browser:ErrorPage", null);
|
|
},
|
|
|
|
_resetFontSize: function _resetFontSize() {
|
|
this._isZoomedToElement = false;
|
|
this._setMinFontSize(0);
|
|
},
|
|
|
|
_highlightElement: null,
|
|
|
|
_doTapHighlight: function _doTapHighlight(aElement) {
|
|
gDOMUtils.setContentState(aElement, kStateActive);
|
|
this._highlightElement = aElement;
|
|
},
|
|
|
|
_cancelTapHighlight: function _cancelTapHighlight(aElement) {
|
|
gDOMUtils.setContentState(content.document.documentElement, kStateActive);
|
|
this._highlightElement = null;
|
|
},
|
|
|
|
_sendMouseEvent: function _sendMouseEvent(aName, aElement, aX, aY, aButton) {
|
|
// the element can be out of the aX/aY point because of the touch radius
|
|
// if outside, we gracefully move the touch point to the center of the element
|
|
if (!(aElement instanceof HTMLHtmlElement)) {
|
|
let isTouchClick = true;
|
|
let rects = getContentClientRects(aElement);
|
|
for (let i = 0; i < rects.length; i++) {
|
|
let rect = rects[i];
|
|
// We might be able to deal with fractional pixels, but mouse events won't.
|
|
// Deflate the bounds in by 1 pixel to deal with any fractional scroll offset issues.
|
|
let inBounds =
|
|
(aX > rect.left + 1 && aX < (rect.left + rect.width - 1)) &&
|
|
(aY > rect.top + 1 && aY < (rect.top + rect.height - 1));
|
|
if (inBounds) {
|
|
isTouchClick = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (isTouchClick) {
|
|
let rect = new Rect(rects[0].left, rects[0].top, rects[0].width, rects[0].height);
|
|
if (rect.isEmpty())
|
|
return;
|
|
|
|
let point = rect.center();
|
|
aX = point.x;
|
|
aY = point.y;
|
|
}
|
|
}
|
|
|
|
let scrollOffset = ContentScroll.getScrollOffset(content);
|
|
let windowUtils = Util.getWindowUtils(content);
|
|
aButton = aButton || 0;
|
|
windowUtils.sendMouseEventToWindow(aName, aX - scrollOffset.x, aY - scrollOffset.y, aButton, 1, 0, true);
|
|
},
|
|
|
|
_setMinFontSize: function _setMinFontSize(aSize) {
|
|
let viewer = docShell.contentViewer.QueryInterface(Ci.nsIMarkupDocumentViewer);
|
|
if (viewer)
|
|
viewer.minFontSize = aSize;
|
|
}
|
|
};
|
|
|
|
Content.init();
|
|
|
|
let ViewportHandler = {
|
|
init: function init() {
|
|
addEventListener("DOMWindowCreated", this, false);
|
|
addEventListener("DOMMetaAdded", this, false);
|
|
addEventListener("DOMContentLoaded", this, false);
|
|
addEventListener("pageshow", this, false);
|
|
},
|
|
|
|
handleEvent: function handleEvent(aEvent) {
|
|
let target = aEvent.originalTarget;
|
|
let isRootDocument = (target == content.document || target.ownerDocument == content.document);
|
|
if (!isRootDocument)
|
|
return;
|
|
|
|
switch (aEvent.type) {
|
|
case "DOMWindowCreated":
|
|
this.resetMetadata();
|
|
break;
|
|
|
|
case "DOMMetaAdded":
|
|
if (target.name == "viewport")
|
|
this.updateMetadata();
|
|
break;
|
|
|
|
case "DOMContentLoaded":
|
|
case "pageshow":
|
|
this.updateMetadata();
|
|
break;
|
|
}
|
|
},
|
|
|
|
resetMetadata: function resetMetadata() {
|
|
sendAsyncMessage("Browser:ViewportMetadata", null);
|
|
},
|
|
|
|
updateMetadata: function updateMetadata() {
|
|
sendAsyncMessage("Browser:ViewportMetadata", this.getViewportMetadata());
|
|
},
|
|
|
|
/**
|
|
* Returns an object with the page's preferred viewport properties:
|
|
* defaultZoom (optional float): The initial scale when the page is loaded.
|
|
* minZoom (optional float): The minimum zoom level.
|
|
* maxZoom (optional float): The maximum zoom level.
|
|
* width (optional int): The CSS viewport width in px.
|
|
* height (optional int): The CSS viewport height in px.
|
|
* autoSize (boolean): Resize the CSS viewport when the window resizes.
|
|
* allowZoom (boolean): Let the user zoom in or out.
|
|
* autoScale (boolean): Adjust the viewport properties to account for display density.
|
|
*/
|
|
getViewportMetadata: function getViewportMetadata() {
|
|
let doctype = content.document.doctype;
|
|
if (doctype && /(WAP|WML|Mobile)/.test(doctype.publicId))
|
|
return { defaultZoom: 1, autoSize: true, allowZoom: true, autoScale: true };
|
|
|
|
let windowUtils = Util.getWindowUtils(content);
|
|
let handheldFriendly = windowUtils.getDocumentMetadata("HandheldFriendly");
|
|
if (handheldFriendly == "true")
|
|
return { defaultZoom: 1, autoSize: true, allowZoom: true, autoScale: true };
|
|
|
|
if (content.document instanceof XULDocument)
|
|
return { defaultZoom: 1, autoSize: true, allowZoom: false, autoScale: false };
|
|
|
|
// HACK: Since we can't set the scale in local tabs (bug 597081), we force
|
|
// them to device-width and scale=1 so they will lay out reasonably.
|
|
if (Util.isParentProcess())
|
|
return { defaultZoom: 1, autoSize: true, allowZoom: false, autoScale: false };
|
|
|
|
// HACK: Since we can't set the scale correctly in frameset pages yet (bug 645756), we force
|
|
// them to device-width and scale=1 so they will lay out reasonably.
|
|
if (content.frames.length > 0 && (content.document.body instanceof HTMLFrameSetElement))
|
|
return { defaultZoom: 1, autoSize: true, allowZoom: false, autoScale: false };
|
|
|
|
// viewport details found here
|
|
// http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html
|
|
// http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html
|
|
|
|
// Note: These values will be NaN if parseFloat or parseInt doesn't find a number.
|
|
// Remember that NaN is contagious: Math.max(1, NaN) == Math.min(1, NaN) == NaN.
|
|
let scale = parseFloat(windowUtils.getDocumentMetadata("viewport-initial-scale"));
|
|
let minScale = parseFloat(windowUtils.getDocumentMetadata("viewport-minimum-scale"));
|
|
let maxScale = parseFloat(windowUtils.getDocumentMetadata("viewport-maximum-scale"));
|
|
|
|
let widthStr = windowUtils.getDocumentMetadata("viewport-width");
|
|
let heightStr = windowUtils.getDocumentMetadata("viewport-height");
|
|
let width = Util.clamp(parseInt(widthStr), kViewportMinWidth, kViewportMaxWidth);
|
|
let height = Util.clamp(parseInt(heightStr), kViewportMinHeight, kViewportMaxHeight);
|
|
|
|
let allowZoomStr = windowUtils.getDocumentMetadata("viewport-user-scalable");
|
|
let allowZoom = !/^(0|no|false)$/.test(allowZoomStr); // WebKit allows 0, "no", or "false"
|
|
|
|
scale = Util.clamp(scale, kViewportMinScale, kViewportMaxScale);
|
|
minScale = Util.clamp(minScale, kViewportMinScale, kViewportMaxScale);
|
|
maxScale = Util.clamp(maxScale, kViewportMinScale, kViewportMaxScale);
|
|
|
|
// If initial scale is 1.0 and width is not set, assume width=device-width
|
|
let autoSize = (widthStr == "device-width" ||
|
|
(!widthStr && (heightStr == "device-height" || scale == 1.0)));
|
|
|
|
return {
|
|
defaultZoom: scale,
|
|
minZoom: minScale,
|
|
maxZoom: maxScale,
|
|
width: width,
|
|
height: height,
|
|
autoSize: autoSize,
|
|
allowZoom: allowZoom,
|
|
autoScale: true
|
|
};
|
|
}
|
|
};
|
|
|
|
ViewportHandler.init();
|
|
|
|
|
|
const kXLinkNamespace = "http://www.w3.org/1999/xlink";
|
|
|
|
var ContextHandler = {
|
|
_types: [],
|
|
|
|
_getLinkURL: function ch_getLinkURL(aLink) {
|
|
let href = aLink.href;
|
|
if (href)
|
|
return href;
|
|
|
|
href = aLink.getAttributeNS(kXLinkNamespace, "href");
|
|
if (!href || !href.match(/\S/)) {
|
|
// Without this we try to save as the current doc,
|
|
// for example, HTML case also throws if empty
|
|
throw "Empty href";
|
|
}
|
|
|
|
return Util.makeURLAbsolute(aLink.baseURI, href);
|
|
},
|
|
|
|
_getURI: function ch_getURI(aURL) {
|
|
try {
|
|
return Util.makeURI(aURL);
|
|
} catch (ex) { }
|
|
|
|
return null;
|
|
},
|
|
|
|
_getProtocol: function ch_getProtocol(aURI) {
|
|
if (aURI)
|
|
return aURI.scheme;
|
|
return null;
|
|
},
|
|
|
|
init: function ch_init() {
|
|
addEventListener("contextmenu", this, false);
|
|
addEventListener("pagehide", this, false);
|
|
addMessageListener("Browser:ContextCommand", this, false);
|
|
this.popupNode = null;
|
|
},
|
|
|
|
reset: function ch_reset() {
|
|
this.popupNode = null;
|
|
},
|
|
|
|
handleEvent: function ch_handleEvent(aEvent) {
|
|
switch (aEvent.type) {
|
|
case "contextmenu":
|
|
this.onContextMenu(aEvent);
|
|
break;
|
|
case "pagehide":
|
|
this.reset();
|
|
break;
|
|
}
|
|
},
|
|
|
|
onContextMenu: function ch_onContextMenu(aEvent) {
|
|
if (aEvent.getPreventDefault())
|
|
return;
|
|
|
|
let state = {
|
|
types: [],
|
|
label: "",
|
|
linkURL: "",
|
|
linkTitle: "",
|
|
linkProtocol: null,
|
|
mediaURL: "",
|
|
x: aEvent.x,
|
|
y: aEvent.y
|
|
};
|
|
|
|
let popupNode = this.popupNode = aEvent.originalTarget;
|
|
|
|
// Do checks for nodes that never have children.
|
|
if (popupNode.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) {
|
|
// See if the user clicked on an image.
|
|
if (popupNode instanceof Ci.nsIImageLoadingContent && popupNode.currentURI) {
|
|
state.types.push("image");
|
|
state.label = state.mediaURL = popupNode.currentURI.spec;
|
|
|
|
// Retrieve the type of image from the cache since the url can fail to
|
|
// provide valuable informations
|
|
try {
|
|
let imageCache = Cc["@mozilla.org/image/cache;1"].getService(Ci.imgICache);
|
|
let props = imageCache.findEntryProperties(popupNode.currentURI, content.document.characterSet);
|
|
if (props) {
|
|
state.contentType = String(props.get("type", Ci.nsISupportsCString));
|
|
state.contentDisposition = String(props.get("content-disposition", Ci.nsISupportsCString));
|
|
}
|
|
} catch (e) {
|
|
// Failure to get type and content-disposition off the image is non-fatal
|
|
}
|
|
|
|
} else if (popupNode instanceof Ci.nsIDOMHTMLMediaElement) {
|
|
state.label = state.mediaURL = (popupNode.currentSrc || popupNode.src);
|
|
state.types.push((popupNode.paused || popupNode.ended) ? "media-paused" : "media-playing");
|
|
if (popupNode instanceof Ci.nsIDOMHTMLVideoElement)
|
|
state.types.push("video");
|
|
}
|
|
}
|
|
|
|
let elem = popupNode;
|
|
let isText = false;
|
|
while (elem) {
|
|
if (elem.nodeType == Ci.nsIDOMNode.ELEMENT_NODE) {
|
|
// Link?
|
|
if ((elem instanceof Ci.nsIDOMHTMLAnchorElement && elem.href) ||
|
|
(elem instanceof Ci.nsIDOMHTMLAreaElement && elem.href) ||
|
|
elem instanceof Ci.nsIDOMHTMLLinkElement ||
|
|
elem.getAttributeNS(kXLinkNamespace, "type") == "simple") {
|
|
|
|
// Target is a link or a descendant of a link.
|
|
state.types.push("link");
|
|
state.label = state.linkURL = this._getLinkURL(elem);
|
|
state.linkTitle = popupNode.textContent || popupNode.title;
|
|
state.linkProtocol = this._getProtocol(this._getURI(state.linkURL));
|
|
break;
|
|
} else if ((elem instanceof Ci.nsIDOMHTMLInputElement &&
|
|
elem.mozIsTextField(false)) || elem instanceof Ci.nsIDOMHTMLTextAreaElement) {
|
|
let selectionStart = elem.selectionStart;
|
|
let selectionEnd = elem.selectionEnd;
|
|
|
|
state.types.push("input-text");
|
|
|
|
// Don't include "copy" for password fields.
|
|
if (!(elem instanceof Ci.nsIDOMHTMLInputElement) || elem.mozIsTextField(true)) {
|
|
if (selectionStart != selectionEnd) {
|
|
state.types.push("copy");
|
|
state.string = elem.value.slice(selectionStart, selectionEnd);
|
|
} else if (elem.value) {
|
|
state.types.push("copy-all");
|
|
state.string = elem.value;
|
|
}
|
|
}
|
|
|
|
if (selectionStart > 0 || selectionEnd < elem.textLength)
|
|
state.types.push("select-all");
|
|
|
|
let clipboard = Cc["@mozilla.org/widget/clipboard;1"].getService(Ci.nsIClipboard);
|
|
let flavors = ["text/unicode"];
|
|
let hasData = clipboard.hasDataMatchingFlavors(flavors, flavors.length, Ci.nsIClipboard.kGlobalClipboard);
|
|
|
|
if (hasData && !elem.readOnly)
|
|
state.types.push("paste");
|
|
break;
|
|
} else if (elem instanceof Ci.nsIDOMHTMLParagraphElement ||
|
|
elem instanceof Ci.nsIDOMHTMLDivElement ||
|
|
elem instanceof Ci.nsIDOMHTMLLIElement ||
|
|
elem instanceof Ci.nsIDOMHTMLPreElement ||
|
|
elem instanceof Ci.nsIDOMHTMLHeadingElement ||
|
|
elem instanceof Ci.nsIDOMHTMLTableCellElement) {
|
|
isText = true;
|
|
}
|
|
}
|
|
|
|
elem = elem.parentNode;
|
|
}
|
|
|
|
if (isText)
|
|
state.types.push("content-text");
|
|
|
|
for (let i = 0; i < this._types.length; i++)
|
|
if (this._types[i].handler(state, popupNode))
|
|
state.types.push(this._types[i].name);
|
|
|
|
state.messageId = this.messageId;
|
|
|
|
sendAsyncMessage("Browser:ContextMenu", state);
|
|
},
|
|
|
|
receiveMessage: function ch_receiveMessage(aMessage) {
|
|
let node = this.popupNode;
|
|
let command = aMessage.json.command;
|
|
|
|
switch (command) {
|
|
case "play":
|
|
case "pause":
|
|
if (node instanceof Ci.nsIDOMHTMLMediaElement)
|
|
node[command]();
|
|
break;
|
|
|
|
case "fullscreen":
|
|
if (node instanceof Ci.nsIDOMHTMLVideoElement) {
|
|
node.pause();
|
|
Cu.import("resource:///modules/video.jsm");
|
|
Video.fullScreenSourceElement = node;
|
|
sendAsyncMessage("Browser:FullScreenVideo:Start");
|
|
}
|
|
break;
|
|
}
|
|
},
|
|
|
|
/**
|
|
* For add-ons to add new types and data to the ContextMenu message.
|
|
*
|
|
* @param aName A string to identify the new type.
|
|
* @param aHandler A function that takes a state object and a target element.
|
|
* If aHandler returns true, then aName will be added to the list of types.
|
|
* The function may also modify the state object.
|
|
*/
|
|
registerType: function registerType(aName, aHandler) {
|
|
this._types.push({name: aName, handler: aHandler});
|
|
},
|
|
|
|
/** Remove all handlers registered for a given type. */
|
|
unregisterType: function unregisterType(aName) {
|
|
this._types = this._types.filter(function(type) type.name != aName);
|
|
}
|
|
};
|
|
|
|
ContextHandler.init();
|
|
|
|
ContextHandler.registerType("mailto", function(aState, aElement) {
|
|
return aState.linkProtocol == "mailto";
|
|
});
|
|
|
|
ContextHandler.registerType("callto", function(aState, aElement) {
|
|
let protocol = aState.linkProtocol;
|
|
return protocol == "tel" || protocol == "callto" || protocol == "sip" || protocol == "voipto";
|
|
});
|
|
|
|
ContextHandler.registerType("link-openable", function(aState, aElement) {
|
|
return Util.isOpenableScheme(aState.linkProtocol);
|
|
});
|
|
|
|
ContextHandler.registerType("link-shareable", function(aState, aElement) {
|
|
return Util.isShareableScheme(aState.linkProtocol);
|
|
});
|
|
|
|
["image", "video"].forEach(function(aType) {
|
|
ContextHandler.registerType(aType+"-shareable", function(aState, aElement) {
|
|
if (aState.types.indexOf(aType) == -1)
|
|
return false;
|
|
|
|
let protocol = ContextHandler._getProtocol(ContextHandler._getURI(aState.mediaURL));
|
|
return Util.isShareableScheme(protocol);
|
|
});
|
|
});
|
|
|
|
ContextHandler.registerType("image-loaded", function(aState, aElement) {
|
|
if (aState.types.indexOf("image") != -1) {
|
|
let request = aElement.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST);
|
|
if (request && (request.imageStatus & request.STATUS_SIZE_AVAILABLE))
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
var FormSubmitObserver = {
|
|
init: function init(){
|
|
addMessageListener("Browser:TabOpen", this);
|
|
addMessageListener("Browser:TabClose", this);
|
|
|
|
addEventListener("pageshow", this, false);
|
|
|
|
Services.obs.addObserver(this, "invalidformsubmit", false);
|
|
},
|
|
|
|
handleEvent: function handleEvent(aEvent) {
|
|
let target = aEvent.originalTarget;
|
|
let isRootDocument = (target == content.document || target.ownerDocument == content.document);
|
|
if (!isRootDocument)
|
|
return;
|
|
|
|
// Reset invalid submit state on each pageshow
|
|
if (aEvent.type == "pageshow")
|
|
Content.formAssistant.invalidSubmit = false;
|
|
},
|
|
|
|
receiveMessage: function findHandlerReceiveMessage(aMessage) {
|
|
let json = aMessage.json;
|
|
switch (aMessage.name) {
|
|
case "Browser:TabOpen":
|
|
Services.obs.addObserver(this, "formsubmit", false);
|
|
break;
|
|
case "Browser:TabClose":
|
|
Services.obs.removeObserver(this, "formsubmit", false);
|
|
break;
|
|
}
|
|
},
|
|
|
|
notify: function notify(aFormElement, aWindow, aActionURI, aCancelSubmit) {
|
|
// Do not notify unless this is the window where the submit occurred
|
|
if (aWindow == content)
|
|
// We don't need to send any data along
|
|
sendAsyncMessage("Browser:FormSubmit", {});
|
|
},
|
|
|
|
notifyInvalidSubmit: function notifyInvalidSubmit(aFormElement, aInvalidElements) {
|
|
if (!aInvalidElements.length)
|
|
return;
|
|
|
|
let element = aInvalidElements.queryElementAt(0, Ci.nsISupports);
|
|
if (!(element instanceof HTMLInputElement ||
|
|
element instanceof HTMLTextAreaElement ||
|
|
element instanceof HTMLSelectElement ||
|
|
element instanceof HTMLButtonElement)) {
|
|
return;
|
|
}
|
|
|
|
Content.formAssistant.invalidSubmit = true;
|
|
Content.formAssistant.open(element);
|
|
},
|
|
|
|
QueryInterface : function(aIID) {
|
|
if (!aIID.equals(Ci.nsIFormSubmitObserver) &&
|
|
!aIID.equals(Ci.nsISupportsWeakReference) &&
|
|
!aIID.equals(Ci.nsISupports))
|
|
throw Cr.NS_ERROR_NO_INTERFACE;
|
|
return this;
|
|
}
|
|
};
|
|
|
|
FormSubmitObserver.init();
|
|
|
|
var FindHandler = {
|
|
get _fastFind() {
|
|
delete this._fastFind;
|
|
this._fastFind = Cc["@mozilla.org/typeaheadfind;1"].createInstance(Ci.nsITypeAheadFind);
|
|
this._fastFind.init(docShell);
|
|
return this._fastFind;
|
|
},
|
|
|
|
init: function findHandlerInit() {
|
|
addMessageListener("FindAssist:Find", this);
|
|
addMessageListener("FindAssist:Next", this);
|
|
addMessageListener("FindAssist:Previous", this);
|
|
},
|
|
|
|
receiveMessage: function findHandlerReceiveMessage(aMessage) {
|
|
let findResult = Ci.nsITypeAheadFind.FIND_NOTFOUND;
|
|
let json = aMessage.json;
|
|
switch (aMessage.name) {
|
|
case "FindAssist:Find":
|
|
findResult = this._fastFind.find(json.searchString, false);
|
|
break;
|
|
|
|
case "FindAssist:Previous":
|
|
findResult = this._fastFind.findAgain(true, false);
|
|
break;
|
|
|
|
case "FindAssist:Next":
|
|
findResult = this._fastFind.findAgain(false, false);
|
|
break;
|
|
}
|
|
|
|
if (findResult == Ci.nsITypeAheadFind.FIND_NOTFOUND) {
|
|
sendAsyncMessage("FindAssist:Show", { rect: null , result: findResult });
|
|
return;
|
|
}
|
|
|
|
let selection = this._fastFind.currentWindow.getSelection();
|
|
if (!selection.rangeCount || selection.isCollapsed) {
|
|
// The selection can be into an input or a textarea element
|
|
let nodes = content.document.querySelectorAll("input[type='text'], textarea");
|
|
for (let i = 0; i < nodes.length; i++) {
|
|
let node = nodes[i];
|
|
if (node instanceof Ci.nsIDOMNSEditableElement && node.editor) {
|
|
selection = node.editor.selectionController.getSelection(Ci.nsISelectionController.SELECTION_NORMAL);
|
|
if (selection.rangeCount && !selection.isCollapsed)
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
let scroll = ContentScroll.getScrollOffset(content);
|
|
for (let frame = this._fastFind.currentWindow; frame != content; frame = frame.parent) {
|
|
let rect = frame.frameElement.getBoundingClientRect();
|
|
let left = frame.getComputedStyle(frame.frameElement, "").borderLeftWidth;
|
|
let top = frame.getComputedStyle(frame.frameElement, "").borderTopWidth;
|
|
scroll.add(rect.left + parseInt(left), rect.top + parseInt(top));
|
|
}
|
|
|
|
let rangeRect = selection.getRangeAt(0).getBoundingClientRect();
|
|
let rect = new Rect(scroll.x + rangeRect.left, scroll.y + rangeRect.top, rangeRect.width, rangeRect.height);
|
|
|
|
// Ensure the potential "scroll" event fired during a search as already fired
|
|
let timer = new Util.Timeout(function() {
|
|
sendAsyncMessage("FindAssist:Show", { rect: rect.isEmpty() ? null: rect , result: findResult });
|
|
});
|
|
timer.once(0);
|
|
}
|
|
};
|
|
|
|
FindHandler.init();
|
|
|
|
var ConsoleAPIObserver = {
|
|
init: function init() {
|
|
addMessageListener("Browser:TabOpen", this);
|
|
addMessageListener("Browser:TabClose", this);
|
|
},
|
|
|
|
receiveMessage: function receiveMessage(aMessage) {
|
|
let json = aMessage.json;
|
|
switch (aMessage.name) {
|
|
case "Browser:TabOpen":
|
|
Services.obs.addObserver(this, "console-api-log-event", false);
|
|
break;
|
|
case "Browser:TabClose":
|
|
Services.obs.removeObserver(this, "console-api-log-event", false);
|
|
break;
|
|
}
|
|
},
|
|
|
|
observe: function observe(aMessage, aTopic, aData) {
|
|
let contentWindowId = content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils).outerWindowID;
|
|
aMessage = aMessage.wrappedJSObject;
|
|
if (aMessage.ID != contentWindowId)
|
|
return;
|
|
|
|
let mappedArguments = Array.map(aMessage.arguments, this.formatResult, this);
|
|
let joinedArguments = Array.join(mappedArguments, " ");
|
|
|
|
if (aMessage.level == "error" || aMessage.level == "warn") {
|
|
let flag = (aMessage.level == "error" ? Ci.nsIScriptError.errorFlag : Ci.nsIScriptError.warningFlag);
|
|
let consoleMsg = Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError);
|
|
consoleMsg.init(joinedArguments, null, null, 0, 0, flag, "content javascript");
|
|
Services.console.logMessage(consoleMsg);
|
|
} else if (aMessage.level == "trace") {
|
|
let bundle = Services.strings.createBundle("chrome://global/locale/headsUpDisplay.properties");
|
|
let args = aMessage.arguments;
|
|
let filename = this.abbreviateSourceURL(args[0].filename);
|
|
let functionName = args[0].functionName || bundle.GetStringFromName("stacktrace.anonymousFunction");
|
|
let lineNumber = args[0].lineNumber;
|
|
|
|
let body = bundle.formatStringFromName("stacktrace.outputMessage", [filename, functionName, lineNumber], 3);
|
|
body += "\n";
|
|
args.forEach(function(aFrame) {
|
|
body += aFrame.filename + " :: " + aFrame.functionName + " :: " + aFrame.lineNumber + "\n";
|
|
});
|
|
|
|
Services.console.logStringMessage(body);
|
|
} else {
|
|
Services.console.logStringMessage(joinedArguments);
|
|
}
|
|
},
|
|
|
|
getResultType: function getResultType(aResult) {
|
|
let type = aResult === null ? "null" : typeof aResult;
|
|
if (type == "object" && aResult.constructor && aResult.constructor.name)
|
|
type = aResult.constructor.name;
|
|
return type.toLowerCase();
|
|
},
|
|
|
|
formatResult: function formatResult(aResult) {
|
|
let output = "";
|
|
let type = this.getResultType(aResult);
|
|
switch (type) {
|
|
case "string":
|
|
case "boolean":
|
|
case "date":
|
|
case "error":
|
|
case "number":
|
|
case "regexp":
|
|
output = aResult.toString();
|
|
break;
|
|
case "null":
|
|
case "undefined":
|
|
output = type;
|
|
break;
|
|
default:
|
|
if (aResult.toSource) {
|
|
try {
|
|
output = aResult.toSource();
|
|
} catch (ex) { }
|
|
}
|
|
if (!output || output == "({})") {
|
|
output = aResult.toString();
|
|
}
|
|
break;
|
|
}
|
|
|
|
return output;
|
|
},
|
|
|
|
abbreviateSourceURL: function abbreviateSourceURL(aSourceURL) {
|
|
// Remove any query parameters.
|
|
let hookIndex = aSourceURL.indexOf("?");
|
|
if (hookIndex > -1)
|
|
aSourceURL = aSourceURL.substring(0, hookIndex);
|
|
|
|
// Remove a trailing "/".
|
|
if (aSourceURL[aSourceURL.length - 1] == "/")
|
|
aSourceURL = aSourceURL.substring(0, aSourceURL.length - 1);
|
|
|
|
// Remove all but the last path component.
|
|
let slashIndex = aSourceURL.lastIndexOf("/");
|
|
if (slashIndex > -1)
|
|
aSourceURL = aSourceURL.substring(slashIndex + 1);
|
|
|
|
return aSourceURL;
|
|
}
|
|
};
|
|
|
|
ConsoleAPIObserver.init();
|
|
|
|
var TouchEventHandler = {
|
|
element: null,
|
|
isCancellable: true,
|
|
|
|
init: function() {
|
|
addMessageListener("Browser:MouseUp", this);
|
|
addMessageListener("Browser:MouseDown", this);
|
|
addMessageListener("Browser:MouseMove", this);
|
|
},
|
|
|
|
receiveMessage: function(aMessage) {
|
|
let json = aMessage.json;
|
|
if (Util.isParentProcess())
|
|
return;
|
|
|
|
if (!content.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils).mayHaveTouchEventListeners) {
|
|
sendAsyncMessage("Browser:CaptureEvents", {
|
|
type: null,
|
|
messageId: json.messageId,
|
|
click: false, panning: false,
|
|
contentMightCaptureMouse: false
|
|
});
|
|
return;
|
|
}
|
|
|
|
let type;
|
|
switch (aMessage.name) {
|
|
case "Browser:MouseDown":
|
|
this.isCancellable = true;
|
|
this.element = elementFromPoint(json.x, json.y);
|
|
type = "touchstart";
|
|
break;
|
|
|
|
case "Browser:MouseUp":
|
|
this.isCancellable = false;
|
|
type = "touchend";
|
|
break;
|
|
|
|
case "Browser:MouseMove":
|
|
type = "touchmove";
|
|
break;
|
|
}
|
|
|
|
if (!this.element)
|
|
return;
|
|
|
|
let cancelled = !this.sendEvent(type, json, this.element);
|
|
if (type == "touchend")
|
|
this.element = null;
|
|
|
|
if (this.isCancellable) {
|
|
sendAsyncMessage("Browser:CaptureEvents", { messageId: json.messageId,
|
|
type: type,
|
|
contentMightCaptureMouse: true,
|
|
click: cancelled && aMessage.name == "Browser:MouseDown",
|
|
panning: cancelled });
|
|
// Panning can be cancelled only during the "touchstart" event and the
|
|
// first "touchmove" event. After it's cancelled, it stays cancelled
|
|
// until the next touchstart event.
|
|
if (cancelled || aMessage.name == "Browser:MouseMove")
|
|
this.isCancellable = false;
|
|
}
|
|
},
|
|
|
|
sendEvent: function(aName, aData, aElement) {
|
|
if (!Services.prefs.getBoolPref("dom.w3c_touch_events.enabled"))
|
|
return true;
|
|
|
|
let evt = content.document.createEvent("touchevent");
|
|
let scrollOffset = ContentScroll.getScrollOffset(aElement.ownerDocument.defaultView);
|
|
let point = content.document.createTouch(content, aElement, 0,
|
|
aData.x, aData.y, aData.x, aData.y, aData.x - scrollOffset.x, aData.y - scrollOffset.y,
|
|
1, 1, 0, 0);
|
|
let touches = content.document.createTouchList(point);
|
|
if (aName == "touchend") {
|
|
let empty = content.document.createTouchList();
|
|
evt.initTouchEvent(aName, true, true, content, 0, false, false, false, false, empty, empty, touches);
|
|
} else {
|
|
evt.initTouchEvent(aName, true, true, content, 0, false, false, false, false, touches, touches, touches);
|
|
}
|
|
return aElement.dispatchEvent(evt);
|
|
}
|
|
};
|
|
|
|
TouchEventHandler.init();
|
|
|
|
var SelectionHandler = {
|
|
cache: {},
|
|
selectedText: "",
|
|
contentWindow: null,
|
|
|
|
init: function sh_init() {
|
|
addMessageListener("Browser:SelectionStart", this);
|
|
addMessageListener("Browser:SelectionEnd", this);
|
|
addMessageListener("Browser:SelectionMove", this);
|
|
},
|
|
|
|
getCurrentWindowAndOffset: function(x, y, offset) {
|
|
let utils = Util.getWindowUtils(content);
|
|
let elem = utils.elementFromPoint(x, y, true, false);
|
|
while (elem && (elem instanceof HTMLIFrameElement || elem instanceof HTMLFrameElement)) {
|
|
// adjust client coordinates' origin to be top left of iframe viewport
|
|
let rect = elem.getBoundingClientRect();
|
|
scrollOffset = ContentScroll.getScrollOffset(elem.ownerDocument.defaultView);
|
|
offset.x += rect.left;
|
|
x -= rect.left;
|
|
|
|
offset.y += rect.top + scrollOffset.y;
|
|
y -= rect.top + scrollOffset.y;
|
|
utils = elem.contentDocument.defaultView.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
|
|
elem = utils.elementFromPoint(x, y, true, false);
|
|
}
|
|
if (!elem)
|
|
return {};
|
|
|
|
return { contentWindow: elem.ownerDocument.defaultView, offset: offset };
|
|
},
|
|
|
|
receiveMessage: function sh_receiveMessage(aMessage) {
|
|
let scrollOffset = ContentScroll.getScrollOffset(content);
|
|
let utils = Util.getWindowUtils(content);
|
|
let json = aMessage.json;
|
|
|
|
switch (aMessage.name) {
|
|
case "Browser:SelectionStart": {
|
|
// Clear out the text cache
|
|
this.selectedText = "";
|
|
|
|
// if this is an iframe, dig down to find the document that was clicked
|
|
let x = json.x - scrollOffset.x;
|
|
let y = json.y - scrollOffset.y;
|
|
let { contentWindow: contentWindow, offset: offset } = this.getCurrentWindowAndOffset(x, y, scrollOffset);
|
|
if (!contentWindow)
|
|
return;
|
|
|
|
let currentDocShell = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShell);
|
|
|
|
// Remove any previous selected or created ranges. Tapping anywhere on a
|
|
// page will create an empty range.
|
|
let selection = contentWindow.getSelection();
|
|
selection.removeAllRanges();
|
|
|
|
// Position the caret using a fake mouse click
|
|
utils.sendMouseEventToWindow("mousedown", x, y, 0, 1, 0, true);
|
|
utils.sendMouseEventToWindow("mouseup", x, y, 0, 1, 0, true);
|
|
|
|
try {
|
|
let selcon = currentDocShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsISelectionDisplay).QueryInterface(Ci.nsISelectionController);
|
|
|
|
// Select the word nearest the caret
|
|
selcon.wordMove(false, false);
|
|
selcon.wordMove(true, true);
|
|
} catch(e) {
|
|
// If we couldn't select the word at the given point, bail
|
|
return;
|
|
}
|
|
|
|
// Find the selected text rect and send it back so the handles can position correctly
|
|
if (selection.rangeCount == 0)
|
|
return;
|
|
|
|
let range = selection.getRangeAt(0).QueryInterface(Ci.nsIDOMNSRange);
|
|
if (!range)
|
|
return;
|
|
|
|
// Cache the selected text since the selection might be gone by the time we get the "end" message
|
|
this.selectedText = selection.toString().trim();
|
|
|
|
// If the range didn't have any text, let's bail
|
|
if (!this.selectedText.length) {
|
|
selection.collapseToStart();
|
|
return;
|
|
}
|
|
|
|
this.cache = this._extractFromRange(range, offset);
|
|
this.contentWindow = contentWindow;
|
|
|
|
sendAsyncMessage("Browser:SelectionRange", this.cache);
|
|
break;
|
|
}
|
|
|
|
case "Browser:SelectionEnd": {
|
|
let tap = { x: json.x - this.cache.offset.x, y: json.y - this.cache.offset.y };
|
|
pointInSelection = (tap.x > this.cache.rect.left && tap.x < this.cache.rect.right) && (tap.y > this.cache.rect.top && tap.y < this.cache.rect.bottom);
|
|
|
|
try {
|
|
// The selection might already be gone
|
|
if (this.contentWindow)
|
|
this.contentWindow.getSelection().removeAllRanges();
|
|
this.contentWindow = null;
|
|
} catch(e) {
|
|
Cu.reportError(e);
|
|
}
|
|
|
|
if (pointInSelection && this.selectedText.length) {
|
|
let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
|
|
clipboard.copyString(this.selectedText);
|
|
sendAsyncMessage("Browser:SelectionCopied", { succeeded: true });
|
|
} else {
|
|
sendAsyncMessage("Browser:SelectionCopied", { succeeded: false });
|
|
}
|
|
break;
|
|
}
|
|
|
|
case "Browser:SelectionMove": {
|
|
if (!this.contentWindow)
|
|
return;
|
|
|
|
// Hack to avoid setting focus in a textbox [Bugs 654352 & 667243]
|
|
let elemUnder = elementFromPoint(json.x - scrollOffset.x, json.y - scrollOffset.y);
|
|
if (elemUnder && elemUnder instanceof Ci.nsIDOMHTMLInputElement || elemUnder instanceof Ci.nsIDOMHTMLTextAreaElement)
|
|
|
|
// Limit the selection to the initial content window (don't leave or enter iframes)
|
|
if (elemUnder && elemUnder.ownerDocument.defaultView != this.contentWindow)
|
|
return;
|
|
|
|
// Use fake mouse events to update the selection
|
|
if (json.type == "end") {
|
|
// Keep the cache in "client" coordinates, but translate for the mouse event
|
|
this.cache.end = { x: json.x, y: json.y };
|
|
let end = { x: this.cache.end.x - scrollOffset.x, y: this.cache.end.y - scrollOffset.y };
|
|
utils.sendMouseEventToWindow("mousedown", end.x, end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true);
|
|
utils.sendMouseEventToWindow("mouseup", end.x, end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true);
|
|
} else {
|
|
// Keep the cache in "client" coordinates, but translate for the mouse event
|
|
this.cache.start = { x: json.x, y: json.y };
|
|
let start = { x: this.cache.start.x - scrollOffset.x, y: this.cache.start.y - scrollOffset.y };
|
|
let end = { x: this.cache.end.x - scrollOffset.x, y: this.cache.end.y - scrollOffset.y };
|
|
|
|
utils.sendMouseEventToWindow("mousedown", start.x, start.y, 0, 0, 0, true);
|
|
utils.sendMouseEventToWindow("mouseup", start.x, start.y, 0, 0, 0, true);
|
|
|
|
utils.sendMouseEventToWindow("mousedown", end.x, end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true);
|
|
utils.sendMouseEventToWindow("mouseup", end.x, end.y, 0, 1, Ci.nsIDOMNSEvent.SHIFT_MASK, true);
|
|
}
|
|
|
|
// Cache the selected text since the selection might be gone by the time we get the "end" message
|
|
let selection = this.contentWindow.getSelection()
|
|
this.selectedText = selection.toString().trim();
|
|
|
|
// Update the rect we use to test when finishing the clipboard operation
|
|
let range = selection.getRangeAt(0).QueryInterface(Ci.nsIDOMNSRange);
|
|
this.cache.rect = this._extractFromRange(range, this.cache.offset).rect;
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
|
|
_extractFromRange: function sh_extractFromRange(aRange, aOffset) {
|
|
let cache = { start: {}, end: {}, rect: { left: Number.MAX_VALUE, top: Number.MAX_VALUE, right: 0, bottom: 0 } };
|
|
let rects = aRange.getClientRects();
|
|
for (let i=0; i<rects.length; i++) {
|
|
if (i == 0) {
|
|
cache.start.x = rects[i].left + aOffset.x;
|
|
cache.start.y = rects[i].bottom + aOffset.y;
|
|
}
|
|
cache.end.x = rects[i].right + aOffset.x;
|
|
cache.end.y = rects[i].bottom + aOffset.y;
|
|
}
|
|
|
|
// Keep the handles from being positioned completely out of the selection range
|
|
const HANDLE_VERTICAL_MARGIN = 4;
|
|
cache.start.y -= HANDLE_VERTICAL_MARGIN;
|
|
cache.end.y -= HANDLE_VERTICAL_MARGIN;
|
|
|
|
cache.rect = aRange.getBoundingClientRect();
|
|
cache.rect.left += aOffset.x;
|
|
cache.rect.top += aOffset.y;
|
|
cache.rect.right += aOffset.x;
|
|
cache.rect.bottom += aOffset.y;
|
|
cache.offset = aOffset;
|
|
|
|
return cache;
|
|
}
|
|
};
|
|
|
|
SelectionHandler.init();
|
|
|
|
|
|
var PluginHandler = {
|
|
init: function() {
|
|
addEventListener("PluginClickToPlay", this, false);
|
|
},
|
|
|
|
addLinkClickCallback: function (linkNode, callbackName /*callbackArgs...*/) {
|
|
// XXX just doing (callback)(arg) was giving a same-origin error. bug?
|
|
let self = this;
|
|
let callbackArgs = Array.prototype.slice.call(arguments).slice(2);
|
|
linkNode.addEventListener("click",
|
|
function(evt) {
|
|
if (!evt.isTrusted)
|
|
return;
|
|
evt.preventDefault();
|
|
if (callbackArgs.length == 0)
|
|
callbackArgs = [ evt ];
|
|
(self[callbackName]).apply(self, callbackArgs);
|
|
},
|
|
true);
|
|
|
|
linkNode.addEventListener("keydown",
|
|
function(evt) {
|
|
if (!evt.isTrusted)
|
|
return;
|
|
if (evt.keyCode == evt.DOM_VK_RETURN) {
|
|
evt.preventDefault();
|
|
if (callbackArgs.length == 0)
|
|
callbackArgs = [ evt ];
|
|
evt.preventDefault();
|
|
(self[callbackName]).apply(self, callbackArgs);
|
|
}
|
|
},
|
|
true);
|
|
},
|
|
|
|
handleEvent : function(event) {
|
|
if (event.type != "PluginClickToPlay")
|
|
return;
|
|
let plugin = event.target;
|
|
PluginHandler.addLinkClickCallback(plugin, "reloadToEnablePlugin");
|
|
},
|
|
|
|
reloadToEnablePlugin: function() {
|
|
sendAsyncMessage("Browser:PluginClickToPlayClicked", { });
|
|
}
|
|
};
|
|
|
|
PluginHandler.init();
|