diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 87c617f3f7d0..ed30af87a583 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -515,6 +515,9 @@ var gPopupBlockerObserver = { var perm = shouldBlock ? pm.DENY_ACTION : pm.ALLOW_ACTION; pm.add(gBrowser.currentURI, "popup", perm); + if (!shouldBlock) + this.showAllBlockedPopups(gBrowser.selectedBrowser); + gBrowser.getNotificationBox().removeCurrentNotification(); }, @@ -569,6 +572,7 @@ var gPopupBlockerObserver = { // xxxdz this should make the option say "Show file picker" and do it (Bug 590306) if (!blockedPopup.popupWindowURI) continue; + var popupURIspec = blockedPopup.popupWindowURI.spec; // Sometimes the popup URI that we get back from the blockedPopup @@ -591,9 +595,6 @@ var gPopupBlockerObserver = { var label = gNavigatorBundle.getFormattedString("popupShowPopupPrefix", [popupURIspec]); menuitem.setAttribute("label", label); - menuitem.setAttribute("popupWindowURI", popupURIspec); - menuitem.setAttribute("popupWindowFeatures", blockedPopup.popupWindowFeatures); - menuitem.setAttribute("popupWindowName", blockedPopup.popupWindowName); menuitem.setAttribute("oncommand", "gPopupBlockerObserver.showBlockedPopup(event);"); menuitem.setAttribute("popupReportIndex", i); menuitem.popupReportBrowser = browser; @@ -640,6 +641,18 @@ var gPopupBlockerObserver = { browser.unblockPopup(popupReportIndex); }, + showAllBlockedPopups: function (aBrowser) + { + let popups = aBrowser.blockedPopups; + if (!popups) + return; + + for (let i = 0; i < popups.length; i++) { + if (popups[i].popupWindowURI) + aBrowser.unblockPopup(i); + } + }, + editPopupSettings: function () { var host = ""; diff --git a/browser/base/content/newtab/newTab.css b/browser/base/content/newtab/newTab.css index d652394d0a24..43f9162624dc 100644 --- a/browser/base/content/newtab/newTab.css +++ b/browser/base/content/newtab/newTab.css @@ -331,13 +331,23 @@ input[type=button] { #newtab-search-logo { display: -moz-box; - width: 77px; /* 65 image width + 6 left "padding" + 6 right "padding" */ + width: 38px; height: 38px; /* 26 image height + 6 top "padding" + 6 bottom "padding" */ border: 1px solid transparent; -moz-margin-end: 8px; background-repeat: no-repeat; background-position: center; + background-image: url(chrome://global/skin/icons/autocomplete-search.svg#search-icon); + background-size: 26px 26px; +} + +#newtab-search-logo[type="logo"] { background-size: 65px 26px; + width: 77px; /* 65 image width + 6 left "padding" + 6 right "padding" */ +} + +#newtab-search-logo[type="favicon"] { + background-size: 16px 16px; } #newtab-search-logo[hidden] { diff --git a/browser/base/content/newtab/search.js b/browser/base/content/newtab/search.js index 405981402691..643bbc52cea6 100644 --- a/browser/base/content/newtab/search.js +++ b/browser/base/content/newtab/search.js @@ -160,6 +160,14 @@ let gSearch = { } }, + // Converts favicon array buffer into data URI of the right size and dpi. + _getFaviconURIFromBuffer: function (buffer) { + let blob = new Blob([buffer]); + let dpiSize = Math.round(16 * window.devicePixelRatio); + let sizeStr = dpiSize + "," + dpiSize; + return URL.createObjectURL(blob) + "#-moz-resolution=" + sizeStr; + }, + _makePanelEngine: function (panel, engine) { let box = document.createElementNS(XUL_NAMESPACE, "hbox"); box.className = "newtab-search-panel-engine"; @@ -173,10 +181,7 @@ let gSearch = { let image = document.createElementNS(XUL_NAMESPACE, "image"); if (engine.iconBuffer) { - let blob = new Blob([engine.iconBuffer]); - let size = Math.round(16 * window.devicePixelRatio); - let sizeStr = size + "," + size; - let uri = URL.createObjectURL(blob) + "#-moz-resolution=" + sizeStr; + let uri = this._getFaviconURIFromBuffer(engine.iconBuffer); image.setAttribute("src", uri); } box.appendChild(image); @@ -191,17 +196,27 @@ let gSearch = { _setCurrentEngine: function (engine) { this.currentEngineName = engine.name; - // Set the logo. - let logoBuf = window.devicePixelRatio == 2 ? engine.logo2xBuffer : + let type = ""; + let uri; + let logoBuf = window.devicePixelRatio >= 2 ? + engine.logo2xBuffer || engine.logoBuffer : engine.logoBuffer || engine.logo2xBuffer; if (logoBuf) { - this._nodes.logo.hidden = false; - let uri = URL.createObjectURL(new Blob([logoBuf])); + uri = URL.createObjectURL(new Blob([logoBuf])); + type = "logo"; + } + else if (engine.iconBuffer) { + uri = this._getFaviconURIFromBuffer(engine.iconBuffer); + type = "favicon"; + } + this._nodes.logo.setAttribute("type", type); + + if (uri) { this._nodes.logo.style.backgroundImage = "url(" + uri + ")"; this._nodes.text.placeholder = ""; } else { - this._nodes.logo.hidden = true; + this._nodes.logo.style.backgroundImage = ""; this._nodes.text.placeholder = engine.name; } diff --git a/browser/base/content/test/general/browser.ini b/browser/base/content/test/general/browser.ini index ad9cdc511e9d..75269e1812ca 100644 --- a/browser/base/content/test/general/browser.ini +++ b/browser/base/content/test/general/browser.ini @@ -65,6 +65,7 @@ support-files = offlineQuotaNotification.html page_style_sample.html parsingTestHelpers.jsm + popup_blocker.html print_postdata.sjs redirect_bug623155.sjs searchSuggestionEngine.sjs @@ -109,6 +110,8 @@ skip-if = os == "linux" # Bug 1073339 - Investigate autocomplete test unreliabil skip-if = os == "linux" # Bug 1073339 - Investigate autocomplete test unreliability on Linux [browser_addKeywordSearch.js] skip-if = e10s +[browser_search_favicon.js] +skip-if = os == "linux" # Bug 1073339 - Investigate autocomplete test unreliability on Linux [browser_alltabslistener.js] skip-if = os == "linux" || e10s # Linux: Intermittent failures, bug 951680; e10s: Bug ?????? - notifications don't work correctly. [browser_autocomplete_a11y_label.js] @@ -369,6 +372,7 @@ skip-if = asan # Disabled because it takes a long time (see test for more inform skip-if = e10s # Bug ?????? - test directly manipulates content (creates and fetches elements directly from content document) [browser_popupUI.js] skip-if = buildapp == 'mulet' || e10s # Bug ?????? - test directly manipulates content (tries to get a popup element directly from content) +[browser_popup_blocker.js] [browser_printpreview.js] skip-if = buildapp == 'mulet' || e10s # Bug ?????? - timeout after logging "Error: Channel closing: too late to send/recv, messages will be lost" [browser_private_browsing_window.js] diff --git a/browser/base/content/test/general/browser_popup_blocker.js b/browser/base/content/test/general/browser_popup_blocker.js new file mode 100644 index 000000000000..c381141f711e --- /dev/null +++ b/browser/base/content/test/general/browser_popup_blocker.js @@ -0,0 +1,64 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const baseURL = "http://example.com/browser/browser/base/content/test/general/"; + +function test() { + waitForExplicitFinish(); + Task.spawn(function* () { + // Enable the popup blocker. + yield pushPrefs(["dom.disable_open_during_load", true]); + + // Open the test page. + let tab = gBrowser.loadOneTab(baseURL + "popup_blocker.html", { inBackground: false }); + yield promiseTabLoaded(tab); + + // Wait for the popup-blocked notification. + let notification; + yield promiseWaitForCondition(() => + notification = gBrowser.getNotificationBox().getNotificationWithValue("popup-blocked")); + + // Show the menu. + let popupShown = promiseWaitForEvent(window, "popupshown"); + notification.querySelector("button").doCommand(); + let popup_event = yield popupShown; + let menu = popup_event.target; + is(menu.id, "blockedPopupOptions", "Blocked popup menu shown"); + + // Check the menu contents. + let sep = menu.querySelector("menuseparator"); + let popupCount = 0; + for (let i = sep.nextElementSibling; i; i = i.nextElementSibling) { + popupCount++; + } + is(popupCount, 2, "Two popups were blocked"); + + // Pressing "allow" should open all blocked popups. + let popupTabs = []; + function onTabOpen(event) { + popupTabs.push(event.target); + } + gBrowser.tabContainer.addEventListener("TabOpen", onTabOpen); + + // Press the button. + let allow = menu.querySelector("[observes='blockedPopupAllowSite']"); + allow.doCommand(); + yield promiseWaitForCondition(() => + popupTabs.length == 2 && + popupTabs.every(tab => tab.linkedBrowser.currentURI.spec != "about:blank")); + + gBrowser.tabContainer.removeEventListener("TabOpen", onTabOpen); + + is(popupTabs[0].linkedBrowser.currentURI.spec, "data:text/plain;charset=utf-8,a", "Popup a"); + is(popupTabs[1].linkedBrowser.currentURI.spec, "data:text/plain;charset=utf-8,b", "Popup b"); + + // Clean up. + gBrowser.removeTab(tab); + for (let popup of popupTabs) { + gBrowser.removeTab(popup); + } + clearAllPermissionsByPrefix("popup"); + finish(); + }); +} diff --git a/browser/base/content/test/general/browser_search_favicon.js b/browser/base/content/test/general/browser_search_favicon.js new file mode 100644 index 000000000000..ebaacb92d414 --- /dev/null +++ b/browser/base/content/test/general/browser_search_favicon.js @@ -0,0 +1,121 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +let gOriginalEngine; +let gEngine; +let gUnifiedCompletePref = "browser.urlbar.unifiedcomplete"; + +/** + * Asynchronously adds visits to a page. + * + * @param aPlaceInfo + * Can be an nsIURI, in such a case a single LINK visit will be added. + * Otherwise can be an object describing the visit to add, or an array + * of these objects: + * { uri: nsIURI of the page, + * transition: one of the TRANSITION_* from nsINavHistoryService, + * [optional] title: title of the page, + * [optional] visitDate: visit date in microseconds from the epoch + * [optional] referrer: nsIURI of the referrer for this visit + * } + * + * @return {Promise} + * @resolves When all visits have been added successfully. + * @rejects JavaScript exception. + */ +function promiseAddVisits(aPlaceInfo) { + return new Promise((resolve, reject) => { + let places = []; + if (aPlaceInfo instanceof Ci.nsIURI) { + places.push({ uri: aPlaceInfo }); + } + else if (Array.isArray(aPlaceInfo)) { + places = places.concat(aPlaceInfo); + } else { + places.push(aPlaceInfo) + } + + // Create mozIVisitInfo for each entry. + let now = Date.now(); + for (let i = 0, len = places.length; i < len; ++i) { + if (!places[i].title) { + places[i].title = "test visit for " + places[i].uri.spec; + } + places[i].visits = [{ + transitionType: places[i].transition === undefined ? Ci.nsINavHistoryService.TRANSITION_LINK + : places[i].transition, + visitDate: places[i].visitDate || (now++) * 1000, + referrerURI: places[i].referrer + }]; + } + + PlacesUtils.asyncHistory.updatePlaces( + places, + { + handleError: function AAV_handleError(aResultCode, aPlaceInfo) { + let ex = new Components.Exception("Unexpected error in adding visits.", + aResultCode); + reject(ex); + }, + handleResult: function () {}, + handleCompletion: function UP_handleCompletion() { + resolve(); + } + } + ); + }); +} + +function* promiseAutocompleteResultPopup(inputText) { + gURLBar.focus(); + gURLBar.value = inputText.slice(0, -1); + EventUtils.synthesizeKey(inputText.slice(-1) , {}); + yield promiseSearchComplete(); + + return gURLBar.popup.richlistbox.children; +} + +registerCleanupFunction(() => { + Services.prefs.clearUserPref(gUnifiedCompletePref); + Services.search.currentEngine = gOriginalEngine; + Services.search.removeEngine(gEngine); + return promiseClearHistory(); +}); + +add_task(function*() { + Services.prefs.setBoolPref(gUnifiedCompletePref, true); +}); + +add_task(function*() { + + Services.search.addEngineWithDetails("SearchEngine", "", "", "", + "GET", "http://s.example.com/search"); + gEngine = Services.search.getEngineByName("SearchEngine"); + gEngine.addParam("q", "{searchTerms}", null); + gOriginalEngine = Services.search.currentEngine; + Services.search.currentEngine = gEngine; + + let uri = NetUtil.newURI("http://s.example.com/search?q=foo&client=1"); + yield promiseAddVisits({ uri: uri, title: "Foo - SearchEngine Search" }); + + // The first autocomplete result has the action searchengine, while + // the second result is the "search favicon" element. + let result = yield promiseAutocompleteResultPopup("foo"); + result = result[1]; + + isnot(result, null, "Expect a search result"); + is(result.getAttribute("type"), "search favicon", "Expect correct `type` attribute"); + + is_element_visible(result._title, "Title element should be visible"); + is_element_visible(result._extraBox, "Extra box element should be visible"); + + is(result._extraBox.pack, "start", "Extra box element should start after the title"); + let iconElem = result._extraBox.nextSibling; + is_element_visible(iconElem, + "The element containing the magnifying glass icon should be visible"); + ok(iconElem.classList.contains("ac-result-type-keyword"), + "That icon should have the same class use for `keyword` results"); + + is_element_visible(result._url, "URL element should be visible"); + is(result._url.textContent, "Search with SearchEngine"); +}); diff --git a/browser/base/content/test/general/head.js b/browser/base/content/test/general/head.js index e3ffb34803a7..60bd18f8006b 100644 --- a/browser/base/content/test/general/head.js +++ b/browser/base/content/test/general/head.js @@ -150,15 +150,25 @@ function setTestPluginEnabledState(newEnabledState, pluginName) { // after a test is done using the plugin doorhanger, we should just clear // any permissions that may have crept in function clearAllPluginPermissions() { + clearAllPermissionsByPrefix("plugin"); +} + +function clearAllPermissionsByPrefix(aPrefix) { let perms = Services.perms.enumerator; while (perms.hasMoreElements()) { let perm = perms.getNext(); - if (perm.type.startsWith('plugin')) { + if (perm.type.startsWith(aPrefix)) { Services.perms.remove(perm.host, perm.type); } } } +function pushPrefs(...aPrefs) { + let deferred = Promise.defer(); + SpecialPowers.pushPrefEnv({"set": aPrefs}, deferred.resolve); + return deferred.promise; +} + function updateBlocklist(aCallback) { var blocklistNotifier = Cc["@mozilla.org/extensions/blocklist;1"] .getService(Ci.nsITimerCallback); diff --git a/browser/base/content/test/general/popup_blocker.html b/browser/base/content/test/general/popup_blocker.html new file mode 100644 index 000000000000..6e2b7db15536 --- /dev/null +++ b/browser/base/content/test/general/popup_blocker.html @@ -0,0 +1,13 @@ + + + + + Page creating two popups + + + + + diff --git a/browser/base/content/test/newtab/browser.ini b/browser/base/content/test/newtab/browser.ini index a32d269ba4fe..c52dad9625e1 100644 --- a/browser/base/content/test/newtab/browser.ini +++ b/browser/base/content/test/newtab/browser.ini @@ -35,6 +35,7 @@ support-files = [browser_newtab_search.js] support-files = searchEngineNoLogo.xml + searchEngineFavicon.xml searchEngine1xLogo.xml searchEngine2xLogo.xml searchEngine1x2xLogo.xml diff --git a/browser/base/content/test/newtab/browser_newtab_search.js b/browser/base/content/test/newtab/browser_newtab_search.js index edf3d55e3506..d18987836f6e 100644 --- a/browser/base/content/test/newtab/browser_newtab_search.js +++ b/browser/base/content/test/newtab/browser_newtab_search.js @@ -4,11 +4,45 @@ // See browser/components/search/test/browser_*_behavior.js for tests of actual // searches. -const ENGINE_NO_LOGO = "searchEngineNoLogo.xml"; -const ENGINE_1X_LOGO = "searchEngine1xLogo.xml"; -const ENGINE_2X_LOGO = "searchEngine2xLogo.xml"; -const ENGINE_1X_2X_LOGO = "searchEngine1x2xLogo.xml"; -const ENGINE_SUGGESTIONS = "searchSuggestionEngine.xml"; +Cu.import("resource://gre/modules/Task.jsm"); + +const ENGINE_NO_LOGO = { + name: "searchEngineNoLogo.xml", + numLogos: 0, +}; + +const ENGINE_FAVICON = { + name: "searchEngineFavicon.xml", + logoPrefix1x: "data:image/png;base64,AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAATCwAAEwsA", + numLogos: 1, +}; +ENGINE_FAVICON.logoPrefix2x = ENGINE_FAVICON.logoPrefix1x; + +const ENGINE_1X_LOGO = { + name: "searchEngine1xLogo.xml", + logoPrefix1x: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAIAAABn3KYmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gkTADEw", + numLogos: 1, +}; +ENGINE_1X_LOGO.logoPrefix2x = ENGINE_1X_LOGO.logoPrefix1x; + +const ENGINE_2X_LOGO = { + name: "searchEngine2xLogo.xml", + logoPrefix2x: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAIAAADJ8nfCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gkTADMU", + numLogos: 1, +}; +ENGINE_2X_LOGO.logoPrefix1x = ENGINE_2X_LOGO.logoPrefix2x; + +const ENGINE_1X_2X_LOGO = { + name: "searchEngine1x2xLogo.xml", + logoPrefix1x: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAIAAABn3KYmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gkTADIG", + logoPrefix2x: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAIAAADJ8nfCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gkTADMo", + numLogos: 2, +}; + +const ENGINE_SUGGESTIONS = { + name: "searchSuggestionEngine.xml", + numLogos: 0, +}; const SERVICE_EVENT_NAME = "ContentSearchService"; @@ -28,9 +62,14 @@ var gExpectedSearchEventQueue = []; var gNewEngines = []; function runTests() { + runTaskifiedTests().then(TestRunner.next, TestRunner.next); + yield; +} + +let runTaskifiedTests = Task.async(function* () { let oldCurrentEngine = Services.search.currentEngine; - yield addNewTabPageTab(); + yield addNewTabPageTabPromise(); // The tab is removed at the end of the test, so there's no need to remove // this listener at the end of the test. @@ -45,66 +84,40 @@ function runTests() { panel.setAttribute("animate", "false"); // Add the engine without any logos and switch to it. - let noLogoEngine = null; - yield promiseNewSearchEngine(ENGINE_NO_LOGO, 0).then(engine => { - noLogoEngine = engine; - TestRunner.next(); - }); - ok(!noLogoEngine.getIconURLBySize(...LOGO_1X_DPI_SIZE), - "Sanity check: engine should not have 1x logo"); - ok(!noLogoEngine.getIconURLBySize(...LOGO_2X_DPI_SIZE), - "Sanity check: engine should not have 2x logo"); + let noLogoEngine = yield promiseNewSearchEngine(ENGINE_NO_LOGO); Services.search.currentEngine = noLogoEngine; - yield promiseSearchEvents(["CurrentEngine"]).then(TestRunner.next); - yield checkCurrentEngine(ENGINE_NO_LOGO, false, false); + yield promiseSearchEvents(["CurrentEngine"]); + yield checkCurrentEngine(ENGINE_NO_LOGO); + + // Add the engine with favicon and switch to it. + let faviconEngine = yield promiseNewSearchEngine(ENGINE_FAVICON); + Services.search.currentEngine = faviconEngine; + yield promiseSearchEvents(["CurrentEngine"]); + yield checkCurrentEngine(ENGINE_FAVICON); // Add the engine with a 1x-DPI logo and switch to it. - let logo1xEngine = null; - yield promiseNewSearchEngine(ENGINE_1X_LOGO, 1).then(engine => { - logo1xEngine = engine; - TestRunner.next(); - }); - ok(!!logo1xEngine.getIconURLBySize(...LOGO_1X_DPI_SIZE), - "Sanity check: engine should have 1x logo"); - ok(!logo1xEngine.getIconURLBySize(...LOGO_2X_DPI_SIZE), - "Sanity check: engine should not have 2x logo"); + let logo1xEngine = yield promiseNewSearchEngine(ENGINE_1X_LOGO); Services.search.currentEngine = logo1xEngine; - yield promiseSearchEvents(["CurrentEngine"]).then(TestRunner.next); - yield checkCurrentEngine(ENGINE_1X_LOGO, true, false); + yield promiseSearchEvents(["CurrentEngine"]); + yield checkCurrentEngine(ENGINE_1X_LOGO); // Add the engine with a 2x-DPI logo and switch to it. - let logo2xEngine = null; - yield promiseNewSearchEngine(ENGINE_2X_LOGO, 1).then(engine => { - logo2xEngine = engine; - TestRunner.next(); - }); - ok(!logo2xEngine.getIconURLBySize(...LOGO_1X_DPI_SIZE), - "Sanity check: engine should not have 1x logo"); - ok(!!logo2xEngine.getIconURLBySize(...LOGO_2X_DPI_SIZE), - "Sanity check: engine should have 2x logo"); + let logo2xEngine = yield promiseNewSearchEngine(ENGINE_2X_LOGO); Services.search.currentEngine = logo2xEngine; - yield promiseSearchEvents(["CurrentEngine"]).then(TestRunner.next); - yield checkCurrentEngine(ENGINE_2X_LOGO, false, true); + yield promiseSearchEvents(["CurrentEngine"]); + yield checkCurrentEngine(ENGINE_2X_LOGO); // Add the engine with 1x- and 2x-DPI logos and switch to it. - let logo1x2xEngine = null; - yield promiseNewSearchEngine(ENGINE_1X_2X_LOGO, 2).then(engine => { - logo1x2xEngine = engine; - TestRunner.next(); - }); - ok(!!logo1x2xEngine.getIconURLBySize(...LOGO_1X_DPI_SIZE), - "Sanity check: engine should have 1x logo"); - ok(!!logo1x2xEngine.getIconURLBySize(...LOGO_2X_DPI_SIZE), - "Sanity check: engine should have 2x logo"); + let logo1x2xEngine = yield promiseNewSearchEngine(ENGINE_1X_2X_LOGO); Services.search.currentEngine = logo1x2xEngine; - yield promiseSearchEvents(["CurrentEngine"]).then(TestRunner.next); - yield checkCurrentEngine(ENGINE_1X_2X_LOGO, true, true); + yield promiseSearchEvents(["CurrentEngine"]); + yield checkCurrentEngine(ENGINE_1X_2X_LOGO); // Click the logo to open the search panel. yield Promise.all([ promisePanelShown(panel), promiseClick(logoImg()), - ]).then(TestRunner.next); + ]); // In the search panel, click the no-logo engine. It should become the // current engine. @@ -119,20 +132,20 @@ function runTests() { yield Promise.all([ promiseSearchEvents(["CurrentEngine"]), promiseClick(noLogoBox), - ]).then(TestRunner.next); + ]); - yield checkCurrentEngine(ENGINE_NO_LOGO, false, false); + yield checkCurrentEngine(ENGINE_NO_LOGO); // Switch back to the 1x-and-2x logo engine. Services.search.currentEngine = logo1x2xEngine; - yield promiseSearchEvents(["CurrentEngine"]).then(TestRunner.next); - yield checkCurrentEngine(ENGINE_1X_2X_LOGO, true, true); + yield promiseSearchEvents(["CurrentEngine"]); + yield checkCurrentEngine(ENGINE_1X_2X_LOGO); // Open the panel again. yield Promise.all([ promisePanelShown(panel), promiseClick(logoImg()), - ]).then(TestRunner.next); + ]); // In the search panel, click the Manage Engines box. let manageBox = $("manage"); @@ -140,17 +153,13 @@ function runTests() { yield Promise.all([ promiseManagerOpen(), promiseClick(manageBox), - ]).then(TestRunner.next); + ]); // Add the engine that provides search suggestions and switch to it. - let suggestionEngine = null; - yield promiseNewSearchEngine(ENGINE_SUGGESTIONS, 0).then(engine => { - suggestionEngine = engine; - TestRunner.next(); - }); + let suggestionEngine = yield promiseNewSearchEngine(ENGINE_SUGGESTIONS); Services.search.currentEngine = suggestionEngine; - yield promiseSearchEvents(["CurrentEngine"]).then(TestRunner.next); - yield checkCurrentEngine(ENGINE_SUGGESTIONS, false, false); + yield promiseSearchEvents(["CurrentEngine"]); + yield checkCurrentEngine(ENGINE_SUGGESTIONS); // Avoid intermittent failures. gSearch()._suggestionController.remoteTimeout = 5000; @@ -165,21 +174,22 @@ function runTests() { // Wait for the search suggestions to become visible and for the Suggestions // message. + let suggestionsUnhiddenDefer = Promise.defer(); let table = getContentDocument().getElementById("searchSuggestionTable"); info("Waiting for suggestions table to open"); let observer = new MutationObserver(() => { if (input.getAttribute("aria-expanded") == "true") { observer.disconnect(); ok(!table.hidden, "Search suggestion table unhidden"); - TestRunner.next(); + suggestionsUnhiddenDefer.resolve(); } }); observer.observe(input, { attributes: true, attributeFilter: ["aria-expanded"], }); - yield undefined; - yield suggestionsPromise.then(TestRunner.next); + yield suggestionsUnhiddenDefer.promise; + yield suggestionsPromise; // Empty the search input, causing the suggestions to be hidden. EventUtils.synthesizeKey("a", { accelKey: true }); @@ -190,12 +200,12 @@ function runTests() { CustomizableUI.removeWidgetFromArea("search-container"); // Focus a different element than the search input from the page. let btn = getContentDocument().getElementById("newtab-customize-button"); - yield promiseClick(btn).then(TestRunner.next); + yield promiseClick(btn); isnot(input, getContentDocument().activeElement, "Search input should not be focused"); // Test that Ctrl/Cmd + K will focus the input field from the page. EventUtils.synthesizeKey("k", { accelKey: true }); - yield promiseSearchEvents(["FocusInput"]).then(TestRunner.next); + yield promiseSearchEvents(["FocusInput"]); is(input, getContentDocument().activeElement, "Search input should be focused"); // Reset changes made to toolbar CustomizableUI.reset(); @@ -207,13 +217,13 @@ function runTests() { // Test that Ctrl/Cmd + K will focus the search bar from a new about:home page if // the newtab is disabled from `NewTabUtils.allPages.enabled`. - yield addNewTabPageTab(); + yield addNewTabPageTabPromise(); // Remove the search bar from toolbar CustomizableUI.removeWidgetFromArea("search-container"); NewTabUtils.allPages.enabled = false; EventUtils.synthesizeKey("k", { accelKey: true }); let waitEvent = "AboutHomeLoadSnippetsCompleted"; - yield promiseTabLoadEvent(gWindow.gBrowser.selectedTab, "about:home", waitEvent).then(TestRunner.next); + yield promiseTabLoadEvent(gWindow.gBrowser.selectedTab, "about:home", waitEvent); is(getContentDocument().documentURI.toLowerCase(), "about:home", "New tab's uri should be about:home"); let searchInput = getContentDocument().getElementById("searchText"); @@ -225,38 +235,29 @@ function runTests() { // Done. Revert the current engine and remove the new engines. Services.search.currentEngine = oldCurrentEngine; - yield promiseSearchEvents(["CurrentEngine"]).then(TestRunner.next); + yield promiseSearchEvents(["CurrentEngine"]); let events = []; for (let engine of gNewEngines) { Services.search.removeEngine(engine); events.push("CurrentState"); } - yield promiseSearchEvents(events).then(TestRunner.next); -} + yield promiseSearchEvents(events); +}); function searchEventListener(event) { info("Got search event " + event.detail.type); - let passed = false; let nonempty = gExpectedSearchEventQueue.length > 0; ok(nonempty, "Expected search event queue should be nonempty"); if (nonempty) { let { type, deferred } = gExpectedSearchEventQueue.shift(); is(event.detail.type, type, "Got expected search event " + type); if (event.detail.type == type) { - passed = true; - // Let gSearch respond to the event before continuing. - executeSoon(() => deferred.resolve()); + deferred.resolve(); + } else { + deferred.reject(); } } - if (!passed) { - info("Didn't get expected event, stopping the test"); - getContentWindow().removeEventListener(SERVICE_EVENT_NAME, - searchEventListener); - // Set next() to a no-op so the test really does stop. - TestRunner.next = function () {}; - TestRunner.finish(); - } } function $(idSuffix) { @@ -270,7 +271,7 @@ function promiseSearchEvents(events) { return Promise.all(events.map(e => e.deferred.promise)); } -function promiseNewSearchEngine(basename, numLogos) { +function promiseNewSearchEngine({name: basename, numLogos}) { info("Waiting for engine to be added: " + basename); // Wait for the search events triggered by adding the new engine. @@ -297,19 +298,40 @@ function promiseNewSearchEngine(basename, numLogos) { }, }); - // Make a new promise that wraps the previous promises. The only point of - // this is to pass the new engine to the yielder via deferred.resolve(), - // which is a little nicer than passing an array whose first element is the - // new engine. - let deferred = Promise.defer(); - Promise.all([addDeferred.promise, eventPromise]).then(values => { - let newEngine = values[0]; - deferred.resolve(newEngine); - }, () => deferred.reject()); - return deferred.promise; + return Promise.all([addDeferred.promise, eventPromise]).then(([newEngine, _]) => { + return newEngine; + }); } -function checkCurrentEngine(basename, has1xLogo, has2xLogo) { +function objectURLToBlob(url) { + return new Promise(function (resolve, reject) { + let xhr = new XMLHttpRequest(); + xhr.open("get", url, true); + xhr.responseType = "blob"; + xhr.overrideMimeType("image/png"); + xhr.onload = function(e) { + if (this.status == 200) { + return resolve(this.response); + } + reject("Failed to get logo, xhr returned status: " + this.status); + }; + xhr.onerror = reject; + xhr.send(); + }); +} + +function blobToBase64(blob) { + return new Promise(function (resolve, reject) { + var reader = new FileReader(); + reader.onload = function() { + resolve(reader.result); + } + reader.onerror = reject; + reader.readAsDataURL(blob); + }); +} + +let checkCurrentEngine = Task.async(function* ({name: basename, logoPrefix1x, logoPrefix2x}) { let engine = Services.search.currentEngine; ok(engine.name.contains(basename), "Sanity check: current engine: engine.name=" + engine.name + @@ -319,41 +341,23 @@ function checkCurrentEngine(basename, has1xLogo, has2xLogo) { is(gSearch().currentEngineName, engine.name, "currentEngineName: " + engine.name); - // search bar logo - let logoURI = null; - if (window.devicePixelRatio == 2) { - if (has2xLogo) { - logoURI = engine.getIconURLBySize(...LOGO_2X_DPI_SIZE); - ok(!!logoURI, "Sanity check: engine should have 2x logo"); - } - } - else { - if (has1xLogo) { - logoURI = engine.getIconURLBySize(...LOGO_1X_DPI_SIZE); - ok(!!logoURI, "Sanity check: engine should have 1x logo"); - } - else if (has2xLogo) { - logoURI = engine.getIconURLBySize(...LOGO_2X_DPI_SIZE); - ok(!!logoURI, "Sanity check: engine should have 2x logo"); - } - } + let expectedLogoPrefix = window.devicePixelRatio >= 2 ? logoPrefix2x : logoPrefix1x; + + // Check that the right logo is set. let logo = logoImg(); - is(logo.hidden, !logoURI, - "Logo should be visible iff engine has a logo: " + engine.name); - if (logoURI) { - // The URLs of blobs created with the same ArrayBuffer are different, so - // just check that the URI is a blob URI. - ok(/^url\("blob:/.test(logo.style.backgroundImage), "Logo URI"); //" - } + if (expectedLogoPrefix) { + let objectURL = logo.style.backgroundImage.match(/^url\("([^"]*)"\)$/)[1]; + ok(objectURL, "ObjectURL should be there."); - if (logo.hidden) { - executeSoon(TestRunner.next); - return; - } + let blob = yield objectURLToBlob(objectURL); + let base64 = yield blobToBase64(blob); + + ok(base64.startsWith(expectedLogoPrefix), "Checking image prefix."); + + let panel = searchPanel(); + panel.openPopup(logo); + yield promisePanelShown(panel); - // "selected" attributes of engines in the panel - let panel = searchPanel(); - promisePanelShown(panel).then(() => { panel.hidePopup(); for (let engineBox of panel.childNodes) { let engineName = engineBox.getAttribute("engine"); @@ -368,10 +372,11 @@ function checkCurrentEngine(basename, has1xLogo, has2xLogo) { "non-selected engine: " + engineName); } } - TestRunner.next(); - }); - panel.openPopup(logo); -} + } + else { + is(logo.style.backgroundImage, "", "backgroundImage should be empty"); + } +}); function promisePanelShown(panel) { let deferred = Promise.defer(); @@ -379,7 +384,7 @@ function promisePanelShown(panel) { panel.addEventListener("popupshown", function onEvent() { panel.removeEventListener("popupshown", onEvent); is(panel.state, "open", "Panel state"); - executeSoon(() => deferred.resolve()); + deferred.resolve(); }); return deferred.promise; } @@ -410,10 +415,8 @@ function promiseManagerOpen() { is(subj.opener, gWindow, "Search engine manager opener should be the chrome browser " + "window containing the newtab page"); - executeSoon(() => { - subj.close(); - deferred.resolve(); - }); + subj.close(); + deferred.resolve(); } }); } diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js index 2b4bdb4e647b..bb0f7ae6acec 100644 --- a/browser/base/content/test/newtab/head.js +++ b/browser/base/content/test/newtab/head.js @@ -327,6 +327,12 @@ function restore() { * Creates a new tab containing 'about:newtab'. */ function addNewTabPageTab() { + addNewTabPageTabPromise().then(TestRunner.next); +} + +function addNewTabPageTabPromise() { + let deferred = Promise.defer(); + let tab = gWindow.gBrowser.selectedTab = gWindow.gBrowser.addTab("about:newtab"); let browser = tab.linkedBrowser; @@ -334,20 +340,17 @@ function addNewTabPageTab() { if (NewTabUtils.allPages.enabled) { // Continue when the link cache has been populated. NewTabUtils.links.populateCache(function () { - whenSearchInitDone(); + deferred.resolve(whenSearchInitDone()); }); } else { - // It's important that we call next() asynchronously. - // 'yield addNewTabPageTab()' would fail if next() is called - // synchronously because the iterator is already executing. - executeSoon(TestRunner.next); + deferred.resolve(); } } // The new tab page might have been preloaded in the background. if (browser.contentDocument.readyState == "complete") { whenNewTabLoaded(); - return; + return deferred.promise; } // Wait for the new tab page to be loaded. @@ -355,6 +358,8 @@ function addNewTabPageTab() { browser.removeEventListener("load", onLoad, true); whenNewTabLoaded(); }, true); + + return deferred.promise; } /** @@ -637,15 +642,16 @@ function whenPagesUpdated(aCallback, aOnlyIfHidden=false) { * Waits for the response to the page's initial search state request. */ function whenSearchInitDone() { + let deferred = Promise.defer(); if (getContentWindow().gSearch._initialStateReceived) { - executeSoon(TestRunner.next); - return; + return Promise.resolve(); } let eventName = "ContentSearchService"; getContentWindow().addEventListener(eventName, function onEvent(event) { if (event.detail.type == "State") { getContentWindow().removeEventListener(eventName, onEvent); - TestRunner.next(); + deferred.resolve(); } }); + return deferred.promise; } diff --git a/browser/base/content/test/newtab/searchEngine1x2xLogo.xml b/browser/base/content/test/newtab/searchEngine1x2xLogo.xml index 4413cc5ac726..c8b6749b35e6 100644 --- a/browser/base/content/test/newtab/searchEngine1x2xLogo.xml +++ b/browser/base/content/test/newtab/searchEngine1x2xLogo.xml @@ -2,6 +2,8 @@ browser_newtab_search searchEngine1x2xLogo.xml -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAYAAADovjFxAAAMR2lDQ1BJQ0MgUHJvZmlsZQAASA2tV3dYU1cbf+9IAiEJIyECMsJeouwpewsKMoU6CEkgYcQQCCpua2kF60DFgaOiVRGrVisgdSDitihu6/hQi4JSiwMXKt+5YdinT7//vvs859xffu973vt733vuyTkA2nZChSIP1wHIlxcpEyJDBJPS0gWM+4CDMfDAEnhCUaEiOD4+Fv7n9eYGYJTxqhMV63+6/btBVywpFAFg8cicKS4U5SP8CwDJESmURQC0FsRbzihSULgTYZ4SCUT4I4Wz1ZiO1AMvcwBbqX2SEkIB6N4AGiyhUJkNwAlDvKBYlI3icMQIO8vFMjnCqxEOEEmFiONcQ3hUfv50hLURBLvMv8XJ/hsWCjOHYwqF2cN4IBdqKGiEyQoVecJZ6h//zy4/T4Xqpb7MUc+SKqMS0J2H6rYxd3oMhVkI75dnTohDWA/hIzIq4wHcKlVFJSNM+beLCkNRLYGP8GuxMCwGYWMAnKnKTQ4exDZCJUJqfzxEVhSdNIhTlNMTBuPjOfK8CdT8QHHwOVJJ9BCukBSGJyIeacBzsmQR0Qijd4XvKpEmpSKMdOINxbKUCQhzEG4pzE2kNFBxrpRIQyle7aNUJVCarRDfmaWMoHJEPgQrvxAhdXzCQiRUP8sA8e5F0qQoxKOxRKxYEhaOMHouMUkiTx7UQ0gVRSFUHMq/RJGnnt9IJ1EhyYukeAuEtxcWJw6NPV2kTKJ4VDfiRo5wHDVfkWbiqaIonqoJpecdxEIohIEAVKhlwnTIAVlrd303+jVgiQAhKCEbJOA0yAyNSFVb5KhPhBL4E+TIp3B4XIjaKoFixH8aZgfGOkGW2lqsHpELj9ET8kkjMoD0I2NRH4SaK+lN+gyNE2gP6aSH08PoUfQIuv0QAyKkOg81Jcj+hYtBNgnKTol6+VAOX+LRHtPaaA9p12nttNuQAn+oowxmOk22SDmkYDjyeGhH0QaqIkEVk0PXkA9pg1R7kCGkP9KPtJN80gicSHeUSTAZiHLzQOxQ9SjVqmFtX2o5VPchP0q14G85DvIcB47HoIrMoazQmxyqxD+jfLHIQIy8Yv7pSXxHHCTOECeIc8QRoh4ExHGigbhIHKXwoOYIdXWyh5+WoK5oLspBNuTjXOvc5fxx6NdwrkLEUAqod4Dmf5FkZhGafxA6XTFLKcuWFgmC0SosEUTLRaNHCVydXdwBqDWd8gF4xVev1Rj//BeuoAnApwytAdRyKqC8AISWAIcfA3DffOEsX6JPagXA0csilbJ4wI+kbjRgogWTB4Zgiv4x7FBOruAJfhAE4TAO4iAJ0mAqqroU8pHqGTAHFkIplMMKWAMbYAtsg13wExyAejgCJ+A0XIDLcB3uoLnRAc+gB95AH4ZhDIyNcTFDzAyzxhwxV8wbC8DCsVgsAUvDMrBsTI6psDnY11g5VoFtwLZiNdjP2GHsBHYOa8NuYw+wLuwl9gEncBbOw01wG3wM7o0H4zF4Ej4Fz8YL8BJ8Mb4MX4dX43vwOvwEfgG/jrfjz/BeAggtgk+YE06ENxFKxBHpRBahJOYRZUQlUU3sJRrRu75KtBPdxHuSTnJJAemE5mcUmUyKyAJyHrmU3EDuIuvIFvIq+YDsIT/T2DRjmiPNlxZNm0TLps2gldIqaTtoh2in0LfTQXtDp9P5dFu6F/o20+g59Nn0pfRN9H30Jnob/RG9l8FgGDIcGf6MOIaQUcQoZaxn7GEcZ1xhdDDeaWhpmGm4akRopGvINRZpVGrs1jimcUXjiUafpo6mtaavZpymWHOW5nLN7ZqNmpc0OzT7mLpMW6Y/M4mZw1zIXMfcyzzFvMt8paWlZaHlozVRS6a1QGud1n6ts1oPtN6z9FgOrFDWZJaKtYy1k9XEus16xWazbdhB7HR2EXsZu4Z9kn2f/Y7D5YzmRHPEnPmcKk4d5wrnubamtrV2sPZU7RLtSu2D2pe0u3U0dWx0QnWEOvN0qnQO69zU6dXl6rroxunm6y7V3a17TrdTj6FnoxeuJ9ZbrLdN76TeIy7BteSGckXcr7nbuae4HTw6z5YXzcvhlfN+4rXyevT19N31U/Rn6lfpH9Vv5xN8G340P4+/nH+Af4P/YYTJiOARkhFLRuwdcWXEW4ORBkEGEoMyg30G1w0+GAoMww1zDVca1hveMyKNHIwmGs0w2mx0yqh7JG+k30jRyLKRB0b+bowbOxgnGM823mZ80bjXxNQk0kRhst7kpEm3Kd80yDTHdLXpMdMuM65ZgJnMbLXZcbOnAn1BsCBPsE7QIugxNzaPMleZbzVvNe+zsLVItlhksc/iniXT0tsyy3K1ZbNlj5WZ1XirOVa1Vr9ba1p7W0ut11qfsX5rY2uTavOtTb1Np62BbbRtiW2t7V07tl2gXYFdtd01e7q9t32u/Sb7yw64g4eD1KHK4ZIj7ujpKHPc5Ng2ijbKZ5R8VPWom04sp2CnYqdapwej+aNjRy8aXT/6+RirMeljVo45M+azs4dznvN25zsuei7jXBa5NLq8dHVwFblWuV5zY7tFuM13a3B74e7oLnHf7H7Lg+sx3uNbj2aPT55enkrPvZ5dXlZeGV4bvW5687zjvZd6n/Wh+YT4zPc54vPe19O3yPeA719+Tn65frv9OsfajpWM3T72kb+Fv9B/q397gCAgI+CHgPZA80BhYHXgwyDLIHHQjqAnwfbBOcF7gp+HOIcoQw6FvA31DZ0b2hRGhEWGlYW1huuFJ4dvCL8fYRGRHVEb0RPpETk7simKFhUTtTLqZrRJtCi6JrpnnNe4ueNaYlgxiTEbYh7GOsQqYxvH4+PHjV81/u4E6wnyCfVxEBcdtyruXrxtfEH8rxPpE+MnVk18nOCSMCfhTCI3cVri7sQ3SSFJy5PuJNslq5KbU7RTJqfUpLxNDUutSG2fNGbS3EkX0ozSZGkN6Yz0lPQd6b1fhX+15quOyR6TSyffmGI7ZeaUc1ONpuZNPTpNe5pw2sEMWkZqxu6Mj8I4YbWwNzM6c2NmjyhUtFb0TBwkXi3ukvhLKiRPsvyzKrI6s/2zV2V3SQOlldJuWahsg+xFTlTOlpy3uXG5O3P781Lz9uVr5GfkH5bryXPlLdNNp8+c3qZwVJQq2gt8C9YU9ChjlDsKscIphQ1FPLR5vqiyU32jelAcUFxV/G5GyoyDM3VnymdenOUwa8msJyURJT/OJmeLZjfPMZ+zcM6DucFzt87D5mXOa55vOX/x/I4FkQt2LWQuzF342yLnRRWLXn+d+nXjYpPFCxY/+ibym9pSTqmy9Oa3ft9u+Y78TvZd6xK3JeuXfC4Tl50vdy6vLP+4VLT0/Pcu36/7vn9Z1rLW5Z7LN6+gr5CvuLEycOWuCt2KkopHq8avqlstWF22+vWaaWvOVbpXblnLXKta274udl3Deqv1K9Z/3CDdcL0qpGrfRuONSza+3STedGVz0Oa9W0y2lG/58IPsh1tbI7fWVdtUV26jbyve9nh7yvYzP3r/WLPDaEf5jk875TvbdyXsaqnxqqnZbbx7eS1eq6rt2jN5z+Wfwn5q2Ou0d+s+/r7y/bBftf/pzxk/3zgQc6D5oPfBvb9Y/7LxEPdQWR1WN6uup15a396Q1tB2eNzh5ka/xkO/jv515xHzI1VH9Y8uP8Y8tvhY//GS471NiqbuE9knHjVPa75zctLJay0TW1pPxZw6ezri9MkzwWeOn/U/e+Sc77nD573P11/wvFB30ePiod88fjvU6tlad8nrUsNln8uNbWPbjl0JvHLiatjV09eir124PuF6243kG7duTr7Zfkt8q/N23u0Xvxf/3ndnwV3a3bJ7Ovcq7xvfr/6P/X/2tXu2H30Q9uDiw8SHdx6JHj37o/CPjx2LH7MfVz4xe1LT6dp5pCui6/LTr552PFM86+su/VP3z43P7Z7/8lfQXxd7JvV0vFC+6H+59JXhq52v3V8398b33n+T/6bvbdk7w3e73nu/P/Mh9cOTvhkfGR/XfbL/1Pg55vPd/vz+foVQKVTvBQjU41lZAC93ArDT0N7hMgCTM3DmUntgA+dEhLHBRtH/wAPnMsqA9hCwMwggeQFAbBPAZtSsEWahO7X9TgoC3M1tuCGGugqz3FzVAGMp0dbkXX//KxMARiPAJ2V/f9+m/v5P29Fe/TZAU8HAWY/yps6QP6D9PMC51qULqPvfr/8Cy81qyPQGeEcAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAGcaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjEzMDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj41MjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoay+OEAAABx0lEQVRYCe1X27KDIAzEOf7/B7d1rGtmTbgdUMF2xtIHMG6ySQjBDtPfNLtmY1gsNTS3269j/OPTPd2w/DDmigAUKxpu1T0XuNos21FsO/41CTBnB4hsQkgMjJVbnXBNnVq81b+af3y511YJcMQ6zUCsg1wTR4zsob+TfEcdztTls8XZd1ZOLGfiiDnOP7hkJZDoLvNaCXcJNhdnshK0xOLyZhnmDP4nz9kNdXI4yHvwb7dDaFwc8aXhBSR3ikj9dMV3RqhrA08FdyX/OLlpy64Qq3t+CiBXBIKWJCg+XIm+6uA9bVJqGxpltEMsn/vwz258uIdy3HT1a4zLxicb490KYmuMelrjFNimhnMbnlX7Ptb2JSkse0Fol5pWpwf/2hhJdtf59HGouSV6JrcF/+kk9AzwKtu/22HJdHUloGmxgZ3fIWmBe+z15D9UCXvPYdsAcI+Vv1btRpX4o0qQPbIfqNZc//Un+KMk9A/z+xgOHYfvC+OcR8k/UPhCw4FgaZYoiAeOOirDCcYQCVbEYJ0a1C3hqEs8nqmjsjK/98WoBtIOl7q56Meo2kb2Kf6uPQFBxSnh/vWfa/mzSUjtSju3y7VxJf8bg8fWe97jWoEAAAAASUVORK5CYII= -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAIAAADJ8nfCAAAMR2lDQ1BJQ0MgUHJvZmlsZQAASA2tV3dYU1cbf+9IAiEJIyECMsJeouwpewsKMoU6CEkgYcQQCCpua2kF60DFgaOiVRGrVisgdSDitihu6/hQi4JSiwMXKt+5YdinT7//vvs859xffu973vt733vuyTkA2nZChSIP1wHIlxcpEyJDBJPS0gWM+4CDMfDAEnhCUaEiOD4+Fv7n9eYGYJTxqhMV63+6/btBVywpFAFg8cicKS4U5SP8CwDJESmURQC0FsRbzihSULgTYZ4SCUT4I4Wz1ZiO1AMvcwBbqX2SEkIB6N4AGiyhUJkNwAlDvKBYlI3icMQIO8vFMjnCqxEOEEmFiONcQ3hUfv50hLURBLvMv8XJ/hsWCjOHYwqF2cN4IBdqKGiEyQoVecJZ6h//zy4/T4Xqpb7MUc+SKqMS0J2H6rYxd3oMhVkI75dnTohDWA/hIzIq4wHcKlVFJSNM+beLCkNRLYGP8GuxMCwGYWMAnKnKTQ4exDZCJUJqfzxEVhSdNIhTlNMTBuPjOfK8CdT8QHHwOVJJ9BCukBSGJyIeacBzsmQR0Qijd4XvKpEmpSKMdOINxbKUCQhzEG4pzE2kNFBxrpRIQyle7aNUJVCarRDfmaWMoHJEPgQrvxAhdXzCQiRUP8sA8e5F0qQoxKOxRKxYEhaOMHouMUkiTx7UQ0gVRSFUHMq/RJGnnt9IJ1EhyYukeAuEtxcWJw6NPV2kTKJ4VDfiRo5wHDVfkWbiqaIonqoJpecdxEIohIEAVKhlwnTIAVlrd303+jVgiQAhKCEbJOA0yAyNSFVb5KhPhBL4E+TIp3B4XIjaKoFixH8aZgfGOkGW2lqsHpELj9ET8kkjMoD0I2NRH4SaK+lN+gyNE2gP6aSH08PoUfQIuv0QAyKkOg81Jcj+hYtBNgnKTol6+VAOX+LRHtPaaA9p12nttNuQAn+oowxmOk22SDmkYDjyeGhH0QaqIkEVk0PXkA9pg1R7kCGkP9KPtJN80gicSHeUSTAZiHLzQOxQ9SjVqmFtX2o5VPchP0q14G85DvIcB47HoIrMoazQmxyqxD+jfLHIQIy8Yv7pSXxHHCTOECeIc8QRoh4ExHGigbhIHKXwoOYIdXWyh5+WoK5oLspBNuTjXOvc5fxx6NdwrkLEUAqod4Dmf5FkZhGafxA6XTFLKcuWFgmC0SosEUTLRaNHCVydXdwBqDWd8gF4xVev1Rj//BeuoAnApwytAdRyKqC8AISWAIcfA3DffOEsX6JPagXA0csilbJ4wI+kbjRgogWTB4Zgiv4x7FBOruAJfhAE4TAO4iAJ0mAqqroU8pHqGTAHFkIplMMKWAMbYAtsg13wExyAejgCJ+A0XIDLcB3uoLnRAc+gB95AH4ZhDIyNcTFDzAyzxhwxV8wbC8DCsVgsAUvDMrBsTI6psDnY11g5VoFtwLZiNdjP2GHsBHYOa8NuYw+wLuwl9gEncBbOw01wG3wM7o0H4zF4Ej4Fz8YL8BJ8Mb4MX4dX43vwOvwEfgG/jrfjz/BeAggtgk+YE06ENxFKxBHpRBahJOYRZUQlUU3sJRrRu75KtBPdxHuSTnJJAemE5mcUmUyKyAJyHrmU3EDuIuvIFvIq+YDsIT/T2DRjmiPNlxZNm0TLps2gldIqaTtoh2in0LfTQXtDp9P5dFu6F/o20+g59Nn0pfRN9H30Jnob/RG9l8FgGDIcGf6MOIaQUcQoZaxn7GEcZ1xhdDDeaWhpmGm4akRopGvINRZpVGrs1jimcUXjiUafpo6mtaavZpymWHOW5nLN7ZqNmpc0OzT7mLpMW6Y/M4mZw1zIXMfcyzzFvMt8paWlZaHlozVRS6a1QGud1n6ts1oPtN6z9FgOrFDWZJaKtYy1k9XEus16xWazbdhB7HR2EXsZu4Z9kn2f/Y7D5YzmRHPEnPmcKk4d5wrnubamtrV2sPZU7RLtSu2D2pe0u3U0dWx0QnWEOvN0qnQO69zU6dXl6rroxunm6y7V3a17TrdTj6FnoxeuJ9ZbrLdN76TeIy7BteSGckXcr7nbuae4HTw6z5YXzcvhlfN+4rXyevT19N31U/Rn6lfpH9Vv5xN8G340P4+/nH+Af4P/YYTJiOARkhFLRuwdcWXEW4ORBkEGEoMyg30G1w0+GAoMww1zDVca1hveMyKNHIwmGs0w2mx0yqh7JG+k30jRyLKRB0b+bowbOxgnGM823mZ80bjXxNQk0kRhst7kpEm3Kd80yDTHdLXpMdMuM65ZgJnMbLXZcbOnAn1BsCBPsE7QIugxNzaPMleZbzVvNe+zsLVItlhksc/iniXT0tsyy3K1ZbNlj5WZ1XirOVa1Vr9ba1p7W0ut11qfsX5rY2uTavOtTb1Np62BbbRtiW2t7V07tl2gXYFdtd01e7q9t32u/Sb7yw64g4eD1KHK4ZIj7ujpKHPc5Ng2ijbKZ5R8VPWom04sp2CnYqdapwej+aNjRy8aXT/6+RirMeljVo45M+azs4dznvN25zsuei7jXBa5NLq8dHVwFblWuV5zY7tFuM13a3B74e7oLnHf7H7Lg+sx3uNbj2aPT55enkrPvZ5dXlZeGV4bvW5687zjvZd6n/Wh+YT4zPc54vPe19O3yPeA719+Tn65frv9OsfajpWM3T72kb+Fv9B/q397gCAgI+CHgPZA80BhYHXgwyDLIHHQjqAnwfbBOcF7gp+HOIcoQw6FvA31DZ0b2hRGhEWGlYW1huuFJ4dvCL8fYRGRHVEb0RPpETk7simKFhUTtTLqZrRJtCi6JrpnnNe4ueNaYlgxiTEbYh7GOsQqYxvH4+PHjV81/u4E6wnyCfVxEBcdtyruXrxtfEH8rxPpE+MnVk18nOCSMCfhTCI3cVri7sQ3SSFJy5PuJNslq5KbU7RTJqfUpLxNDUutSG2fNGbS3EkX0ozSZGkN6Yz0lPQd6b1fhX+15quOyR6TSyffmGI7ZeaUc1ONpuZNPTpNe5pw2sEMWkZqxu6Mj8I4YbWwNzM6c2NmjyhUtFb0TBwkXi3ukvhLKiRPsvyzKrI6s/2zV2V3SQOlldJuWahsg+xFTlTOlpy3uXG5O3P781Lz9uVr5GfkH5bryXPlLdNNp8+c3qZwVJQq2gt8C9YU9ChjlDsKscIphQ1FPLR5vqiyU32jelAcUFxV/G5GyoyDM3VnymdenOUwa8msJyURJT/OJmeLZjfPMZ+zcM6DucFzt87D5mXOa55vOX/x/I4FkQt2LWQuzF342yLnRRWLXn+d+nXjYpPFCxY/+ibym9pSTqmy9Oa3ft9u+Y78TvZd6xK3JeuXfC4Tl50vdy6vLP+4VLT0/Pcu36/7vn9Z1rLW5Z7LN6+gr5CvuLEycOWuCt2KkopHq8avqlstWF22+vWaaWvOVbpXblnLXKta274udl3Deqv1K9Z/3CDdcL0qpGrfRuONSza+3STedGVz0Oa9W0y2lG/58IPsh1tbI7fWVdtUV26jbyve9nh7yvYzP3r/WLPDaEf5jk875TvbdyXsaqnxqqnZbbx7eS1eq6rt2jN5z+Wfwn5q2Ou0d+s+/r7y/bBftf/pzxk/3zgQc6D5oPfBvb9Y/7LxEPdQWR1WN6uup15a396Q1tB2eNzh5ka/xkO/jv515xHzI1VH9Y8uP8Y8tvhY//GS471NiqbuE9knHjVPa75zctLJay0TW1pPxZw6ezri9MkzwWeOn/U/e+Sc77nD573P11/wvFB30ePiod88fjvU6tlad8nrUsNln8uNbWPbjl0JvHLiatjV09eir124PuF6243kG7duTr7Zfkt8q/N23u0Xvxf/3ndnwV3a3bJ7Ovcq7xvfr/6P/X/2tXu2H30Q9uDiw8SHdx6JHj37o/CPjx2LH7MfVz4xe1LT6dp5pCui6/LTr552PFM86+su/VP3z43P7Z7/8lfQXxd7JvV0vFC+6H+59JXhq52v3V8398b33n+T/6bvbdk7w3e73nu/P/Mh9cOTvhkfGR/XfbL/1Pg55vPd/vz+foVQKVTvBQjU41lZAC93ArDT0N7hMgCTM3DmUntgA+dEhLHBRtH/wAPnMsqA9hCwMwggeQFAbBPAZtSsEWahO7X9TgoC3M1tuCGGugqz3FzVAGMp0dbkXX//KxMARiPAJ2V/f9+m/v5P29Fe/TZAU8HAWY/yps6QP6D9PMC51qULqPvfr/8Cy81qyPQGeEcAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAGcaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjEzMDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj41MjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoay+OEAAAGOUlEQVR4Ae2abYsbQQyDE7j//1MLhX7rq4LA+3Riz3puN0kDPY5F45FkjTevx11/XX5d/v+8egIf6W24Xq6/L791VTwDXQ9GfYRnFekRvR7hGflvt+H4uBkxrAWqWyh+2pc+lZb+q3xqienDepXh9PwfPy4/ZMrewmzPiKxTUnGqekfb4dCffOYkh3XyK05V72g7nPC/frt8o8A4trVkdNapIof1Dp+cyoeeHVx5sk6fqm+HT07lw14pzl+UaC2Z3C32K4nfTshhe9bJT9urSH7lQ23FqerSassOzNPpSz4zEHd8yE9zXr9evpJkTCp32ZJ1Ymorfoez6lnxWa/ykNPJ1uEseV6/XL5YwIidNhXnrDqPQUx/1t86/8fPy08eZo45Ah6bqg6H/GfiTrYO5/TM+feGSRul9K5BLCmJ4oRD/jNxJ1uHc27m5dtwbvv/bp7A+beBL1Z6WHn5RuN+Sf7921DFquqdia9qV/nMUGmrOrUVXtXu8rdv0Xzk7sqqfEP9iE9HW3Gq+hBvd3nEp6MNzu3ZoIUC8TYwn3ZTTliQPGB+/en4MAP9WWeLJuffz7+9KK2OieOoMD2rW9KpV/6ssxdvW+dW0YeYnp2cFZ+eKf5QYm+stknthqLN4+qJiMPRaLmbYbBNl2+d//Zs8BR4J2NwPnA6Js6CYxV5d9z0H/iepswnHEvMYa9UG1YCvFVaxs/L8398v3xXiAh0D4YxxQjumY+rMAO7cHysE1Pb4VN7FmYGekae24uSfrl3j4NgEMt7ZrMiBycQP6LMtWnTZp7QNvnzJNqVz7n5t7fo3d7nEk4fzbnxdt3Ozb//gXU30AsJfCbxEfrCSEutI//Lng0RN6Ko8tajPJL/9i06JrILVke2ymeAI1r6EK96rvI/3Wt7UaIFcfUIVcT4gLjKn3h6S4b8cMle1HJMzEBMPuv0ZL3Dn3C8JcOl/NttmFin4x7aRHv6cEzk89irnMqf9cH/38+/3QZF10l4AGOOjyMjf+DEsW0YV8slpE/s2jDl0N+pfKWP5dw1prbiD5zn5799b1BXJWZEFTmOiMW4PLDIwZmM9dMc9bItmwozz1vn3z4pDUdKR1aNoxo9p8YxsU7Pyqejfev8+3/M4Mg0Jk9ERY6mqlNLXPGrekdLToUr/6r+CJ+0V+uPGUwjFy8NhqW2hjq1xINwWM59BnIs6V/hIBsMy3lfeg7CYTn3Gchabi9K7PEfP3kCy8+GNF/1ApWSDxYf0esRntUx0175v4uRSjs9fbzFYhPT84hPpx17kX+kLz2P+DBP4PxfAmJ7AFUU1imp4pJPDutHfKglpv8j+tKffdmL9eDnX98oC6r0/FCY2qk4aPnB11YUCqsYHPqzr20tHPy9jK0A0Ys+9DfTV3IG/8jG+qANDv3pKb7kVtEnONvXt6Z1tCSf7VmPNpGAuyw6JSPeM12RZ2SY9E051NJ/4uNIjEqhcCQ39pEHDpfMEH1v7w3aGCzs5bq3bBQyLcnh+Fgn3w73V/IrH6roKa2XIky0npQ4g9aSiZZ8ZiA+Jf9fn5R24zqxQ5gckgCMzjExOnHlw7qwTyshPcnRlpcCQwbL3TQ4Ta2trE2vlQ/rwvP8+bfoQeZlGuJ4cbVXh9/hHE9uh9VeKf+vZwOTiR1tBGJJTorTNikzimFuEMsgDCAIE36HM9h6KSEfuV6mzCiu9rrnP+Rb9H2bSPwW4Pn5tw+s6h2PgkcPy410VaMjfc/yWT3vWX3DZ3s2qBRvR286mvfNv/8vAXHHhkduVa8eWeSTw1tOTqdOnwqf5Ukf9urkpJb88MlflCjjh7+QNUHHR5x4FLNXVWdr+vN4rNOT2g7u+FQ5qzr7hn9+GwZqjKk6KvnEHAFjVT5VXZ7asnPFYZ0ZOn3JJ35a/u2PGZ241VEZnZie1ZE69VVP5lQGL2XCOj0r/LT821t0NQ5F9wGc1csq91CnliPgaGheZaAtPTvaik/PClP70Pz7b9GTiJ6mCBzrJG5qtcpPTT5RrPpW9arFKj/12Z4N6baKkzbasspgWFobVzPT6yCMZZBVSW95ECZgoo1GBsNSnkO96jIIYxl8Veb5929DpAlw3yb6PQ5EU4NYdjoG+RPajn+HM8/wBy3+Gl99yL4tAAAAAElFTkSuQmCC + +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAIAAABn3KYmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gkTADIGr0+8uwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAL0lEQVRYw+3PAREAAAQEsKd/Z3I4W4NVJtd14uDg4ODg4ODg4ODg4ODg4ODg8Pqw7M0BM+n9I0oAAAAASUVORK5CYII= + +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAIAAADJ8nfCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gkTADMoaoKANQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAYklEQVR42u3RQQ0AAAjEMMC/58MECZ9OwtqVlL4bCzAIAwZhwCAMGIQBgzBgEAYMwoBBGDAIAwZhwCAMGIQBgzBgEAYMwoBBGIQBgzBgEAYMwoBBGDAIAwZhwCAMGIQBg+5ar7sCZiri9VUAAAAASUVORK5CYII= diff --git a/browser/base/content/test/newtab/searchEngine1xLogo.xml b/browser/base/content/test/newtab/searchEngine1xLogo.xml index 73ff048c4a4a..19ac03f48b4e 100644 --- a/browser/base/content/test/newtab/searchEngine1xLogo.xml +++ b/browser/base/content/test/newtab/searchEngine1xLogo.xml @@ -2,5 +2,6 @@ browser_newtab_search searchEngine1xLogo.xml -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAYAAADovjFxAAAMR2lDQ1BJQ0MgUHJvZmlsZQAASA2tV3dYU1cbf+9IAiEJIyECMsJeouwpewsKMoU6CEkgYcQQCCpua2kF60DFgaOiVRGrVisgdSDitihu6/hQi4JSiwMXKt+5YdinT7//vvs859xffu973vt733vuyTkA2nZChSIP1wHIlxcpEyJDBJPS0gWM+4CDMfDAEnhCUaEiOD4+Fv7n9eYGYJTxqhMV63+6/btBVywpFAFg8cicKS4U5SP8CwDJESmURQC0FsRbzihSULgTYZ4SCUT4I4Wz1ZiO1AMvcwBbqX2SEkIB6N4AGiyhUJkNwAlDvKBYlI3icMQIO8vFMjnCqxEOEEmFiONcQ3hUfv50hLURBLvMv8XJ/hsWCjOHYwqF2cN4IBdqKGiEyQoVecJZ6h//zy4/T4Xqpb7MUc+SKqMS0J2H6rYxd3oMhVkI75dnTohDWA/hIzIq4wHcKlVFJSNM+beLCkNRLYGP8GuxMCwGYWMAnKnKTQ4exDZCJUJqfzxEVhSdNIhTlNMTBuPjOfK8CdT8QHHwOVJJ9BCukBSGJyIeacBzsmQR0Qijd4XvKpEmpSKMdOINxbKUCQhzEG4pzE2kNFBxrpRIQyle7aNUJVCarRDfmaWMoHJEPgQrvxAhdXzCQiRUP8sA8e5F0qQoxKOxRKxYEhaOMHouMUkiTx7UQ0gVRSFUHMq/RJGnnt9IJ1EhyYukeAuEtxcWJw6NPV2kTKJ4VDfiRo5wHDVfkWbiqaIonqoJpecdxEIohIEAVKhlwnTIAVlrd303+jVgiQAhKCEbJOA0yAyNSFVb5KhPhBL4E+TIp3B4XIjaKoFixH8aZgfGOkGW2lqsHpELj9ET8kkjMoD0I2NRH4SaK+lN+gyNE2gP6aSH08PoUfQIuv0QAyKkOg81Jcj+hYtBNgnKTol6+VAOX+LRHtPaaA9p12nttNuQAn+oowxmOk22SDmkYDjyeGhH0QaqIkEVk0PXkA9pg1R7kCGkP9KPtJN80gicSHeUSTAZiHLzQOxQ9SjVqmFtX2o5VPchP0q14G85DvIcB47HoIrMoazQmxyqxD+jfLHIQIy8Yv7pSXxHHCTOECeIc8QRoh4ExHGigbhIHKXwoOYIdXWyh5+WoK5oLspBNuTjXOvc5fxx6NdwrkLEUAqod4Dmf5FkZhGafxA6XTFLKcuWFgmC0SosEUTLRaNHCVydXdwBqDWd8gF4xVev1Rj//BeuoAnApwytAdRyKqC8AISWAIcfA3DffOEsX6JPagXA0csilbJ4wI+kbjRgogWTB4Zgiv4x7FBOruAJfhAE4TAO4iAJ0mAqqroU8pHqGTAHFkIplMMKWAMbYAtsg13wExyAejgCJ+A0XIDLcB3uoLnRAc+gB95AH4ZhDIyNcTFDzAyzxhwxV8wbC8DCsVgsAUvDMrBsTI6psDnY11g5VoFtwLZiNdjP2GHsBHYOa8NuYw+wLuwl9gEncBbOw01wG3wM7o0H4zF4Ej4Fz8YL8BJ8Mb4MX4dX43vwOvwEfgG/jrfjz/BeAggtgk+YE06ENxFKxBHpRBahJOYRZUQlUU3sJRrRu75KtBPdxHuSTnJJAemE5mcUmUyKyAJyHrmU3EDuIuvIFvIq+YDsIT/T2DRjmiPNlxZNm0TLps2gldIqaTtoh2in0LfTQXtDp9P5dFu6F/o20+g59Nn0pfRN9H30Jnob/RG9l8FgGDIcGf6MOIaQUcQoZaxn7GEcZ1xhdDDeaWhpmGm4akRopGvINRZpVGrs1jimcUXjiUafpo6mtaavZpymWHOW5nLN7ZqNmpc0OzT7mLpMW6Y/M4mZw1zIXMfcyzzFvMt8paWlZaHlozVRS6a1QGud1n6ts1oPtN6z9FgOrFDWZJaKtYy1k9XEus16xWazbdhB7HR2EXsZu4Z9kn2f/Y7D5YzmRHPEnPmcKk4d5wrnubamtrV2sPZU7RLtSu2D2pe0u3U0dWx0QnWEOvN0qnQO69zU6dXl6rroxunm6y7V3a17TrdTj6FnoxeuJ9ZbrLdN76TeIy7BteSGckXcr7nbuae4HTw6z5YXzcvhlfN+4rXyevT19N31U/Rn6lfpH9Vv5xN8G340P4+/nH+Af4P/YYTJiOARkhFLRuwdcWXEW4ORBkEGEoMyg30G1w0+GAoMww1zDVca1hveMyKNHIwmGs0w2mx0yqh7JG+k30jRyLKRB0b+bowbOxgnGM823mZ80bjXxNQk0kRhst7kpEm3Kd80yDTHdLXpMdMuM65ZgJnMbLXZcbOnAn1BsCBPsE7QIugxNzaPMleZbzVvNe+zsLVItlhksc/iniXT0tsyy3K1ZbNlj5WZ1XirOVa1Vr9ba1p7W0ut11qfsX5rY2uTavOtTb1Np62BbbRtiW2t7V07tl2gXYFdtd01e7q9t32u/Sb7yw64g4eD1KHK4ZIj7ujpKHPc5Ng2ijbKZ5R8VPWom04sp2CnYqdapwej+aNjRy8aXT/6+RirMeljVo45M+azs4dznvN25zsuei7jXBa5NLq8dHVwFblWuV5zY7tFuM13a3B74e7oLnHf7H7Lg+sx3uNbj2aPT55enkrPvZ5dXlZeGV4bvW5687zjvZd6n/Wh+YT4zPc54vPe19O3yPeA719+Tn65frv9OsfajpWM3T72kb+Fv9B/q397gCAgI+CHgPZA80BhYHXgwyDLIHHQjqAnwfbBOcF7gp+HOIcoQw6FvA31DZ0b2hRGhEWGlYW1huuFJ4dvCL8fYRGRHVEb0RPpETk7simKFhUTtTLqZrRJtCi6JrpnnNe4ueNaYlgxiTEbYh7GOsQqYxvH4+PHjV81/u4E6wnyCfVxEBcdtyruXrxtfEH8rxPpE+MnVk18nOCSMCfhTCI3cVri7sQ3SSFJy5PuJNslq5KbU7RTJqfUpLxNDUutSG2fNGbS3EkX0ozSZGkN6Yz0lPQd6b1fhX+15quOyR6TSyffmGI7ZeaUc1ONpuZNPTpNe5pw2sEMWkZqxu6Mj8I4YbWwNzM6c2NmjyhUtFb0TBwkXi3ukvhLKiRPsvyzKrI6s/2zV2V3SQOlldJuWahsg+xFTlTOlpy3uXG5O3P781Lz9uVr5GfkH5bryXPlLdNNp8+c3qZwVJQq2gt8C9YU9ChjlDsKscIphQ1FPLR5vqiyU32jelAcUFxV/G5GyoyDM3VnymdenOUwa8msJyURJT/OJmeLZjfPMZ+zcM6DucFzt87D5mXOa55vOX/x/I4FkQt2LWQuzF342yLnRRWLXn+d+nXjYpPFCxY/+ibym9pSTqmy9Oa3ft9u+Y78TvZd6xK3JeuXfC4Tl50vdy6vLP+4VLT0/Pcu36/7vn9Z1rLW5Z7LN6+gr5CvuLEycOWuCt2KkopHq8avqlstWF22+vWaaWvOVbpXblnLXKta274udl3Deqv1K9Z/3CDdcL0qpGrfRuONSza+3STedGVz0Oa9W0y2lG/58IPsh1tbI7fWVdtUV26jbyve9nh7yvYzP3r/WLPDaEf5jk875TvbdyXsaqnxqqnZbbx7eS1eq6rt2jN5z+Wfwn5q2Ou0d+s+/r7y/bBftf/pzxk/3zgQc6D5oPfBvb9Y/7LxEPdQWR1WN6uup15a396Q1tB2eNzh5ka/xkO/jv515xHzI1VH9Y8uP8Y8tvhY//GS471NiqbuE9knHjVPa75zctLJay0TW1pPxZw6ezri9MkzwWeOn/U/e+Sc77nD573P11/wvFB30ePiod88fjvU6tlad8nrUsNln8uNbWPbjl0JvHLiatjV09eir124PuF6243kG7duTr7Zfkt8q/N23u0Xvxf/3ndnwV3a3bJ7Ovcq7xvfr/6P/X/2tXu2H30Q9uDiw8SHdx6JHj37o/CPjx2LH7MfVz4xe1LT6dp5pCui6/LTr552PFM86+su/VP3z43P7Z7/8lfQXxd7JvV0vFC+6H+59JXhq52v3V8398b33n+T/6bvbdk7w3e73nu/P/Mh9cOTvhkfGR/XfbL/1Pg55vPd/vz+foVQKVTvBQjU41lZAC93ArDT0N7hMgCTM3DmUntgA+dEhLHBRtH/wAPnMsqA9hCwMwggeQFAbBPAZtSsEWahO7X9TgoC3M1tuCGGugqz3FzVAGMp0dbkXX//KxMARiPAJ2V/f9+m/v5P29Fe/TZAU8HAWY/yps6QP6D9PMC51qULqPvfr/8Cy81qyPQGeEcAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAGcaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjEzMDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj41MjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoay+OEAAABx0lEQVRYCe1X27KDIAzEOf7/B7d1rGtmTbgdUMF2xtIHMG6ySQjBDtPfNLtmY1gsNTS3269j/OPTPd2w/DDmigAUKxpu1T0XuNos21FsO/41CTBnB4hsQkgMjJVbnXBNnVq81b+af3y511YJcMQ6zUCsg1wTR4zsob+TfEcdztTls8XZd1ZOLGfiiDnOP7hkJZDoLvNaCXcJNhdnshK0xOLyZhnmDP4nz9kNdXI4yHvwb7dDaFwc8aXhBSR3ikj9dMV3RqhrA08FdyX/OLlpy64Qq3t+CiBXBIKWJCg+XIm+6uA9bVJqGxpltEMsn/vwz258uIdy3HT1a4zLxicb490KYmuMelrjFNimhnMbnlX7Ptb2JSkse0Fol5pWpwf/2hhJdtf59HGouSV6JrcF/+kk9AzwKtu/22HJdHUloGmxgZ3fIWmBe+z15D9UCXvPYdsAcI+Vv1btRpX4o0qQPbIfqNZc//Un+KMk9A/z+xgOHYfvC+OcR8k/UPhCw4FgaZYoiAeOOirDCcYQCVbEYJ0a1C3hqEs8nqmjsjK/98WoBtIOl7q56Meo2kb2Kf6uPQFBxSnh/vWfa/mzSUjtSju3y7VxJf8bg8fWe97jWoEAAAAASUVORK5CYII= + +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAAaCAIAAABn3KYmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gkTADEwS9h64QAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAL0lEQVRYw+3PAREAAAQEsKd/Z3I4W4PV5LyOg4ODg4ODg4ODg4ODg4ODg4PD78MC7cwBM02qquMAAAAASUVORK5CYII= diff --git a/browser/base/content/test/newtab/searchEngine2xLogo.xml b/browser/base/content/test/newtab/searchEngine2xLogo.xml index e4cae7b4a1cb..941bf040dcf5 100644 --- a/browser/base/content/test/newtab/searchEngine2xLogo.xml +++ b/browser/base/content/test/newtab/searchEngine2xLogo.xml @@ -2,5 +2,6 @@ browser_newtab_search searchEngine2xLogo.xml -data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAIAAADJ8nfCAAAMR2lDQ1BJQ0MgUHJvZmlsZQAASA2tV3dYU1cbf+9IAiEJIyECMsJeouwpewsKMoU6CEkgYcQQCCpua2kF60DFgaOiVRGrVisgdSDitihu6/hQi4JSiwMXKt+5YdinT7//vvs859xffu973vt733vuyTkA2nZChSIP1wHIlxcpEyJDBJPS0gWM+4CDMfDAEnhCUaEiOD4+Fv7n9eYGYJTxqhMV63+6/btBVywpFAFg8cicKS4U5SP8CwDJESmURQC0FsRbzihSULgTYZ4SCUT4I4Wz1ZiO1AMvcwBbqX2SEkIB6N4AGiyhUJkNwAlDvKBYlI3icMQIO8vFMjnCqxEOEEmFiONcQ3hUfv50hLURBLvMv8XJ/hsWCjOHYwqF2cN4IBdqKGiEyQoVecJZ6h//zy4/T4Xqpb7MUc+SKqMS0J2H6rYxd3oMhVkI75dnTohDWA/hIzIq4wHcKlVFJSNM+beLCkNRLYGP8GuxMCwGYWMAnKnKTQ4exDZCJUJqfzxEVhSdNIhTlNMTBuPjOfK8CdT8QHHwOVJJ9BCukBSGJyIeacBzsmQR0Qijd4XvKpEmpSKMdOINxbKUCQhzEG4pzE2kNFBxrpRIQyle7aNUJVCarRDfmaWMoHJEPgQrvxAhdXzCQiRUP8sA8e5F0qQoxKOxRKxYEhaOMHouMUkiTx7UQ0gVRSFUHMq/RJGnnt9IJ1EhyYukeAuEtxcWJw6NPV2kTKJ4VDfiRo5wHDVfkWbiqaIonqoJpecdxEIohIEAVKhlwnTIAVlrd303+jVgiQAhKCEbJOA0yAyNSFVb5KhPhBL4E+TIp3B4XIjaKoFixH8aZgfGOkGW2lqsHpELj9ET8kkjMoD0I2NRH4SaK+lN+gyNE2gP6aSH08PoUfQIuv0QAyKkOg81Jcj+hYtBNgnKTol6+VAOX+LRHtPaaA9p12nttNuQAn+oowxmOk22SDmkYDjyeGhH0QaqIkEVk0PXkA9pg1R7kCGkP9KPtJN80gicSHeUSTAZiHLzQOxQ9SjVqmFtX2o5VPchP0q14G85DvIcB47HoIrMoazQmxyqxD+jfLHIQIy8Yv7pSXxHHCTOECeIc8QRoh4ExHGigbhIHKXwoOYIdXWyh5+WoK5oLspBNuTjXOvc5fxx6NdwrkLEUAqod4Dmf5FkZhGafxA6XTFLKcuWFgmC0SosEUTLRaNHCVydXdwBqDWd8gF4xVev1Rj//BeuoAnApwytAdRyKqC8AISWAIcfA3DffOEsX6JPagXA0csilbJ4wI+kbjRgogWTB4Zgiv4x7FBOruAJfhAE4TAO4iAJ0mAqqroU8pHqGTAHFkIplMMKWAMbYAtsg13wExyAejgCJ+A0XIDLcB3uoLnRAc+gB95AH4ZhDIyNcTFDzAyzxhwxV8wbC8DCsVgsAUvDMrBsTI6psDnY11g5VoFtwLZiNdjP2GHsBHYOa8NuYw+wLuwl9gEncBbOw01wG3wM7o0H4zF4Ej4Fz8YL8BJ8Mb4MX4dX43vwOvwEfgG/jrfjz/BeAggtgk+YE06ENxFKxBHpRBahJOYRZUQlUU3sJRrRu75KtBPdxHuSTnJJAemE5mcUmUyKyAJyHrmU3EDuIuvIFvIq+YDsIT/T2DRjmiPNlxZNm0TLps2gldIqaTtoh2in0LfTQXtDp9P5dFu6F/o20+g59Nn0pfRN9H30Jnob/RG9l8FgGDIcGf6MOIaQUcQoZaxn7GEcZ1xhdDDeaWhpmGm4akRopGvINRZpVGrs1jimcUXjiUafpo6mtaavZpymWHOW5nLN7ZqNmpc0OzT7mLpMW6Y/M4mZw1zIXMfcyzzFvMt8paWlZaHlozVRS6a1QGud1n6ts1oPtN6z9FgOrFDWZJaKtYy1k9XEus16xWazbdhB7HR2EXsZu4Z9kn2f/Y7D5YzmRHPEnPmcKk4d5wrnubamtrV2sPZU7RLtSu2D2pe0u3U0dWx0QnWEOvN0qnQO69zU6dXl6rroxunm6y7V3a17TrdTj6FnoxeuJ9ZbrLdN76TeIy7BteSGckXcr7nbuae4HTw6z5YXzcvhlfN+4rXyevT19N31U/Rn6lfpH9Vv5xN8G340P4+/nH+Af4P/YYTJiOARkhFLRuwdcWXEW4ORBkEGEoMyg30G1w0+GAoMww1zDVca1hveMyKNHIwmGs0w2mx0yqh7JG+k30jRyLKRB0b+bowbOxgnGM823mZ80bjXxNQk0kRhst7kpEm3Kd80yDTHdLXpMdMuM65ZgJnMbLXZcbOnAn1BsCBPsE7QIugxNzaPMleZbzVvNe+zsLVItlhksc/iniXT0tsyy3K1ZbNlj5WZ1XirOVa1Vr9ba1p7W0ut11qfsX5rY2uTavOtTb1Np62BbbRtiW2t7V07tl2gXYFdtd01e7q9t32u/Sb7yw64g4eD1KHK4ZIj7ujpKHPc5Ng2ijbKZ5R8VPWom04sp2CnYqdapwej+aNjRy8aXT/6+RirMeljVo45M+azs4dznvN25zsuei7jXBa5NLq8dHVwFblWuV5zY7tFuM13a3B74e7oLnHf7H7Lg+sx3uNbj2aPT55enkrPvZ5dXlZeGV4bvW5687zjvZd6n/Wh+YT4zPc54vPe19O3yPeA719+Tn65frv9OsfajpWM3T72kb+Fv9B/q397gCAgI+CHgPZA80BhYHXgwyDLIHHQjqAnwfbBOcF7gp+HOIcoQw6FvA31DZ0b2hRGhEWGlYW1huuFJ4dvCL8fYRGRHVEb0RPpETk7simKFhUTtTLqZrRJtCi6JrpnnNe4ueNaYlgxiTEbYh7GOsQqYxvH4+PHjV81/u4E6wnyCfVxEBcdtyruXrxtfEH8rxPpE+MnVk18nOCSMCfhTCI3cVri7sQ3SSFJy5PuJNslq5KbU7RTJqfUpLxNDUutSG2fNGbS3EkX0ozSZGkN6Yz0lPQd6b1fhX+15quOyR6TSyffmGI7ZeaUc1ONpuZNPTpNe5pw2sEMWkZqxu6Mj8I4YbWwNzM6c2NmjyhUtFb0TBwkXi3ukvhLKiRPsvyzKrI6s/2zV2V3SQOlldJuWahsg+xFTlTOlpy3uXG5O3P781Lz9uVr5GfkH5bryXPlLdNNp8+c3qZwVJQq2gt8C9YU9ChjlDsKscIphQ1FPLR5vqiyU32jelAcUFxV/G5GyoyDM3VnymdenOUwa8msJyURJT/OJmeLZjfPMZ+zcM6DucFzt87D5mXOa55vOX/x/I4FkQt2LWQuzF342yLnRRWLXn+d+nXjYpPFCxY/+ibym9pSTqmy9Oa3ft9u+Y78TvZd6xK3JeuXfC4Tl50vdy6vLP+4VLT0/Pcu36/7vn9Z1rLW5Z7LN6+gr5CvuLEycOWuCt2KkopHq8avqlstWF22+vWaaWvOVbpXblnLXKta274udl3Deqv1K9Z/3CDdcL0qpGrfRuONSza+3STedGVz0Oa9W0y2lG/58IPsh1tbI7fWVdtUV26jbyve9nh7yvYzP3r/WLPDaEf5jk875TvbdyXsaqnxqqnZbbx7eS1eq6rt2jN5z+Wfwn5q2Ou0d+s+/r7y/bBftf/pzxk/3zgQc6D5oPfBvb9Y/7LxEPdQWR1WN6uup15a396Q1tB2eNzh5ka/xkO/jv515xHzI1VH9Y8uP8Y8tvhY//GS471NiqbuE9knHjVPa75zctLJay0TW1pPxZw6ezri9MkzwWeOn/U/e+Sc77nD573P11/wvFB30ePiod88fjvU6tlad8nrUsNln8uNbWPbjl0JvHLiatjV09eir124PuF6243kG7duTr7Zfkt8q/N23u0Xvxf/3ndnwV3a3bJ7Ovcq7xvfr/6P/X/2tXu2H30Q9uDiw8SHdx6JHj37o/CPjx2LH7MfVz4xe1LT6dp5pCui6/LTr552PFM86+su/VP3z43P7Z7/8lfQXxd7JvV0vFC+6H+59JXhq52v3V8398b33n+T/6bvbdk7w3e73nu/P/Mh9cOTvhkfGR/XfbL/1Pg55vPd/vz+foVQKVTvBQjU41lZAC93ArDT0N7hMgCTM3DmUntgA+dEhLHBRtH/wAPnMsqA9hCwMwggeQFAbBPAZtSsEWahO7X9TgoC3M1tuCGGugqz3FzVAGMp0dbkXX//KxMARiPAJ2V/f9+m/v5P29Fe/TZAU8HAWY/yps6QP6D9PMC51qULqPvfr/8Cy81qyPQGeEcAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAGcaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjEzMDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj41MjwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgoay+OEAAAGOUlEQVR4Ae2abYsbQQyDE7j//1MLhX7rq4LA+3Riz3puN0kDPY5F45FkjTevx11/XX5d/v+8egIf6W24Xq6/L791VTwDXQ9GfYRnFekRvR7hGflvt+H4uBkxrAWqWyh+2pc+lZb+q3xqienDepXh9PwfPy4/ZMrewmzPiKxTUnGqekfb4dCffOYkh3XyK05V72g7nPC/frt8o8A4trVkdNapIof1Dp+cyoeeHVx5sk6fqm+HT07lw14pzl+UaC2Z3C32K4nfTshhe9bJT9urSH7lQ23FqerSassOzNPpSz4zEHd8yE9zXr9evpJkTCp32ZJ1Ymorfoez6lnxWa/ykNPJ1uEseV6/XL5YwIidNhXnrDqPQUx/1t86/8fPy08eZo45Ah6bqg6H/GfiTrYO5/TM+feGSRul9K5BLCmJ4oRD/jNxJ1uHc27m5dtwbvv/bp7A+beBL1Z6WHn5RuN+Sf7921DFquqdia9qV/nMUGmrOrUVXtXu8rdv0Xzk7sqqfEP9iE9HW3Gq+hBvd3nEp6MNzu3ZoIUC8TYwn3ZTTliQPGB+/en4MAP9WWeLJuffz7+9KK2OieOoMD2rW9KpV/6ssxdvW+dW0YeYnp2cFZ+eKf5QYm+stknthqLN4+qJiMPRaLmbYbBNl2+d//Zs8BR4J2NwPnA6Js6CYxV5d9z0H/iepswnHEvMYa9UG1YCvFVaxs/L8398v3xXiAh0D4YxxQjumY+rMAO7cHysE1Pb4VN7FmYGekae24uSfrl3j4NgEMt7ZrMiBycQP6LMtWnTZp7QNvnzJNqVz7n5t7fo3d7nEk4fzbnxdt3Ozb//gXU30AsJfCbxEfrCSEutI//Lng0RN6Ko8tajPJL/9i06JrILVke2ymeAI1r6EK96rvI/3Wt7UaIFcfUIVcT4gLjKn3h6S4b8cMle1HJMzEBMPuv0ZL3Dn3C8JcOl/NttmFin4x7aRHv6cEzk89irnMqf9cH/38+/3QZF10l4AGOOjyMjf+DEsW0YV8slpE/s2jDl0N+pfKWP5dw1prbiD5zn5799b1BXJWZEFTmOiMW4PLDIwZmM9dMc9bItmwozz1vn3z4pDUdKR1aNoxo9p8YxsU7Pyqejfev8+3/M4Mg0Jk9ERY6mqlNLXPGrekdLToUr/6r+CJ+0V+uPGUwjFy8NhqW2hjq1xINwWM59BnIs6V/hIBsMy3lfeg7CYTn3Gchabi9K7PEfP3kCy8+GNF/1ApWSDxYf0esRntUx0175v4uRSjs9fbzFYhPT84hPpx17kX+kLz2P+DBP4PxfAmJ7AFUU1imp4pJPDutHfKglpv8j+tKffdmL9eDnX98oC6r0/FCY2qk4aPnB11YUCqsYHPqzr20tHPy9jK0A0Ys+9DfTV3IG/8jG+qANDv3pKb7kVtEnONvXt6Z1tCSf7VmPNpGAuyw6JSPeM12RZ2SY9E051NJ/4uNIjEqhcCQ39pEHDpfMEH1v7w3aGCzs5bq3bBQyLcnh+Fgn3w73V/IrH6roKa2XIky0npQ4g9aSiZZ8ZiA+Jf9fn5R24zqxQ5gckgCMzjExOnHlw7qwTyshPcnRlpcCQwbL3TQ4Ta2trE2vlQ/rwvP8+bfoQeZlGuJ4cbVXh9/hHE9uh9VeKf+vZwOTiR1tBGJJTorTNikzimFuEMsgDCAIE36HM9h6KSEfuV6mzCiu9rrnP+Rb9H2bSPwW4Pn5tw+s6h2PgkcPy410VaMjfc/yWT3vWX3DZ3s2qBRvR286mvfNv/8vAXHHhkduVa8eWeSTw1tOTqdOnwqf5Ukf9urkpJb88MlflCjjh7+QNUHHR5x4FLNXVWdr+vN4rNOT2g7u+FQ5qzr7hn9+GwZqjKk6KvnEHAFjVT5VXZ7asnPFYZ0ZOn3JJ35a/u2PGZ241VEZnZie1ZE69VVP5lQGL2XCOj0r/LT821t0NQ5F9wGc1csq91CnliPgaGheZaAtPTvaik/PClP70Pz7b9GTiJ6mCBzrJG5qtcpPTT5RrPpW9arFKj/12Z4N6baKkzbasspgWFobVzPT6yCMZZBVSW95ECZgoo1GBsNSnkO96jIIYxl8Veb5929DpAlw3yb6PQ5EU4NYdjoG+RPajn+HM8/wBy3+Gl99yL4tAAAAAElFTkSuQmCC + +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAAA0CAIAAADJ8nfCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gkTADMURe38sgAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAYklEQVR42u3RQQ0AAAjEsAP/nsEECZ9OwlrJRN+1BRiEAYMwYBAGDMKAQRgwCAMGYcAgDBiEAYMwYBAGDMKAQRgwCAMGYcAgDMKAQRgwCAMGYcAgDBiEAYMwYBAGDMKAQXctkIQBZ/1YP3YAAAAASUVORK5CYII= diff --git a/browser/base/content/test/newtab/searchEngineFavicon.xml b/browser/base/content/test/newtab/searchEngineFavicon.xml new file mode 100644 index 000000000000..6f2a970f5697 --- /dev/null +++ b/browser/base/content/test/newtab/searchEngineFavicon.xml @@ -0,0 +1,6 @@ + + +browser_newtab_search searchEngineFavicon.xml + +data:application/ico;base64,AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAATCwAAEwsAAAAAAAAAAAAA/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAABAAAAAgAAAAAQAgAAAAAAAABAAAEwsAABMLAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + diff --git a/browser/components/sessionstore/SessionFile.jsm b/browser/components/sessionstore/SessionFile.jsm index 36f42087b21e..9b992fcb2d4f 100644 --- a/browser/components/sessionstore/SessionFile.jsm +++ b/browser/components/sessionstore/SessionFile.jsm @@ -234,6 +234,12 @@ let SessionFileInternal = { } } } + + // All files are corrupted if files found but none could deliver a result. + let allCorrupt = !noFilesFound && !result; + Telemetry.getHistogramById("FX_SESSION_RESTORE_ALL_FILES_CORRUPT"). + add(allCorrupt); + if (!result) { // If everything fails, start with an empty session. result = { diff --git a/browser/components/sessionstore/SessionStore.jsm b/browser/components/sessionstore/SessionStore.jsm index 4d5069ecd65e..9336b827c4c1 100644 --- a/browser/components/sessionstore/SessionStore.jsm +++ b/browser/components/sessionstore/SessionStore.jsm @@ -2202,12 +2202,9 @@ let SessionStoreInternal = { if (aWindow && (!aWindow.__SSi || !this._windows[aWindow.__SSi])) this.onLoad(aWindow); + let root; try { - var root = typeof aState == "string" ? JSON.parse(aState) : aState; - if (!root.windows[0]) { - this._sendRestoreCompletedNotifications(); - return; // nothing to restore - } + root = (typeof aState == "string") ? JSON.parse(aState) : aState; } catch (ex) { // invalid state object - don't restore anything debug(ex); @@ -2215,15 +2212,23 @@ let SessionStoreInternal = { return; } + // Restore closed windows if any. + if (root._closedWindows) { + this._closedWindows = root._closedWindows; + } + + // We're done here if there are no windows. + if (!root.windows || !root.windows.length) { + this._sendRestoreCompletedNotifications(); + return; + } + TelemetryStopwatch.start("FX_SESSION_RESTORE_RESTORE_WINDOW_MS"); // We're not returning from this before we end up calling restoreTabs // for this window, so make sure we send the SSWindowStateBusy event. this._setWindowStateBusy(aWindow); - if (root._closedWindows) - this._closedWindows = root._closedWindows; - var winData; if (!root.selectedWindow || root.selectedWindow > root.windows.length) { root.selectedWindow = 0; diff --git a/browser/components/sessionstore/test/unit/test_histogram_corrupt_files.js b/browser/components/sessionstore/test/unit/test_histogram_corrupt_files.js new file mode 100644 index 000000000000..c14651c0b8c9 --- /dev/null +++ b/browser/components/sessionstore/test/unit/test_histogram_corrupt_files.js @@ -0,0 +1,114 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/* + * The primary purpose of this test is to ensure that + * the sessionstore component records information about + * corrupted backup files into a histogram. + */ + +"use strict"; +Cu.import("resource://gre/modules/osfile.jsm", this); + +const Telemetry = Services.telemetry; +const Path = OS.Path; +const HistogramId = "FX_SESSION_RESTORE_ALL_FILES_CORRUPT"; + +// Prepare the session file. +let profd = do_get_profile(); +Cu.import("resource:///modules/sessionstore/SessionFile.jsm", this); + +/** + * A utility function for resetting the histogram and the contents + * of the backup directory. + */ +function reset_session(backups = {}) { + + // Reset the histogram. + Telemetry.getHistogramById(HistogramId).clear(); + + // Reset the contents of the backups directory + OS.File.makeDir(SessionFile.Paths.backups); + for (let key of SessionFile.Paths.loadOrder) { + if (backups.hasOwnProperty(key)) { + OS.File.copy(backups[key], SessionFile.Paths[key]); + } else { + OS.File.remove(SessionFile.Paths[key]); + } + } +} + +/** + * In order to use FX_SESSION_RESTORE_ALL_FILES_CORRUPT histogram + * it has to be registered in "toolkit/components/telemetry/Histograms.json". + * This test ensures that the histogram is registered and empty. + */ +add_task(function* test_ensure_histogram_exists_and_empty() { + let s = Telemetry.getHistogramById(HistogramId).snapshot(); + Assert.equal(s.sum, 0, "Initially, the sum of probes is 0"); +}); + +/** + * Makes sure that the histogram is negatively updated when no + * backup files are present. + */ +add_task(function* test_no_files_exist() { + // No session files are available to SessionFile. + reset_session(); + + yield SessionFile.read(); + // Checking if the histogram is updated negatively + let h = Telemetry.getHistogramById(HistogramId); + let s = h.snapshot(); + Assert.equal(s.counts[0], 1, "One probe for the 'false' bucket."); + Assert.equal(s.counts[1], 0, "No probes in the 'true' bucket."); +}); + +/** + * Makes sure that the histogram is negatively updated when at least one + * backup file is not corrupted. + */ +add_task(function* test_one_file_valid() { + // Corrupting some backup files. + let invalidSession = "data/sessionstore_invalid.js"; + let validSession = "data/sessionstore_valid.js"; + reset_session({ + clean : invalidSession, + cleanBackup: validSession, + recovery: invalidSession, + recoveryBackup: invalidSession + }); + + yield SessionFile.read(); + // Checking if the histogram is updated negatively. + let h = Telemetry.getHistogramById(HistogramId); + let s = h.snapshot(); + Assert.equal(s.counts[0], 1, "One probe for the 'false' bucket."); + Assert.equal(s.counts[1], 0, "No probes in the 'true' bucket."); +}); + +/** + * Makes sure that the histogram is positively updated when all + * backup files are corrupted. + */ +add_task(function* test_all_files_corrupt() { + // Corrupting all backup files. + let invalidSession = "data/sessionstore_invalid.js"; + reset_session({ + clean : invalidSession, + cleanBackup: invalidSession, + recovery: invalidSession, + recoveryBackup: invalidSession + }); + + yield SessionFile.read(); + // Checking if the histogram is positively updated. + let h = Telemetry.getHistogramById(HistogramId); + let s = h.snapshot(); + Assert.equal(s.counts[1], 1, "One probe for the 'true' bucket."); + Assert.equal(s.counts[0], 0, "No probes in the 'false' bucket."); +}); + +function run_test() { + run_next_test(); +} diff --git a/browser/components/sessionstore/test/unit/xpcshell.ini b/browser/components/sessionstore/test/unit/xpcshell.ini index 8abbff5b8700..21ab8440e480 100644 --- a/browser/components/sessionstore/test/unit/xpcshell.ini +++ b/browser/components/sessionstore/test/unit/xpcshell.ini @@ -11,3 +11,4 @@ support-files = [test_startup_nosession_async.js] [test_startup_session_async.js] [test_startup_invalid_session.js] +[test_histogram_corrupt_files.js] diff --git a/browser/devtools/webide/webide-prefs.js b/browser/devtools/webide/webide-prefs.js index ea6b81ed4768..0d7c1b1e3920 100644 --- a/browser/devtools/webide/webide-prefs.js +++ b/browser/devtools/webide/webide-prefs.js @@ -7,7 +7,7 @@ pref("devtools.webide.showProjectEditor", true); pref("devtools.webide.templatesURL", "https://code.cdn.mozilla.net/templates/list.json"); pref("devtools.webide.autoinstallADBHelper", true); pref("devtools.webide.restoreLastProject", true); -pref("devtools.webide.enableLocalRuntime", false); +pref("devtools.webide.enableLocalRuntime", true); pref("devtools.webide.addonsURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/index.json"); pref("devtools.webide.simulatorAddonsURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/#VERSION#/#OS#/fxos_#SLASHED_VERSION#_simulator-#OS#-latest.xpi"); pref("devtools.webide.simulatorAddonID", "fxos_#SLASHED_VERSION#_simulator@mozilla.org"); diff --git a/browser/modules/ContentSearch.jsm b/browser/modules/ContentSearch.jsm index b14a34414b4a..95554789141e 100644 --- a/browser/modules/ContentSearch.jsm +++ b/browser/modules/ContentSearch.jsm @@ -386,10 +386,12 @@ this.ContentSearch = { _currentEngineObj: Task.async(function* () { let engine = Services.search.currentEngine; + let favicon = engine.getIconURLBySize(16, 16); let uri1x = engine.getIconURLBySize(65, 26); let uri2x = engine.getIconURLBySize(130, 52); let obj = { name: engine.name, + iconBuffer: yield this._arrayBufferFromDataURI(favicon), logoBuffer: yield this._arrayBufferFromDataURI(uri1x), logo2xBuffer: yield this._arrayBufferFromDataURI(uri2x), }; diff --git a/browser/modules/test/browser_ContentSearch.js b/browser/modules/test/browser_ContentSearch.js index eea890af1301..49f017263a59 100644 --- a/browser/modules/test/browser_ContentSearch.js +++ b/browser/modules/test/browser_ContentSearch.js @@ -258,9 +258,43 @@ add_task(function* GetSuggestions_AddFormHistoryEntry_RemoveFormHistoryEntry() { yield waitForTestMsg("CurrentState"); }); +function buffersEqual(actualArrayBuffer, expectedArrayBuffer) { + let expectedView = new Int8Array(expectedArrayBuffer); + let actualView = new Int8Array(actualArrayBuffer); + for (let i = 0; i < expectedView.length; i++) { + if (actualView[i] != expectedView[i]) { + return false; + } + } + return true; +} + +function arrayBufferEqual(actualArrayBuffer, expectedArrayBuffer) { + ok(actualArrayBuffer instanceof ArrayBuffer, "Actual value is ArrayBuffer."); + ok(expectedArrayBuffer instanceof ArrayBuffer, "Expected value is ArrayBuffer."); + Assert.equal(actualArrayBuffer.byteLength, expectedArrayBuffer.byteLength, + "Array buffers have the same length."); + ok(buffersEqual(actualArrayBuffer, expectedArrayBuffer), "Buffers are equal."); +} + +function checkArrayBuffers(actual, expected) { + if (actual instanceof ArrayBuffer) { + arrayBufferEqual(actual, expected); + } + if (typeof actual == "object") { + for (let i in actual) { + checkArrayBuffers(actual[i], expected[i]); + } + } +} function checkMsg(actualMsg, expectedMsgData) { + let actualMsgData = actualMsg.data; SimpleTest.isDeeply(actualMsg.data, expectedMsgData, "Checking message"); + + // Engines contain ArrayBuffers which we have to compare byte by byte and + // not as Objects (like SimpleTest.isDeeply does). + checkArrayBuffers(actualMsgData, expectedMsgData); } function waitForMsg(name, type) { @@ -330,35 +364,33 @@ function addTab() { return deferred.promise; } -function currentStateObj() { - return Task.spawn(function* () { - let state = { - engines: [], - currentEngine: yield currentEngineObj(), - }; - for (let engine of Services.search.getVisibleEngines()) { - let uri = engine.getIconURLBySize(16, 16); - state.engines.push({ - name: engine.name, - iconBuffer: yield arrayBufferFromDataURI(uri), - }); - } - return state; - }.bind(this)); -} - -function currentEngineObj() { - return Task.spawn(function* () { - let engine = Services.search.currentEngine; - let uri1x = engine.getIconURLBySize(65, 26); - let uri2x = engine.getIconURLBySize(130, 52); - return { +let currentStateObj = Task.async(function* () { + let state = { + engines: [], + currentEngine: yield currentEngineObj(), + }; + for (let engine of Services.search.getVisibleEngines()) { + let uri = engine.getIconURLBySize(16, 16); + state.engines.push({ name: engine.name, - logoBuffer: yield arrayBufferFromDataURI(uri1x), - logo2xBuffer: yield arrayBufferFromDataURI(uri2x), - }; - }.bind(this)); -} + iconBuffer: yield arrayBufferFromDataURI(uri), + }); + } + return state; +}); + +let currentEngineObj = Task.async(function* () { + let engine = Services.search.currentEngine; + let uri1x = engine.getIconURLBySize(65, 26); + let uri2x = engine.getIconURLBySize(130, 52); + let uriFavicon = engine.getIconURLBySize(16, 16); + return { + name: engine.name, + logoBuffer: yield arrayBufferFromDataURI(uri1x), + logo2xBuffer: yield arrayBufferFromDataURI(uri2x), + iconBuffer: yield arrayBufferFromDataURI(uriFavicon), + }; +}); function arrayBufferFromDataURI(uri) { if (!uri) { diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index ba2737153fc8..8436d32137b2 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -5897,7 +5897,7 @@ nsDocument::RegisterElement(JSContext* aCx, const nsAString& aType, JSAutoCompartment ac(aCx, global); JS::Handle htmlProto( - HTMLElementBinding::GetProtoObject(aCx, global)); + HTMLElementBinding::GetProtoObjectHandle(aCx, global)); if (!htmlProto) { rv.Throw(NS_ERROR_OUT_OF_MEMORY); return; @@ -5943,7 +5943,7 @@ nsDocument::RegisterElement(JSContext* aCx, const nsAString& aType, } JS::Handle svgProto( - SVGElementBinding::GetProtoObject(aCx, global)); + SVGElementBinding::GetProtoObjectHandle(aCx, global)); if (!svgProto) { rv.Throw(NS_ERROR_OUT_OF_MEMORY); return; diff --git a/content/base/src/nsFrameMessageManager.cpp b/content/base/src/nsFrameMessageManager.cpp index 07765a2e8b64..98cbf18c718c 100644 --- a/content/base/src/nsFrameMessageManager.cpp +++ b/content/base/src/nsFrameMessageManager.cpp @@ -29,6 +29,7 @@ #include "nsIDOMClassInfo.h" #include "nsIDOMFile.h" #include "xpcpublic.h" +#include "mozilla/CycleCollectedJSRuntime.h" #include "mozilla/Preferences.h" #include "mozilla/dom/nsIContentParent.h" #include "mozilla/dom/PermissionMessageUtils.h" @@ -1432,8 +1433,8 @@ nsFrameScriptExecutor::LoadFrameScriptInternal(const nsAString& aURL, return; } - AutoSafeJSContext cx; - JS::Rooted script(cx); + JSRuntime* rt = CycleCollectedJSRuntime::Get()->Runtime(); + JS::Rooted script(rt); nsFrameScriptObjectExecutorHolder* holder = sCachedScripts->Get(aURL); if (holder && holder->WillRunInGlobalScope() == aRunInGlobalScope) { @@ -1446,26 +1447,23 @@ nsFrameScriptExecutor::LoadFrameScriptInternal(const nsAString& aURL, shouldCache, &script); } - JS::Rooted global(cx, mGlobal->GetJSObject()); + JS::Rooted global(rt, mGlobal->GetJSObject()); if (global) { - JSAutoCompartment ac(cx, global); - bool ok = true; + AutoEntryScript aes(xpc::NativeGlobal(global)); + aes.TakeOwnershipOfErrorReporting(); + JSContext* cx = aes.cx(); if (script) { if (aRunInGlobalScope) { - ok = JS::CloneAndExecuteScript(cx, global, script); + JS::CloneAndExecuteScript(cx, global, script); } else { JS::Rooted scope(cx); - ok = js::ExecuteInGlobalAndReturnScope(cx, global, script, &scope); - if (ok){ + bool ok = js::ExecuteInGlobalAndReturnScope(cx, global, script, &scope); + if (ok) { // Force the scope to stay alive. mAnonymousGlobalScopes.AppendElement(scope); } } } - - if (!ok) { - nsJSUtils::ReportPendingException(cx); - } } } diff --git a/content/base/src/nsScriptLoader.cpp b/content/base/src/nsScriptLoader.cpp index 357a5139df81..4e60dc20b288 100644 --- a/content/base/src/nsScriptLoader.cpp +++ b/content/base/src/nsScriptLoader.cpp @@ -1057,7 +1057,9 @@ nsScriptLoader::FillCompileOptionsForRequest(const AutoJSAPI &jsapi, aOptions->setSourceMapURL(aRequest->mSourceMapURL.get()); } if (aRequest->mOriginPrincipal) { - aOptions->setOriginPrincipals(nsJSPrincipals::get(aRequest->mOriginPrincipal)); + nsIPrincipal* scriptPrin = nsContentUtils::ObjectPrincipal(aScopeChain); + bool subsumes = scriptPrin->Subsumes(aRequest->mOriginPrincipal); + aOptions->setMutedErrors(!subsumes); } JSContext* cx = jsapi.cx(); diff --git a/content/media/AudioStream.cpp b/content/media/AudioStream.cpp index 1f44715c68aa..c595cf73056b 100644 --- a/content/media/AudioStream.cpp +++ b/content/media/AudioStream.cpp @@ -141,6 +141,7 @@ AudioStream::AudioStream() , mNeedsStart(false) , mShouldDropFrames(false) , mPendingAudioInitTask(false) + , mLastGoodPosition(0) { // keep a ref in case we shut down later than nsLayoutStatics mLatencyLog = AsyncLatencyLogger::Get(true); @@ -856,7 +857,12 @@ AudioStream::GetPositionInFramesUnlocked() } } - return std::min(position, INT64_MAX); + MOZ_ASSERT(position >= mLastGoodPosition, "cubeb position shouldn't go backward"); + // This error handling/recovery keeps us in good shape in release build. + if (position >= mLastGoodPosition) { + mLastGoodPosition = position; + } + return std::min(mLastGoodPosition, INT64_MAX); } int64_t diff --git a/content/media/AudioStream.h b/content/media/AudioStream.h index 3c499487dfd0..ef166896b819 100644 --- a/content/media/AudioStream.h +++ b/content/media/AudioStream.h @@ -402,6 +402,9 @@ private: // True if there is a pending AudioInitTask. Shutdown() will wait until the // pending AudioInitTask is finished. bool mPendingAudioInitTask; + // The last good position returned by cubeb_stream_get_position(). Used to + // check if the cubeb position is going backward. + uint64_t mLastGoodPosition; }; class AudioInitTask : public nsRunnable diff --git a/content/media/MediaStreamGraph.cpp b/content/media/MediaStreamGraph.cpp index 5062fb426cc5..d388fa235152 100644 --- a/content/media/MediaStreamGraph.cpp +++ b/content/media/MediaStreamGraph.cpp @@ -2726,7 +2726,7 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(bool aRealtime, , mNonRealtimeProcessing(false) , mStreamOrderDirty(false) , mLatencyLog(AsyncLatencyLogger::Get()) -#ifdef MOZ_WEBRTCj +#ifdef MOZ_WEBRTC , mFarendObserverRef(nullptr) #endif , mMemoryReportMonitor("MSGIMemory") diff --git a/content/svg/content/src/SVGEllipseElement.cpp b/content/svg/content/src/SVGEllipseElement.cpp index 488f62345771..db0d1d2402a4 100644 --- a/content/svg/content/src/SVGEllipseElement.cpp +++ b/content/svg/content/src/SVGEllipseElement.cpp @@ -97,10 +97,7 @@ void SVGEllipseElement::ConstructPath(gfxContext *aCtx) { RefPtr dt = aCtx->GetDrawTarget(); - FillRule fillRule = - aCtx->CurrentFillRule() == gfxContext::FILL_RULE_WINDING ? - FillRule::FILL_WINDING : FillRule::FILL_EVEN_ODD; - RefPtr builder = dt->CreatePathBuilder(fillRule); + RefPtr builder = dt->CreatePathBuilder(aCtx->CurrentFillRule()); RefPtr path = BuildPath(builder); if (path) { aCtx->SetPath(path); diff --git a/content/svg/content/test/test_a_href_01.xhtml b/content/svg/content/test/test_a_href_01.xhtml index 23f923ce0168..49cab09be363 100644 --- a/content/svg/content/test/test_a_href_01.xhtml +++ b/content/svg/content/test/test_a_href_01.xhtml @@ -57,6 +57,7 @@ function doNavigationTest(testNumber, initialHref, f) { var iframe = document.getElementById("iframe" + testNumber); var a = iframe.contentDocument.getElementById("a"); ok(endsWith(iframe.contentWindow.location, initialHref), "Initial href of test " + testNumber); + is("pointer", window.getComputedStyle(a).getPropertyValue("cursor"), "expected pointer cursor"); iframe.onload = function() { ok(endsWith(iframe.contentWindow.location, "a_href_destination.svg"), "Final href of test " + testNumber); if (++navigationCount == testCount) { diff --git a/docshell/test/browser/browser.ini b/docshell/test/browser/browser.ini index 04a1503401ab..b0c14ec1234e 100644 --- a/docshell/test/browser/browser.ini +++ b/docshell/test/browser/browser.ini @@ -32,8 +32,6 @@ support-files = file_bug670318.html file_bug852909.pdf file_bug852909.png - file_bug941562-child.html - file_bug941562.html file_bug1046022.html print_postdata.sjs test-form_sjis.html @@ -87,8 +85,6 @@ skip-if = e10s # Bug ?????? - test touches content (adds event listener to conte [browser_bug852909.js] skip-if = e10s # Bug ?????? - event handler checks event.target is the content document and test e10s-utils doesn't do that. [browser_bug92473.js] -skip-if = e10s # Bug ?????? - BrowserSetForcedCharacterSet() in browser.js references docShell -[browser_bug941562.js] skip-if = e10s # Bug ?????? - event handler checks event.target is the content document and test e10s-utils doesn't do that. [browser_uriFixupIntegration.js] skip-if = e10s diff --git a/docshell/test/browser/browser_bug941562.js b/docshell/test/browser/browser_bug941562.js deleted file mode 100644 index 6f564e74bf86..000000000000 --- a/docshell/test/browser/browser_bug941562.js +++ /dev/null @@ -1,39 +0,0 @@ -function test() { - waitForExplicitFinish(); - - var rootDir = "http://mochi.test:8888/browser/docshell/test/browser/"; - gBrowser.selectedTab = gBrowser.addTab(rootDir + "file_bug941562.html"); - gBrowser.selectedBrowser.addEventListener("load", afterOpen, true); -} - -function afterOpen(event) { - if (event.target != gBrowser.contentDocument) { - return; - } - - gBrowser.selectedBrowser.removeEventListener("load", afterOpen, true); - gBrowser.selectedBrowser.addEventListener("load", afterChangeCharset, true); - - is(gBrowser.contentDocument.documentElement.textContent.indexOf('\u20AC'), 140, "Parent doc should be windows-1252 initially"); - - is(gBrowser.contentDocument.getElementsByTagName("iframe")[0].contentDocument.documentElement.textContent.indexOf('\u4E2D'), 77, "Child doc should be HZ-GB-2312 initially"); - - BrowserSetForcedCharacterSet("windows-1251"); -} - -function afterChangeCharset(event) { - if (event.target != gBrowser.contentDocument) { - return; - } - - gBrowser.selectedBrowser.removeEventListener("load", afterChangeCharset, true); - - is(gBrowser.contentDocument.documentElement.textContent.indexOf('\u0402'), 140, "Parent doc should decode as windows-1251 subsequently"); - is(gBrowser.contentDocument.getElementsByTagName("iframe")[0].contentDocument.documentElement.textContent.indexOf('\u4E2D'), 77, "Child doc should decode as HZ-GB-2312 subsequently"); - - is(gBrowser.contentDocument.characterSet, "windows-1251", "Parent doc should report windows-1251 subsequently"); - is(gBrowser.contentDocument.getElementsByTagName("iframe")[0].contentDocument.characterSet, "HZ-GB-2312", "Child doc should report HZ-GB-2312 subsequently"); - - gBrowser.removeCurrentTab(); - finish(); -} diff --git a/docshell/test/browser/file_bug941562-child.html b/docshell/test/browser/file_bug941562-child.html deleted file mode 100644 index eae29f85f2d8..000000000000 --- a/docshell/test/browser/file_bug941562-child.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - -meta declaration in parent and meta HZ in child - - -

China if decoded as HZ: ~{VP~}

- - - diff --git a/docshell/test/browser/file_bug941562.html b/docshell/test/browser/file_bug941562.html deleted file mode 100644 index 0966f52f8367..000000000000 --- a/docshell/test/browser/file_bug941562.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - -meta declaration in parent and meta HZ in child - - -

meta declaration in parent and meta HZ in child

- -

Euro sign if decoded as Windows-1252: €

-

a with diaeresis if decoded as Windows-1252: ä

- - - - - - diff --git a/dom/base/ScriptSettings.cpp b/dom/base/ScriptSettings.cpp index 62e64d21a56f..d49d010ea47c 100644 --- a/dom/base/ScriptSettings.cpp +++ b/dom/base/ScriptSettings.cpp @@ -234,9 +234,53 @@ FindJSContext(nsIGlobalObject* aGlobalObject) AutoJSAPI::AutoJSAPI() : mCx(nullptr) + , mOwnErrorReporting(false) + , mOldDontReportUncaught(false) { } +AutoJSAPI::~AutoJSAPI() +{ + if (mOwnErrorReporting) { + MOZ_ASSERT(NS_IsMainThread(), "See corresponding assertion in TakeOwnershipOfErrorReporting()"); + JS::ContextOptionsRef(cx()).setDontReportUncaught(mOldDontReportUncaught); + + if (HasException()) { + + // AutoJSAPI uses a JSAutoNullableCompartment, and may be in a null + // compartment when the destructor is called. However, the JS engine + // requires us to be in a compartment when we fetch the pending exception. + // In this case, we enter the privileged junk scope and don't dispatch any + // error events. + JS::Rooted errorGlobal(cx(), JS::CurrentGlobalOrNull(cx())); + if (!errorGlobal) + errorGlobal = xpc::PrivilegedJunkScope(); + JSAutoCompartment ac(cx(), errorGlobal); + nsCOMPtr win = xpc::WindowGlobalOrNull(errorGlobal); + const char *category = nsContentUtils::IsCallerChrome() ? "chrome javascript" + : "content javascript"; + JS::Rooted exn(cx()); + js::ErrorReport jsReport(cx()); + if (StealException(&exn) && jsReport.init(cx(), exn)) { + nsRefPtr xpcReport = new xpc::ErrorReport(); + xpcReport->Init(jsReport.report(), jsReport.message(), category, + win ? win->WindowID() : 0); + if (win) { + DispatchScriptErrorEvent(win, JS_GetRuntime(cx()), xpcReport, exn); + } else { + xpcReport->LogToConsole(); + } + } else { + NS_WARNING("OOMed while acquiring uncaught exception from JSAPI"); + } + } + } + + if (mOldErrorReporter.isSome()) { + JS_SetErrorReporter(JS_GetRuntime(cx()), mOldErrorReporter.value()); + } +} + void AutoJSAPI::InitInternal(JSObject* aGlobal, JSContext* aCx, bool aIsMainThread) { @@ -253,11 +297,19 @@ AutoJSAPI::InitInternal(JSObject* aGlobal, JSContext* aCx, bool aIsMainThread) } else { mAutoNullableCompartment.emplace(mCx, aGlobal); } + + if (aIsMainThread) { + JSRuntime* rt = JS_GetRuntime(aCx); + mOldErrorReporter.emplace(JS_GetErrorReporter(rt)); + JS_SetErrorReporter(rt, xpc::SystemErrorReporter); + } } AutoJSAPI::AutoJSAPI(nsIGlobalObject* aGlobalObject, bool aIsMainThread, JSContext* aCx) + : mOwnErrorReporting(false) + , mOldDontReportUncaught(false) { MOZ_ASSERT(aGlobalObject); MOZ_ASSERT(aGlobalObject->GetGlobalJSObject(), "Must have a JS global"); @@ -352,6 +404,49 @@ AutoJSAPI::InitWithLegacyErrorReporting(nsGlobalWindow* aWindow) return InitWithLegacyErrorReporting(static_cast(aWindow)); } +// Even with dontReportUncaught, the JS engine still sends warning reports +// to the JSErrorReporter as soon as they are generated. These go directly to +// the console, so we can handle them easily here. +// +// Eventually, SpiderMonkey will have a special-purpose callback for warnings only. +void +WarningOnlyErrorReporter(JSContext* aCx, const char* aMessage, JSErrorReport* aRep) +{ + MOZ_ASSERT(JSREPORT_IS_WARNING(aRep->flags)); + nsRefPtr xpcReport = new xpc::ErrorReport(); + const char* category = nsContentUtils::IsCallerChrome() ? "chrome javascript" + : "content javascript"; + nsPIDOMWindow* win = xpc::WindowGlobalOrNull(JS::CurrentGlobalOrNull(aCx)); + xpcReport->Init(aRep, aMessage, category, win ? win->WindowID() : 0); + xpcReport->LogToConsole(); +} + +void +AutoJSAPI::TakeOwnershipOfErrorReporting() +{ + MOZ_ASSERT(NS_IsMainThread(), "Can't own error reporting off-main-thread yet"); + MOZ_ASSERT(!mOwnErrorReporting); + mOwnErrorReporting = true; + + JSRuntime *rt = JS_GetRuntime(cx()); + mOldDontReportUncaught = JS::ContextOptionsRef(cx()).dontReportUncaught(); + JS::ContextOptionsRef(cx()).setDontReportUncaught(true); + JS_SetErrorReporter(rt, WarningOnlyErrorReporter); +} + +bool +AutoJSAPI::StealException(JS::MutableHandle aVal) +{ + MOZ_ASSERT(CxPusherIsStackTop()); + MOZ_ASSERT(HasException()); + MOZ_ASSERT(js::GetContextCompartment(cx())); + if (!JS_GetPendingException(cx(), aVal)) { + return false; + } + JS_ClearPendingException(cx()); + return true; +} + AutoEntryScript::AutoEntryScript(nsIGlobalObject* aGlobalObject, bool aIsMainThread, JSContext* aCx) diff --git a/dom/base/ScriptSettings.h b/dom/base/ScriptSettings.h index 7769eb5ecea3..f6559a447e00 100644 --- a/dom/base/ScriptSettings.h +++ b/dom/base/ScriptSettings.h @@ -203,6 +203,8 @@ public: // accessing the JSContext through cx(). AutoJSAPI(); + ~AutoJSAPI(); + // This uses the SafeJSContext (or worker equivalent), and enters a null // compartment, so that the consumer is forced to select a compartment to // enter before manipulating objects. @@ -253,6 +255,31 @@ public: bool CxPusherIsStackTop() const { return mCxPusher->IsStackTop(); } + // We're moving towards a world where the AutoJSAPI always handles + // exceptions that bubble up from the JS engine. In order to make this + // process incremental, we allow consumers to opt-in to the new behavior + // while keeping the old behavior as the default. + void TakeOwnershipOfErrorReporting(); + bool OwnsErrorReporting() { return mOwnErrorReporting; } + + bool HasException() const { + MOZ_ASSERT(CxPusherIsStackTop()); + return JS_IsExceptionPending(cx()); + }; + + // Transfers ownership of the current exception from the JS engine to the + // caller. Callers must ensure that HasException() is true, and that cx() + // is in a non-null compartment. + // + // Note that this fails if and only if we OOM while wrapping the exception + // into the current compartment. + bool StealException(JS::MutableHandle aVal); + + void ClearException() { + MOZ_ASSERT(CxPusherIsStackTop()); + JS_ClearPendingException(cx()); + } + protected: // Protected constructor, allowing subclasses to specify a particular cx to // be used. This constructor initialises the AutoJSAPI, so Init must NOT be @@ -266,7 +293,15 @@ private: mozilla::Maybe mAutoNullableCompartment; JSContext *mCx; + // Track state between the old and new error reporting modes. + bool mOwnErrorReporting; + bool mOldDontReportUncaught; + Maybe mOldErrorReporter; + void InitInternal(JSObject* aGlobal, JSContext* aCx, bool aIsMainThread); + + AutoJSAPI(const AutoJSAPI&) MOZ_DELETE; + AutoJSAPI& operator= (const AutoJSAPI&) MOZ_DELETE; }; /* diff --git a/dom/base/WindowNamedPropertiesHandler.cpp b/dom/base/WindowNamedPropertiesHandler.cpp index c3dbd4b463b4..22a929e7cfbb 100644 --- a/dom/base/WindowNamedPropertiesHandler.cpp +++ b/dom/base/WindowNamedPropertiesHandler.cpp @@ -5,6 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "WindowNamedPropertiesHandler.h" +#include "mozilla/dom/EventTargetBinding.h" #include "mozilla/dom/WindowBinding.h" #include "nsDOMClassInfo.h" #include "nsGlobalWindow.h" @@ -206,33 +207,74 @@ WindowNamedPropertiesHandler::delete_(JSContext* aCx, return true; } -// static -void -WindowNamedPropertiesHandler::Install(JSContext* aCx, - JS::Handle aProto) +static bool +ResolveWindowNamedProperty(JSContext* aCx, JS::Handle aWrapper, + JS::Handle aObj, JS::Handle aId, + JS::MutableHandle aDesc) { - JS::Rooted protoProto(aCx); - if (!::JS_GetPrototype(aCx, aProto, &protoProto)) { - return; + { + JSAutoCompartment ac(aCx, aObj); + if (!js::GetProxyHandler(aObj)->getOwnPropertyDescriptor(aCx, aObj, aId, + aDesc)) { + return false; + } } + if (aDesc.object()) { + aDesc.object().set(aWrapper); + + return JS_WrapPropertyDescriptor(aCx, aDesc); + } + + return true; +} + +static bool +EnumerateWindowNamedProperties(JSContext* aCx, JS::Handle aWrapper, + JS::Handle aObj, + JS::AutoIdVector& aProps) +{ + JSAutoCompartment ac(aCx, aObj); + return js::GetProxyHandler(aObj)->getOwnPropertyNames(aCx, aObj, aProps); +} + +const NativePropertyHooks sWindowNamedPropertiesNativePropertyHooks[] = { { + ResolveWindowNamedProperty, + EnumerateWindowNamedProperties, + { nullptr, nullptr }, + prototypes::id::_ID_Count, + constructors::id::_ID_Count, + nullptr +} }; + +static const DOMIfaceAndProtoJSClass WindowNamedPropertiesClass = { + PROXY_CLASS_DEF("WindowProperties", + DOM_INTERFACE_PROTO_SLOTS_BASE, /* extra slots */ + JSCLASS_IS_DOMIFACEANDPROTOJSCLASS), + eNamedPropertiesObject, + sWindowNamedPropertiesNativePropertyHooks, + "[object WindowProperties]", + prototypes::id::_ID_Count, + 0, + EventTargetBinding::GetProtoObject +}; + +// static +JSObject* +WindowNamedPropertiesHandler::Create(JSContext* aCx, + JS::Handle aProto) +{ // Note: since the scope polluter proxy lives on the window's prototype // chain, it needs a singleton type to avoid polluting type information // for properties on the window. JS::Rooted gsp(aCx); js::ProxyOptions options; options.setSingleton(true); - gsp = js::NewProxyObject(aCx, WindowNamedPropertiesHandler::getInstance(), - JS::NullHandleValue, protoProto, - js::GetGlobalForObjectCrossCompartment(aProto), - options); - if (!gsp) { - return; - } - - // And then set the prototype of the interface prototype object to be the - // global scope polluter. - ::JS_SplicePrototype(aCx, aProto, gsp); + options.setClass(&WindowNamedPropertiesClass.mBase); + return js::NewProxyObject(aCx, WindowNamedPropertiesHandler::getInstance(), + JS::NullHandleValue, aProto, + js::GetGlobalForObjectCrossCompartment(aProto), + options); } } // namespace dom diff --git a/dom/base/WindowNamedPropertiesHandler.h b/dom/base/WindowNamedPropertiesHandler.h index d12ec55461f2..2b7f71c6df5b 100644 --- a/dom/base/WindowNamedPropertiesHandler.h +++ b/dom/base/WindowNamedPropertiesHandler.h @@ -63,9 +63,10 @@ public: return &instance; } - // For Install, aProto is the proto of the Window we're associated with. - static void - Install(JSContext *aCx, JS::Handle aProto); + // For Create, aProto is the parent of the interface prototype object of the + // Window we're associated with. + static JSObject* + Create(JSContext *aCx, JS::Handle aProto); }; } // namespace dom diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index fac125801a43..c676e5f1f309 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -2590,15 +2590,6 @@ nsGlobalWindow::SetNewDocument(nsIDocument* aDocument, bool allow = GetDocShell()->GetCanExecuteScripts(); xpc::Scriptability::Get(GetWrapperPreserveColor()).SetDocShellAllowsScript(allow); - // If we created a new inner window above, we need to do the last little bit - // of initialization now that the dust has settled. - if (createdInnerWindow) { - JS::Rooted global(cx, newInnerGlobal); - JS::Rooted proto(cx); - JS_GetPrototype(cx, global, &proto); - WindowNamedPropertiesHandler::Install(cx, proto); - } - if (!aState) { JS::Rooted rootedWrapper(cx, GetWrapperPreserveColor()); if (!JS_DefineProperty(cx, newInnerGlobal, "window", rootedWrapper, @@ -13975,6 +13966,14 @@ nsGlobalWindow::ClearDocumentDependentSlots(JSContext* aCx) WindowBinding::ClearCachedPerformanceValue(aCx, this); } +/* static */ +JSObject* +nsGlobalWindow::CreateNamedPropertiesObject(JSContext *aCx, + JS::Handle aProto) +{ + return WindowNamedPropertiesHandler::Create(aCx, aProto); +} + #ifdef MOZ_B2G void nsGlobalWindow::EnableNetworkEvent(uint32_t aType) diff --git a/dom/base/nsGlobalWindow.h b/dom/base/nsGlobalWindow.h index 83810792fa46..df3a119def27 100644 --- a/dom/base/nsGlobalWindow.h +++ b/dom/base/nsGlobalWindow.h @@ -785,6 +785,9 @@ public: return nullptr; } + static JSObject* + CreateNamedPropertiesObject(JSContext *aCx, JS::Handle aProto); + nsIDOMWindow* GetWindow(mozilla::ErrorResult& aError); nsIDOMWindow* GetSelf(mozilla::ErrorResult& aError); nsIDocument* GetDocument() diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index 587cc8951a3a..20021f980fa8 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -351,28 +351,23 @@ NS_HandleScriptError(nsIScriptGlobalObject *aScriptGlobal, class ScriptErrorEvent : public nsRunnable { public: - ScriptErrorEvent(JSRuntime* aRuntime, + ScriptErrorEvent(nsPIDOMWindow* aWindow, + JSRuntime* aRuntime, xpc::ErrorReport* aReport, - nsIPrincipal* aScriptOriginPrincipal, - JS::Handle aError, - bool aDispatchEvent) - : mReport(aReport) - , mOriginPrincipal(aScriptOriginPrincipal) - , mDispatchEvent(aDispatchEvent) + JS::Handle aError) + : mWindow(aWindow) + , mReport(aReport) , mError(aRuntime, aError) {} NS_IMETHOD Run() { nsEventStatus status = nsEventStatus_eIgnore; - nsPIDOMWindow* win = mReport->mWindow; + nsPIDOMWindow* win = mWindow; MOZ_ASSERT(win); // First, notify the DOM that we have a script error, but only if // our window is still the current inner. - if (mDispatchEvent && win->IsCurrentInnerWindow() && - win->GetDocShell() && !JSREPORT_IS_WARNING(mReport->mFlags) && - !sHandlingScriptError) - { + if (win->IsCurrentInnerWindow() && win->GetDocShell() && !sHandlingScriptError) { AutoRestore recursionGuard(sHandlingScriptError); sHandlingScriptError = true; @@ -385,21 +380,8 @@ public: init.mFilename = mReport->mFileName; init.mBubbles = true; - nsCOMPtr sop(do_QueryInterface(win)); - NS_ENSURE_STATE(sop); - nsIPrincipal* p = sop->GetPrincipal(); - NS_ENSURE_STATE(p); - - bool sameOrigin = !mOriginPrincipal; - - if (p && !sameOrigin) { - if (NS_FAILED(p->Subsumes(mOriginPrincipal, &sameOrigin))) { - sameOrigin = false; - } - } - NS_NAMED_LITERAL_STRING(xoriginMsg, "Script error."); - if (sameOrigin) { + if (!mReport->mIsMuted) { init.mMessage = mReport->mErrorMsg; init.mLineno = mReport->mLineNumber; init.mColno = mReport->mColumn; @@ -427,9 +409,8 @@ public: } private: + nsCOMPtr mWindow; nsRefPtr mReport; - nsCOMPtr mOriginPrincipal; - bool mDispatchEvent; JS::PersistentRootedValue mError; static bool sHandlingScriptError; @@ -489,33 +470,33 @@ SystemErrorReporter(JSContext *cx, const char *message, JSErrorReport *report) if (globalObject) { nsRefPtr xpcReport = new xpc::ErrorReport(); - xpcReport->Init(report, message, globalObject); + bool isChrome = nsContentUtils::IsSystemPrincipal(globalObject->PrincipalOrNull()); + nsCOMPtr win = do_QueryInterface(globalObject); + xpcReport->Init(report, message, isChrome, win ? win->WindowID() : 0); - // If there's no window to fire an event at, report it to the console - // directly. - if (!xpcReport->mWindow) { + // If we can't dispatch an event to a window, report it to the console + // directly. This includes the case where the error was an OOM, because + // triggering a scripted event handler is likely to generate further OOMs. + if (!win || JSREPORT_IS_WARNING(xpcReport->mFlags) || + report->errorNumber == JSMSG_OUT_OF_MEMORY) + { xpcReport->LogToConsole(); return; } // Otherwise, we need to asynchronously invoke onerror before we can decide // whether or not to report the error to the console. - nsContentUtils::AddScriptRunner( - new ScriptErrorEvent(JS_GetRuntime(cx), - xpcReport, - nsJSPrincipals::get(report->originPrincipals), - exception, - /* We do not try to report Out Of Memory via a dom - * event because the dom event handler would - * encounter an OOM exception trying to process the - * event, and then we'd need to generate a new OOM - * event for that new OOM instance -- this isn't - * pretty. - */ - report->errorNumber != JSMSG_OUT_OF_MEMORY)); + DispatchScriptErrorEvent(win, JS_GetRuntime(cx), xpcReport, exception); } } +void +DispatchScriptErrorEvent(nsPIDOMWindow *win, JSRuntime *rt, xpc::ErrorReport *xpcReport, + JS::Handle exception) +{ + nsContentUtils::AddScriptRunner(new ScriptErrorEvent(win, rt, xpcReport, exception)); +} + } /* namespace xpc */ #ifdef DEBUG diff --git a/dom/base/nsJSUtils.cpp b/dom/base/nsJSUtils.cpp index 96c4e25cce48..50141fe04e50 100644 --- a/dom/base/nsJSUtils.cpp +++ b/dom/base/nsJSUtils.cpp @@ -28,6 +28,10 @@ #include "nsContentUtils.h" #include "nsGlobalWindow.h" +#include "mozilla/dom/ScriptSettings.h" + +using namespace mozilla::dom; + bool nsJSUtils::GetCallingLocation(JSContext* aContext, const char* *aFilename, uint32_t* aLineno) @@ -120,7 +124,7 @@ nsJSUtils::ReportPendingException(JSContext *aContext) } nsresult -nsJSUtils::CompileFunction(JSContext* aCx, +nsJSUtils::CompileFunction(AutoJSAPI& jsapi, JS::Handle aTarget, JS::CompileOptions& aOptions, const nsACString& aName, @@ -129,10 +133,12 @@ nsJSUtils::CompileFunction(JSContext* aCx, const nsAString& aBody, JSObject** aFunctionObject) { - MOZ_ASSERT(js::GetEnterCompartmentDepth(aCx) > 0); - MOZ_ASSERT_IF(aTarget, js::IsObjectInContextCompartment(aTarget, aCx)); + MOZ_ASSERT(jsapi.OwnsErrorReporting()); + JSContext* cx = jsapi.cx(); + MOZ_ASSERT(js::GetEnterCompartmentDepth(cx) > 0); + MOZ_ASSERT_IF(aTarget, js::IsObjectInContextCompartment(aTarget, cx)); MOZ_ASSERT_IF(aOptions.versionSet, aOptions.version != JSVERSION_UNKNOWN); - mozilla::DebugOnly ctx = GetScriptContextFromJSContext(aCx); + mozilla::DebugOnly ctx = GetScriptContextFromJSContext(cx); MOZ_ASSERT_IF(ctx, ctx->IsContextInitialized()); // Do the junk Gecko is supposed to do before calling into JSAPI. @@ -141,14 +147,13 @@ nsJSUtils::CompileFunction(JSContext* aCx, } // Compile. - JS::Rooted fun(aCx); - if (!JS::CompileFunction(aCx, aTarget, aOptions, + JS::Rooted fun(cx); + if (!JS::CompileFunction(cx, aTarget, aOptions, PromiseFlatCString(aName).get(), aArgCount, aArgArray, PromiseFlatString(aBody).get(), aBody.Length(), &fun)) { - ReportPendingException(aCx); return NS_ERROR_FAILURE; } diff --git a/dom/base/nsJSUtils.h b/dom/base/nsJSUtils.h index 18f7864fa842..61cf9e0ea55a 100644 --- a/dom/base/nsJSUtils.h +++ b/dom/base/nsJSUtils.h @@ -22,6 +22,12 @@ class nsIScriptContext; class nsIScriptGlobalObject; +namespace mozilla { +namespace dom { +class AutoJSAPI; +} +} + class nsJSUtils { public: @@ -49,7 +55,7 @@ public: */ static void ReportPendingException(JSContext *aContext); - static nsresult CompileFunction(JSContext* aCx, + static nsresult CompileFunction(mozilla::dom::AutoJSAPI& jsapi, JS::Handle aTarget, JS::CompileOptions& aOptions, const nsACString& aName, diff --git a/dom/base/nsWrapperCache.h b/dom/base/nsWrapperCache.h index d7019dfac3d0..f93e60684ea9 100644 --- a/dom/base/nsWrapperCache.h +++ b/dom/base/nsWrapperCache.h @@ -98,7 +98,7 @@ public: { MOZ_ASSERT(!PreservingWrapper(), "Clearing a preserved wrapper!"); MOZ_ASSERT(aWrapper, "Use ClearWrapper!"); - MOZ_ASSERT(js::HasObjectMovedOp(aWrapper), + MOZ_ASSERT(js::HasObjectMovedOpIfRequired(aWrapper), "Object has not provided the hook to update the wrapper if it is moved"); SetWrapperJSObject(aWrapper); diff --git a/dom/bindings/BindingUtils.cpp b/dom/bindings/BindingUtils.cpp index f57c6745c611..0bcff8387873 100644 --- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -36,6 +36,7 @@ #include "mozilla/dom/ScriptSettings.h" #include "mozilla/dom/DOMError.h" #include "mozilla/dom/DOMErrorBinding.h" +#include "mozilla/dom/ElementBinding.h" #include "mozilla/dom/HTMLObjectElement.h" #include "mozilla/dom/HTMLObjectElementBinding.h" #include "mozilla/dom/HTMLSharedObjectElement.h" @@ -343,53 +344,40 @@ DefineUnforgeableAttributes(JSContext* cx, JS::Handle obj, // passed a non-Function object we also need to provide our own toString method // for interface objects. -enum { - TOSTRING_CLASS_RESERVED_SLOT = 0, - TOSTRING_NAME_RESERVED_SLOT = 1 -}; - static bool InterfaceObjectToString(JSContext* cx, unsigned argc, JS::Value *vp) { JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - JS::Rooted callee(cx, &args.callee()); - if (!args.thisv().isObject()) { JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_CANT_CONVERT_TO, "null", "object"); return false; } - JS::Value v = js::GetFunctionNativeReserved(callee, - TOSTRING_CLASS_RESERVED_SLOT); - const JSClass* clasp = static_cast(v.toPrivate()); - - v = js::GetFunctionNativeReserved(callee, TOSTRING_NAME_RESERVED_SLOT); - JSString* jsname = v.toString(); - - nsAutoJSString name; - if (!name.init(cx, jsname)) { + JS::Rooted thisObj(cx, &args.thisv().toObject()); + JS::Rooted obj(cx, js::CheckedUnwrap(thisObj, /* stopAtOuter = */ false)); + if (!obj) { + JS_ReportError(cx, "Permission denied to access object"); return false; } - if (js::GetObjectJSClass(&args.thisv().toObject()) != clasp) { - JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, - JSMSG_INCOMPATIBLE_PROTO, - NS_ConvertUTF16toUTF8(name).get(), "toString", - "object"); + const js::Class* clasp = js::GetObjectClass(obj); + if (!IsDOMIfaceAndProtoClass(clasp)) { + JS_ReportError(cx, "toString called on incompatible object"); return false; } - nsString str; - str.AppendLiteral("function "); - str.Append(name); - str.AppendLiteral("() {"); - str.Append('\n'); - str.AppendLiteral(" [native code]"); - str.Append('\n'); - str.Append('}'); + const DOMIfaceAndProtoJSClass* ifaceAndProtoJSClass = + DOMIfaceAndProtoJSClass::FromJSClass(clasp); + JS::Rooted str(cx, + JS_NewStringCopyZ(cx, + ifaceAndProtoJSClass->mToString)); + if (!str) { + return false; + } - return xpc::NonVoidStringToJsval(cx, str, args.rval()); + args.rval().setString(str); + return true; } bool @@ -439,7 +427,7 @@ DefineConstructor(JSContext* cx, JS::Handle global, const char* name, static JSObject* CreateInterfaceObject(JSContext* cx, JS::Handle global, JS::Handle constructorProto, - const JSClass* constructorClass, + const js::Class* constructorClass, const JSNativeHolder* constructorNative, unsigned ctorNargs, const NamedConstructor* namedConstructors, JS::Handle proto, @@ -450,7 +438,8 @@ CreateInterfaceObject(JSContext* cx, JS::Handle global, JS::Rooted constructor(cx); if (constructorClass) { MOZ_ASSERT(constructorProto); - constructor = JS_NewObject(cx, constructorClass, constructorProto, global); + constructor = JS_NewObject(cx, Jsvalify(constructorClass), constructorProto, + global); } else { MOZ_ASSERT(constructorNative); MOZ_ASSERT(constructorProto == JS_GetFunctionPrototype(cx, global)); @@ -465,25 +454,12 @@ CreateInterfaceObject(JSContext* cx, JS::Handle global, // Have to shadow Function.prototype.toString, since that throws // on things that are not js::FunctionClass. JS::Rooted toString(cx, - js::DefineFunctionWithReserved(cx, constructor, - "toString", - InterfaceObjectToString, - 0, 0)); + JS_DefineFunction(cx, constructor, "toString", InterfaceObjectToString, + 0, 0)); if (!toString) { return nullptr; } - JSString *str = ::JS_InternString(cx, name); - if (!str) { - return nullptr; - } - JSObject* toStringObj = JS_GetFunctionObject(toString); - js::SetFunctionNativeReserved(toStringObj, TOSTRING_CLASS_RESERVED_SLOT, - PRIVATE_TO_JSVAL(const_cast(constructorClass))); - - js::SetFunctionNativeReserved(toStringObj, TOSTRING_NAME_RESERVED_SLOT, - STRING_TO_JSVAL(str)); - if (!JS_DefineProperty(cx, constructor, "length", ctorNargs, JSPROP_READONLY | JSPROP_PERMANENT)) { return nullptr; @@ -592,12 +568,12 @@ DefineWebIDLBindingPropertiesOnXPCObject(JSContext* cx, static JSObject* CreateInterfacePrototypeObject(JSContext* cx, JS::Handle global, JS::Handle parentProto, - const JSClass* protoClass, + const js::Class* protoClass, const NativeProperties* properties, const NativeProperties* chromeOnlyProperties) { JS::Rooted ourProto(cx, - JS_NewObjectWithUniqueType(cx, protoClass, parentProto, global)); + JS_NewObjectWithUniqueType(cx, Jsvalify(protoClass), parentProto, global)); if (!ourProto || !DefineProperties(cx, ourProto, properties, chromeOnlyProperties)) { return nullptr; @@ -651,9 +627,9 @@ DefineProperties(JSContext* cx, JS::Handle obj, void CreateInterfaceObjects(JSContext* cx, JS::Handle global, JS::Handle protoProto, - const JSClass* protoClass, JS::Heap* protoCache, + const js::Class* protoClass, JS::Heap* protoCache, JS::Handle constructorProto, - const JSClass* constructorClass, const JSNativeHolder* constructor, + const js::Class* constructorClass, const JSNativeHolder* constructor, unsigned ctorNargs, const NamedConstructor* namedConstructors, JS::Heap* constructorCache, const NativeProperties* properties, @@ -939,9 +915,12 @@ inline const NativePropertyHooks* GetNativePropertyHooks(JSContext *cx, JS::Handle obj, DOMObjectType& type) { - const DOMJSClass* domClass = GetDOMClass(obj); + const js::Class* clasp = js::GetObjectClass(obj); + + const DOMJSClass* domClass = GetDOMClass(clasp); if (domClass) { - type = eInstance; + bool isGlobal = (clasp->flags & JSCLASS_DOM_GLOBAL) != 0; + type = isGlobal ? eGlobalInstance : eInstance; return domClass->mNativeHooks; } @@ -963,65 +942,6 @@ GetNativePropertyHooks(JSContext *cx, JS::Handle obj, return ifaceAndProtoJSClass->mNativeHooks; } -// Try to resolve a property as an unforgeable property from the given -// NativeProperties, if it's there. nativeProperties is allowed to be null (in -// which case we of course won't resolve anything). -static bool -XrayResolveUnforgeableProperty(JSContext* cx, JS::Handle wrapper, - JS::Handle obj, JS::Handle id, - JS::MutableHandle desc, - bool& cacheOnHolder, - const NativeProperties* nativeProperties); - -static bool -XrayResolveNativeProperty(JSContext* cx, JS::Handle wrapper, - const NativePropertyHooks* nativePropertyHooks, - DOMObjectType type, JS::Handle obj, - JS::Handle id, - JS::MutableHandle desc, - bool& cacheOnHolder); - -bool -XrayResolveOwnProperty(JSContext* cx, JS::Handle wrapper, - JS::Handle obj, JS::Handle id, - JS::MutableHandle desc, - bool& cacheOnHolder) -{ - cacheOnHolder = false; - - DOMObjectType type; - const NativePropertyHooks *nativePropertyHooks = - GetNativePropertyHooks(cx, obj, type); - - if (type != eInstance) { - // For prototype objects and interface objects, just return their - // normal set of properties. - return XrayResolveNativeProperty(cx, wrapper, nativePropertyHooks, type, - obj, id, desc, cacheOnHolder); - } - - // Check for unforgeable properties before doing mResolveOwnProperty weirdness - const NativePropertiesHolder& nativeProperties = - nativePropertyHooks->mNativeProperties; - if (!XrayResolveUnforgeableProperty(cx, wrapper, obj, id, desc, cacheOnHolder, - nativeProperties.regular)) { - return false; - } - if (desc.object()) { - return true; - } - if (!XrayResolveUnforgeableProperty(cx, wrapper, obj, id, desc, cacheOnHolder, - nativeProperties.chromeOnly)) { - return false; - } - if (desc.object()) { - return true; - } - - return !nativePropertyHooks->mResolveOwnProperty || - nativePropertyHooks->mResolveOwnProperty(cx, wrapper, obj, id, desc); -} - static bool XrayResolveAttribute(JSContext* cx, JS::Handle wrapper, JS::Handle obj, JS::Handle id, @@ -1124,7 +1044,10 @@ XrayResolveMethod(JSContext* cx, JS::Handle wrapper, return true; } -/* static */ bool +// Try to resolve a property as an unforgeable property from the given +// NativeProperties, if it's there. nativeProperties is allowed to be null (in +// which case we of course won't resolve anything). +static bool XrayResolveUnforgeableProperty(JSContext* cx, JS::Handle wrapper, JS::Handle obj, JS::Handle id, JS::MutableHandle desc, @@ -1275,31 +1198,171 @@ ResolvePrototypeOrConstructor(JSContext* cx, JS::Handle wrapper, return JS_WrapPropertyDescriptor(cx, desc); } -/* static */ bool -XrayResolveNativeProperty(JSContext* cx, JS::Handle wrapper, - const NativePropertyHooks* nativePropertyHooks, - DOMObjectType type, JS::Handle obj, - JS::Handle id, - JS::MutableHandle desc, - bool& cacheOnHolder) +#ifdef DEBUG + +static void +DEBUG_CheckXBLCallable(JSContext *cx, JSObject *obj) { - if (type == eInterface && IdEquals(id, "prototype")) { - return nativePropertyHooks->mPrototypeID == prototypes::id::_ID_Count || - ResolvePrototypeOrConstructor(cx, wrapper, obj, - nativePropertyHooks->mPrototypeID, - JSPROP_PERMANENT | JSPROP_READONLY, - desc, cacheOnHolder); - } + // In general, we shouldn't have cross-compartment wrappers here, because + // we should be running in an XBL scope, and the content prototype should + // contain wrappers to functions defined in the XBL scope. But if the node + // has been adopted into another compartment, those prototypes will now point + // to a different XBL scope (which is ok). + MOZ_ASSERT_IF(js::IsCrossCompartmentWrapper(obj), + xpc::IsContentXBLScope(js::GetObjectCompartment(js::UncheckedUnwrap(obj)))); + MOZ_ASSERT(JS::IsCallable(obj)); +} - if (type == eInterfacePrototype && IdEquals(id, "constructor")) { - return nativePropertyHooks->mConstructorID == constructors::id::_ID_Count || - ResolvePrototypeOrConstructor(cx, wrapper, obj, - nativePropertyHooks->mConstructorID, - 0, desc, cacheOnHolder); - } +static void +DEBUG_CheckXBLLookup(JSContext *cx, JSPropertyDescriptor *desc) +{ + if (!desc->obj) + return; + if (!desc->value.isUndefined()) { + MOZ_ASSERT(desc->value.isObject()); + DEBUG_CheckXBLCallable(cx, &desc->value.toObject()); + } + if (desc->getter) { + MOZ_ASSERT(desc->attrs & JSPROP_GETTER); + DEBUG_CheckXBLCallable(cx, JS_FUNC_TO_DATA_PTR(JSObject *, desc->getter)); + } + if (desc->setter) { + MOZ_ASSERT(desc->attrs & JSPROP_SETTER); + DEBUG_CheckXBLCallable(cx, JS_FUNC_TO_DATA_PTR(JSObject *, desc->setter)); + } +} +#else +#define DEBUG_CheckXBLLookup(a, b) {} +#endif +/* static */ bool +XrayResolveOwnProperty(JSContext* cx, JS::Handle wrapper, + JS::Handle obj, JS::Handle id, + JS::MutableHandle desc, + bool& cacheOnHolder) +{ + cacheOnHolder = false; + + DOMObjectType type; + const NativePropertyHooks *nativePropertyHooks = + GetNativePropertyHooks(cx, obj, type); const NativePropertiesHolder& nativeProperties = nativePropertyHooks->mNativeProperties; + ResolveOwnProperty resolveOwnProperty = + nativePropertyHooks->mResolveOwnProperty; + + if (type == eNamedPropertiesObject) { + // None of these should be cached on the holder, since they're dynamic. + return resolveOwnProperty(cx, wrapper, obj, id, desc); + } + + // Check for unforgeable properties first. + if (IsInstance(type)) { + const NativePropertiesHolder& nativeProperties = + nativePropertyHooks->mNativeProperties; + if (!XrayResolveUnforgeableProperty(cx, wrapper, obj, id, desc, cacheOnHolder, + nativeProperties.regular)) { + return false; + } + + if (!desc.object() && xpc::AccessCheck::isChrome(wrapper) && + !XrayResolveUnforgeableProperty(cx, wrapper, obj, id, desc, cacheOnHolder, + nativeProperties.chromeOnly)) { + return false; + } + + if (desc.object()) { + return true; + } + } + + if (IsInstance(type)) { + if (resolveOwnProperty) { + if (!resolveOwnProperty(cx, wrapper, obj, id, desc)) { + return false; + } + + if (desc.object()) { + // None of these should be cached on the holder, since they're dynamic. + return true; + } + } + + // If we're a special scope for in-content XBL, our script expects to see + // the bound XBL methods and attributes when accessing content. However, + // these members are implemented in content via custom-spliced prototypes, + // and thus aren't visible through Xray wrappers unless we handle them + // explicitly. So we check if we're running in such a scope, and if so, + // whether the wrappee is a bound element. If it is, we do a lookup via + // specialized XBL machinery. + // + // While we have to do some sketchy walking through content land, we should + // be protected by read-only/non-configurable properties, and any functions + // we end up with should _always_ be living in our own scope (the XBL scope). + // Make sure to assert that. + Element* element; + if (xpc::ObjectScope(wrapper)->IsContentXBLScope() && + NS_SUCCEEDED(UNWRAP_OBJECT(Element, obj, element))) { + if (!nsContentUtils::LookupBindingMember(cx, element, id, desc)) { + return false; + } + + DEBUG_CheckXBLLookup(cx, desc.address()); + + if (desc.object()) { + // XBL properties shouldn't be cached on the holder, as they might be + // shadowed by own properties returned from mResolveOwnProperty. + desc.object().set(wrapper); + + return true; + } + } + + // For non-global instance Xrays there are no other properties, so return + // here for them. + if (type != eGlobalInstance || !GlobalPropertiesAreOwn()) { + return true; + } + } else if (type == eInterface) { + if (IdEquals(id, "prototype")) { + return nativePropertyHooks->mPrototypeID == prototypes::id::_ID_Count || + ResolvePrototypeOrConstructor(cx, wrapper, obj, + nativePropertyHooks->mPrototypeID, + JSPROP_PERMANENT | JSPROP_READONLY, + desc, cacheOnHolder); + } + + if (IdEquals(id, "toString") && !JS_ObjectIsFunction(cx, obj)) { + MOZ_ASSERT(IsDOMIfaceAndProtoClass(js::GetObjectClass(obj))); + + JS::Rooted toString(cx, JS_NewFunction(cx, InterfaceObjectToString, 0, 0, wrapper, "toString")); + if (!toString) { + return false; + } + + cacheOnHolder = true; + + FillPropertyDescriptor(desc, wrapper, 0, + JS::ObjectValue(*JS_GetFunctionObject(toString))); + + return JS_WrapPropertyDescriptor(cx, desc); + } + } else { + MOZ_ASSERT(IsInterfacePrototype(type)); + + if (IdEquals(id, "constructor")) { + return nativePropertyHooks->mConstructorID == constructors::id::_ID_Count || + ResolvePrototypeOrConstructor(cx, wrapper, obj, + nativePropertyHooks->mConstructorID, + 0, desc, cacheOnHolder); + } + + // The properties for globals live on the instance, so return here as there + // are no properties on their interface prototype object. + if (type == eGlobalInterfacePrototype && GlobalPropertiesAreOwn()) { + return true; + } + } if (nativeProperties.regular && !XrayResolveProperty(cx, wrapper, obj, id, desc, cacheOnHolder, type, @@ -1318,43 +1381,6 @@ XrayResolveNativeProperty(JSContext* cx, JS::Handle wrapper, return true; } -bool -XrayResolveNativeProperty(JSContext* cx, JS::Handle wrapper, - JS::Handle obj, - JS::Handle id, JS::MutableHandle desc, - bool& cacheOnHolder) -{ - cacheOnHolder = false; - - DOMObjectType type; - const NativePropertyHooks* nativePropertyHooks = - GetNativePropertyHooks(cx, obj, type); - - if (type == eInstance) { - // Force the type to be eInterfacePrototype, since we need to walk the - // prototype chain. - type = eInterfacePrototype; - } - - if (type == eInterfacePrototype) { - do { - if (!XrayResolveNativeProperty(cx, wrapper, nativePropertyHooks, type, - obj, id, desc, cacheOnHolder)) { - return false; - } - - if (desc.object()) { - return true; - } - } while ((nativePropertyHooks = nativePropertyHooks->mProtoHooks)); - - return true; - } - - return XrayResolveNativeProperty(cx, wrapper, nativePropertyHooks, type, obj, - id, desc, cacheOnHolder); -} - bool XrayDefineProperty(JSContext* cx, JS::Handle wrapper, JS::Handle obj, JS::Handle id, @@ -1411,14 +1437,20 @@ XrayEnumerateProperties(JSContext* cx, JS::Handle wrapper, DOMObjectType type, const NativeProperties* nativeProperties) { - if (type == eInstance) { + MOZ_ASSERT(type != eNamedPropertiesObject); + + if (IsInstance(type)) { ENUMERATE_IF_DEFINED(unforgeableMethod); ENUMERATE_IF_DEFINED(unforgeableAttribute); + if (type == eGlobalInstance && GlobalPropertiesAreOwn()) { + ENUMERATE_IF_DEFINED(method); + ENUMERATE_IF_DEFINED(attribute); + } } else if (type == eInterface) { ENUMERATE_IF_DEFINED(staticMethod); ENUMERATE_IF_DEFINED(staticAttribute); - } else { - MOZ_ASSERT(type == eInterfacePrototype); + } else if (type != eGlobalInterfacePrototype || !GlobalPropertiesAreOwn()) { + MOZ_ASSERT(IsInterfacePrototype(type)); ENUMERATE_IF_DEFINED(method); ENUMERATE_IF_DEFINED(attribute); } @@ -1447,16 +1479,19 @@ XrayEnumerateProperties(JSContext* cx, JS::Handle wrapper, bool XrayEnumerateNativeProperties(JSContext* cx, JS::Handle wrapper, const NativePropertyHooks* nativePropertyHooks, - DOMObjectType type, JS::Handle obj, - unsigned flags, JS::AutoIdVector& props) + DOMObjectType type, + JS::Handle obj, unsigned flags, + JS::AutoIdVector& props) { + MOZ_ASSERT(type != eNamedPropertiesObject); + if (type == eInterface && nativePropertyHooks->mPrototypeID != prototypes::id::_ID_Count && !AddStringToIDVector(cx, props, "prototype")) { return false; } - if (type == eInterfacePrototype && + if (IsInterfacePrototype(type) && nativePropertyHooks->mConstructorID != constructors::id::_ID_Count && (flags & JSITER_HIDDEN) && !AddStringToIDVector(cx, props, "constructor")) { @@ -1490,45 +1525,24 @@ XrayEnumerateProperties(JSContext* cx, JS::Handle wrapper, DOMObjectType type; const NativePropertyHooks* nativePropertyHooks = GetNativePropertyHooks(cx, obj, type); + EnumerateOwnProperties enumerateOwnProperties = + nativePropertyHooks->mEnumerateOwnProperties; - if (type == eInstance) { - if (nativePropertyHooks->mEnumerateOwnProperties && - !nativePropertyHooks->mEnumerateOwnProperties(cx, wrapper, obj, - props)) { - return false; - } - - // Handle Unforgeable properties. - if (!XrayEnumerateNativeProperties(cx, wrapper, nativePropertyHooks, type, - obj, flags, props)) { - return false; - } - - if (flags & JSITER_OWNONLY) { - return true; - } - - // Force the type to be eInterfacePrototype, since we need to walk the - // prototype chain. - type = eInterfacePrototype; + if (type == eNamedPropertiesObject) { + return enumerateOwnProperties(cx, wrapper, obj, props); } - if (type == eInterfacePrototype) { - do { - if (!XrayEnumerateNativeProperties(cx, wrapper, nativePropertyHooks, type, - obj, flags, props)) { - return false; - } - - if (flags & JSITER_OWNONLY) { - return true; - } - } while ((nativePropertyHooks = nativePropertyHooks->mProtoHooks)); - - return true; + if (IsInstance(type)) { + // FIXME https://bugzilla.mozilla.org/show_bug.cgi?id=1071189 + // Should do something about XBL properties too. + if (enumerateOwnProperties && + !enumerateOwnProperties(cx, wrapper, obj, props)) { + return false; + } } - return XrayEnumerateNativeProperties(cx, wrapper, nativePropertyHooks, type, + return (type == eGlobalInterfacePrototype && GlobalPropertiesAreOwn()) || + XrayEnumerateNativeProperties(cx, wrapper, nativePropertyHooks, type, obj, flags, props); } @@ -1652,85 +1666,6 @@ DictionaryBase::AppendJSONToString(const char16_t* aJSONData, return true; } -static JSString* -ConcatJSString(JSContext* cx, const char* pre, JS::Handle str, const char* post) -{ - if (!str) { - return nullptr; - } - - JS::Rooted preString(cx, JS_NewStringCopyN(cx, pre, strlen(pre))); - JS::Rooted postString(cx, JS_NewStringCopyN(cx, post, strlen(post))); - if (!preString || !postString) { - return nullptr; - } - - preString = JS_ConcatStrings(cx, preString, str); - if (!preString) { - return nullptr; - } - - return JS_ConcatStrings(cx, preString, postString); -} - -bool -NativeToString(JSContext* cx, JS::Handle wrapper, - JS::Handle obj, - JS::MutableHandle v) -{ - JS::Rooted toStringDesc(cx); - toStringDesc.object().set(nullptr); - toStringDesc.setAttributes(0); - toStringDesc.setGetter(nullptr); - toStringDesc.setSetter(nullptr); - toStringDesc.value().set(JS::UndefinedValue()); - JS::Rooted id(cx, - nsXPConnect::GetRuntimeInstance()->GetStringID(XPCJSRuntime::IDX_TO_STRING)); - bool unused; - if (!XrayResolveNativeProperty(cx, wrapper, obj, id, &toStringDesc, unused)) { - return false; - } - - JS::Rooted str(cx); - { - JSAutoCompartment ac(cx, obj); - if (toStringDesc.object()) { - JS::Rooted toString(cx, toStringDesc.value()); - if (!JS_WrapValue(cx, &toString)) { - return false; - } - MOZ_ASSERT(JS::IsCallable(&toString.toObject())); - JS::Rooted toStringResult(cx); - if (JS_CallFunctionValue(cx, obj, toString, JS::HandleValueArray::empty(), - &toStringResult)) { - str = toStringResult.toString(); - } else { - str = nullptr; - } - } else { - const js::Class* clasp = js::GetObjectClass(obj); - if (IsDOMClass(clasp)) { - str = JS_NewStringCopyZ(cx, clasp->name); - str = ConcatJSString(cx, "[object ", str, "]"); - } else if (IsDOMIfaceAndProtoClass(clasp)) { - const DOMIfaceAndProtoJSClass* ifaceAndProtoJSClass = - DOMIfaceAndProtoJSClass::FromJSClass(clasp); - str = JS_NewStringCopyZ(cx, ifaceAndProtoJSClass->mToString); - } else { - MOZ_ASSERT(JS_IsNativeFunction(obj, Constructor)); - JS::Rooted fun(cx, JS_GetObjectFunction(obj)); - str = JS_DecompileFunction(cx, fun, 0); - } - } - } - - if (!str) { - return false; - } - - v.setString(str); - return JS_WrapValue(cx, v); -} // Dynamically ensure that two objects don't end up with the same reserved slot. class MOZ_STACK_CLASS AutoCloneDOMObjectSlotGuard diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index b4c1be749fd2..c83c7c7b2df9 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -180,14 +180,16 @@ UnwrapDOMObject(JSObject* obj) return static_cast(val.toPrivate()); } +inline const DOMJSClass* +GetDOMClass(const js::Class* clasp) +{ + return IsDOMClass(clasp) ? DOMJSClass::FromJSClass(clasp) : nullptr; +} + inline const DOMJSClass* GetDOMClass(JSObject* obj) { - const js::Class* clasp = js::GetObjectClass(obj); - if (IsDOMClass(clasp)) { - return DOMJSClass::FromJSClass(clasp); - } - return nullptr; + return GetDOMClass(js::GetObjectClass(obj)); } inline nsISupports* @@ -289,13 +291,17 @@ IsConvertibleToCallbackInterface(JSContext* cx, JS::Handle obj) return IsNotDateOrRegExp(cx, obj); } -// The items in the protoAndIfaceCache are indexed by the prototypes::id::ID and -// constructors::id::ID enums, in that order. The end of the prototype objects -// should be the start of the interface objects. +// The items in the protoAndIfaceCache are indexed by the prototypes::id::ID, +// constructors::id::ID and namedpropertiesobjects::id::ID enums, in that order. +// The end of the prototype objects should be the start of the interface +// objects, and the end of the interface objects should be the start of the +// named properties objects. static_assert((size_t)constructors::id::_ID_Start == - (size_t)prototypes::id::_ID_Count, + (size_t)prototypes::id::_ID_Count && + (size_t)namedpropertiesobjects::id::_ID_Start == + (size_t)constructors::id::_ID_Count, "Overlapping or discontiguous indexes."); -const size_t kProtoAndIfaceCacheCount = constructors::id::_ID_Count; +const size_t kProtoAndIfaceCacheCount = namedpropertiesobjects::id::_ID_Count; class ProtoAndIfaceCache { @@ -597,9 +603,9 @@ struct NamedConstructor void CreateInterfaceObjects(JSContext* cx, JS::Handle global, JS::Handle protoProto, - const JSClass* protoClass, JS::Heap* protoCache, + const js::Class* protoClass, JS::Heap* protoCache, JS::Handle interfaceProto, - const JSClass* constructorClass, const JSNativeHolder* constructor, + const js::Class* constructorClass, const JSNativeHolder* constructor, unsigned ctorNargs, const NamedConstructor* namedConstructors, JS::Heap* constructorCache, const NativeProperties* regularProperties, @@ -2311,7 +2317,7 @@ AddStringToIDVector(JSContext* cx, JS::AutoIdVector& vector, const char* name) // Implementation of the bits that XrayWrapper needs /** - * This resolves indexed or named properties of obj. + * This resolves operations, attributes and constants of the interfaces for obj. * * wrapper is the Xray JS object. * obj is the target object of the Xray, a binding's instance object or a @@ -2324,19 +2330,6 @@ XrayResolveOwnProperty(JSContext* cx, JS::Handle wrapper, JS::MutableHandle desc, bool& cacheOnHolder); -/** - * This resolves operations, attributes and constants of the interfaces for obj. - * - * wrapper is the Xray JS object. - * obj is the target object of the Xray, a binding's instance object or a - * interface or interface prototype object. - */ -bool -XrayResolveNativeProperty(JSContext* cx, JS::Handle wrapper, - JS::Handle obj, - JS::Handle id, JS::MutableHandle desc, - bool& cacheOnHolder); - /** * Define a property on obj through an Xray wrapper. * @@ -2364,6 +2357,43 @@ XrayEnumerateProperties(JSContext* cx, JS::Handle wrapper, JS::Handle obj, unsigned flags, JS::AutoIdVector& props); +/** + * Returns the prototype to use for an Xray for a DOM object, wrapped in cx's + * compartment. This always returns the prototype that would be used for a DOM + * object if we ignore any changes that might have been done to the prototype + * chain by JS, the XBL code or plugins. + * + * cx should be in the Xray's compartment. + * obj is the target object of the Xray, a binding's instance object or an + * interface or interface prototype object. + */ +inline bool +XrayGetNativeProto(JSContext* cx, JS::Handle obj, + JS::MutableHandle protop) +{ + JS::Rooted global(cx, js::GetGlobalForObjectCrossCompartment(obj)); + { + JSAutoCompartment ac(cx, global); + const DOMJSClass* domClass = GetDOMClass(obj); + if (domClass) { + ProtoHandleGetter protoGetter = domClass->mGetProto; + if (protoGetter) { + protop.set(protoGetter(cx, global)); + } else { + protop.set(JS_GetObjectPrototype(cx, global)); + } + } else { + const js::Class* clasp = js::GetObjectClass(obj); + MOZ_ASSERT(IsDOMIfaceAndProtoClass(clasp)); + ProtoGetter protoGetter = + DOMIfaceAndProtoJSClass::FromJSClass(clasp)->mGetParentProto; + protop.set(protoGetter(cx, global)); + } + } + + return JS_WrapObject(cx, protop); +} + extern NativePropertyHooks sWorkerNativePropertyHooks; // We use one constructor JSNative to represent all DOM interface objects (so @@ -2421,23 +2451,6 @@ MustInheritFromNonRefcountedDOMObject(NonRefcountedDOMObject*) { } -/** - * This creates a JSString containing the value that the toString function for - * obj should create according to the WebIDL specification, ignoring any - * modifications by script. The value is prefixed with pre and postfixed with - * post, unless this is called for an object that has a stringifier. It is - * specifically for use by Xray code. - * - * wrapper is the Xray JS object. - * obj is the target object of the Xray, a binding's instance object or a - * interface or interface prototype object. - * v contains the JSString for the value if the function returns true. - */ -bool -NativeToString(JSContext* cx, JS::Handle wrapper, - JS::Handle obj, - JS::MutableHandle v); - HAS_MEMBER(JSBindingFinalized) template::Value> @@ -2833,7 +2846,7 @@ struct CreateGlobalOptions nsresult RegisterDOMNames(); -template +template bool CreateGlobal(JSContext* aCx, T* aNative, nsWrapperCache* aCache, const JSClass* aClass, JS::CompartmentOptions& aOptions, @@ -3013,6 +3026,13 @@ template class SmartPtr, class S> inline void StrongOrRawPtr(SmartPtr&& aPtr) MOZ_DELETE; +inline +JSObject* +GetErrorPrototype(JSContext* aCx, JS::Handle aForObj) +{ + return JS_GetErrorPrototype(aCx); +} + } // namespace dom } // namespace mozilla diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index af1ef14dfb03..ca31a131a287 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -298,9 +298,9 @@ class CGNativePropertyHooks(CGThing): prototypeID += self.descriptor.name else: prototypeID += "_ID_Count" - parent = self.descriptor.interface.parent - parentHooks = (toBindingNamespace(parent.identifier.name) + "::sNativePropertyHooks" - if parent else 'nullptr') + parentProtoName = self.descriptor.parentPrototypeName + parentHooks = (toBindingNamespace(parentProtoName) + "::sNativePropertyHooks" + if parentProtoName else 'nullptr') return fill( """ @@ -327,10 +327,7 @@ def NativePropertyHooks(descriptor): def DOMClass(descriptor): - def make_name(d): - return "%s%s" % (d.interface.identifier.name, '_workers' if d.workers else '') - - protoList = ['prototypes::id::' + make_name(descriptor.getDescriptor(proto)) for proto in descriptor.prototypeChain] + protoList = ['prototypes::id::' + proto for proto in descriptor.prototypeNameChain] # Pad out the list to the right length with _ID_Count so we # guarantee that all the lists are the same length. _ID_Count # is never the ID of any prototype, so it's safe to use as @@ -343,7 +340,7 @@ def DOMClass(descriptor): IsBaseOf::value, ${hooks}, GetParentObject<${nativeType}>::Get, - GetProtoObject, + GetProtoObjectHandle, GetCCParticipant<${nativeType}>::Get() """, protoChain=', '.join(protoList), @@ -605,6 +602,36 @@ def CallOnUnforgeableHolder(descriptor, code, isXrayCheck=None, code=code) +def InterfacePrototypeObjectProtoGetter(descriptor): + """ + Returns a tuple with two elements: + + 1) The name of the function to call to get the prototype to use for the + interface prototype object as a JSObject*. + + 2) The name of the function to call to get the prototype to use for the + interface prototype object as a JS::Handle or None if no + such function exists. + """ + parentProtoName = descriptor.parentPrototypeName + if descriptor.hasNamedPropertiesObject: + protoGetter = "GetNamedPropertiesObject" + protoHandleGetter = None + elif parentProtoName is None: + if descriptor.interface.getExtendedAttribute("ArrayClass"): + protoGetter = "JS_GetArrayPrototype" + elif descriptor.interface.getExtendedAttribute("ExceptionClass"): + protoGetter = "GetErrorPrototype" + else: + protoGetter = "JS_GetObjectPrototype" + protoHandleGetter = None + else: + prefix = toBindingNamespace(parentProtoName) + protoGetter = prefix + "::GetProtoObject" + protoHandleGetter = prefix + "::GetProtoObjectHandle" + + return (protoGetter, protoHandleGetter) + class CGPrototypeJSClass(CGThing): def __init__(self, descriptor, properties): CGThing.__init__(self) @@ -620,6 +647,8 @@ class CGPrototypeJSClass(CGThing): slotCount = "DOM_INTERFACE_PROTO_SLOTS_BASE" if UseHolderForUnforgeable(self.descriptor): slotCount += " + 1 /* slot for the JSObject holding the unforgeable properties */" + (protoGetter, _) = InterfacePrototypeObjectProtoGetter(self.descriptor) + type = "eGlobalInterfacePrototype" if self.descriptor.isGlobal() else "eInterfacePrototype" return fill( """ static const DOMIfaceAndProtoJSClass PrototypeClass = { @@ -638,25 +667,55 @@ class CGPrototypeJSClass(CGThing): nullptr, /* hasInstance */ nullptr, /* construct */ nullptr, /* trace */ - JSCLASS_NO_INTERNAL_MEMBERS + JS_NULL_CLASS_SPEC, + JS_NULL_CLASS_EXT, + JS_NULL_OBJECT_OPS }, - eInterfacePrototype, + ${type}, ${hooks}, "[object ${name}Prototype]", ${prototypeID}, - ${depth} + ${depth}, + ${protoGetter} }; """, name=self.descriptor.interface.identifier.name, slotCount=slotCount, + type=type, hooks=NativePropertyHooks(self.descriptor), prototypeID=prototypeID, - depth=depth) + depth=depth, + protoGetter=protoGetter) def NeedsGeneratedHasInstance(descriptor): return descriptor.hasXPConnectImpls or descriptor.interface.isConsequential() +def InterfaceObjectProtoGetter(descriptor): + """ + Returns a tuple with two elements: + + 1) The name of the function to call to get the prototype to use for the + interface object as a JSObject*. + + 2) The name of the function to call to get the prototype to use for the + interface prototype as a JS::Handle or None if no such + function exists. + """ + parentWithInterfaceObject = descriptor.interface.parent + while (parentWithInterfaceObject and + not parentWithInterfaceObject.hasInterfaceObject()): + parentWithInterfaceObject = parentWithInterfaceObject.parent + if parentWithInterfaceObject: + parentIfaceName = parentWithInterfaceObject.identifier.name + parentDesc = descriptor.getDescriptor(parentIfaceName) + prefix = toBindingNamespace(parentDesc.name) + protoGetter = prefix + "::GetConstructorObject" + protoHandleGetter = prefix + "::GetConstructorObjectHandle" + else: + protoGetter = "JS_GetFunctionPrototype" + protoHandleGetter = None + return (protoGetter, protoHandleGetter) class CGInterfaceObjectJSClass(CGThing): def __init__(self, descriptor, properties): @@ -684,6 +743,8 @@ class CGInterfaceObjectJSClass(CGThing): if len(self.descriptor.interface.namedConstructors) > 0: slotCount += (" + %i /* slots for the named constructors */" % len(self.descriptor.interface.namedConstructors)) + (protoGetter, _) = InterfaceObjectProtoGetter(self.descriptor) + return fill( """ static const DOMIfaceAndProtoJSClass InterfaceObjectClass = { @@ -702,13 +763,16 @@ class CGInterfaceObjectJSClass(CGThing): ${hasInstance}, /* hasInstance */ ${ctorname}, /* construct */ nullptr, /* trace */ - JSCLASS_NO_INTERNAL_MEMBERS + JS_NULL_CLASS_SPEC, + JS_NULL_CLASS_EXT, + JS_NULL_OBJECT_OPS }, eInterface, ${hooks}, "function ${name}() {\\n [native code]\\n}", ${prototypeID}, - ${depth} + ${depth}, + ${protoGetter} }; """, slotCount=slotCount, @@ -717,7 +781,8 @@ class CGInterfaceObjectJSClass(CGThing): hooks=NativePropertyHooks(self.descriptor), name=self.descriptor.interface.identifier.name, prototypeID=prototypeID, - depth=depth) + depth=depth, + protoGetter=protoGetter) class CGList(CGThing): @@ -2578,38 +2643,23 @@ class CGCreateInterfaceObjectsMethod(CGAbstractMethod): self.properties = properties def definition_body(self): - if len(self.descriptor.prototypeChain) == 1: + (protoGetter, protoHandleGetter) = InterfacePrototypeObjectProtoGetter(self.descriptor) + if protoHandleGetter is None: parentProtoType = "Rooted" - if self.descriptor.interface.getExtendedAttribute("ArrayClass"): - getParentProto = "aCx, JS_GetArrayPrototype(aCx, aGlobal)" - elif self.descriptor.interface.getExtendedAttribute("ExceptionClass"): - getParentProto = "aCx, JS_GetErrorPrototype(aCx)" - else: - getParentProto = "aCx, JS_GetObjectPrototype(aCx, aGlobal)" + getParentProto = "aCx, " + protoGetter else: - parentProtoName = self.descriptor.prototypeChain[-2] - parentDesc = self.descriptor.getDescriptor(parentProtoName) - if parentDesc.workers: - parentProtoName += '_workers' - getParentProto = ("%s::GetProtoObject(aCx, aGlobal)" % - toBindingNamespace(parentProtoName)) parentProtoType = "Handle" + getParentProto = protoHandleGetter + getParentProto = getParentProto + "(aCx, aGlobal)" - parentWithInterfaceObject = self.descriptor.interface.parent - while (parentWithInterfaceObject and - not parentWithInterfaceObject.hasInterfaceObject()): - parentWithInterfaceObject = parentWithInterfaceObject.parent - if parentWithInterfaceObject: - parentIfaceName = parentWithInterfaceObject.identifier.name - parentDesc = self.descriptor.getDescriptor(parentIfaceName) - if parentDesc.workers: - parentIfaceName += "_workers" - getConstructorProto = ("%s::GetConstructorObject(aCx, aGlobal)" % - toBindingNamespace(parentIfaceName)) - constructorProtoType = "Handle" - else: - getConstructorProto = "aCx, JS_GetFunctionPrototype(aCx, aGlobal)" + (protoGetter, protoHandleGetter) = InterfaceObjectProtoGetter(self.descriptor) + if protoHandleGetter is None: + getConstructorProto = "aCx, " + protoGetter constructorProtoType = "Rooted" + else: + getConstructorProto = protoHandleGetter + constructorProtoType = "Handle" + getConstructorProto += "(aCx, aGlobal)" needInterfaceObject = self.descriptor.interface.hasInterfaceObject() needInterfacePrototypeObject = self.descriptor.interface.hasInterfacePrototypeObject() @@ -2814,12 +2864,12 @@ class CGGetPerInterfaceObject(CGAbstractMethod): id=self.id) -class CGGetProtoObjectMethod(CGGetPerInterfaceObject): +class CGGetProtoObjectHandleMethod(CGGetPerInterfaceObject): """ A method for getting the interface prototype object. """ def __init__(self, descriptor): - CGGetPerInterfaceObject.__init__(self, descriptor, "GetProtoObject", + CGGetPerInterfaceObject.__init__(self, descriptor, "GetProtoObjectHandle", "prototypes::") def definition_body(self): @@ -2831,13 +2881,25 @@ class CGGetProtoObjectMethod(CGGetPerInterfaceObject): """) + CGGetPerInterfaceObject.definition_body(self) -class CGGetConstructorObjectMethod(CGGetPerInterfaceObject): +class CGGetProtoObjectMethod(CGAbstractMethod): + """ + A method for getting the interface prototype object. + """ + def __init__(self, descriptor): + CGAbstractMethod.__init__( + self, descriptor, "GetProtoObject", "JSObject*", [Argument('JSContext*', 'aCx'), + Argument('JS::Handle', 'aGlobal')]) + + def definition_body(self): + return "return GetProtoObjectHandle(aCx, aGlobal);\n" + +class CGGetConstructorObjectHandleMethod(CGGetPerInterfaceObject): """ A method for getting the interface constructor object. """ def __init__(self, descriptor): CGGetPerInterfaceObject.__init__( - self, descriptor, "GetConstructorObject", + self, descriptor, "GetConstructorObjectHandle", "constructors::", extraArgs=[Argument("bool", "aDefineOnGlobal", "true")]) @@ -2848,6 +2910,73 @@ class CGGetConstructorObjectMethod(CGGetPerInterfaceObject): """) + CGGetPerInterfaceObject.definition_body(self) +class CGGetConstructorObjectMethod(CGAbstractMethod): + """ + A method for getting the interface constructor object. + """ + def __init__(self, descriptor): + CGAbstractMethod.__init__( + self, descriptor, "GetConstructorObject", "JSObject*", [Argument('JSContext*', 'aCx'), + Argument('JS::Handle', 'aGlobal')]) + + def definition_body(self): + return "return GetConstructorObjectHandle(aCx, aGlobal);\n" + +class CGGetNamedPropertiesObjectMethod(CGAbstractStaticMethod): + def __init__(self, descriptor): + args = [Argument('JSContext*', 'aCx'), + Argument('JS::Handle', 'aGlobal')] + CGAbstractStaticMethod.__init__(self, descriptor, + 'GetNamedPropertiesObject', + 'JSObject*', args) + + def definition_body(self): + parentProtoName = self.descriptor.parentPrototypeName + if parentProtoName is None: + getParentProto = "" + parentProto = "nullptr" + else: + getParentProto = fill( + """ + JS::Rooted parentProto(aCx, ${parent}::GetProtoObjectHandle(aCx, aGlobal)); + if (!parentProto) { + return nullptr; + } + """, + parent=toBindingNamespace(parentProtoName)) + parentProto = "parentProto" + return fill( + """ + /* Make sure our global is sane. Hopefully we can remove this sometime */ + if (!(js::GetObjectClass(aGlobal)->flags & JSCLASS_DOM_GLOBAL)) { + return nullptr; + } + + /* Check to see whether the named properties object has already been created */ + ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(aGlobal); + + JS::Heap& namedPropertiesObject = protoAndIfaceCache.EntrySlotOrCreate(namedpropertiesobjects::id::${ifaceName}); + if (!namedPropertiesObject) { + $*{getParentProto} + namedPropertiesObject = ${nativeType}::CreateNamedPropertiesObject(aCx, ${parentProto}); + DebugOnly clasp = + DOMIfaceAndProtoJSClass::FromJSClass(js::GetObjectClass(namedPropertiesObject)); + MOZ_ASSERT(clasp->mType == eNamedPropertiesObject, + "Expected ${nativeType}::CreateNamedPropertiesObject to return a named properties object"); + MOZ_ASSERT(clasp->mNativeHooks, + "The named properties object for ${nativeType} should have NativePropertyHooks."); + MOZ_ASSERT(clasp->mNativeHooks->mResolveOwnProperty, + "Don't know how to resolve the properties of the named properties object for ${nativeType}."); + MOZ_ASSERT(clasp->mNativeHooks->mEnumerateOwnProperties, + "Don't know how to enumerate the properties of the named properties object for ${nativeType}."); + } + return namedPropertiesObject.get(); + """, + getParentProto=getParentProto, + ifaceName=self.descriptor.name, + parentProto=parentProto, + nativeType=self.descriptor.nativeType) + class CGDefineDOMInterfaceMethod(CGAbstractMethod): """ @@ -2874,7 +3003,7 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod): def definition_body(self): if len(self.descriptor.interface.namedConstructors) > 0: getConstructor = dedent(""" - JSObject* interfaceObject = GetConstructorObject(aCx, aGlobal, aDefineOnGlobal); + JSObject* interfaceObject = GetConstructorObjectHandle(aCx, aGlobal, aDefineOnGlobal); if (!interfaceObject) { return nullptr; } @@ -2887,7 +3016,7 @@ class CGDefineDOMInterfaceMethod(CGAbstractMethod): return interfaceObject; """) else: - getConstructor = "return GetConstructorObject(aCx, aGlobal, aDefineOnGlobal);\n" + getConstructor = "return GetConstructorObjectHandle(aCx, aGlobal, aDefineOnGlobal);\n" return getConstructor @@ -3168,7 +3297,7 @@ class CGWrapWithCacheMethod(CGAbstractMethod): JSAutoCompartment ac(aCx, parent); JS::Rooted global(aCx, JS_GetGlobalForObject(aCx, parent)); - JS::Handle proto = GetProtoObject(aCx, global); + JS::Handle proto = GetProtoObjectHandle(aCx, global); if (!proto) { return nullptr; } @@ -3224,7 +3353,7 @@ class CGWrapNonWrapperCacheMethod(CGAbstractMethod): $*{assertions} JS::Rooted global(aCx, JS::CurrentGlobalOrNull(aCx)); - JS::Handle proto = GetProtoObject(aCx, global); + JS::Handle proto = GetProtoObjectHandle(aCx, global); if (!proto) { return nullptr; } @@ -3286,7 +3415,7 @@ class CGWrapGlobalMethod(CGAbstractMethod): "nsISupports must be on our primary inheritance chain"); JS::Rooted obj(aCx); - CreateGlobal<${nativeType}, GetProtoObject>(aCx, + CreateGlobal<${nativeType}, GetProtoObjectHandle>(aCx, aObject, aCache, Class.ToJSClass(), @@ -11016,6 +11145,9 @@ class CGDescriptor(CGThing): cgThings.append(CGNewResolveHook(descriptor)) cgThings.append(CGEnumerateHook(descriptor)) + if descriptor.hasNamedPropertiesObject: + cgThings.append(CGGetNamedPropertiesObjectMethod(descriptor)) + if descriptor.interface.hasInterfacePrototypeObject(): cgThings.append(CGPrototypeJSClass(descriptor, properties)) @@ -11085,8 +11217,11 @@ class CGDescriptor(CGThing): # CGGetProtoObjectMethod and CGGetConstructorObjectMethod need # to come after CGCreateInterfaceObjectsMethod. if descriptor.interface.hasInterfacePrototypeObject(): - cgThings.append(CGGetProtoObjectMethod(descriptor)) + cgThings.append(CGGetProtoObjectHandleMethod(descriptor)) + if descriptor.interface.hasChildInterfaces(): + cgThings.append(CGGetProtoObjectMethod(descriptor)) if descriptor.interface.hasInterfaceObject(): + cgThings.append(CGGetConstructorObjectHandleMethod(descriptor)) cgThings.append(CGGetConstructorObjectMethod(descriptor)) # See whether we need we need to generate an IsPermitted method @@ -14172,6 +14307,18 @@ class GlobalGenRoots(): curr.append(idEnum) + # Named properties object enum. + namedPropertiesObjects = [d.name for d in config.getDescriptors(hasNamedPropertiesObject=True)] + idEnum = CGNamespacedEnum('id', 'ID', ['_ID_Start'] + namedPropertiesObjects, + ['constructors::id::_ID_Count', '_ID_Start']) + + # Wrap all of that in our namespaces. + idEnum = CGNamespace.build(['mozilla', 'dom', 'namedpropertiesobjects'], + CGWrapper(idEnum, pre='\n')) + idEnum = CGWrapper(idEnum, post='\n') + + curr.append(idEnum) + traitsDecls = [CGGeneric(declare=dedent(""" template struct PrototypeTraits; diff --git a/dom/bindings/Configuration.py b/dom/bindings/Configuration.py index 5cda5ff09709..7fd5f0c54d35 100644 --- a/dom/bindings/Configuration.py +++ b/dom/bindings/Configuration.py @@ -303,7 +303,7 @@ class Descriptor(DescriptorProvider): self.concrete = (not self.interface.isExternal() and not self.interface.isCallback() and desc.get('concrete', True)) - operations = { + self.operations = { 'IndexedGetter': None, 'IndexedSetter': None, 'IndexedCreator': None, @@ -320,8 +320,8 @@ class Descriptor(DescriptorProvider): self.proxy = False iface = self.interface def addOperation(operation, m): - if not operations[operation]: - operations[operation] = m + if not self.operations[operation]: + self.operations[operation] = m # Since stringifiers go on the prototype, we only need to worry # about our own stringifier, not those of our ancestor interfaces. for m in iface.members: @@ -345,7 +345,6 @@ class Descriptor(DescriptorProvider): continue def addIndexedOrNamedOperation(operation, m): - self.proxy = True if m.isIndexed(): operation = 'Indexed' + operation else: @@ -369,18 +368,22 @@ class Descriptor(DescriptorProvider): iface.setUserData('hasConcreteDescendant', True) iface = iface.parent + self.proxy = (self.supportsIndexedProperties() or + (self.supportsNamedProperties() and + not self.hasNamedPropertiesObject)) + if self.proxy: - if (not operations['IndexedGetter'] and - (operations['IndexedSetter'] or - operations['IndexedDeleter'] or - operations['IndexedCreator'])): + if (not self.operations['IndexedGetter'] and + (self.operations['IndexedSetter'] or + self.operations['IndexedDeleter'] or + self.operations['IndexedCreator'])): raise SyntaxError("%s supports indexed properties but does " "not have an indexed getter.\n%s" % (self.interface, self.interface.location)) - if (not operations['NamedGetter'] and - (operations['NamedSetter'] or - operations['NamedDeleter'] or - operations['NamedCreator'])): + if (not self.operations['NamedGetter'] and + (self.operations['NamedSetter'] or + self.operations['NamedDeleter'] or + self.operations['NamedCreator'])): raise SyntaxError("%s supports named properties but does " "not have a named getter.\n%s" % (self.interface, self.interface.location)) @@ -388,7 +391,6 @@ class Descriptor(DescriptorProvider): while iface: iface.setUserData('hasProxyDescendant', True) iface = iface.parent - self.operations = operations self.nativeOwnership = desc.get('nativeOwnership', 'refcounted') if not self.nativeOwnership in ('owned', 'refcounted'): @@ -511,6 +513,16 @@ class Descriptor(DescriptorProvider): def binaryNameFor(self, name): return self._binaryNames.get(name, name) + @property + def prototypeNameChain(self): + return map(lambda p: self.getDescriptor(p).name, self.prototypeChain) + + @property + def parentPrototypeName(self): + if len(self.prototypeChain) == 1: + return None + return self.getDescriptor(self.prototypeChain[-2]).name + def hasInterfaceOrInterfacePrototypeObject(self): # Forward-declared interfaces don't need either interface object or @@ -521,6 +533,13 @@ class Descriptor(DescriptorProvider): return self.interface.hasInterfaceObject() or self.interface.hasInterfacePrototypeObject() + @property + def hasNamedPropertiesObject(self): + if self.interface.isExternal(): + return False + + return self.isGlobal() and self.supportsNamedProperties() + def getExtendedAttributes(self, member, getter=False, setter=False): def ensureValidThrowsExtendedAttribute(attr): assert(attr is None or attr is True or len(attr) == 1) diff --git a/dom/bindings/DOMJSClass.h b/dom/bindings/DOMJSClass.h index ea322c5378a0..a2deffc44bcb 100644 --- a/dom/bindings/DOMJSClass.h +++ b/dom/bindings/DOMJSClass.h @@ -156,25 +156,46 @@ struct NativePropertyHooks // constructors::id::_ID_Count. constructors::ID mConstructorID; - // The NativePropertyHooks instance for the parent interface. + // The NativePropertyHooks instance for the parent interface (for + // ShimInterfaceInfo). const NativePropertyHooks* mProtoHooks; }; enum DOMObjectType { eInstance, + eGlobalInstance, eInterface, - eInterfacePrototype + eInterfacePrototype, + eGlobalInterfacePrototype, + eNamedPropertiesObject }; +inline +bool +IsInstance(DOMObjectType type) +{ + return type == eInstance || type == eGlobalInstance; +} + +inline +bool +IsInterfacePrototype(DOMObjectType type) +{ + return type == eInterfacePrototype || type == eGlobalInterfacePrototype; +} + typedef JSObject* (*ParentGetter)(JSContext* aCx, JS::Handle aObj); + +typedef JSObject* (*ProtoGetter)(JSContext* aCx, + JS::Handle aGlobal); /** * Returns a handle to the relevent WebIDL prototype object for the given global * (which may be a handle to null on out of memory). Once allocated, the * prototype object is guaranteed to exist as long as the global does, since the * global traces its array of WebIDL prototypes and constructors. */ -typedef JS::Handle (*ProtoGetter)(JSContext* aCx, - JS::Handle aGlobal); +typedef JS::Handle (*ProtoHandleGetter)(JSContext* aCx, + JS::Handle aGlobal); // Special JSClass for reflected DOM objects. struct DOMJSClass @@ -197,7 +218,7 @@ struct DOMJSClass const NativePropertyHooks* mNativeHooks; ParentGetter mGetParent; - ProtoGetter mGetProto; + ProtoHandleGetter mGetProto; // This stores the CC participant for the native, null if this class is for a // worker or for a native inheriting from nsISupports (we can get the CC @@ -219,13 +240,14 @@ struct DOMJSClass // Special JSClass for DOM interface and interface prototype objects. struct DOMIfaceAndProtoJSClass { - // It would be nice to just inherit from JSClass, but that precludes pure + // It would be nice to just inherit from js::Class, but that precludes pure // compile-time initialization of the form // |DOMJSInterfaceAndPrototypeClass = {...};|, since C++ only allows brace // initialization for aggregate/POD types. - const JSClass mBase; + const js::Class mBase; - // Either eInterface or eInterfacePrototype + // Either eInterface, eInterfacePrototype, eGlobalInterfacePrototype or + // eNamedPropertiesObject. DOMObjectType mType; const NativePropertyHooks* mNativeHooks; @@ -237,6 +259,8 @@ struct DOMIfaceAndProtoJSClass const prototypes::ID mPrototypeID; const uint32_t mDepth; + ProtoGetter mGetParentProto; + static const DOMIfaceAndProtoJSClass* FromJSClass(const JSClass* base) { MOZ_ASSERT(base->flags & JSCLASS_IS_DOMIFACEANDPROTOJSCLASS); return reinterpret_cast(base); @@ -245,7 +269,7 @@ struct DOMIfaceAndProtoJSClass return FromJSClass(Jsvalify(base)); } - const JSClass* ToJSClass() const { return &mBase; } + const JSClass* ToJSClass() const { return Jsvalify(&mBase); } }; class ProtoAndIfaceCache; diff --git a/dom/bindings/test/chrome.ini b/dom/bindings/test/chrome.ini index bd9c32187e9c..689bb0415faa 100644 --- a/dom/bindings/test/chrome.ini +++ b/dom/bindings/test/chrome.ini @@ -3,5 +3,6 @@ [test_bug707564-chrome.html] [test_bug775543.html] [test_document_location_set_via_xray.html] +[test_dom_xrays.html] [test_proxies_via_xray.html] [test_document_location_via_xray_cached.html] diff --git a/dom/bindings/test/file_dom_xrays.html b/dom/bindings/test/file_dom_xrays.html new file mode 100644 index 000000000000..36b3f8a30094 --- /dev/null +++ b/dom/bindings/test/file_dom_xrays.html @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/dom/bindings/test/mochitest.ini b/dom/bindings/test/mochitest.ini index 4dcb081c4d9f..fa1b792a2b31 100644 --- a/dom/bindings/test/mochitest.ini +++ b/dom/bindings/test/mochitest.ini @@ -4,6 +4,7 @@ support-files = file_bug707564.html file_bug775543.html file_document_location_set_via_xray.html + file_dom_xrays.html file_proxies_via_xray.html forOf_iframe.html diff --git a/dom/bindings/test/test_dom_xrays.html b/dom/bindings/test/test_dom_xrays.html new file mode 100644 index 000000000000..96704d2a56e8 --- /dev/null +++ b/dom/bindings/test/test_dom_xrays.html @@ -0,0 +1,158 @@ + + + + + + Test for Bug 787070 + + + + +Mozilla Bug 787070 +

+ +
+
+
+ + diff --git a/dom/canvas/CanvasRenderingContext2D.cpp b/dom/canvas/CanvasRenderingContext2D.cpp index 755540a14936..6aa1467d2e8f 100644 --- a/dom/canvas/CanvasRenderingContext2D.cpp +++ b/dom/canvas/CanvasRenderingContext2D.cpp @@ -82,6 +82,7 @@ #include "mozilla/gfx/Helpers.h" #include "mozilla/gfx/PathHelpers.h" #include "mozilla/gfx/DataSurfaceHelpers.h" +#include "mozilla/gfx/PatternHelpers.h" #include "mozilla/ipc/DocumentRendererParent.h" #include "mozilla/ipc/PDocumentRendererParent.h" #include "mozilla/MathAlgorithms.h" @@ -223,42 +224,33 @@ public: typedef CanvasRenderingContext2D::Style Style; typedef CanvasRenderingContext2D::ContextState ContextState; - CanvasGeneralPattern() : mPattern(nullptr) {} - ~CanvasGeneralPattern() - { - if (mPattern) { - mPattern->~Pattern(); - } - } - Pattern& ForStyle(CanvasRenderingContext2D *aCtx, Style aStyle, DrawTarget *aRT) { // This should only be called once or the mPattern destructor will // not be executed. - NS_ASSERTION(!mPattern, "ForStyle() should only be called once on CanvasGeneralPattern!"); + NS_ASSERTION(!mPattern.GetPattern(), "ForStyle() should only be called once on CanvasGeneralPattern!"); const ContextState &state = aCtx->CurrentState(); if (state.StyleIsColor(aStyle)) { - mPattern = new (mColorPattern.addr()) ColorPattern(Color::FromABGR(state.colorStyles[aStyle])); + mPattern.InitColorPattern(Color::FromABGR(state.colorStyles[aStyle])); } else if (state.gradientStyles[aStyle] && state.gradientStyles[aStyle]->GetType() == CanvasGradient::Type::LINEAR) { CanvasLinearGradient *gradient = static_cast(state.gradientStyles[aStyle].get()); - mPattern = new (mLinearGradientPattern.addr()) - LinearGradientPattern(gradient->mBegin, gradient->mEnd, - gradient->GetGradientStopsForTarget(aRT)); + mPattern.InitLinearGradientPattern(gradient->mBegin, gradient->mEnd, + gradient->GetGradientStopsForTarget(aRT)); } else if (state.gradientStyles[aStyle] && state.gradientStyles[aStyle]->GetType() == CanvasGradient::Type::RADIAL) { CanvasRadialGradient *gradient = static_cast(state.gradientStyles[aStyle].get()); - mPattern = new (mRadialGradientPattern.addr()) - RadialGradientPattern(gradient->mCenter1, gradient->mCenter2, gradient->mRadius1, - gradient->mRadius2, gradient->GetGradientStopsForTarget(aRT)); + mPattern.InitRadialGradientPattern(gradient->mCenter1, gradient->mCenter2, + gradient->mRadius1, gradient->mRadius2, + gradient->GetGradientStopsForTarget(aRT)); } else if (state.patternStyles[aStyle]) { if (aCtx->mCanvasElement) { CanvasUtils::DoDrawImageSecurityCheck(aCtx->mCanvasElement, @@ -273,21 +265,14 @@ public: } else { mode = ExtendMode::REPEAT; } - mPattern = new (mSurfacePattern.addr()) - SurfacePattern(state.patternStyles[aStyle]->mSurface, mode, - state.patternStyles[aStyle]->mTransform); + mPattern.InitSurfacePattern(state.patternStyles[aStyle]->mSurface, mode, + state.patternStyles[aStyle]->mTransform); } - return *mPattern; + return *mPattern.GetPattern(); } - union { - AlignedStorage2 mColorPattern; - AlignedStorage2 mLinearGradientPattern; - AlignedStorage2 mRadialGradientPattern; - AlignedStorage2 mSurfacePattern; - }; - Pattern *mPattern; + GeneralPattern mPattern; }; /* This is an RAII based class that can be used as a drawtarget for diff --git a/dom/canvas/WebGLBuffer.cpp b/dom/canvas/WebGLBuffer.cpp index 9ed81e9b755c..f7c434ce9805 100644 --- a/dom/canvas/WebGLBuffer.cpp +++ b/dom/canvas/WebGLBuffer.cpp @@ -13,7 +13,7 @@ using namespace mozilla; WebGLBuffer::WebGLBuffer(WebGLContext *context) - : WebGLBindableName() + : WebGLBindableName() , WebGLContextBoundObject(context) , mByteLength(0) { diff --git a/dom/canvas/WebGLBuffer.h b/dom/canvas/WebGLBuffer.h index 3373b8a767ee..819dce1fb636 100644 --- a/dom/canvas/WebGLBuffer.h +++ b/dom/canvas/WebGLBuffer.h @@ -13,6 +13,7 @@ #include "WebGLBindableName.h" #include "WebGLObjectModel.h" #include "WebGLTypes.h" +#include "WebGLStrongTypes.h" namespace mozilla { @@ -20,7 +21,7 @@ class WebGLElementArrayCache; class WebGLBuffer MOZ_FINAL : public nsWrapperCache - , public WebGLBindableName + , public WebGLBindableName , public WebGLRefCountedObject , public LinkedListElement , public WebGLContextBoundObject diff --git a/dom/canvas/WebGLContext.h b/dom/canvas/WebGLContext.h index 951dac8ae034..eb6fc5dad741 100644 --- a/dom/canvas/WebGLContext.h +++ b/dom/canvas/WebGLContext.h @@ -1272,7 +1272,7 @@ protected: GLuint mGLName; public: - FakeBlackTexture(gl::GLContext* gl, GLenum target, GLenum format); + FakeBlackTexture(gl::GLContext* gl, TexTarget target, GLenum format); ~FakeBlackTexture(); GLuint GLName() const { return mGLName; } }; diff --git a/dom/canvas/WebGLContextDraw.cpp b/dom/canvas/WebGLContextDraw.cpp index dc1fea8bed7b..6535a0899532 100644 --- a/dom/canvas/WebGLContextDraw.cpp +++ b/dom/canvas/WebGLContextDraw.cpp @@ -710,11 +710,10 @@ WebGLContext::UnbindFakeBlackTextures() gl->fActiveTexture(LOCAL_GL_TEXTURE0 + mActiveTexture); } -WebGLContext::FakeBlackTexture::FakeBlackTexture(GLContext *gl, GLenum target, GLenum format) +WebGLContext::FakeBlackTexture::FakeBlackTexture(GLContext *gl, TexTarget target, GLenum format) : mGL(gl) , mGLName(0) { - MOZ_ASSERT(target == LOCAL_GL_TEXTURE_2D || target == LOCAL_GL_TEXTURE_CUBE_MAP); MOZ_ASSERT(format == LOCAL_GL_RGB || format == LOCAL_GL_RGBA); mGL->MakeCurrent(); @@ -724,7 +723,7 @@ WebGLContext::FakeBlackTexture::FakeBlackTexture(GLContext *gl, GLenum target, G : LOCAL_GL_TEXTURE_BINDING_CUBE_MAP, &formerBinding); gl->fGenTextures(1, &mGLName); - gl->fBindTexture(target, mGLName); + gl->fBindTexture(target.get(), mGLName); // we allocate our zeros on the heap, and we overallocate (16 bytes instead of 4) // to minimize the risk of running into a driver bug in texImage2D, as it is @@ -732,7 +731,7 @@ WebGLContext::FakeBlackTexture::FakeBlackTexture(GLContext *gl, GLenum target, G // that texImage2D expects. void* zeros = calloc(1, 16); if (target == LOCAL_GL_TEXTURE_2D) { - gl->fTexImage2D(target, 0, format, 1, 1, + gl->fTexImage2D(target.get(), 0, format, 1, 1, 0, format, LOCAL_GL_UNSIGNED_BYTE, zeros); } else { for (GLuint i = 0; i < 6; ++i) { @@ -742,7 +741,7 @@ WebGLContext::FakeBlackTexture::FakeBlackTexture(GLContext *gl, GLenum target, G } free(zeros); - gl->fBindTexture(target, formerBinding); + gl->fBindTexture(target.get(), formerBinding); } WebGLContext::FakeBlackTexture::~FakeBlackTexture() diff --git a/dom/canvas/WebGLContextGL.cpp b/dom/canvas/WebGLContextGL.cpp index f98cd6fcd037..cbd9ac54e9dd 100644 --- a/dom/canvas/WebGLContextGL.cpp +++ b/dom/canvas/WebGLContextGL.cpp @@ -942,7 +942,7 @@ WebGLContext::GenerateMipmap(GLenum rawTarget) // note that the choice of GL_NEAREST_MIPMAP_NEAREST really matters. See Chromium bug 101105. gl->fTexParameteri(target.get(), LOCAL_GL_TEXTURE_MIN_FILTER, LOCAL_GL_NEAREST_MIPMAP_NEAREST); gl->fGenerateMipmap(target.get()); - gl->fTexParameteri(target.get(), LOCAL_GL_TEXTURE_MIN_FILTER, tex->MinFilter()); + gl->fTexParameteri(target.get(), LOCAL_GL_TEXTURE_MIN_FILTER, tex->MinFilter().get()); } else { gl->fGenerateMipmap(target.get()); } diff --git a/dom/canvas/WebGLStrongTypes.h b/dom/canvas/WebGLStrongTypes.h index f7ff6fc37e98..445ca26e00e8 100644 --- a/dom/canvas/WebGLStrongTypes.h +++ b/dom/canvas/WebGLStrongTypes.h @@ -252,6 +252,26 @@ STRONG_GLENUM_BEGIN(TexType) STRONG_GLENUM_VALUE(FLOAT_32_UNSIGNED_INT_24_8_REV), STRONG_GLENUM_END(TexType) +STRONG_GLENUM_BEGIN(TexMinFilter) + STRONG_GLENUM_VALUE(NEAREST), + STRONG_GLENUM_VALUE(LINEAR), + STRONG_GLENUM_VALUE(NEAREST_MIPMAP_NEAREST), + STRONG_GLENUM_VALUE(LINEAR_MIPMAP_NEAREST), + STRONG_GLENUM_VALUE(NEAREST_MIPMAP_LINEAR), + STRONG_GLENUM_VALUE(LINEAR_MIPMAP_LINEAR), +STRONG_GLENUM_END(TexMinFilter) + +STRONG_GLENUM_BEGIN(TexMagFilter) + STRONG_GLENUM_VALUE(NEAREST), + STRONG_GLENUM_VALUE(LINEAR), +STRONG_GLENUM_END(TexMagFilter) + +STRONG_GLENUM_BEGIN(TexWrap) + STRONG_GLENUM_VALUE(REPEAT), + STRONG_GLENUM_VALUE(CLAMP_TO_EDGE), + STRONG_GLENUM_VALUE(MIRRORED_REPEAT), +STRONG_GLENUM_END(TexWrap) + STRONG_GLENUM_BEGIN(TexFormat) STRONG_GLENUM_VALUE(NONE), STRONG_GLENUM_VALUE(DEPTH_COMPONENT), @@ -405,4 +425,15 @@ STRONG_GLENUM_BEGIN(RBParam) STRONG_GLENUM_VALUE(RENDERBUFFER_STENCIL_SIZE), STRONG_GLENUM_END(RBParam) +STRONG_GLENUM_BEGIN(VAOBinding) + STRONG_GLENUM_VALUE(NONE), + STRONG_GLENUM_VALUE(VERTEX_ARRAY_BINDING), +STRONG_GLENUM_END(VAOBinding) + +STRONG_GLENUM_BEGIN(BufferBinding) + STRONG_GLENUM_VALUE(NONE), + STRONG_GLENUM_VALUE(ARRAY_BUFFER), + STRONG_GLENUM_VALUE(ELEMENT_ARRAY_BUFFER), +STRONG_GLENUM_END(BufferBinding) + #endif diff --git a/dom/canvas/WebGLTexture.h b/dom/canvas/WebGLTexture.h index 88db44797a3b..000c875dfd58 100644 --- a/dom/canvas/WebGLTexture.h +++ b/dom/canvas/WebGLTexture.h @@ -194,7 +194,9 @@ public: protected: - GLenum mMinFilter, mMagFilter, mWrapS, mWrapT; + TexMinFilter mMinFilter; + TexMagFilter mMagFilter; + TexWrap mWrapS, mWrapT; size_t mFacesCount, mMaxLevelWithCustomImages; nsTArray mImageInfos; @@ -227,23 +229,23 @@ public: GLsizei aWidth, GLsizei aHeight, TexInternalFormat aFormat, TexType aType, WebGLImageDataStatus aStatus); - void SetMinFilter(GLenum aMinFilter) { + void SetMinFilter(TexMinFilter aMinFilter) { mMinFilter = aMinFilter; SetFakeBlackStatus(WebGLTextureFakeBlackStatus::Unknown); } - void SetMagFilter(GLenum aMagFilter) { + void SetMagFilter(TexMagFilter aMagFilter) { mMagFilter = aMagFilter; SetFakeBlackStatus(WebGLTextureFakeBlackStatus::Unknown); } - void SetWrapS(GLenum aWrapS) { + void SetWrapS(TexWrap aWrapS) { mWrapS = aWrapS; SetFakeBlackStatus(WebGLTextureFakeBlackStatus::Unknown); } - void SetWrapT(GLenum aWrapT) { + void SetWrapT(TexWrap aWrapT) { mWrapT = aWrapT; SetFakeBlackStatus(WebGLTextureFakeBlackStatus::Unknown); } - GLenum MinFilter() const { return mMinFilter; } + TexMinFilter MinFilter() const { return mMinFilter; } bool DoesMinFilterRequireMipmap() const { return !(mMinFilter == LOCAL_GL_NEAREST || mMinFilter == LOCAL_GL_LINEAR); diff --git a/dom/canvas/WebGLVertexArray.cpp b/dom/canvas/WebGLVertexArray.cpp index 9b49ad7cb161..211dcbeb77de 100644 --- a/dom/canvas/WebGLVertexArray.cpp +++ b/dom/canvas/WebGLVertexArray.cpp @@ -20,7 +20,7 @@ WebGLVertexArray::WrapObject(JSContext *cx) { } WebGLVertexArray::WebGLVertexArray(WebGLContext* context) - : WebGLBindableName() + : WebGLBindableName() , WebGLContextBoundObject(context) { SetIsDOMBinding(); diff --git a/dom/canvas/WebGLVertexArray.h b/dom/canvas/WebGLVertexArray.h index 6d58c8dd0684..5d242f1e095c 100644 --- a/dom/canvas/WebGLVertexArray.h +++ b/dom/canvas/WebGLVertexArray.h @@ -10,6 +10,7 @@ #include "WebGLObjectModel.h" #include "WebGLBuffer.h" #include "WebGLVertexAttribData.h" +#include "WebGLStrongTypes.h" #include "nsWrapperCache.h" @@ -21,7 +22,7 @@ class WebGLVertexArrayFake; class WebGLVertexArray : public nsWrapperCache - , public WebGLBindableName + , public WebGLBindableName , public WebGLRefCountedObject , public LinkedListElement , public WebGLContextBoundObject @@ -41,8 +42,6 @@ public: virtual void GenVertexArray() = 0; virtual void BindVertexArrayImpl() = 0; - GLuint GLName() const { return mGLName; } - // ------------------------------------------------------------------------- // IMPLEMENT PARENT CLASSES diff --git a/dom/encoding/EncodingUtils.cpp b/dom/encoding/EncodingUtils.cpp index 7e9915866917..c487ccb96a14 100644 --- a/dom/encoding/EncodingUtils.cpp +++ b/dom/encoding/EncodingUtils.cpp @@ -56,6 +56,8 @@ EncodingUtils::FindEncodingForLabelNoReplacement(const nsACString& aLabel, bool EncodingUtils::IsAsciiCompatible(const nsACString& aPreferredName) { + // HZ and UTF-7 are no longer in mozilla-central, but keeping them here + // just in case for the benefit of comm-central. return !(aPreferredName.LowerCaseEqualsLiteral("utf-16") || aPreferredName.LowerCaseEqualsLiteral("utf-16be") || aPreferredName.LowerCaseEqualsLiteral("utf-16le") || diff --git a/dom/encoding/encodingsgroups.properties b/dom/encoding/encodingsgroups.properties index 3e9cffe5a67d..17f876f4a6b0 100644 --- a/dom/encoding/encodingsgroups.properties +++ b/dom/encoding/encodingsgroups.properties @@ -10,7 +10,6 @@ EUC-JP=ja EUC-KR=ko gb18030=zh-CN gbk=zh-CN -HZ-GB-2312=zh-CN IBM866=x-cyrillic ISO-2022-JP=ja ISO-8859-3=x-western diff --git a/dom/encoding/labelsencodings.properties b/dom/encoding/labelsencodings.properties index a2f93e10ccf7..bf20fc0c966e 100644 --- a/dom/encoding/labelsencodings.properties +++ b/dom/encoding/labelsencodings.properties @@ -187,7 +187,7 @@ gbk=gbk iso-ir-58=gbk x-gbk=gbk gb18030=gb18030 -hz-gb-2312=HZ-GB-2312 +hz-gb-2312=replacement big5=Big5 big5-hkscs=Big5-HKSCS cn-big5=Big5 diff --git a/dom/encoding/test/reftest/bug945215-1-ref.html b/dom/encoding/test/reftest/bug945215-1-ref.html new file mode 100644 index 000000000000..5d9606030b36 --- /dev/null +++ b/dom/encoding/test/reftest/bug945215-1-ref.html @@ -0,0 +1 @@ +� diff --git a/dom/encoding/test/reftest/bug945215-1.html b/dom/encoding/test/reftest/bug945215-1.html new file mode 100644 index 000000000000..6b5ee58ce8b2 --- /dev/null +++ b/dom/encoding/test/reftest/bug945215-1.html @@ -0,0 +1 @@ + diff --git a/dom/encoding/test/reftest/bug945215-2-ref.html b/dom/encoding/test/reftest/bug945215-2-ref.html new file mode 100644 index 000000000000..0211b5459124 --- /dev/null +++ b/dom/encoding/test/reftest/bug945215-2-ref.html @@ -0,0 +1,3 @@ + + + diff --git a/dom/encoding/test/reftest/bug945215-2.html b/dom/encoding/test/reftest/bug945215-2.html new file mode 100644 index 000000000000..16ddfa123795 --- /dev/null +++ b/dom/encoding/test/reftest/bug945215-2.html @@ -0,0 +1,17 @@ + + + + + + diff --git a/dom/encoding/test/reftest/reftest.list b/dom/encoding/test/reftest/reftest.list index 8eeee5e55e48..43558be0429a 100644 --- a/dom/encoding/test/reftest/reftest.list +++ b/dom/encoding/test/reftest/reftest.list @@ -1,3 +1,5 @@ == bug863728-1.html bug863728-1-ref.html == bug863728-2.html bug863728-2-ref.html == bug863728-3.html bug863728-3-ref.html +== bug945215-1.html bug945215-1-ref.html +== bug945215-2.html bug945215-2-ref.html diff --git a/dom/encoding/test/stringencoding-license.txt b/dom/encoding/test/stringencoding-license.txt index da3146b42e18..540bb346f1a5 100644 --- a/dom/encoding/test/stringencoding-license.txt +++ b/dom/encoding/test/stringencoding-license.txt @@ -5,7 +5,6 @@ unit/test_big5.js unit/test_euc-jp.js unit/test_euc-kr.js unit/test_gbk.js -unit/test_hz-gb-2312.js unit/test_iso-2022-jp.js unit/test_iso-2022-kr.js unit/test_shift_jis.js diff --git a/dom/encoding/test/test_TextDecoder.js b/dom/encoding/test/test_TextDecoder.js index df6ed0f07434..26b7bc459582 100644 --- a/dom/encoding/test/test_TextDecoder.js +++ b/dom/encoding/test/test_TextDecoder.js @@ -342,7 +342,6 @@ function testDecoderGetEncoding() {encoding: "x-mac-cyrillic", labels: ["x-mac-cyrillic", "x-mac-ukrainian"]}, {encoding: "gbk", labels: ["chinese", "csgb2312", "csiso58gb231280", "gb2312", "gb_2312", "gb_2312-80", "gbk", "iso-ir-58", "x-gbk"]}, {encoding: "gb18030", labels: ["gb18030"]}, - {encoding: "hz-gb-2312", labels: ["hz-gb-2312"]}, {encoding: "big5", labels: ["big5", "cn-big5", "csbig5", "x-x-big5"]}, {encoding: "big5-hkscs", labels: ["big5-hkscs"]}, {encoding: "euc-jp", labels: ["cseucpkdfmtjapanese", "euc-jp", "x-euc-jp"]}, @@ -352,7 +351,7 @@ function testDecoderGetEncoding() {encoding: "utf-16le", labels: ["utf-16", "utf-16le"]}, {encoding: "utf-16be", labels: ["utf-16be"]}, {encoding: "x-user-defined", labels: ["x-user-defined"]}, - {error: "TypeError", labels: ["x-windows-949", "\u0130SO-8859-1", "csiso2022kr", "iso-2022-kr", "iso-2022-cn", "iso-2022-cn-ext", "replacement"]}, + {error: "TypeError", labels: ["x-windows-949", "\u0130SO-8859-1", "csiso2022kr", "iso-2022-kr", "iso-2022-cn", "iso-2022-cn-ext", "replacement", "hz-gb-2312"]}, ]; for (var le of labelEncodings) { diff --git a/dom/encoding/test/test_stringencoding.html b/dom/encoding/test/test_stringencoding.html index 799b925de1d4..57b7bc1acc84 100644 --- a/dom/encoding/test/test_stringencoding.html +++ b/dom/encoding/test/test_stringencoding.html @@ -18,7 +18,6 @@ setup({explicit_timeout: true}); - diff --git a/dom/encoding/test/unit/mochitest.ini b/dom/encoding/test/unit/mochitest.ini index 51e72dc1bf82..2a1542ae7b90 100644 --- a/dom/encoding/test/unit/mochitest.ini +++ b/dom/encoding/test/unit/mochitest.ini @@ -5,6 +5,5 @@ skip-if = e10s [test_euc-jp.js] [test_euc-kr.js] [test_gbk.js] -[test_hz-gb-2312.js] [test_iso-2022-jp.js] [test_shift_jis.js] diff --git a/dom/encoding/test/unit/test_hz-gb-2312.js b/dom/encoding/test/unit/test_hz-gb-2312.js deleted file mode 100644 index 58224beb7b1e..000000000000 --- a/dom/encoding/test/unit/test_hz-gb-2312.js +++ /dev/null @@ -1,9 +0,0 @@ -test( - function () { - var bytes = [126,123,33,33,33,34,33,35,33,37,33,38,33,39,33,40,33,41,33,43,33,44,33,45,33,46,33,47,33,48,33,49,33,50,33,51,33,52,33,53,33,54,33,55,33,56,33,57,33,58,33,59,33,60,33,61,33,62,33,63,33,64,33,65,33,66,33,67,33,68,33,69,33,70,33,71,33,72,33,73,33,74,33,75,33,76,33,77,33,78,33,79,33,80,33,81,33,82,33,83,33,84,33,85,33,86,33,87,33,88,33,89,33,90,33,91,33,92,33,93,33,94,33,95,33,96,33,97,33,98,33,99,33,100,33,101,33,102,33,103,33,104,33,105,33,106,33,107,33,108,33,109,33,110,33,111,33,112,33,113,33,114,33,115,33,116,33,117,33,118,33,119,33,120,33,121,33,122,33,123,33,124,33,125,33,126,34,49,34,50,34,51,34,52,34,53,34,54,34,55,34,56,34,57,34,58,34,59,34,60,34,61,34,62,34,63,34,64,34,65,34,66,34,67,34,68,34,69,34,70,34,71,34,72,34,73,34,74,34,75,34,76,34,77,34,78,34,79,34,80,34,81,34,82,34,83,34,84,34,85,34,86,34,87,34,88,34,89,34,90,34,91,34,92,34,93,34,94,34,95,34,96,34,97,34,98,34,101,34,102,34,103,34,104,34,105,34,106,34,107,34,108,34,109,34,110,34,113,34,114,34,115,34,116,34,117,34,118,34,119,34,120,34,121,34,122,34,123,34,124,33,33,35,33,35,34,35,35,35,36,35,37,35,38,35,39,35,40,35,41,35,42,35,43,35,44,35,45,35,46,35,47,35,48,35,49,35,50,35,51,35,52,35,53,35,54,35,55,35,56,35,57,35,58,35,59,35,60,35,61,35,62,35,63,35,64,35,65,35,66,35,67,35,68,35,69,35,70,35,71,35,72,35,73,35,74,35,75,35,76,35,77,35,78,35,79,35,80,35,81,35,82,35,83,35,84,35,85,35,86,35,87,35,88,35,89,35,90,35,91,35,92,35,93,35,94,35,95,35,96,35,97,35,98,35,99,35,100,35,101,35,102,35,103,35,104,35,105,35,106,35,107,35,108,35,109,35,110,35,111,35,112,35,113,35,114,35,115,35,116,35,117,35,118,35,119,35,120,35,121,35,122,35,123,35,124,35,125,35,126,36,33,36,34,36,35,36,36,36,37,36,38,36,39,36,40,36,41,36,42,36,43,36,44,36,45,36,46,36,47,36,48,36,49,36,50,36,51,36,52,36,53,36,54,36,55,36,56,36,57,36,58,36,59,36,60,36,61,36,62,36,63,36,64,36,65,36,66,36,67,36,68,36,69,36,70,36,71,36,72,36,73,36,74,36,75,36,76,36,77,36,78,36,79,36,80,36,81,36,82,36,83,36,84,36,85,36,86,36,87,36,88,36,89,36,90,36,91,36,92,36,93,36,94,36,95,36,96,36,97,36,98,36,99,36,100,36,101,36,102,36,103,36,104,36,105,36,106,36,107,36,108,36,109,36,110,36,111,36,112,36,113,36,114,36,115,37,33,37,34,37,35,37,36,37,37,37,38,37,39,37,40,37,41,37,42,37,43,37,44,37,45,37,46,37,47,37,48,37,49,37,50,37,51,37,52,37,53,37,54,37,55,37,56,37,57,37,58,37,59,37,60,37,61,37,62,37,63,37,64,37,65,37,66,37,67,37,68,37,69,37,70,37,71,37,72,37,73,37,74,37,75,37,76,37,77,37,78,37,79,37,80,37,81,37,82,37,83,37,84,37,85,37,86,37,87,37,88,37,89,37,90,37,91,37,92,37,93,37,94,37,95,37,96,37,97,37,98,37,99,37,100,37,101,37,102,37,103,37,104,37,105,37,106,37,107,37,108,37,109,37,110,37,111,37,112,37,113,37,114,37,115,37,116,37,117,37,118,38,33,38,34,38,35,38,36,38,37,38,38,38,39,38,40,38,41,38,42,38,43,38,44,38,45,38,46,38,47,38,48,38,49,38,50,38,51,38,52,38,53,38,54,38,55,38,56,38,65,38,66,38,67,38,68,38,69,38,70,38,71,38,72,38,73,38,74,38,75,38,76,38,77,38,78,38,79,38,80,38,81,38,82,38,83,38,84,38,85,38,86,38,87,38,88,39,33,39,34,39,35,39,36,39,37,39,38,39,39,39,40,39,41,39,42,39,43,39,44,39,45,39,46,39,47,39,48,39,49,39,50,39,51,39,52,39,53,39,54,39,55,39,56,39,57,39,58,39,59,39,60,39,61,39,62,39,63,39,64,39,65,39,81,39,82,39,83,39,84,39,85,39,86,39,87,39,88,39,89,39,90,39,91,39,92,39,93,39,94,39,95,39,96,39,97,39,98,39,99,39,100,39,101,39,102,39,103,39,104,39,105,39,106,39,107,39,108,39,109,39,110,39,111,39,112,39,113,40,33,40,34,40,35,40,36,40,37,40,38,40,39,40,40,40,41,40,42,40,43,40,44,40,45,40,46,40,47,40,48,40,49,40,50,40,51,40,52,40,53,40,54,40,55,40,56,40,57,40,58,40,69,40,70,40,71,40,72,40,73,40,74,40,75,40,76,40,77,40,78,40,79,40,80,40,81,40,82,40,83,40,84,40,85,40,86,40,87,40,88,40,89,40,90,40,91,40,92,40,93,40,94,40,95,40,96,40,97,40,98,40,99,40,100,40,101,40,102,40,103,40,104,40,105,41,36,41,37,41,38,41,39,41,40,41,41,41,42,41,43,41,44,41,45,41,46,41,47,41,48,41,49,41,50,41,51,41,52,41,53,41,54,41,55,41,56,41,57,41,58,41,59,41,60,41,61,41,62,41,63,41,64,41,65,41,66,41,67,41,68,41,69,41,70,41,71,41,72,41,73,41,74,41,75,41,76,41,77,41,78,41,79,41,80,41,81,41,82,41,83,41,84,41,85,41,86,41,87,41,88,41,89,41,90,41,91,41,92,41,93,41,94,41,95,41,96,41,97,41,98,41,99,41,100,41,101,41,102,41,103,41,104,41,105,41,106,41,107,41,108,41,109,41,110,41,111,48,33,48,34,48,35,48,36,48,37,48,38,48,39,48,40,48,41,48,42,48,43,48,44,48,45,48,46,48,47,48,48,48,49,48,50,48,51,48,52,48,53,48,54,48,55,48,56,48,57,48,58,48,59,48,60,48,61,48,62,48,63,48,64,48,65,48,66,48,67,48,68,48,69,48,70,48,71,48,72,48,73,48,74,48,75,48,76,48,77,48,78,48,79,48,80,48,81,48,82,48,83,48,84,48,85,48,86,48,87,48,88,48,89,48,90,48,91,48,92,48,93,48,94,48,95,48,96,48,97,48,98,48,99,48,100,48,101,48,102,48,103,48,104,48,105,48,106,48,107,48,108,48,109,48,110,48,111,48,112,48,113,48,114,48,115,48,116,48,117,48,118,48,119,48,120,48,121,48,122,48,123,48,124,48,125,48,126,49,33,49,34,49,35,49,36,49,37,49,38,49,39,49,40,49,41,49,42,49,43,49,44,49,45,49,46,49,47,49,48,49,49,49,50,49,51,49,52,49,53,49,54,49,55,49,56,49,57,49,58,49,59,49,60,49,61,49,62,49,63,49,64,49,65,49,66,49,67,49,68,49,69,49,70,49,71,49,72,49,73,49,74,49,75,49,76,49,77,49,78,49,79,49,80,49,81,49,82,49,83,49,84,49,85,49,86,49,87,49,88,49,89,49,90,49,91,49,92,49,93,49,94,49,95,49,96,49,97,49,98,49,99,49,100,49,101,49,102,49,103,49,104,49,105,49,106,49,107,49,108,49,109,49,110,49,111,49,112,49,113,49,114,49,115,49,116,49,117,49,118,49,119,49,120,49,121,49,122,49,123,49,124,49,125,49,126,50,33,50,34,50,35,50,36,50,37,50,38,50,39,50,40,50,41,50,42,50,43,50,44,50,45,50,46,50,47,50,48,50,49,50,50,50,51,50,52,50,53,50,54,50,55,50,56,50,57,50,58,50,59,50,60,50,61,50,62,50,63,50,64,50,65,50,66,50,67,50,68,50,69,50,70,50,71,50,72,50,73,50,74,50,75,50,76,50,77,50,78,50,79,50,80,50,81,50,82,50,83,50,84,50,85,50,86,50,87,50,88,50,89,50,90,50,91,50,92,50,93,50,94,50,95,50,96,50,97,50,98,50,99,50,100,50,101,50,102,50,103,50,104,50,105,50,106,50,107,50,108,50,109,50,110,50,111,50,112,50,113,50,114,50,115,50,116,50,117,50,118,50,119,50,120,50,121,50,122,50,123,50,124,50,125,50,126,51,33,51,34,51,35,51,36,51,37,51,38,51,39,51,40,51,41,51,42,51,43,51,44,51,45,51,46,51,47,51,48,51,49,51,50,51,51,51,52,51,53,51,54,51,55,51,56,51,57,51,58,51,59,51,60,51,61,51,62,51,63,51,64,51,65,51,66,51,67,51,68,51,69,51,70,51,71,51,72,51,73,51,74,51,75,51,76,51,77,51,78,51,79,51,80,51,81,51,82,51,83,51,84,51,85,51,86,51,87,51,88,51,89,51,90,51,91,51,92,51,93,51,94,51,95,51,96,51,97,51,98,51,99,51,100,51,101,51,102,51,103,51,104,51,105,51,106,51,107,51,108,51,109,51,110,51,111,51,112,51,113,51,114,51,115,51,116,51,117,51,118,51,119,51,120,51,121,51,122,51,123,51,124,51,125,51,126,52,33,52,34,52,35,52,36,52,37,52,38,52,39,52,40,52,41,52,42,52,43,52,44,52,45,52,46,52,47,52,48,52,49,52,50,52,51,52,52,52,53,52,54,52,55,52,56,52,57,52,58,52,59,52,60,52,61,52,62,52,63,52,64,52,65,52,66,52,67,52,68,52,69,52,70,52,71,52,72,52,73,52,74,52,75,52,76,52,77,52,78,52,79,52,80,52,81,52,82,52,83,52,84,52,85,52,86,52,87,52,88,52,89,52,90,52,91,52,92,52,93,52,94,52,95,52,96,52,97,52,98,52,99,52,100,52,101,52,102,52,103,52,104,52,105,52,106,52,107,52,108,52,109,52,110,52,111,52,112,52,113,52,114,52,115,52,116,52,117,52,118,52,119,52,120,52,121,52,122,52,123,52,124,52,125,52,126,53,33,53,34,53,35,53,36,53,37,53,38,53,39,53,40,53,41,53,42,53,43,53,44,53,45,53,46,53,47,53,48,53,49,53,50,53,51,53,52,53,53,53,54,53,55,53,56,53,57,53,58,53,59,53,60,53,61,53,62,53,63,53,64,53,65,53,66,53,67,53,68,53,69,53,70,53,71,53,72,53,73,53,74,53,75,53,76,53,77,53,78,53,79,53,80,53,81,53,82,53,83,53,84,53,85,53,86,53,87,53,88,53,89,53,90,53,91,53,92,53,93,53,94,53,95,53,96,53,97,53,98,53,99,53,100,53,101,53,102,53,103,53,104,53,105,53,106,53,107,53,108,53,109,53,110,53,111,53,112,53,113,53,114,53,115,53,116,53,117,53,118,53,119,53,120,53,121,53,122,53,123,53,124,53,125,53,126,54,33,54,34,54,35,54,36,54,37,54,38,54,39,54,40,54,41,54,42,54,43,54,44,54,45,54,46,54,47,54,48,54,49,54,50,54,51,54,52,54,53,54,54,54,55,54,56,54,57,54,58,54,59,54,60,54,61,54,62,54,63,54,64,54,65,54,66,54,67,54,68,54,69,54,70,54,71,54,72,54,73,54,74,54,75,54,76,54,77,54,78,54,79,54,80,54,81,54,82,54,83,54,84,54,85,54,86,54,87,54,88,54,89,54,90,54,91,54,92,54,93,54,94,54,95,54,96,54,97,54,98,54,99,54,100,54,101,54,102,54,103,54,104,54,105,54,106,54,107,54,108,54,109,54,110,54,111,54,112,54,113,54,114,54,115,54,116,54,117,54,118,54,119,54,120,54,121,54,122,54,123,54,124,54,125,54,126,55,33,55,34,55,35,55,36,55,37,55,38,55,39,55,40,55,41,55,42,55,43,55,44,55,45,55,46,55,47,55,48,55,49,55,50,55,51,55,52,55,53,55,54,55,55,55,56,55,57,55,58,55,59,55,60,55,61,55,62,55,63,55,64,55,65,55,66,55,67,55,68,55,69,55,70,55,71,55,72,55,73,55,74,55,75,55,76,55,77,55,78,55,79,55,80,55,81,55,82,55,83,55,84,55,85,55,86,55,87,55,88,55,89,55,90,55,91,55,92,55,93,55,94,55,95,55,96,55,97,55,98,55,99,55,100,55,101,55,102,55,103,55,104,55,105,55,106,55,107,55,108,55,109,55,110,55,111,55,112,55,113,55,114,55,115,55,116,55,117,55,118,55,119,55,120,55,121,55,122,55,123,55,124,55,125,55,126,56,33,56,34,56,35,56,36,56,37,56,38,56,39,56,40,56,41,56,42,56,43,56,44,56,45,56,46,56,47,56,48,56,49,56,50,56,51,56,52,56,53,56,54,56,55,56,56,56,57,56,58,56,59,56,60,56,61,56,62,56,63,56,64,56,65,56,66,56,67,56,68,56,69,56,70,56,71,56,72,56,73,56,74,56,75,56,76,56,77,56,78,56,79,56,80,56,81,56,82,56,83,56,84,56,85,56,86,56,87,56,88,56,89,56,90,56,91,56,92,56,93,56,94,56,95,56,96,56,97,56,98,56,99,56,100,56,101,56,102,56,103,56,104,56,105,56,106,56,107,56,108,56,109,56,110,56,111,56,112,56,113,56,114,56,115,56,116,56,117,56,118,56,119,56,120,56,121,56,122,56,123,56,124,56,125,56,126,57,33,57,34,57,35,57,36,57,37,57,38,57,39,57,40,57,41,57,42,57,43,57,44,57,45,57,46,57,47,57,48,57,49,57,50,57,51,57,52,57,53,57,54,57,55,57,56,57,57,57,58,57,59,57,60,57,61,57,62,57,63,57,64,57,65,57,66,57,67,57,68,57,69,57,70,57,71,57,72,57,73,57,74,57,75,57,76,57,77,57,78,57,79,57,80,57,81,57,82,57,83,57,84,57,85,57,86,57,87,57,88,57,89,57,90,57,91,57,92,57,93,57,94,57,95,57,96,57,97,57,98,57,99,57,100,57,101,57,102,57,103,57,104,57,105,57,106,57,107,57,108,57,109,57,110,57,111,57,112,57,113,57,114,57,115,57,116,57,117,57,118,57,119,57,120,57,121,57,122,57,123,57,124,57,125,57,126,58,33,58,34,58,35,58,36,58,37,58,38,58,39,58,40,58,41,58,42,58,43,58,44,58,45,58,46,58,47,58,48,58,49,58,50,58,51,58,52,58,53,58,54,58,55,58,56,58,57,58,58,58,59,58,60,58,61,58,62,58,63,58,64,58,65,58,66,58,67,58,68,58,69,58,70,58,71,58,72,58,73,58,74,58,75,58,76,58,77,58,78,58,79,58,80,58,81,58,82,58,83,58,84,58,85,58,86,58,87,58,88,58,89,58,90,58,91,58,92,58,93,58,94,58,95,58,96,58,97,58,98,58,99,58,100,58,101,58,102,58,103,58,104,58,105,58,106,58,107,58,108,58,109,58,110,58,111,58,112,58,113,58,114,58,115,58,116,58,117,58,118,58,119,58,120,58,121,58,122,58,123,58,124,58,125,58,126,59,33,59,34,59,35,59,36,59,37,59,38,59,39,59,40,59,41,59,42,59,43,59,44,59,45,59,46,59,47,59,48,59,49,59,50,59,51,59,52,59,53,59,54,59,55,59,56,59,57,59,58,59,59,59,60,59,61,59,62,59,63,59,64,59,65,59,66,59,67,59,68,59,69,59,70,59,71,59,72,59,73,59,74,59,75,59,76,59,77,59,78,59,79,59,80,59,81,59,82,59,83,59,84,59,85,59,86,59,87,59,88,59,89,59,90,59,91,59,92,59,93,59,94,59,95,59,96,59,97,59,98,59,99,59,100,59,101,59,102,59,103,59,104,59,105,59,106,59,107,59,108,59,109,59,110,59,111,59,112,59,113,59,114,59,115,59,116,59,117,59,118,59,119,59,120,59,121,59,122,59,123,59,124,59,125,59,126,60,33,60,34,60,35,60,36,60,37,60,38,60,39,60,40,60,41,60,42,60,43,60,44,60,45,60,46,60,47,60,48,60,49,60,50,60,51,60,52,60,53,60,54,60,55,60,56,60,57,60,58,60,59,60,60,60,61,60,62,60,63,60,64,60,65,60,66,60,67,60,68,60,69,60,70,60,71,60,72,60,73,60,74,60,75,60,76,60,77,60,78,60,79,60,80,60,81,60,82,60,83,60,84,60,85,60,86,60,87,60,88,60,89,60,90,60,91,60,92,60,93,60,94,60,95,60,96,60,97,60,98,60,99,60,100,60,101,60,102,60,103,60,104,60,105,60,106,60,107,60,108,60,109,60,110,60,111,60,112,60,113,60,114,60,115,60,116,60,117,60,118,60,119,60,120,60,121,60,122,60,123,60,124,60,125,60,126,61,33,61,34,61,35,61,36,61,37,61,38,61,39,61,40,61,41,61,42,61,43,61,44,61,45,61,46,61,47,61,48,61,49,61,50,61,51,61,52,61,53,61,54,61,55,61,56,61,57,61,58,61,59,61,60,61,61,61,62,61,63,61,64,61,65,61,66,61,67,61,68,61,69,61,70,61,71,61,72,61,73,61,74,61,75,61,76,61,77,61,78,61,79,61,80,61,81,61,82,61,83,61,84,61,85,61,86,61,87,61,88,61,89,61,90,61,91,61,92,61,93,61,94,61,95,61,96,61,97,61,98,61,99,61,100,61,101,61,102,61,103,61,104,61,105,61,106,61,107,61,108,61,109,61,110,61,111,61,112,61,113,61,114,61,115,61,116,61,117,61,118,61,119,61,120,61,121,61,122,61,123,61,124,61,125,61,126,62,33,62,34,62,35,62,36,62,37,62,38,62,39,62,40,62,41,62,42,62,43,62,44,62,45,62,46,62,47,62,48,62,49,62,50,62,51,62,52,62,53,62,54,62,55,62,56,62,57,62,58,62,59,62,60,62,61,62,62,62,63,62,64,62,65,62,66,62,67,62,68,62,69,62,70,62,71,62,72,62,73,62,74,62,75,62,76,62,77,62,78,62,79,62,80,62,81,62,82,62,83,62,84,62,85,62,86,62,87,62,88,62,89,62,90,62,91,62,92,62,93,62,94,62,95,62,96,62,97,62,98,62,99,62,100,62,101,62,102,62,103,62,104,62,105,62,106,62,107,62,108,62,109,62,110,62,111,62,112,62,113,62,114,62,115,62,116,62,117,62,118,62,119,62,120,62,121,62,122,62,123,62,124,62,125,62,126,63,33,63,34,63,35,63,36,63,37,63,38,63,39,63,40,63,41,63,42,63,43,63,44,63,45,63,46,63,47,63,48,63,49,63,50,63,51,63,52,63,53,63,54,63,55,63,56,63,57,63,58,63,59,63,60,63,61,63,62,63,63,63,64,63,65,63,66,63,67,63,68,63,69,63,70,63,71,63,72,63,73,63,74,63,75,63,76,63,77,63,78,63,79,63,80,63,81,63,82,63,83,63,84,63,85,63,86,63,87,63,88,63,89,63,90,63,91,63,92,63,93,63,94,63,95,63,96,63,97,63,98,63,99,63,100,63,101,63,102,63,103,63,104,63,105,63,106,63,107,63,108,63,109,63,110,63,111,63,112,63,113,63,114,63,115,63,116,63,117,63,118,63,119,63,120,63,121,63,122,63,123,63,124,63,125,63,126,64,33,64,34,64,35,64,36,64,37,64,38,64,39,64,40,64,41,64,42,64,43,64,44,64,45,64,46,64,47,64,48,64,49,64,50,64,51,64,52,64,53,64,54,64,55,64,56,64,57,64,58,64,59,64,60,64,61,64,62,64,63,64,64,64,65,64,66,64,67,64,68,64,69,64,70,64,71,64,72,64,73,64,74,64,75,64,76,64,77,64,78,64,79,64,80,64,81,64,82,64,83,64,84,64,85,64,86,64,87,64,88,64,89,64,90,64,91,64,92,64,93,64,94,64,95,64,96,64,97,64,98,64,99,64,100,64,101,64,102,64,103,64,104,64,105,64,106,64,107,64,108,64,109,64,110,64,111,64,112,64,113,64,114,64,115,64,116,64,117,64,118,64,119,64,120,64,121,64,122,64,123,64,124,64,125,64,126,65,33,65,34,65,35,65,36,65,37,65,38,65,39,65,40,65,41,65,42,65,43,65,44,65,45,65,46,65,47,65,48,65,49,65,50,65,51,65,52,65,53,65,54,65,55,65,56,65,57,65,58,65,59,65,60,65,61,65,62,65,63,65,64,65,65,65,66,65,67,65,68,65,69,65,70,65,71,65,72,65,73,65,74,65,75,65,76,65,77,65,78,65,79,65,80,65,81,65,82,65,83,65,84,65,85,65,86,65,87,65,88,65,89,65,90,65,91,65,92,65,93,65,94,65,95,65,96,65,97,65,98,65,99,65,100,65,101,65,102,65,103,65,104,65,105,65,106,65,107,65,108,65,109,65,110,65,111,65,112,65,113,65,114,65,115,65,116,65,117,65,118,65,119,65,120,65,121,65,122,65,123,65,124,65,125,65,126,66,33,66,34,66,35,66,36,66,37,66,38,66,39,66,40,66,41,66,42,66,43,66,44,66,45,66,46,66,47,66,48,66,49,66,50,66,51,66,52,66,53,66,54,66,55,66,56,66,57,66,58,66,59,66,60,66,61,66,62,66,63,66,64,66,65,66,66,66,67,66,68,66,69,66,70,66,71,66,72,66,73,66,74,66,75,66,76,66,77,66,78,66,79,66,80,66,81,66,82,66,83,66,84,66,85,66,86,66,87,66,88,66,89,66,90,66,91,66,92,66,93,66,94,66,95,66,96,66,97,66,98,66,99,66,100,66,101,66,102,66,103,66,104,66,105,66,106,66,107,66,108,66,109,66,110,66,111,66,112,66,113,66,114,66,115,66,116,66,117,66,118,66,119,66,120,66,121,66,122,66,123,66,124,66,125,66,126,67,33,67,34,67,35,67,36,67,37,67,38,67,39,67,40,67,41,67,42,67,43,67,44,67,45,67,46,67,47,67,48,67,49,67,50,67,51,67,52,67,53,67,54,67,55,67,56,67,57,67,58,67,59,67,60,67,61,67,62,67,63,67,64,67,65,67,66,67,67,67,68,67,69,67,70,67,71,67,72,67,73,67,74,67,75,67,76,67,77,67,78,67,79,67,80,67,81,67,82,67,83,67,84,67,85,67,86,67,87,67,88,67,89,67,90,67,91,67,92,67,93,67,94,67,95,67,96,67,97,67,98,67,99,67,100,67,101,67,102,67,103,67,104,67,105,67,106,67,107,67,108,67,109,67,110,67,111,67,112,67,113,67,114,67,115,67,116,67,117,67,118,67,119,67,120,67,121,67,122,67,123,67,124,67,125,67,126,68,33,68,34,68,35,68,36,68,37,68,38,68,39,68,40,68,41,68,42,68,43,68,44,68,45,68,46,68,47,68,48,68,49,68,50,68,51,68,52,68,53,68,54,68,55,68,56,68,57,68,58,68,59,68,60,68,61,68,62,68,63,68,64,68,65,68,66,68,67,68,68,68,69,68,70,68,71,68,72,68,73,68,74,68,75,68,76,68,77,68,78,68,79,68,80,68,81,68,82,68,83,68,84,68,85,68,86,68,87,68,88,68,89,68,90,68,91,68,92,68,93,68,94,68,95,68,96,68,97,68,98,68,99,68,100,68,101,68,102,68,103,68,104,68,105,68,106,68,107,68,108,68,109,68,110,68,111,68,112,68,113,68,114,68,115,68,116,68,117,68,118,68,119,68,120,68,121,68,122,68,123,68,124,68,125,68,126,69,33,69,34,69,35,69,36,69,37,69,38,69,39,69,40,69,41,69,42,69,43,69,44,69,45,69,46,69,47,69,48,69,49,69,50,69,51,69,52,69,53,69,54,69,55,69,56,69,57,69,58,69,59,69,60,69,61,69,62,69,63,69,64,69,65,69,66,69,67,69,68,69,69,69,70,69,71,69,72,69,73,69,74,69,75,69,76,69,77,69,78,69,79,69,80,69,81,69,82,69,83,69,84,69,85,69,86,69,87,69,88,69,89,69,90,69,91,69,92,69,93,69,94,69,95,69,96,69,97,69,98,69,99,69,100,69,101,69,102,69,103,69,104,69,105,69,106,69,107,69,108,69,109,69,110,69,111,69,112,69,113,69,114,69,115,69,116,69,117,69,118,69,119,69,120,69,121,69,122,69,123,69,124,69,125,69,126,70,33,70,34,70,35,70,36,70,37,70,38,70,39,70,40,70,41,70,42,70,43,70,44,70,45,70,46,70,47,70,48,70,49,70,50,70,51,70,52,70,53,70,54,70,55,70,56,70,57,70,58,70,59,70,60,70,61,70,62,70,63,70,64,70,65,70,66,70,67,70,68,70,69,70,70,70,71,70,72,70,73,70,74,70,75,70,76,70,77,70,78,70,79,70,80,70,81,70,82,70,83,70,84,70,85,70,86,70,87,70,88,70,89,70,90,70,91,70,92,70,93,70,94,70,95,70,96,70,97,70,98,70,99,70,100,70,101,70,102,70,103,70,104,70,105,70,106,70,107,70,108,70,109,70,110,70,111,70,112,70,113,70,114,70,115,70,116,70,117,70,118,70,119,70,120,70,121,70,122,70,123,70,124,70,125,70,126,71,33,71,34,71,35,71,36,71,37,71,38,71,39,71,40,71,41,71,42,71,43,71,44,71,45,71,46,71,47,71,48,71,49,71,50,71,51,71,52,71,53,71,54,71,55,71,56,71,57,71,58,71,59,71,60,71,61,71,62,71,63,71,64,71,65,71,66,71,67,71,68,71,69,71,70,71,71,71,72,71,73,71,74,71,75,71,76,71,77,71,78,71,79,71,80,71,81,71,82,71,83,71,84,71,85,71,86,71,87,71,88,71,89,71,90,71,91,71,92,71,93,71,94,71,95,71,96,71,97,71,98,71,99,71,100,71,101,71,102,71,103,71,104,71,105,71,106,71,107,71,108,71,109,71,110,71,111,71,112,71,113,71,114,71,115,71,116,71,117,71,118,71,119,71,120,71,121,71,122,71,123,71,124,71,125,71,126,72,33,72,34,72,35,72,36,72,37,72,38,72,39,72,40,72,41,72,42,72,43,72,44,72,45,72,46,72,47,72,48,72,49,72,50,72,51,72,52,72,53,72,54,72,55,72,56,72,57,72,58,72,59,72,60,72,61,72,62,72,63,72,64,72,65,72,66,72,67,72,68,72,69,72,70,72,71,72,72,72,73,72,74,72,75,72,76,72,77,72,78,72,79,72,80,72,81,72,82,72,83,72,84,72,85,72,86,72,87,72,88,72,89,72,90,72,91,72,92,72,93,72,94,72,95,72,96,72,97,72,98,72,99,72,100,72,101,72,102,72,103,72,104,72,105,72,106,72,107,72,108,72,109,72,110,72,111,72,112,72,113,72,114,72,115,72,116,72,117,72,118,72,119,72,120,72,121,72,122,72,123,72,124,72,125,72,126,73,33,73,34,73,35,73,36,73,37,73,38,73,39,73,40,73,41,73,42,73,43,73,44,73,45,73,46,73,47,73,48,73,49,73,50,73,51,73,52,73,53,73,54,73,55,73,56,73,57,73,58,73,59,73,60,73,61,73,62,73,63,73,64,73,65,73,66,73,67,73,68,73,69,73,70,73,71,73,72,73,73,73,74,73,75,73,76,73,77,73,78,73,79,73,80,73,81,73,82,73,83,73,84,73,85,73,86,73,87,73,88,73,89,73,90,73,91,73,92,73,93,73,94,73,95,73,96,73,97,73,98,73,99,73,100,73,101,73,102,73,103,73,104,73,105,73,106,73,107,73,108,73,109,73,110,73,111,73,112,73,113,73,114,73,115,73,116,73,117,73,118,73,119,73,120,73,121,73,122,73,123,73,124,73,125,73,126,74,33,74,34,74,35,74,36,74,37,74,38,74,39,74,40,74,41,74,42,74,43,74,44,74,45,74,46,74,47,74,48,74,49,74,50,74,51,74,52,74,53,74,54,74,55,74,56,74,57,74,58,74,59,74,60,74,61,74,62,74,63,74,64,74,65,74,66,74,67,74,68,74,69,74,70,74,71,74,72,74,73,74,74,74,75,74,76,74,77,74,78,74,79,74,80,74,81,74,82,74,83,74,84,74,85,74,86,74,87,74,88,74,89,74,90,74,91,74,92,74,93,74,94,74,95,74,96,74,97,74,98,74,99,74,100,74,101,74,102,74,103,74,104,74,105,74,106,74,107,74,108,74,109,74,110,74,111,74,112,74,113,74,114,74,115,74,116,74,117,74,118,74,119,74,120,74,121,74,122,74,123,74,124,74,125,74,126,75,33,75,34,75,35,75,36,75,37,75,38,75,39,75,40,75,41,75,42,75,43,75,44,75,45,75,46,75,47,75,48,75,49,75,50,75,51,75,52,75,53,75,54,75,55,75,56,75,57,75,58,75,59,75,60,75,61,75,62,75,63,75,64,75,65,75,66,75,67,75,68,75,69,75,70,75,71,75,72,75,73,75,74,75,75,75,76,75,77,75,78,75,79,75,80,75,81,75,82,75,83,75,84,75,85,75,86,75,87,75,88,75,89,75,90,75,91,75,92,75,93,75,94,75,95,75,96,75,97,75,98,75,99,75,100,75,101,75,102,75,103,75,104,75,105,75,106,75,107,75,108,75,109,75,110,75,111,75,112,75,113,75,114,75,115,75,116,75,117,75,118,75,119,75,120,75,121,75,122,75,123,75,124,75,125,75,126,76,33,76,34,76,35,76,36,76,37,76,38,76,39,76,40,76,41,76,42,76,43,76,44,76,45,76,46,76,47,76,48,76,49,76,50,76,51,76,52,76,53,76,54,76,55,76,56,76,57,76,58,76,59,76,60,76,61,76,62,76,63,76,64,76,65,76,66,76,67,76,68,76,69,76,70,76,71,76,72,76,73,76,74,76,75,76,76,76,77,76,78,76,79,76,80,76,81,76,82,76,83,76,84,76,85,76,86,76,87,76,88,76,89,76,90,76,91,76,92,76,93,76,94,76,95,76,96,76,97,76,98,76,99,76,100,76,101,76,102,76,103,76,104,76,105,76,106,76,107,76,108,76,109,76,110,76,111,76,112,76,113,76,114,76,115,76,116,76,117,76,118,76,119,76,120,76,121,76,122,76,123,76,124,76,125,76,126,77,33,77,34,77,35,77,36,77,37,77,38,77,39,77,40,77,41,77,42,77,43,77,44,77,45,77,46,77,47,77,48,77,49,77,50,77,51,77,52,77,53,77,54,77,55,77,56,77,57,77,58,77,59,77,60,77,61,77,62,77,63,77,64,77,65,77,66,77,67,77,68,77,69,77,70,77,71,77,72,77,73,77,74,77,75,77,76,77,77,77,78,77,79,77,80,77,81,77,82,77,83,77,84,77,85,77,86,77,87,77,88,77,89,77,90,77,91,77,92,77,93,77,94,77,95,77,96,77,97,77,98,77,99,77,100,77,101,77,102,77,103,77,104,77,105,77,106,77,107,77,108,77,109,77,110,77,111,77,112,77,113,77,114,77,115,77,116,77,117,77,118,77,119,77,120,77,121,77,122,77,123,77,124,77,125,77,126,78,33,78,34,78,35,78,36,78,37,78,38,78,39,78,40,78,41,78,42,78,43,78,44,78,45,78,46,78,47,78,48,78,49,78,50,78,51,78,52,78,53,78,54,78,55,78,56,78,57,78,58,78,59,78,60,78,61,78,62,78,63,78,64,78,65,78,66,78,67,78,68,78,69,78,70,78,71,78,72,78,73,78,74,78,75,78,76,78,77,78,78,78,79,78,80,78,81,78,82,78,83,78,84,78,85,78,86,78,87,78,88,78,89,78,90,78,91,78,92,78,93,78,94,78,95,78,96,78,97,78,98,78,99,78,100,78,101,78,102,78,103,78,104,78,105,78,106,78,107,78,108,78,109,78,110,78,111,78,112,78,113,78,114,78,115,78,116,78,117,78,118,78,119,78,120,78,121,78,122,78,123,78,124,78,125,78,126,79,33,79,34,79,35,79,36,79,37,79,38,79,39,79,40,79,41,79,42,79,43,79,44,79,45,79,46,79,47,79,48,79,49,79,50,79,51,79,52,79,53,79,54,79,55,79,56,79,57,79,58,79,59,79,60,79,61,79,62,79,63,79,64,79,65,79,66,79,67,79,68,79,69,79,70,79,71,79,72,79,73,79,74,79,75,79,76,79,77,79,78,79,79,79,80,79,81,79,82,79,83,79,84,79,85,79,86,79,87,79,88,79,89,79,90,79,91,79,92,79,93,79,94,79,95,79,96,79,97,79,98,79,99,79,100,79,101,79,102,79,103,79,104,79,105,79,106,79,107,79,108,79,109,79,110,79,111,79,112,79,113,79,114,79,115,79,116,79,117,79,118,79,119,79,120,79,121,79,122,79,123,79,124,79,125,79,126,80,33,80,34,80,35,80,36,80,37,80,38,80,39,80,40,80,41,80,42,80,43,80,44,80,45,80,46,80,47,80,48,80,49,80,50,80,51,80,52,80,53,80,54,80,55,80,56,80,57,80,58,80,59,80,60,80,61,80,62,80,63,80,64,80,65,80,66,80,67,80,68,80,69,80,70,80,71,80,72,80,73,80,74,80,75,80,76,80,77,80,78,80,79,80,80,80,81,80,82,80,83,80,84,80,85,80,86,80,87,80,88,80,89,80,90,80,91,80,92,80,93,80,94,80,95,80,96,80,97,80,98,80,99,80,100,80,101,80,102,80,103,80,104,80,105,80,106,80,107,80,108,80,109,80,110,80,111,80,112,80,113,80,114,80,115,80,116,80,117,80,118,80,119,80,120,80,121,80,122,80,123,80,124,80,125,80,126,81,33,81,34,81,35,81,36,81,37,81,38,81,39,81,40,81,41,81,42,81,43,81,44,81,45,81,46,81,47,81,48,81,49,81,50,81,51,81,52,81,53,81,54,81,55,81,56,81,57,81,58,81,59,81,60,81,61,81,62,81,63,81,64,81,65,81,66,81,67,81,68,81,69,81,70,81,71,81,72,81,73,81,74,81,75,81,76,81,77,81,78,81,79,81,80,81,81,81,82,81,83,81,84,81,85,81,86,81,87,81,88,81,89,81,90,81,91,81,92,81,93,81,94,81,95,81,96,81,97,81,98,81,99,81,100,81,101,81,102,81,103,81,104,81,105,81,106,81,107,81,108,81,109,81,110,81,111,81,112,81,113,81,114,81,115,81,116,81,117,81,118,81,119,81,120,81,121,81,122,81,123,81,124,81,125,81,126,82,33,82,34,82,35,82,36,82,37,82,38,82,39,82,40,82,41,82,42,82,43,82,44,82,45,82,46,82,47,82,48,82,49,82,50,82,51,82,52,82,53,82,54,82,55,82,56,82,57,82,58,82,59,82,60,82,61,82,62,82,63,82,64,82,65,82,66,82,67,82,68,82,69,82,70,82,71,82,72,82,73,82,74,82,75,82,76,82,77,82,78,82,79,82,80,82,81,82,82,82,83,82,84,82,85,82,86,82,87,82,88,82,89,82,90,82,91,82,92,82,93,82,94,82,95,82,96,82,97,82,98,82,99,82,100,82,101,82,102,82,103,82,104,82,105,82,106,82,107,82,108,82,109,82,110,82,111,82,112,82,113,82,114,82,115,82,116,82,117,82,118,82,119,82,120,82,121,82,122,82,123,82,124,82,125,82,126,83,33,83,34,83,35,83,36,83,37,83,38,83,39,83,40,83,41,83,42,83,43,83,44,83,45,83,46,83,47,83,48,83,49,83,50,83,51,83,52,83,53,83,54,83,55,83,56,83,57,83,58,83,59,83,60,83,61,83,62,83,63,83,64,83,65,83,66,83,67,83,68,83,69,83,70,83,71,83,72,83,73,83,74,83,75,83,76,83,77,83,78,83,79,83,80,83,81,83,82,83,83,83,84,83,85,83,86,83,87,83,88,83,89,83,90,83,91,83,92,83,93,83,94,83,95,83,96,83,97,83,98,83,99,83,100,83,101,83,102,83,103,83,104,83,105,83,106,83,107,83,108,83,109,83,110,83,111,83,112,83,113,83,114,83,115,83,116,83,117,83,118,83,119,83,120,83,121,83,122,83,123,83,124,83,125,83,126,84,33,84,34,84,35,84,36,84,37,84,38,84,39,84,40,84,41,84,42,84,43,84,44,84,45,84,46,84,47,84,48,84,49,84,50,84,51,84,52,84,53,84,54,84,55,84,56,84,57,84,58,84,59,84,60,84,61,84,62,84,63,84,64,84,65,84,66,84,67,84,68,84,69,84,70,84,71,84,72,84,73,84,74,84,75,84,76,84,77,84,78,84,79,84,80,84,81,84,82,84,83,84,84,84,85,84,86,84,87,84,88,84,89,84,90,84,91,84,92,84,93,84,94,84,95,84,96,84,97,84,98,84,99,84,100,84,101,84,102,84,103,84,104,84,105,84,106,84,107,84,108,84,109,84,110,84,111,84,112,84,113,84,114,84,115,84,116,84,117,84,118,84,119,84,120,84,121,84,122,84,123,84,124,84,125,84,126,85,33,85,34,85,35,85,36,85,37,85,38,85,39,85,40,85,41,85,42,85,43,85,44,85,45,85,46,85,47,85,48,85,49,85,50,85,51,85,52,85,53,85,54,85,55,85,56,85,57,85,58,85,59,85,60,85,61,85,62,85,63,85,64,85,65,85,66,85,67,85,68,85,69,85,70,85,71,85,72,85,73,85,74,85,75,85,76,85,77,85,78,85,79,85,80,85,81,85,82,85,83,85,84,85,85,85,86,85,87,85,88,85,89,85,90,85,91,85,92,85,93,85,94,85,95,85,96,85,97,85,98,85,99,85,100,85,101,85,102,85,103,85,104,85,105,85,106,85,107,85,108,85,109,85,110,85,111,85,112,85,113,85,114,85,115,85,116,85,117,85,118,85,119,85,120,85,121,85,122,85,123,85,124,85,125,85,126,86,33,86,34,86,35,86,36,86,37,86,38,86,39,86,40,86,41,86,42,86,43,86,44,86,45,86,46,86,47,86,48,86,49,86,50,86,51,86,52,86,53,86,54,86,55,86,56,86,57,86,58,86,59,86,60,86,61,86,62,86,63,86,64,86,65,86,66,86,67,86,68,86,69,86,70,86,71,86,72,86,73,86,74,86,75,86,76,86,77,86,78,86,79,86,80,86,81,86,82,86,83,86,84,86,85,86,86,86,87,86,88,86,89,86,90,86,91,86,92,86,93,86,94,86,95,86,96,86,97,86,98,86,99,86,100,86,101,86,102,86,103,86,104,86,105,86,106,86,107,86,108,86,109,86,110,86,111,86,112,86,113,86,114,86,115,86,116,86,117,86,118,86,119,86,120,86,121,86,122,86,123,86,124,86,125,86,126,87,33,87,34,87,35,87,36,87,37,87,38,87,39,87,40,87,41,87,42,87,43,87,44,87,45,87,46,87,47,87,48,87,49,87,50,87,51,87,52,87,53,87,54,87,55,87,56,87,57,87,58,87,59,87,60,87,61,87,62,87,63,87,64,87,65,87,66,87,67,87,68,87,69,87,70,87,71,87,72,87,73,87,74,87,75,87,76,87,77,87,78,87,79,87,80,87,81,87,82,87,83,87,84,87,85,87,86,87,87,87,88,87,89,87,90,87,91,87,92,87,93,87,94,87,95,87,96,87,97,87,98,87,99,87,100,87,101,87,102,87,103,87,104,87,105,87,106,87,107,87,108,87,109,87,110,87,111,87,112,87,113,87,114,87,115,87,116,87,117,87,118,87,119,87,120,87,121,88,33,88,34,88,35,88,36,88,37,88,38,88,39,88,40,88,41,88,42,88,43,88,44,88,45,88,46,88,47,88,48,88,49,88,50,88,51,88,52,88,53,88,54,88,55,88,56,88,57,88,58,88,59,88,60,88,61,88,62,88,63,88,64,88,65,88,66,88,67,88,68,88,69,88,70,88,71,88,72,88,73,88,74,88,75,88,76,88,77,88,78,88,79,88,80,88,81,88,82,88,83,88,84,88,85,88,86,88,87,88,88,88,89,88,90,88,91,88,92,88,93,88,94,88,95,88,96,88,97,88,98,88,99,88,100,88,101,88,102,88,103,88,104,88,105,88,106,88,107,88,108,88,109,88,110,88,111,88,112,88,113,88,114,88,115,88,116,88,117,88,118,88,119,88,120,88,121,88,122,88,123,88,124,88,125,88,126,89,33,89,34,89,35,89,36,89,37,89,38,89,39,89,40,89,41,89,42,89,43,89,44,89,45,89,46,89,47,89,48,89,49,89,50,89,51,89,52,89,53,89,54,89,55,89,56,89,57,89,58,89,59,89,60,89,61,89,62,89,63,89,64,89,65,89,66,89,67,89,68,89,69,89,70,89,71,89,72,89,73,89,74,89,75,89,76,89,77,89,78,89,79,89,80,89,81,89,82,89,83,89,84,89,85,89,86,89,87,89,88,89,89,89,90,89,91,89,92,89,93,89,94,89,95,89,96,89,97,89,98,89,99,89,100,89,101,89,102,89,103,89,104,89,105,89,106,89,107,89,108,89,109,89,110,89,111,89,112,89,113,89,114,89,115,89,116,89,117,89,118,89,119,89,120,89,121,89,122,89,123,89,124,89,125,89,126,90,33,90,34,90,35,90,36,90,37,90,38,90,39,90,40,90,41,90,42,90,43,90,44,90,45,90,46,90,47,90,48,90,49,90,50,90,51,90,52,90,53,90,54,90,55,90,56,90,57,90,58,90,59,90,60,90,61,90,62,90,63,90,64,90,65,90,66,90,67,90,68,90,69,90,70,90,71,90,72,90,73,90,74,90,75,90,76,90,77,90,78,90,79,90,80,90,81,90,82,90,83,90,84,90,85,90,86,90,87,90,88,90,89,90,90,90,91,90,92,90,93,90,94,90,95,90,96,90,97,90,98,90,99,90,100,90,101,90,102,90,103,90,104,90,105,90,106,90,107,90,108,90,109,90,110,90,111,90,112,90,113,90,114,90,115,90,116,90,117,90,118,90,119,90,120,90,121,90,122,90,123,90,124,90,125,90,126,91,33,91,34,91,35,91,36,91,37,91,38,91,39,91,40,91,41,91,42,91,43,91,44,91,45,91,46,91,47,91,48,91,49,91,50,91,51,91,52,91,53,91,54,91,55,91,56,91,57,91,58,91,59,91,60,91,61,91,62,91,63,91,64,91,65,91,66,91,67,91,68,91,69,91,70,91,71,91,72,91,73,91,74,91,75,91,76,91,77,91,78,91,79,91,80,91,81,91,82,91,83,91,84,91,85,91,86,91,87,91,88,91,89,91,90,91,91,91,92,91,93,91,94,91,95,91,96,91,97,91,98,91,99,91,100,91,101,91,102,91,103,91,104,91,105,91,106,91,107,91,108,91,109,91,110,91,111,91,112,91,113,91,114,91,115,91,116,91,117,91,118,91,119,91,120,91,121,91,122,91,123,91,124,91,125,91,126,92,33,92,34,92,35,92,36,92,37,92,38,92,39,92,40,92,41,92,42,92,43,92,44,92,45,92,46,92,47,92,48,92,49,92,50,92,51,92,52,92,53,92,54,92,55,92,56,92,57,92,58,92,59,92,60,92,61,92,62,92,63,92,64,92,65,92,66,92,67,92,68,92,69,92,70,92,71,92,72,92,73,92,74,92,75,92,76,92,77,92,78,92,79,92,80,92,81,92,82,92,83,92,84,92,85,92,86,92,87,92,88,92,89,92,90,92,91,92,92,92,93,92,94,92,95,92,96,92,97,92,98,92,99,92,100,92,101,92,102,92,103,92,104,92,105,92,106,92,107,92,108,92,109,92,110,92,111,92,112,92,113,92,114,92,115,92,116,92,117,92,118,92,119,92,120,92,121,92,122,92,123,92,124,92,125,92,126,93,33,93,34,93,35,93,36,93,37,93,38,93,39,93,40,93,41,93,42,93,43,93,44,93,45,93,46,93,47,93,48,93,49,93,50,93,51,93,52,93,53,93,54,93,55,93,56,93,57,93,58,93,59,93,60,93,61,93,62,93,63,93,64,93,65,93,66,93,67,93,68,93,69,93,70,93,71,93,72,93,73,93,74,93,75,93,76,93,77,93,78,93,79,93,80,93,81,93,82,93,83,93,84,93,85,93,86,93,87,93,88,93,89,93,90,93,91,93,92,93,93,93,94,93,95,93,96,93,97,93,98,93,99,93,100,93,101,93,102,93,103,93,104,93,105,93,106,93,107,93,108,93,109,93,110,93,111,93,112,93,113,93,114,93,115,93,116,93,117,93,118,93,119,93,120,93,121,93,122,93,123,93,124,93,125,93,126,94,33,94,34,94,35,94,36,94,37,94,38,94,39,94,40,94,41,94,42,94,43,94,44,94,45,94,46,94,47,94,48,94,49,94,50,94,51,94,52,94,53,94,54,94,55,94,56,94,57,94,58,94,59,94,60,94,61,94,62,94,63,94,64,94,65,94,66,94,67,94,68,94,69,94,70,94,71,94,72,94,73,94,74,94,75,94,76,94,77,94,78,94,79,94,80,94,81,94,82,94,83,94,84,94,85,94,86,94,87,94,88,94,89,94,90,94,91,94,92,94,93,94,94,94,95,94,96,94,97,94,98,94,99,94,100,94,101,94,102,94,103,94,104,94,105,94,106,94,107,94,108,94,109,94,110,94,111,94,112,94,113,94,114,94,115,94,116,94,117,94,118,94,119,94,120,94,121,94,122,94,123,94,124,94,125,94,126,95,33,95,34,95,35,95,36,95,37,95,38,95,39,95,40,95,41,95,42,95,43,95,44,95,45,95,46,95,47,95,48,95,49,95,50,95,51,95,52,95,53,95,54,95,55,95,56,95,57,95,58,95,59,95,60,95,61,95,62,95,63,95,64,95,65,95,66,95,67,95,68,95,69,95,70,95,71,95,72,95,73,95,74,95,75,95,76,95,77,95,78,95,79,95,80,95,81,95,82,95,83,95,84,95,85,95,86,95,87,95,88,95,89,95,90,95,91,95,92,95,93,95,94,95,95,95,96,95,97,95,98,95,99,95,100,95,101,95,102,95,103,95,104,95,105,95,106,95,107,95,108,95,109,95,110,95,111,95,112,95,113,95,114,95,115,95,116,95,117,95,118,95,119,95,120,95,121,95,122,95,123,95,124,95,125,95,126,96,33,96,34,96,35,96,36,96,37,96,38,96,39,96,40,96,41,96,42,96,43,96,44,96,45,96,46,96,47,96,48,96,49,96,50,96,51,96,52,96,53,96,54,96,55,96,56,96,57,96,58,96,59,96,60,96,61,96,62,96,63,96,64,96,65,96,66,96,67,96,68,96,69,96,70,96,71,96,72,96,73,96,74,96,75,96,76,96,77,96,78,96,79,96,80,96,81,96,82,96,83,96,84,96,85,96,86,96,87,96,88,96,89,96,90,96,91,96,92,96,93,96,94,96,95,96,96,96,97,96,98,96,99,96,100,96,101,96,102,96,103,96,104,96,105,96,106,96,107,96,108,96,109,96,110,96,111,96,112,96,113,96,114,96,115,96,116,96,117,96,118,96,119,96,120,96,121,96,122,96,123,96,124,96,125,96,126,97,33,97,34,97,35,97,36,97,37,97,38,97,39,97,40,97,41,97,42,97,43,97,44,97,45,97,46,97,47,97,48,97,49,97,50,97,51,97,52,97,53,97,54,97,55,97,56,97,57,97,58,97,59,97,60,97,61,97,62,97,63,97,64,97,65,97,66,97,67,97,68,97,69,97,70,97,71,97,72,97,73,97,74,97,75,97,76,97,77,97,78,97,79,97,80,97,81,97,82,97,83,97,84,97,85,97,86,97,87,97,88,97,89,97,90,97,91,97,92,97,93,97,94,97,95,97,96,97,97,97,98,97,99,97,100,97,101,97,102,97,103,97,104,97,105,97,106,97,107,97,108,97,109,97,110,97,111,97,112,97,113,97,114,97,115,97,116,97,117,97,118,97,119,97,120,97,121,97,122,97,123,97,124,97,125,97,126,98,33,98,34,98,35,98,36,98,37,98,38,98,39,98,40,98,41,98,42,98,43,98,44,98,45,98,46,98,47,98,48,98,49,98,50,98,51,98,52,98,53,98,54,98,55,98,56,98,57,98,58,98,59,98,60,98,61,98,62,98,63,98,64,98,65,98,66,98,67,98,68,98,69,98,70,98,71,98,72,98,73,98,74,98,75,98,76,98,77,98,78,98,79,98,80,98,81,98,82,98,83,98,84,98,85,98,86,98,87,98,88,98,89,98,90,98,91,98,92,98,93,98,94,98,95,98,96,98,97,98,98,98,99,98,100,98,101,98,102,98,103,98,104,98,105,98,106,98,107,98,108,98,109,98,110,98,111,98,112,98,113,98,114,98,115,98,116,98,117,98,118,98,119,98,120,98,121,98,122,98,123,98,124,98,125,98,126,99,33,99,34,99,35,99,36,99,37,99,38,99,39,99,40,99,41,99,42,99,43,99,44,99,45,99,46,99,47,99,48,99,49,99,50,99,51,99,52,99,53,99,54,99,55,99,56,99,57,99,58,99,59,99,60,99,61,99,62,99,63,99,64,99,65,99,66,99,67,99,68,99,69,99,70,99,71,99,72,99,73,99,74,99,75,99,76,99,77,99,78,99,79,99,80,99,81,99,82,99,83,99,84,99,85,99,86,99,87,99,88,99,89,99,90,99,91,99,92,99,93,99,94,99,95,99,96,99,97,99,98,99,99,99,100,99,101,99,102,99,103,99,104,99,105,99,106,99,107,99,108,99,109,99,110,99,111,99,112,99,113,99,114,99,115,99,116,99,117,99,118,99,119,99,120,99,121,99,122,99,123,99,124,99,125,99,126,100,33,100,34,100,35,100,36,100,37,100,38,100,39,100,40,100,41,100,42,100,43,100,44,100,45,100,46,100,47,100,48,100,49,100,50,100,51,100,52,100,53,100,54,100,55,100,56,100,57,100,58,100,59,100,60,100,61,100,62,100,63,100,64,100,65,100,66,100,67,100,68,100,69,100,70,100,71,100,72,100,73,100,74,100,75,100,76,100,77,100,78,100,79,100,80,100,81,100,82,100,83,100,84,100,85,100,86,100,87,100,88,100,89,100,90,100,91,100,92,100,93,100,94,100,95,100,96,100,97,100,98,100,99,100,100,100,101,100,102,100,103,100,104,100,105,100,106,100,107,100,108,100,109,100,110,100,111,100,112,100,113,100,114,100,115,100,116,100,117,100,118,100,119,100,120,100,121,100,122,100,123,100,124,100,125,100,126,101,33,101,34,101,35,101,36,101,37,101,38,101,39,101,40,101,41,101,42,101,43,101,44,101,45,101,46,101,47,101,48,101,49,101,50,101,51,101,52,101,53,101,54,101,55,101,56,101,57,101,58,101,59,101,60,101,61,101,62,101,63,101,64,101,65,101,66,101,67,101,68,101,69,101,70,101,71,101,72,101,73,101,74,101,75,101,76,101,77,101,78,101,79,101,80,101,81,101,82,101,83,101,84,101,85,101,86,101,87,101,88,101,89,101,90,101,91,101,92,101,93,101,94,101,95,101,96,101,97,101,98,101,99,101,100,101,101,101,102,101,103,101,104,101,105,101,106,101,107,101,108,101,109,101,110,101,111,101,112,101,113,101,114,101,115,101,116,101,117,101,118,101,119,101,120,101,121,101,122,101,123,101,124,101,125,101,126,102,33,102,34,102,35,102,36,102,37,102,38,102,39,102,40,102,41,102,42,102,43,102,44,102,45,102,46,102,47,102,48,102,49,102,50,102,51,102,52,102,53,102,54,102,55,102,56,102,57,102,58,102,59,102,60,102,61,102,62,102,63,102,64,102,65,102,66,102,67,102,68,102,69,102,70,102,71,102,72,102,73,102,74,102,75,102,76,102,77,102,78,102,79,102,80,102,81,102,82,102,83,102,84,102,85,102,86,102,87,102,88,102,89,102,90,102,91,102,92,102,93,102,94,102,95,102,96,102,97,102,98,102,99,102,100,102,101,102,102,102,103,102,104,102,105,102,106,102,107,102,108,102,109,102,110,102,111,102,112,102,113,102,114,102,115,102,116,102,117,102,118,102,119,102,120,102,121,102,122,102,123,102,124,102,125,102,126,103,33,103,34,103,35,103,36,103,37,103,38,103,39,103,40,103,41,103,42,103,43,103,44,103,45,103,46,103,47,103,48,103,49,103,50,103,51,103,52,103,53,103,54,103,55,103,56,103,57,103,58,103,59,103,60,103,61,103,62,103,63,103,64,103,65,103,66,103,67,103,68,103,69,103,70,103,71,103,72,103,73,103,74,103,75,103,76,103,77,103,78,103,79,103,80,103,81,103,82,103,83,103,84,103,85,103,86,103,87,103,88,103,89,103,90,103,91,103,92,103,93,103,94,103,95,103,96,103,97,103,98,103,99,103,100,103,101,103,102,103,103,103,104,103,105,103,106,103,107,103,108,103,109,103,110,103,111,103,112,103,113,103,114,103,115,103,116,103,117,103,118,103,119,103,120,103,121,103,122,103,123,103,124,103,125,103,126,104,33,104,34,104,35,104,36,104,37,104,38,104,39,104,40,104,41,104,42,104,43,104,44,104,45,104,46,104,47,104,48,104,49,104,50,104,51,104,52,104,53,104,54,104,55,104,56,104,57,104,58,104,59,104,60,104,61,104,62,104,63,104,64,104,65,104,66,104,67,104,68,104,69,104,70,104,71,104,72,104,73,104,74,104,75,104,76,104,77,104,78,104,79,104,80,104,81,104,82,104,83,104,84,104,85,104,86,104,87,104,88,104,89,104,90,104,91,104,92,104,93,104,94,104,95,104,96,104,97,104,98,104,99,104,100,104,101,104,102,104,103,104,104,104,105,104,106,104,107,104,108,104,109,104,110,104,111,104,112,104,113,104,114,104,115,104,116,104,117,104,118,104,119,104,120,104,121,104,122,104,123,104,124,104,125,104,126,105,33,105,34,105,35,105,36,105,37,105,38,105,39,105,40,105,41,105,42,105,43,105,44,105,45,105,46,105,47,105,48,105,49,105,50,105,51,105,52,105,53,105,54,105,55,105,56,105,57,105,58,105,59,105,60,105,61,105,62,105,63,105,64,105,65,105,66,105,67,105,68,105,69,105,70,105,71,105,72,105,73,105,74,105,75,105,76,105,77,105,78,105,79,105,80,105,81,105,82,105,83,105,84,105,85,105,86,105,87,105,88,105,89,105,90,105,91,105,92,105,93,105,94,105,95,105,96,105,97,105,98,105,99,105,100,105,101,105,102,105,103,105,104,105,105,105,106,105,107,105,108,105,109,105,110,105,111,105,112,105,113,105,114,105,115,105,116,105,117,105,118,105,119,105,120,105,121,105,122,105,123,105,124,105,125,105,126,106,33,106,34,106,35,106,36,106,37,106,38,106,39,106,40,106,41,106,42,106,43,106,44,106,45,106,46,106,47,106,48,106,49,106,50,106,51,106,52,106,53,106,54,106,55,106,56,106,57,106,58,106,59,106,60,106,61,106,62,106,63,106,64,106,65,106,66,106,67,106,68,106,69,106,70,106,71,106,72,106,73,106,74,106,75,106,76,106,77,106,78,106,79,106,80,106,81,106,82,106,83,106,84,106,85,106,86,106,87,106,88,106,89,106,90,106,91,106,92,106,93,106,94,106,95,106,96,106,97,106,98,106,99,106,100,106,101,106,102,106,103,106,104,106,105,106,106,106,107,106,108,106,109,106,110,106,111,106,112,106,113,106,114,106,115,106,116,106,117,106,118,106,119,106,120,106,121,106,122,106,123,106,124,106,125,106,126,107,33,107,34,107,35,107,36,107,37,107,38,107,39,107,40,107,41,107,42,107,43,107,44,107,45,107,46,107,47,107,48,107,49,107,50,107,51,107,52,107,53,107,54,107,55,107,56,107,57,107,58,107,59,107,60,107,61,107,62,107,63,107,64,107,65,107,66,107,67,107,68,107,69,107,70,107,71,107,72,107,73,107,74,107,75,107,76,107,77,107,78,107,79,107,80,107,81,107,82,107,83,107,84,107,85,107,86,107,87,107,88,107,89,107,90,107,91,107,92,107,93,107,94,107,95,107,96,107,97,107,98,107,99,107,100,107,101,107,102,107,103,107,104,107,105,107,106,107,107,107,108,107,109,107,110,107,111,107,112,107,113,107,114,107,115,107,116,107,117,107,118,107,119,107,120,107,121,107,122,107,123,107,124,107,125,107,126,108,33,108,34,108,35,108,36,108,37,108,38,108,39,108,40,108,41,108,42,108,43,108,44,108,45,108,46,108,47,108,48,108,49,108,50,108,51,108,52,108,53,108,54,108,55,108,56,108,57,108,58,108,59,108,60,108,61,108,62,108,63,108,64,108,65,108,66,108,67,108,68,108,69,108,70,108,71,108,72,108,73,108,74,108,75,108,76,108,77,108,78,108,79,108,80,108,81,108,82,108,83,108,84,108,85,108,86,108,87,108,88,108,89,108,90,108,91,108,92,108,93,108,94,108,95,108,96,108,97,108,98,108,99,108,100,108,101,108,102,108,103,108,104,108,105,108,106,108,107,108,108,108,109,108,110,108,111,108,112,108,113,108,114,108,115,108,116,108,117,108,118,108,119,108,120,108,121,108,122,108,123,108,124,108,125,108,126,109,33,109,34,109,35,109,36,109,37,109,38,109,39,109,40,109,41,109,42,109,43,109,44,109,45,109,46,109,47,109,48,109,49,109,50,109,51,109,52,109,53,109,54,109,55,109,56,109,57,109,58,109,59,109,60,109,61,109,62,109,63,109,64,109,65,109,66,109,67,109,68,109,69,109,70,109,71,109,72,109,73,109,74,109,75,109,76,109,77,109,78,109,79,109,80,109,81,109,82,109,83,109,84,109,85,109,86,109,87,109,88,109,89,109,90,109,91,109,92,109,93,109,94,109,95,109,96,109,97,109,98,109,99,109,100,109,101,109,102,109,103,109,104,109,105,109,106,109,107,109,108,109,109,109,110,109,111,109,112,109,113,109,114,109,115,109,116,109,117,109,118,109,119,109,120,109,121,109,122,109,123,109,124,109,125,109,126,110,33,110,34,110,35,110,36,110,37,110,38,110,39,110,40,110,41,110,42,110,43,110,44,110,45,110,46,110,47,110,48,110,49,110,50,110,51,110,52,110,53,110,54,110,55,110,56,110,57,110,58,110,59,110,60,110,61,110,62,110,63,110,64,110,65,110,66,110,67,110,68,110,69,110,70,110,71,110,72,110,73,110,74,110,75,110,76,110,77,110,78,110,79,110,80,110,81,110,82,110,83,110,84,110,85,110,86,110,87,110,88,110,89,110,90,110,91,110,92,110,93,110,94,110,95,110,96,110,97,110,98,110,99,110,100,110,101,110,102,110,103,110,104,110,105,110,106,110,107,110,108,110,109,110,110,110,111,110,112,110,113,110,114,110,115,110,116,110,117,110,118,110,119,110,120,110,121,110,122,110,123,110,124,110,125,110,126,111,33,111,34,111,35,111,36,111,37,111,38,111,39,111,40,111,41,111,42,111,43,111,44,111,45,111,46,111,47,111,48,111,49,111,50,111,51,111,52,111,53,111,54,111,55,111,56,111,57,111,58,111,59,111,60,111,61,111,62,111,63,111,64,111,65,111,66,111,67,111,68,111,69,111,70,111,71,111,72,111,73,111,74,111,75,111,76,111,77,111,78,111,79,111,80,111,81,111,82,111,83,111,84,111,85,111,86,111,87,111,88,111,89,111,90,111,91,111,92,111,93,111,94,111,95,111,96,111,97,111,98,111,99,111,100,111,101,111,102,111,103,111,104,111,105,111,106,111,107,111,108,111,109,111,110,111,111,111,112,111,113,111,114,111,115,111,116,111,117,111,118,111,119,111,120,111,121,111,122,111,123,111,124,111,125,111,126,112,33,112,34,112,35,112,36,112,37,112,38,112,39,112,40,112,41,112,42,112,43,112,44,112,45,112,46,112,47,112,48,112,49,112,50,112,51,112,52,112,53,112,54,112,55,112,56,112,57,112,58,112,59,112,60,112,61,112,62,112,63,112,64,112,65,112,66,112,67,112,68,112,69,112,70,112,71,112,72,112,73,112,74,112,75,112,76,112,77,112,78,112,79,112,80,112,81,112,82,112,83,112,84,112,85,112,86,112,87,112,88,112,89,112,90,112,91,112,92,112,93,112,94,112,95,112,96,112,97,112,98,112,99,112,100,112,101,112,102,112,103,112,104,112,105,112,106,112,107,112,108,112,109,112,110,112,111,112,112,112,113,112,114,112,115,112,116,112,117,112,118,112,119,112,120,112,121,112,122,112,123,112,124,112,125,112,126,113,33,113,34,113,35,113,36,113,37,113,38,113,39,113,40,113,41,113,42,113,43,113,44,113,45,113,46,113,47,113,48,113,49,113,50,113,51,113,52,113,53,113,54,113,55,113,56,113,57,113,58,113,59,113,60,113,61,113,62,113,63,113,64,113,65,113,66,113,67,113,68,113,69,113,70,113,71,113,72,113,73,113,74,113,75,113,76,113,77,113,78,113,79,113,80,113,81,113,82,113,83,113,84,113,85,113,86,113,87,113,88,113,89,113,90,113,91,113,92,113,93,113,94,113,95,113,96,113,97,113,98,113,99,113,100,113,101,113,102,113,103,113,104,113,105,113,106,113,107,113,108,113,109,113,110,113,111,113,112,113,113,113,114,113,115,113,116,113,117,113,118,113,119,113,120,113,121,113,122,113,123,113,124,113,125,113,126,114,33,114,34,114,35,114,36,114,37,114,38,114,39,114,40,114,41,114,42,114,43,114,44,114,45,114,46,114,47,114,48,114,49,114,50,114,51,114,52,114,53,114,54,114,55,114,56,114,57,114,58,114,59,114,60,114,61,114,62,114,63,114,64,114,65,114,66,114,67,114,68,114,69,114,70,114,71,114,72,114,73,114,74,114,75,114,76,114,77,114,78,114,79,114,80,114,81,114,82,114,83,114,84,114,85,114,86,114,87,114,88,114,89,114,90,114,91,114,92,114,93,114,94,114,95,114,96,114,97,114,98,114,99,114,100,114,101,114,102,114,103,114,104,114,105,114,106,114,107,114,108,114,109,114,110,114,111,114,112,114,113,114,114,114,115,114,116,114,117,114,118,114,119,114,120,114,121,114,122,114,123,114,124,114,125,114,126,115,33,115,34,115,35,115,36,115,37,115,38,115,39,115,40,115,41,115,42,115,43,115,44,115,45,115,46,115,47,115,48,115,49,115,50,115,51,115,52,115,53,115,54,115,55,115,56,115,57,115,58,115,59,115,60,115,61,115,62,115,63,115,64,115,65,115,66,115,67,115,68,115,69,115,70,115,71,115,72,115,73,115,74,115,75,115,76,115,77,115,78,115,79,115,80,115,81,115,82,115,83,115,84,115,85,115,86,115,87,115,88,115,89,115,90,115,91,115,92,115,93,115,94,115,95,115,96,115,97,115,98,115,99,115,100,115,101,115,102,115,103,115,104,115,105,115,106,115,107,115,108,115,109,115,110,115,111,115,112,115,113,115,114,115,115,115,116,115,117,115,118,115,119,115,120,115,121,115,122,115,123,115,124,115,125,115,126,116,33,116,34,116,35,116,36,116,37,116,38,116,39,116,40,116,41,116,42,116,43,116,44,116,45,116,46,116,47,116,48,116,49,116,50,116,51,116,52,116,53,116,54,116,55,116,56,116,57,116,58,116,59,116,60,116,61,116,62,116,63,116,64,116,65,116,66,116,67,116,68,116,69,116,70,116,71,116,72,116,73,116,74,116,75,116,76,116,77,116,78,116,79,116,80,116,81,116,82,116,83,116,84,116,85,116,86,116,87,116,88,116,89,116,90,116,91,116,92,116,93,116,94,116,95,116,96,116,97,116,98,116,99,116,100,116,101,116,102,116,103,116,104,116,105,116,106,116,107,116,108,116,109,116,110,116,111,116,112,116,113,116,114,116,115,116,116,116,117,116,118,116,119,116,120,116,121,116,122,116,123,116,124,116,125,116,126,117,33,117,34,117,35,117,36,117,37,117,38,117,39,117,40,117,41,117,42,117,43,117,44,117,45,117,46,117,47,117,48,117,49,117,50,117,51,117,52,117,53,117,54,117,55,117,56,117,57,117,58,117,59,117,60,117,61,117,62,117,63,117,64,117,65,117,66,117,67,117,68,117,69,117,70,117,71,117,72,117,73,117,74,117,75,117,76,117,77,117,78,117,79,117,80,117,81,117,82,117,83,117,84,117,85,117,86,117,87,117,88,117,89,117,90,117,91,117,92,117,93,117,94,117,95,117,96,117,97,117,98,117,99,117,100,117,101,117,102,117,103,117,104,117,105,117,106,117,107,117,108,117,109,117,110,117,111,117,112,117,113,117,114,117,115,117,116,117,117,117,118,117,119,117,120,117,121,117,122,117,123,117,124,117,125,117,126,118,33,118,34,118,35,118,36,118,37,118,38,118,39,118,40,118,41,118,42,118,43,118,44,118,45,118,46,118,47,118,48,118,49,118,50,118,51,118,52,118,53,118,54,118,55,118,56,118,57,118,58,118,59,118,60,118,61,118,62,118,63,118,64,118,65,118,66,118,67,118,68,118,69,118,70,118,71,118,72,118,73,118,74,118,75,118,76,118,77,118,78,118,79,118,80,118,81,118,82,118,83,118,84,118,85,118,86,118,87,118,88,118,89,118,90,118,91,118,92,118,93,118,94,118,95,118,96,118,97,118,98,118,99,118,100,118,101,118,102,118,103,118,104,118,105,118,106,118,107,118,108,118,109,118,110,118,111,118,112,118,113,118,114,118,115,118,116,118,117,118,118,118,119,118,120,118,121,118,122,118,123,118,124,118,125,118,126,119,33,119,34,119,35,119,36,119,37,119,38,119,39,119,40,119,41,119,42,119,43,119,44,119,45,119,46,119,47,119,48,119,49,119,50,119,51,119,52,119,53,119,54,119,55,119,56,119,57,119,58,119,59,119,60,119,61,119,62,119,63,119,64,119,65,119,66,119,67,119,68,119,69,119,70,119,71,119,72,119,73,119,74,119,75,119,76,119,77,119,78,119,79,119,80,119,81,119,82,119,83,119,84,119,85,119,86,119,87,119,88,119,89,119,90,119,91,119,92,119,93,119,94,119,95,119,96,119,97,119,98,119,99,119,100,119,101,119,102,119,103,119,104,119,105,119,106,119,107,119,108,119,109,119,110,119,111,119,112,119,113,119,114,119,115,119,116,119,117,119,118,119,119,119,120,119,121,119,122,119,123,119,124,119,125,119,126]; - var string = "\u3000\u3001\u3002\u02C9\u02C7\u00A8\u3003\u3005\uFF5E\u2016\u2026\u2018\u2019\u201C\u201D\u3014\u3015\u3008\u3009\u300A\u300B\u300C\u300D\u300E\u300F\u3016\u3017\u3010\u3011\u00B1\u00D7\u00F7\u2236\u2227\u2228\u2211\u220F\u222A\u2229\u2208\u2237\u221A\u22A5\u2225\u2220\u2312\u2299\u222B\u222E\u2261\u224C\u2248\u223D\u221D\u2260\u226E\u226F\u2264\u2265\u221E\u2235\u2234\u2642\u2640\u00B0\u2032\u2033\u2103\uFF04\u00A4\uFFE0\uFFE1\u2030\u00A7\u2116\u2606\u2605\u25CB\u25CF\u25CE\u25C7\u25C6\u25A1\u25A0\u25B3\u25B2\u203B\u2192\u2190\u2191\u2193\u3013\u2488\u2489\u248A\u248B\u248C\u248D\u248E\u248F\u2490\u2491\u2492\u2493\u2494\u2495\u2496\u2497\u2498\u2499\u249A\u249B\u2474\u2475\u2476\u2477\u2478\u2479\u247A\u247B\u247C\u247D\u247E\u247F\u2480\u2481\u2482\u2483\u2484\u2485\u2486\u2487\u2460\u2461\u2462\u2463\u2464\u2465\u2466\u2467\u2468\u2469\u3220\u3221\u3222\u3223\u3224\u3225\u3226\u3227\u3228\u3229\u2160\u2161\u2162\u2163\u2164\u2165\u2166\u2167\u2168\u2169\u216A\u216B\u3000\uFF01\uFF02\uFF03\uFFE5\uFF05\uFF06\uFF07\uFF08\uFF09\uFF0A\uFF0B\uFF0C\uFF0D\uFF0E\uFF0F\uFF10\uFF11\uFF12\uFF13\uFF14\uFF15\uFF16\uFF17\uFF18\uFF19\uFF1A\uFF1B\uFF1C\uFF1D\uFF1E\uFF1F\uFF20\uFF21\uFF22\uFF23\uFF24\uFF25\uFF26\uFF27\uFF28\uFF29\uFF2A\uFF2B\uFF2C\uFF2D\uFF2E\uFF2F\uFF30\uFF31\uFF32\uFF33\uFF34\uFF35\uFF36\uFF37\uFF38\uFF39\uFF3A\uFF3B\uFF3C\uFF3D\uFF3E\uFF3F\uFF40\uFF41\uFF42\uFF43\uFF44\uFF45\uFF46\uFF47\uFF48\uFF49\uFF4A\uFF4B\uFF4C\uFF4D\uFF4E\uFF4F\uFF50\uFF51\uFF52\uFF53\uFF54\uFF55\uFF56\uFF57\uFF58\uFF59\uFF5A\uFF5B\uFF5C\uFF5D\uFFE3\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048\u3049\u304A\u304B\u304C\u304D\u304E\u304F\u3050\u3051\u3052\u3053\u3054\u3055\u3056\u3057\u3058\u3059\u305A\u305B\u305C\u305D\u305E\u305F\u3060\u3061\u3062\u3063\u3064\u3065\u3066\u3067\u3068\u3069\u306A\u306B\u306C\u306D\u306E\u306F\u3070\u3071\u3072\u3073\u3074\u3075\u3076\u3077\u3078\u3079\u307A\u307B\u307C\u307D\u307E\u307F\u3080\u3081\u3082\u3083\u3084\u3085\u3086\u3087\u3088\u3089\u308A\u308B\u308C\u308D\u308E\u308F\u3090\u3091\u3092\u3093\u30A1\u30A2\u30A3\u30A4\u30A5\u30A6\u30A7\u30A8\u30A9\u30AA\u30AB\u30AC\u30AD\u30AE\u30AF\u30B0\u30B1\u30B2\u30B3\u30B4\u30B5\u30B6\u30B7\u30B8\u30B9\u30BA\u30BB\u30BC\u30BD\u30BE\u30BF\u30C0\u30C1\u30C2\u30C3\u30C4\u30C5\u30C6\u30C7\u30C8\u30C9\u30CA\u30CB\u30CC\u30CD\u30CE\u30CF\u30D0\u30D1\u30D2\u30D3\u30D4\u30D5\u30D6\u30D7\u30D8\u30D9\u30DA\u30DB\u30DC\u30DD\u30DE\u30DF\u30E0\u30E1\u30E2\u30E3\u30E4\u30E5\u30E6\u30E7\u30E8\u30E9\u30EA\u30EB\u30EC\u30ED\u30EE\u30EF\u30F0\u30F1\u30F2\u30F3\u30F4\u30F5\u30F6\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0101\u00E1\u01CE\u00E0\u0113\u00E9\u011B\u00E8\u012B\u00ED\u01D0\u00EC\u014D\u00F3\u01D2\u00F2\u016B\u00FA\u01D4\u00F9\u01D6\u01D8\u01DA\u01DC\u00FC\u00EA\u3105\u3106\u3107\u3108\u3109\u310A\u310B\u310C\u310D\u310E\u310F\u3110\u3111\u3112\u3113\u3114\u3115\u3116\u3117\u3118\u3119\u311A\u311B\u311C\u311D\u311E\u311F\u3120\u3121\u3122\u3123\u3124\u3125\u3126\u3127\u3128\u3129\u2500\u2501\u2502\u2503\u2504\u2505\u2506\u2507\u2508\u2509\u250A\u250B\u250C\u250D\u250E\u250F\u2510\u2511\u2512\u2513\u2514\u2515\u2516\u2517\u2518\u2519\u251A\u251B\u251C\u251D\u251E\u251F\u2520\u2521\u2522\u2523\u2524\u2525\u2526\u2527\u2528\u2529\u252A\u252B\u252C\u252D\u252E\u252F\u2530\u2531\u2532\u2533\u2534\u2535\u2536\u2537\u2538\u2539\u253A\u253B\u253C\u253D\u253E\u253F\u2540\u2541\u2542\u2543\u2544\u2545\u2546\u2547\u2548\u2549\u254A\u254B\u554A\u963F\u57C3\u6328\u54CE\u5509\u54C0\u7691\u764C\u853C\u77EE\u827E\u788D\u7231\u9698\u978D\u6C28\u5B89\u4FFA\u6309\u6697\u5CB8\u80FA\u6848\u80AE\u6602\u76CE\u51F9\u6556\u71AC\u7FF1\u8884\u50B2\u5965\u61CA\u6FB3\u82AD\u634C\u6252\u53ED\u5427\u7B06\u516B\u75A4\u5DF4\u62D4\u8DCB\u9776\u628A\u8019\u575D\u9738\u7F62\u7238\u767D\u67CF\u767E\u6446\u4F70\u8D25\u62DC\u7A17\u6591\u73ED\u642C\u6273\u822C\u9881\u677F\u7248\u626E\u62CC\u4F34\u74E3\u534A\u529E\u7ECA\u90A6\u5E2E\u6886\u699C\u8180\u7ED1\u68D2\u78C5\u868C\u9551\u508D\u8C24\u82DE\u80DE\u5305\u8912\u5265\u8584\u96F9\u4FDD\u5821\u9971\u5B9D\u62B1\u62A5\u66B4\u8C79\u9C8D\u7206\u676F\u7891\u60B2\u5351\u5317\u8F88\u80CC\u8D1D\u94A1\u500D\u72C8\u5907\u60EB\u7119\u88AB\u5954\u82EF\u672C\u7B28\u5D29\u7EF7\u752D\u6CF5\u8E66\u8FF8\u903C\u9F3B\u6BD4\u9119\u7B14\u5F7C\u78A7\u84D6\u853D\u6BD5\u6BD9\u6BD6\u5E01\u5E87\u75F9\u95ED\u655D\u5F0A\u5FC5\u8F9F\u58C1\u81C2\u907F\u965B\u97AD\u8FB9\u7F16\u8D2C\u6241\u4FBF\u53D8\u535E\u8FA8\u8FA9\u8FAB\u904D\u6807\u5F6A\u8198\u8868\u9CD6\u618B\u522B\u762A\u5F6C\u658C\u6FD2\u6EE8\u5BBE\u6448\u5175\u51B0\u67C4\u4E19\u79C9\u997C\u70B3\u75C5\u5E76\u73BB\u83E0\u64AD\u62E8\u94B5\u6CE2\u535A\u52C3\u640F\u94C2\u7B94\u4F2F\u5E1B\u8236\u8116\u818A\u6E24\u6CCA\u9A73\u6355\u535C\u54FA\u8865\u57E0\u4E0D\u5E03\u6B65\u7C3F\u90E8\u6016\u64E6\u731C\u88C1\u6750\u624D\u8D22\u776C\u8E29\u91C7\u5F69\u83DC\u8521\u9910\u53C2\u8695\u6B8B\u60ED\u60E8\u707F\u82CD\u8231\u4ED3\u6CA7\u85CF\u64CD\u7CD9\u69FD\u66F9\u8349\u5395\u7B56\u4FA7\u518C\u6D4B\u5C42\u8E6D\u63D2\u53C9\u832C\u8336\u67E5\u78B4\u643D\u5BDF\u5C94\u5DEE\u8BE7\u62C6\u67F4\u8C7A\u6400\u63BA\u8749\u998B\u8C17\u7F20\u94F2\u4EA7\u9610\u98A4\u660C\u7316\u573A\u5C1D\u5E38\u957F\u507F\u80A0\u5382\u655E\u7545\u5531\u5021\u8D85\u6284\u949E\u671D\u5632\u6F6E\u5DE2\u5435\u7092\u8F66\u626F\u64A4\u63A3\u5F7B\u6F88\u90F4\u81E3\u8FB0\u5C18\u6668\u5FF1\u6C89\u9648\u8D81\u886C\u6491\u79F0\u57CE\u6A59\u6210\u5448\u4E58\u7A0B\u60E9\u6F84\u8BDA\u627F\u901E\u9A8B\u79E4\u5403\u75F4\u6301\u5319\u6C60\u8FDF\u5F1B\u9A70\u803B\u9F7F\u4F88\u5C3A\u8D64\u7FC5\u65A5\u70BD\u5145\u51B2\u866B\u5D07\u5BA0\u62BD\u916C\u7574\u8E0C\u7A20\u6101\u7B79\u4EC7\u7EF8\u7785\u4E11\u81ED\u521D\u51FA\u6A71\u53A8\u8E87\u9504\u96CF\u6EC1\u9664\u695A\u7840\u50A8\u77D7\u6410\u89E6\u5904\u63E3\u5DDD\u7A7F\u693D\u4F20\u8239\u5598\u4E32\u75AE\u7A97\u5E62\u5E8A\u95EF\u521B\u5439\u708A\u6376\u9524\u5782\u6625\u693F\u9187\u5507\u6DF3\u7EAF\u8822\u6233\u7EF0\u75B5\u8328\u78C1\u96CC\u8F9E\u6148\u74F7\u8BCD\u6B64\u523A\u8D50\u6B21\u806A\u8471\u56F1\u5306\u4ECE\u4E1B\u51D1\u7C97\u918B\u7C07\u4FC3\u8E7F\u7BE1\u7A9C\u6467\u5D14\u50AC\u8106\u7601\u7CB9\u6DEC\u7FE0\u6751\u5B58\u5BF8\u78CB\u64AE\u6413\u63AA\u632B\u9519\u642D\u8FBE\u7B54\u7629\u6253\u5927\u5446\u6B79\u50A3\u6234\u5E26\u6B86\u4EE3\u8D37\u888B\u5F85\u902E\u6020\u803D\u62C5\u4E39\u5355\u90F8\u63B8\u80C6\u65E6\u6C2E\u4F46\u60EE\u6DE1\u8BDE\u5F39\u86CB\u5F53\u6321\u515A\u8361\u6863\u5200\u6363\u8E48\u5012\u5C9B\u7977\u5BFC\u5230\u7A3B\u60BC\u9053\u76D7\u5FB7\u5F97\u7684\u8E6C\u706F\u767B\u7B49\u77AA\u51F3\u9093\u5824\u4F4E\u6EF4\u8FEA\u654C\u7B1B\u72C4\u6DA4\u7FDF\u5AE1\u62B5\u5E95\u5730\u8482\u7B2C\u5E1D\u5F1F\u9012\u7F14\u98A0\u6382\u6EC7\u7898\u70B9\u5178\u975B\u57AB\u7535\u4F43\u7538\u5E97\u60E6\u5960\u6DC0\u6BBF\u7889\u53FC\u96D5\u51CB\u5201\u6389\u540A\u9493\u8C03\u8DCC\u7239\u789F\u8776\u8FED\u8C0D\u53E0\u4E01\u76EF\u53EE\u9489\u9876\u9F0E\u952D\u5B9A\u8BA2\u4E22\u4E1C\u51AC\u8463\u61C2\u52A8\u680B\u4F97\u606B\u51BB\u6D1E\u515C\u6296\u6597\u9661\u8C46\u9017\u75D8\u90FD\u7763\u6BD2\u728A\u72EC\u8BFB\u5835\u7779\u8D4C\u675C\u9540\u809A\u5EA6\u6E21\u5992\u7AEF\u77ED\u953B\u6BB5\u65AD\u7F0E\u5806\u5151\u961F\u5BF9\u58A9\u5428\u8E72\u6566\u987F\u56E4\u949D\u76FE\u9041\u6387\u54C6\u591A\u593A\u579B\u8EB2\u6735\u8DFA\u8235\u5241\u60F0\u5815\u86FE\u5CE8\u9E45\u4FC4\u989D\u8BB9\u5A25\u6076\u5384\u627C\u904F\u9102\u997F\u6069\u800C\u513F\u8033\u5C14\u9975\u6D31\u4E8C\u8D30\u53D1\u7F5A\u7B4F\u4F10\u4E4F\u9600\u6CD5\u73D0\u85E9\u5E06\u756A\u7FFB\u6A0A\u77FE\u9492\u7E41\u51E1\u70E6\u53CD\u8FD4\u8303\u8D29\u72AF\u996D\u6CDB\u574A\u82B3\u65B9\u80AA\u623F\u9632\u59A8\u4EFF\u8BBF\u7EBA\u653E\u83F2\u975E\u5561\u98DE\u80A5\u532A\u8BFD\u5420\u80BA\u5E9F\u6CB8\u8D39\u82AC\u915A\u5429\u6C1B\u5206\u7EB7\u575F\u711A\u6C7E\u7C89\u594B\u4EFD\u5FFF\u6124\u7CAA\u4E30\u5C01\u67AB\u8702\u5CF0\u950B\u98CE\u75AF\u70FD\u9022\u51AF\u7F1D\u8BBD\u5949\u51E4\u4F5B\u5426\u592B\u6577\u80A4\u5B75\u6276\u62C2\u8F90\u5E45\u6C1F\u7B26\u4F0F\u4FD8\u670D\u6D6E\u6DAA\u798F\u88B1\u5F17\u752B\u629A\u8F85\u4FEF\u91DC\u65A7\u812F\u8151\u5E9C\u8150\u8D74\u526F\u8986\u8D4B\u590D\u5085\u4ED8\u961C\u7236\u8179\u8D1F\u5BCC\u8BA3\u9644\u5987\u7F1A\u5490\u5676\u560E\u8BE5\u6539\u6982\u9499\u76D6\u6E89\u5E72\u7518\u6746\u67D1\u7AFF\u809D\u8D76\u611F\u79C6\u6562\u8D63\u5188\u521A\u94A2\u7F38\u809B\u7EB2\u5C97\u6E2F\u6760\u7BD9\u768B\u9AD8\u818F\u7F94\u7CD5\u641E\u9550\u7A3F\u544A\u54E5\u6B4C\u6401\u6208\u9E3D\u80F3\u7599\u5272\u9769\u845B\u683C\u86E4\u9601\u9694\u94EC\u4E2A\u5404\u7ED9\u6839\u8DDF\u8015\u66F4\u5E9A\u7FB9\u57C2\u803F\u6897\u5DE5\u653B\u529F\u606D\u9F9A\u4F9B\u8EAC\u516C\u5BAB\u5F13\u5DE9\u6C5E\u62F1\u8D21\u5171\u94A9\u52FE\u6C9F\u82DF\u72D7\u57A2\u6784\u8D2D\u591F\u8F9C\u83C7\u5495\u7B8D\u4F30\u6CBD\u5B64\u59D1\u9F13\u53E4\u86CA\u9AA8\u8C37\u80A1\u6545\u987E\u56FA\u96C7\u522E\u74DC\u5250\u5BE1\u6302\u8902\u4E56\u62D0\u602A\u68FA\u5173\u5B98\u51A0\u89C2\u7BA1\u9986\u7F50\u60EF\u704C\u8D2F\u5149\u5E7F\u901B\u7470\u89C4\u572D\u7845\u5F52\u9F9F\u95FA\u8F68\u9B3C\u8BE1\u7678\u6842\u67DC\u8DEA\u8D35\u523D\u8F8A\u6EDA\u68CD\u9505\u90ED\u56FD\u679C\u88F9\u8FC7\u54C8\u9AB8\u5B69\u6D77\u6C26\u4EA5\u5BB3\u9A87\u9163\u61A8\u90AF\u97E9\u542B\u6DB5\u5BD2\u51FD\u558A\u7F55\u7FF0\u64BC\u634D\u65F1\u61BE\u608D\u710A\u6C57\u6C49\u592F\u676D\u822A\u58D5\u568E\u8C6A\u6BEB\u90DD\u597D\u8017\u53F7\u6D69\u5475\u559D\u8377\u83CF\u6838\u79BE\u548C\u4F55\u5408\u76D2\u8C89\u9602\u6CB3\u6DB8\u8D6B\u8910\u9E64\u8D3A\u563F\u9ED1\u75D5\u5F88\u72E0\u6068\u54FC\u4EA8\u6A2A\u8861\u6052\u8F70\u54C4\u70D8\u8679\u9E3F\u6D2A\u5B8F\u5F18\u7EA2\u5589\u4FAF\u7334\u543C\u539A\u5019\u540E\u547C\u4E4E\u5FFD\u745A\u58F6\u846B\u80E1\u8774\u72D0\u7CCA\u6E56\u5F27\u864E\u552C\u62A4\u4E92\u6CAA\u6237\u82B1\u54D7\u534E\u733E\u6ED1\u753B\u5212\u5316\u8BDD\u69D0\u5F8A\u6000\u6DEE\u574F\u6B22\u73AF\u6853\u8FD8\u7F13\u6362\u60A3\u5524\u75EA\u8C62\u7115\u6DA3\u5BA6\u5E7B\u8352\u614C\u9EC4\u78FA\u8757\u7C27\u7687\u51F0\u60F6\u714C\u6643\u5E4C\u604D\u8C0E\u7070\u6325\u8F89\u5FBD\u6062\u86D4\u56DE\u6BC1\u6094\u6167\u5349\u60E0\u6666\u8D3F\u79FD\u4F1A\u70E9\u6C47\u8BB3\u8BF2\u7ED8\u8364\u660F\u5A5A\u9B42\u6D51\u6DF7\u8C41\u6D3B\u4F19\u706B\u83B7\u6216\u60D1\u970D\u8D27\u7978\u51FB\u573E\u57FA\u673A\u7578\u7A3D\u79EF\u7B95\u808C\u9965\u8FF9\u6FC0\u8BA5\u9E21\u59EC\u7EE9\u7F09\u5409\u6781\u68D8\u8F91\u7C4D\u96C6\u53CA\u6025\u75BE\u6C72\u5373\u5AC9\u7EA7\u6324\u51E0\u810A\u5DF1\u84DF\u6280\u5180\u5B63\u4F0E\u796D\u5242\u60B8\u6D4E\u5BC4\u5BC2\u8BA1\u8BB0\u65E2\u5FCC\u9645\u5993\u7EE7\u7EAA\u5609\u67B7\u5939\u4F73\u5BB6\u52A0\u835A\u988A\u8D3E\u7532\u94BE\u5047\u7A3C\u4EF7\u67B6\u9A7E\u5AC1\u6B7C\u76D1\u575A\u5C16\u7B3A\u95F4\u714E\u517C\u80A9\u8270\u5978\u7F04\u8327\u68C0\u67EC\u78B1\u7877\u62E3\u6361\u7B80\u4FED\u526A\u51CF\u8350\u69DB\u9274\u8DF5\u8D31\u89C1\u952E\u7BAD\u4EF6\u5065\u8230\u5251\u996F\u6E10\u6E85\u6DA7\u5EFA\u50F5\u59DC\u5C06\u6D46\u6C5F\u7586\u848B\u6868\u5956\u8BB2\u5320\u9171\u964D\u8549\u6912\u7901\u7126\u80F6\u4EA4\u90CA\u6D47\u9A84\u5A07\u56BC\u6405\u94F0\u77EB\u4FA5\u811A\u72E1\u89D2\u997A\u7F34\u7EDE\u527F\u6559\u9175\u8F7F\u8F83\u53EB\u7A96\u63ED\u63A5\u7686\u79F8\u8857\u9636\u622A\u52AB\u8282\u6854\u6770\u6377\u776B\u7AED\u6D01\u7ED3\u89E3\u59D0\u6212\u85C9\u82A5\u754C\u501F\u4ECB\u75A5\u8BEB\u5C4A\u5DFE\u7B4B\u65A4\u91D1\u4ECA\u6D25\u895F\u7D27\u9526\u4EC5\u8C28\u8FDB\u9773\u664B\u7981\u8FD1\u70EC\u6D78\u5C3D\u52B2\u8346\u5162\u830E\u775B\u6676\u9CB8\u4EAC\u60CA\u7CBE\u7CB3\u7ECF\u4E95\u8B66\u666F\u9888\u9759\u5883\u656C\u955C\u5F84\u75C9\u9756\u7ADF\u7ADE\u51C0\u70AF\u7A98\u63EA\u7A76\u7EA0\u7396\u97ED\u4E45\u7078\u4E5D\u9152\u53A9\u6551\u65E7\u81FC\u8205\u548E\u5C31\u759A\u97A0\u62D8\u72D9\u75BD\u5C45\u9A79\u83CA\u5C40\u5480\u77E9\u4E3E\u6CAE\u805A\u62D2\u636E\u5DE8\u5177\u8DDD\u8E1E\u952F\u4FF1\u53E5\u60E7\u70AC\u5267\u6350\u9E43\u5A1F\u5026\u7737\u5377\u7EE2\u6485\u652B\u6289\u6398\u5014\u7235\u89C9\u51B3\u8BC0\u7EDD\u5747\u83CC\u94A7\u519B\u541B\u5CFB\u4FCA\u7AE3\u6D5A\u90E1\u9A8F\u5580\u5496\u5361\u54AF\u5F00\u63E9\u6977\u51EF\u6168\u520A\u582A\u52D8\u574E\u780D\u770B\u5EB7\u6177\u7CE0\u625B\u6297\u4EA2\u7095\u8003\u62F7\u70E4\u9760\u5777\u82DB\u67EF\u68F5\u78D5\u9897\u79D1\u58F3\u54B3\u53EF\u6E34\u514B\u523B\u5BA2\u8BFE\u80AF\u5543\u57A6\u6073\u5751\u542D\u7A7A\u6050\u5B54\u63A7\u62A0\u53E3\u6263\u5BC7\u67AF\u54ED\u7A9F\u82E6\u9177\u5E93\u88E4\u5938\u57AE\u630E\u8DE8\u80EF\u5757\u7B77\u4FA9\u5FEB\u5BBD\u6B3E\u5321\u7B50\u72C2\u6846\u77FF\u7736\u65F7\u51B5\u4E8F\u76D4\u5CBF\u7AA5\u8475\u594E\u9B41\u5080\u9988\u6127\u6E83\u5764\u6606\u6346\u56F0\u62EC\u6269\u5ED3\u9614\u5783\u62C9\u5587\u8721\u814A\u8FA3\u5566\u83B1\u6765\u8D56\u84DD\u5A6A\u680F\u62E6\u7BEE\u9611\u5170\u6F9C\u8C30\u63FD\u89C8\u61D2\u7F06\u70C2\u6EE5\u7405\u6994\u72FC\u5ECA\u90CE\u6717\u6D6A\u635E\u52B3\u7262\u8001\u4F6C\u59E5\u916A\u70D9\u6D9D\u52D2\u4E50\u96F7\u956D\u857E\u78CA\u7D2F\u5121\u5792\u64C2\u808B\u7C7B\u6CEA\u68F1\u695E\u51B7\u5398\u68A8\u7281\u9ECE\u7BF1\u72F8\u79BB\u6F13\u7406\u674E\u91CC\u9CA4\u793C\u8389\u8354\u540F\u6817\u4E3D\u5389\u52B1\u783E\u5386\u5229\u5088\u4F8B\u4FD0\u75E2\u7ACB\u7C92\u6CA5\u96B6\u529B\u7483\u54E9\u4FE9\u8054\u83B2\u8FDE\u9570\u5EC9\u601C\u6D9F\u5E18\u655B\u8138\u94FE\u604B\u70BC\u7EC3\u7CAE\u51C9\u6881\u7CB1\u826F\u4E24\u8F86\u91CF\u667E\u4EAE\u8C05\u64A9\u804A\u50DA\u7597\u71CE\u5BE5\u8FBD\u6F66\u4E86\u6482\u9563\u5ED6\u6599\u5217\u88C2\u70C8\u52A3\u730E\u7433\u6797\u78F7\u9716\u4E34\u90BB\u9CDE\u6DCB\u51DB\u8D41\u541D\u62CE\u73B2\u83F1\u96F6\u9F84\u94C3\u4F36\u7F9A\u51CC\u7075\u9675\u5CAD\u9886\u53E6\u4EE4\u6E9C\u7409\u69B4\u786B\u998F\u7559\u5218\u7624\u6D41\u67F3\u516D\u9F99\u804B\u5499\u7B3C\u7ABF\u9686\u5784\u62E2\u9647\u697C\u5A04\u6402\u7BD3\u6F0F\u964B\u82A6\u5362\u9885\u5E90\u7089\u63B3\u5364\u864F\u9C81\u9E93\u788C\u9732\u8DEF\u8D42\u9E7F\u6F5E\u7984\u5F55\u9646\u622E\u9A74\u5415\u94DD\u4FA3\u65C5\u5C65\u5C61\u7F15\u8651\u6C2F\u5F8B\u7387\u6EE4\u7EFF\u5CE6\u631B\u5B6A\u6EE6\u5375\u4E71\u63A0\u7565\u62A1\u8F6E\u4F26\u4ED1\u6CA6\u7EB6\u8BBA\u841D\u87BA\u7F57\u903B\u9523\u7BA9\u9AA1\u88F8\u843D\u6D1B\u9A86\u7EDC\u5988\u9EBB\u739B\u7801\u8682\u9A6C\u9A82\u561B\u5417\u57CB\u4E70\u9EA6\u5356\u8FC8\u8109\u7792\u9992\u86EE\u6EE1\u8513\u66FC\u6162\u6F2B\u8C29\u8292\u832B\u76F2\u6C13\u5FD9\u83BD\u732B\u8305\u951A\u6BDB\u77DB\u94C6\u536F\u8302\u5192\u5E3D\u8C8C\u8D38\u4E48\u73AB\u679A\u6885\u9176\u9709\u7164\u6CA1\u7709\u5A92\u9541\u6BCF\u7F8E\u6627\u5BD0\u59B9\u5A9A\u95E8\u95F7\u4EEC\u840C\u8499\u6AAC\u76DF\u9530\u731B\u68A6\u5B5F\u772F\u919A\u9761\u7CDC\u8FF7\u8C1C\u5F25\u7C73\u79D8\u89C5\u6CCC\u871C\u5BC6\u5E42\u68C9\u7720\u7EF5\u5195\u514D\u52C9\u5A29\u7F05\u9762\u82D7\u63CF\u7784\u85D0\u79D2\u6E3A\u5E99\u5999\u8511\u706D\u6C11\u62BF\u76BF\u654F\u60AF\u95FD\u660E\u879F\u9E23\u94ED\u540D\u547D\u8C2C\u6478\u6479\u8611\u6A21\u819C\u78E8\u6469\u9B54\u62B9\u672B\u83AB\u58A8\u9ED8\u6CAB\u6F20\u5BDE\u964C\u8C0B\u725F\u67D0\u62C7\u7261\u4EA9\u59C6\u6BCD\u5893\u66AE\u5E55\u52DF\u6155\u6728\u76EE\u7766\u7267\u7A46\u62FF\u54EA\u5450\u94A0\u90A3\u5A1C\u7EB3\u6C16\u4E43\u5976\u8010\u5948\u5357\u7537\u96BE\u56CA\u6320\u8111\u607C\u95F9\u6DD6\u5462\u9981\u5185\u5AE9\u80FD\u59AE\u9713\u502A\u6CE5\u5C3C\u62DF\u4F60\u533F\u817B\u9006\u6EBA\u852B\u62C8\u5E74\u78BE\u64B5\u637B\u5FF5\u5A18\u917F\u9E1F\u5C3F\u634F\u8042\u5B7D\u556E\u954A\u954D\u6D85\u60A8\u67E0\u72DE\u51DD\u5B81\u62E7\u6CDE\u725B\u626D\u94AE\u7EBD\u8113\u6D53\u519C\u5F04\u5974\u52AA\u6012\u5973\u6696\u8650\u759F\u632A\u61E6\u7CEF\u8BFA\u54E6\u6B27\u9E25\u6BB4\u85D5\u5455\u5076\u6CA4\u556A\u8DB4\u722C\u5E15\u6015\u7436\u62CD\u6392\u724C\u5F98\u6E43\u6D3E\u6500\u6F58\u76D8\u78D0\u76FC\u7554\u5224\u53DB\u4E53\u5E9E\u65C1\u802A\u80D6\u629B\u5486\u5228\u70AE\u888D\u8DD1\u6CE1\u5478\u80DA\u57F9\u88F4\u8D54\u966A\u914D\u4F69\u6C9B\u55B7\u76C6\u7830\u62A8\u70F9\u6F8E\u5F6D\u84EC\u68DA\u787C\u7BF7\u81A8\u670B\u9E4F\u6367\u78B0\u576F\u7812\u9739\u6279\u62AB\u5288\u7435\u6BD7\u5564\u813E\u75B2\u76AE\u5339\u75DE\u50FB\u5C41\u8B6C\u7BC7\u504F\u7247\u9A97\u98D8\u6F02\u74E2\u7968\u6487\u77A5\u62FC\u9891\u8D2B\u54C1\u8058\u4E52\u576A\u82F9\u840D\u5E73\u51ED\u74F6\u8BC4\u5C4F\u5761\u6CFC\u9887\u5A46\u7834\u9B44\u8FEB\u7C95\u5256\u6251\u94FA\u4EC6\u8386\u8461\u83E9\u84B2\u57D4\u6734\u5703\u666E\u6D66\u8C31\u66DD\u7011\u671F\u6B3A\u6816\u621A\u59BB\u4E03\u51C4\u6F06\u67D2\u6C8F\u5176\u68CB\u5947\u6B67\u7566\u5D0E\u8110\u9F50\u65D7\u7948\u7941\u9A91\u8D77\u5C82\u4E5E\u4F01\u542F\u5951\u780C\u5668\u6C14\u8FC4\u5F03\u6C7D\u6CE3\u8BAB\u6390\u6070\u6D3D\u7275\u6266\u948E\u94C5\u5343\u8FC1\u7B7E\u4EDF\u8C26\u4E7E\u9ED4\u94B1\u94B3\u524D\u6F5C\u9063\u6D45\u8C34\u5811\u5D4C\u6B20\u6B49\u67AA\u545B\u8154\u7F8C\u5899\u8537\u5F3A\u62A2\u6A47\u9539\u6572\u6084\u6865\u77A7\u4E54\u4FA8\u5DE7\u9798\u64AC\u7FD8\u5CED\u4FCF\u7A8D\u5207\u8304\u4E14\u602F\u7A83\u94A6\u4FB5\u4EB2\u79E6\u7434\u52E4\u82B9\u64D2\u79BD\u5BDD\u6C81\u9752\u8F7B\u6C22\u503E\u537F\u6E05\u64CE\u6674\u6C30\u60C5\u9877\u8BF7\u5E86\u743C\u7A77\u79CB\u4E18\u90B1\u7403\u6C42\u56DA\u914B\u6CC5\u8D8B\u533A\u86C6\u66F2\u8EAF\u5C48\u9A71\u6E20\u53D6\u5A36\u9F8B\u8DA3\u53BB\u5708\u98A7\u6743\u919B\u6CC9\u5168\u75CA\u62F3\u72AC\u5238\u529D\u7F3A\u7094\u7638\u5374\u9E4A\u69B7\u786E\u96C0\u88D9\u7FA4\u7136\u71C3\u5189\u67D3\u74E4\u58E4\u6518\u56B7\u8BA9\u9976\u6270\u7ED5\u60F9\u70ED\u58EC\u4EC1\u4EBA\u5FCD\u97E7\u4EFB\u8BA4\u5203\u598A\u7EAB\u6254\u4ECD\u65E5\u620E\u8338\u84C9\u8363\u878D\u7194\u6EB6\u5BB9\u7ED2\u5197\u63C9\u67D4\u8089\u8339\u8815\u5112\u5B7A\u5982\u8FB1\u4E73\u6C5D\u5165\u8925\u8F6F\u962E\u854A\u745E\u9510\u95F0\u6DA6\u82E5\u5F31\u6492\u6D12\u8428\u816E\u9CC3\u585E\u8D5B\u4E09\u53C1\u4F1E\u6563\u6851\u55D3\u4E27\u6414\u9A9A\u626B\u5AC2\u745F\u8272\u6DA9\u68EE\u50E7\u838E\u7802\u6740\u5239\u6C99\u7EB1\u50BB\u5565\u715E\u7B5B\u6652\u73CA\u82EB\u6749\u5C71\u5220\u717D\u886B\u95EA\u9655\u64C5\u8D61\u81B3\u5584\u6C55\u6247\u7F2E\u5892\u4F24\u5546\u8D4F\u664C\u4E0A\u5C1A\u88F3\u68A2\u634E\u7A0D\u70E7\u828D\u52FA\u97F6\u5C11\u54E8\u90B5\u7ECD\u5962\u8D4A\u86C7\u820C\u820D\u8D66\u6444\u5C04\u6151\u6D89\u793E\u8BBE\u7837\u7533\u547B\u4F38\u8EAB\u6DF1\u5A20\u7EC5\u795E\u6C88\u5BA1\u5A76\u751A\u80BE\u614E\u6E17\u58F0\u751F\u7525\u7272\u5347\u7EF3\u7701\u76DB\u5269\u80DC\u5723\u5E08\u5931\u72EE\u65BD\u6E7F\u8BD7\u5C38\u8671\u5341\u77F3\u62FE\u65F6\u4EC0\u98DF\u8680\u5B9E\u8BC6\u53F2\u77E2\u4F7F\u5C4E\u9A76\u59CB\u5F0F\u793A\u58EB\u4E16\u67FF\u4E8B\u62ED\u8A93\u901D\u52BF\u662F\u55DC\u566C\u9002\u4ED5\u4F8D\u91CA\u9970\u6C0F\u5E02\u6043\u5BA4\u89C6\u8BD5\u6536\u624B\u9996\u5B88\u5BFF\u6388\u552E\u53D7\u7626\u517D\u852C\u67A2\u68B3\u6B8A\u6292\u8F93\u53D4\u8212\u6DD1\u758F\u4E66\u8D4E\u5B70\u719F\u85AF\u6691\u66D9\u7F72\u8700\u9ECD\u9F20\u5C5E\u672F\u8FF0\u6811\u675F\u620D\u7AD6\u5885\u5EB6\u6570\u6F31\u6055\u5237\u800D\u6454\u8870\u7529\u5E05\u6813\u62F4\u971C\u53CC\u723D\u8C01\u6C34\u7761\u7A0E\u542E\u77AC\u987A\u821C\u8BF4\u7855\u6714\u70C1\u65AF\u6495\u5636\u601D\u79C1\u53F8\u4E1D\u6B7B\u8086\u5BFA\u55E3\u56DB\u4F3A\u4F3C\u9972\u5DF3\u677E\u8038\u6002\u9882\u9001\u5B8B\u8BBC\u8BF5\u641C\u8258\u64DE\u55FD\u82CF\u9165\u4FD7\u7D20\u901F\u7C9F\u50F3\u5851\u6EAF\u5BBF\u8BC9\u8083\u9178\u849C\u7B97\u867D\u968B\u968F\u7EE5\u9AD3\u788E\u5C81\u7A57\u9042\u96A7\u795F\u5B59\u635F\u7B0B\u84D1\u68AD\u5506\u7F29\u7410\u7D22\u9501\u6240\u584C\u4ED6\u5B83\u5979\u5854\u736D\u631E\u8E4B\u8E0F\u80CE\u82D4\u62AC\u53F0\u6CF0\u915E\u592A\u6001\u6C70\u574D\u644A\u8D2A\u762B\u6EE9\u575B\u6A80\u75F0\u6F6D\u8C2D\u8C08\u5766\u6BEF\u8892\u78B3\u63A2\u53F9\u70AD\u6C64\u5858\u642A\u5802\u68E0\u819B\u5510\u7CD6\u5018\u8EBA\u6DCC\u8D9F\u70EB\u638F\u6D9B\u6ED4\u7EE6\u8404\u6843\u9003\u6DD8\u9676\u8BA8\u5957\u7279\u85E4\u817E\u75BC\u8A8A\u68AF\u5254\u8E22\u9511\u63D0\u9898\u8E44\u557C\u4F53\u66FF\u568F\u60D5\u6D95\u5243\u5C49\u5929\u6DFB\u586B\u7530\u751C\u606C\u8214\u8146\u6311\u6761\u8FE2\u773A\u8DF3\u8D34\u94C1\u5E16\u5385\u542C\u70C3\u6C40\u5EF7\u505C\u4EAD\u5EAD\u633A\u8247\u901A\u6850\u916E\u77B3\u540C\u94DC\u5F64\u7AE5\u6876\u6345\u7B52\u7EDF\u75DB\u5077\u6295\u5934\u900F\u51F8\u79C3\u7A81\u56FE\u5F92\u9014\u6D82\u5C60\u571F\u5410\u5154\u6E4D\u56E2\u63A8\u9893\u817F\u8715\u892A\u9000\u541E\u5C6F\u81C0\u62D6\u6258\u8131\u9E35\u9640\u9A6E\u9A7C\u692D\u59A5\u62D3\u553E\u6316\u54C7\u86D9\u6D3C\u5A03\u74E6\u889C\u6B6A\u5916\u8C4C\u5F2F\u6E7E\u73A9\u987D\u4E38\u70F7\u5B8C\u7897\u633D\u665A\u7696\u60CB\u5B9B\u5A49\u4E07\u8155\u6C6A\u738B\u4EA1\u6789\u7F51\u5F80\u65FA\u671B\u5FD8\u5984\u5A01\u5DCD\u5FAE\u5371\u97E6\u8FDD\u6845\u56F4\u552F\u60DF\u4E3A\u6F4D\u7EF4\u82C7\u840E\u59D4\u4F1F\u4F2A\u5C3E\u7EAC\u672A\u851A\u5473\u754F\u80C3\u5582\u9B4F\u4F4D\u6E2D\u8C13\u5C09\u6170\u536B\u761F\u6E29\u868A\u6587\u95FB\u7EB9\u543B\u7A33\u7D0A\u95EE\u55E1\u7FC1\u74EE\u631D\u8717\u6DA1\u7A9D\u6211\u65A1\u5367\u63E1\u6C83\u5DEB\u545C\u94A8\u4E4C\u6C61\u8BEC\u5C4B\u65E0\u829C\u68A7\u543E\u5434\u6BCB\u6B66\u4E94\u6342\u5348\u821E\u4F0D\u4FAE\u575E\u620A\u96FE\u6664\u7269\u52FF\u52A1\u609F\u8BEF\u6614\u7199\u6790\u897F\u7852\u77FD\u6670\u563B\u5438\u9521\u727A\u7A00\u606F\u5E0C\u6089\u819D\u5915\u60DC\u7184\u70EF\u6EAA\u6C50\u7280\u6A84\u88AD\u5E2D\u4E60\u5AB3\u559C\u94E3\u6D17\u7CFB\u9699\u620F\u7EC6\u778E\u867E\u5323\u971E\u8F96\u6687\u5CE1\u4FA0\u72ED\u4E0B\u53A6\u590F\u5413\u6380\u9528\u5148\u4ED9\u9C9C\u7EA4\u54B8\u8D24\u8854\u8237\u95F2\u6D8E\u5F26\u5ACC\u663E\u9669\u73B0\u732E\u53BF\u817A\u9985\u7FA1\u5BAA\u9677\u9650\u7EBF\u76F8\u53A2\u9576\u9999\u7BB1\u8944\u6E58\u4E61\u7FD4\u7965\u8BE6\u60F3\u54CD\u4EAB\u9879\u5DF7\u6A61\u50CF\u5411\u8C61\u8427\u785D\u9704\u524A\u54EE\u56A3\u9500\u6D88\u5BB5\u6DC6\u6653\u5C0F\u5B5D\u6821\u8096\u5578\u7B11\u6548\u6954\u4E9B\u6B47\u874E\u978B\u534F\u631F\u643A\u90AA\u659C\u80C1\u8C10\u5199\u68B0\u5378\u87F9\u61C8\u6CC4\u6CFB\u8C22\u5C51\u85AA\u82AF\u950C\u6B23\u8F9B\u65B0\u5FFB\u5FC3\u4FE1\u8845\u661F\u8165\u7329\u60FA\u5174\u5211\u578B\u5F62\u90A2\u884C\u9192\u5E78\u674F\u6027\u59D3\u5144\u51F6\u80F8\u5308\u6C79\u96C4\u718A\u4F11\u4FEE\u7F9E\u673D\u55C5\u9508\u79C0\u8896\u7EE3\u589F\u620C\u9700\u865A\u5618\u987B\u5F90\u8BB8\u84C4\u9157\u53D9\u65ED\u5E8F\u755C\u6064\u7D6E\u5A7F\u7EEA\u7EED\u8F69\u55A7\u5BA3\u60AC\u65CB\u7384\u9009\u7663\u7729\u7EDA\u9774\u859B\u5B66\u7A74\u96EA\u8840\u52CB\u718F\u5FAA\u65EC\u8BE2\u5BFB\u9A6F\u5DE1\u6B89\u6C5B\u8BAD\u8BAF\u900A\u8FC5\u538B\u62BC\u9E26\u9E2D\u5440\u4E2B\u82BD\u7259\u869C\u5D16\u8859\u6DAF\u96C5\u54D1\u4E9A\u8BB6\u7109\u54BD\u9609\u70DF\u6DF9\u76D0\u4E25\u7814\u8712\u5CA9\u5EF6\u8A00\u989C\u960E\u708E\u6CBF\u5944\u63A9\u773C\u884D\u6F14\u8273\u5830\u71D5\u538C\u781A\u96C1\u5501\u5F66\u7130\u5BB4\u8C1A\u9A8C\u6B83\u592E\u9E2F\u79E7\u6768\u626C\u4F6F\u75A1\u7F8A\u6D0B\u9633\u6C27\u4EF0\u75D2\u517B\u6837\u6F3E\u9080\u8170\u5996\u7476\u6447\u5C27\u9065\u7A91\u8C23\u59DA\u54AC\u8200\u836F\u8981\u8000\u6930\u564E\u8036\u7237\u91CE\u51B6\u4E5F\u9875\u6396\u4E1A\u53F6\u66F3\u814B\u591C\u6DB2\u4E00\u58F9\u533B\u63D6\u94F1\u4F9D\u4F0A\u8863\u9890\u5937\u9057\u79FB\u4EEA\u80F0\u7591\u6C82\u5B9C\u59E8\u5F5D\u6905\u8681\u501A\u5DF2\u4E59\u77E3\u4EE5\u827A\u6291\u6613\u9091\u5C79\u4EBF\u5F79\u81C6\u9038\u8084\u75AB\u4EA6\u88D4\u610F\u6BC5\u5FC6\u4E49\u76CA\u6EA2\u8BE3\u8BAE\u8C0A\u8BD1\u5F02\u7FFC\u7FCC\u7ECE\u8335\u836B\u56E0\u6BB7\u97F3\u9634\u59FB\u541F\u94F6\u6DEB\u5BC5\u996E\u5C39\u5F15\u9690\u5370\u82F1\u6A31\u5A74\u9E70\u5E94\u7F28\u83B9\u8424\u8425\u8367\u8747\u8FCE\u8D62\u76C8\u5F71\u9896\u786C\u6620\u54DF\u62E5\u4F63\u81C3\u75C8\u5EB8\u96CD\u8E0A\u86F9\u548F\u6CF3\u6D8C\u6C38\u607F\u52C7\u7528\u5E7D\u4F18\u60A0\u5FE7\u5C24\u7531\u90AE\u94C0\u72B9\u6CB9\u6E38\u9149\u6709\u53CB\u53F3\u4F51\u91C9\u8BF1\u53C8\u5E7C\u8FC2\u6DE4\u4E8E\u76C2\u6986\u865E\u611A\u8206\u4F59\u4FDE\u903E\u9C7C\u6109\u6E1D\u6E14\u9685\u4E88\u5A31\u96E8\u4E0E\u5C7F\u79B9\u5B87\u8BED\u7FBD\u7389\u57DF\u828B\u90C1\u5401\u9047\u55BB\u5CEA\u5FA1\u6108\u6B32\u72F1\u80B2\u8A89\u6D74\u5BD3\u88D5\u9884\u8C6B\u9A6D\u9E33\u6E0A\u51A4\u5143\u57A3\u8881\u539F\u63F4\u8F95\u56ED\u5458\u5706\u733F\u6E90\u7F18\u8FDC\u82D1\u613F\u6028\u9662\u66F0\u7EA6\u8D8A\u8DC3\u94A5\u5CB3\u7CA4\u6708\u60A6\u9605\u8018\u4E91\u90E7\u5300\u9668\u5141\u8FD0\u8574\u915D\u6655\u97F5\u5B55\u531D\u7838\u6742\u683D\u54C9\u707E\u5BB0\u8F7D\u518D\u5728\u54B1\u6512\u6682\u8D5E\u8D43\u810F\u846C\u906D\u7CDF\u51FF\u85FB\u67A3\u65E9\u6FA1\u86A4\u8E81\u566A\u9020\u7682\u7076\u71E5\u8D23\u62E9\u5219\u6CFD\u8D3C\u600E\u589E\u618E\u66FE\u8D60\u624E\u55B3\u6E23\u672D\u8F67\u94E1\u95F8\u7728\u6805\u69A8\u548B\u4E4D\u70B8\u8BC8\u6458\u658B\u5B85\u7A84\u503A\u5BE8\u77BB\u6BE1\u8A79\u7C98\u6CBE\u76CF\u65A9\u8F97\u5D2D\u5C55\u8638\u6808\u5360\u6218\u7AD9\u6E5B\u7EFD\u6A1F\u7AE0\u5F70\u6F33\u5F20\u638C\u6DA8\u6756\u4E08\u5E10\u8D26\u4ED7\u80C0\u7634\u969C\u62DB\u662D\u627E\u6CBC\u8D75\u7167\u7F69\u5146\u8087\u53EC\u906E\u6298\u54F2\u86F0\u8F99\u8005\u9517\u8517\u8FD9\u6D59\u73CD\u659F\u771F\u7504\u7827\u81FB\u8D1E\u9488\u4FA6\u6795\u75B9\u8BCA\u9707\u632F\u9547\u9635\u84B8\u6323\u7741\u5F81\u72F0\u4E89\u6014\u6574\u62EF\u6B63\u653F\u5E27\u75C7\u90D1\u8BC1\u829D\u679D\u652F\u5431\u8718\u77E5\u80A2\u8102\u6C41\u4E4B\u7EC7\u804C\u76F4\u690D\u6B96\u6267\u503C\u4F84\u5740\u6307\u6B62\u8DBE\u53EA\u65E8\u7EB8\u5FD7\u631A\u63B7\u81F3\u81F4\u7F6E\u5E1C\u5CD9\u5236\u667A\u79E9\u7A1A\u8D28\u7099\u75D4\u6EDE\u6CBB\u7A92\u4E2D\u76C5\u5FE0\u949F\u8877\u7EC8\u79CD\u80BF\u91CD\u4EF2\u4F17\u821F\u5468\u5DDE\u6D32\u8BCC\u7CA5\u8F74\u8098\u5E1A\u5492\u76B1\u5B99\u663C\u9AA4\u73E0\u682A\u86DB\u6731\u732A\u8BF8\u8BDB\u9010\u7AF9\u70DB\u716E\u62C4\u77A9\u5631\u4E3B\u8457\u67F1\u52A9\u86C0\u8D2E\u94F8\u7B51\u4F4F\u6CE8\u795D\u9A7B\u6293\u722A\u62FD\u4E13\u7816\u8F6C\u64B0\u8D5A\u7BC6\u6869\u5E84\u88C5\u5986\u649E\u58EE\u72B6\u690E\u9525\u8FFD\u8D58\u5760\u7F00\u8C06\u51C6\u6349\u62D9\u5353\u684C\u7422\u8301\u914C\u5544\u7740\u707C\u6D4A\u5179\u54A8\u8D44\u59FF\u6ECB\u6DC4\u5B5C\u7D2B\u4ED4\u7C7D\u6ED3\u5B50\u81EA\u6E0D\u5B57\u9B03\u68D5\u8E2A\u5B97\u7EFC\u603B\u7EB5\u90B9\u8D70\u594F\u63CD\u79DF\u8DB3\u5352\u65CF\u7956\u8BC5\u963B\u7EC4\u94BB\u7E82\u5634\u9189\u6700\u7F6A\u5C0A\u9075\u6628\u5DE6\u4F50\u67DE\u505A\u4F5C\u5750\u5EA7\u4E8D\u4E0C\u5140\u4E10\u5EFF\u5345\u4E15\u4E98\u4E1E\u9B32\u5B6C\u5669\u4E28\u79BA\u4E3F\u5315\u4E47\u592D\u723B\u536E\u6C10\u56DF\u80E4\u9997\u6BD3\u777E\u9F17\u4E36\u4E9F\u9F10\u4E5C\u4E69\u4E93\u8288\u5B5B\u556C\u560F\u4EC4\u538D\u539D\u53A3\u53A5\u53AE\u9765\u8D5D\u531A\u53F5\u5326\u532E\u533E\u8D5C\u5366\u5363\u5202\u5208\u520E\u522D\u5233\u523F\u5240\u524C\u525E\u5261\u525C\u84AF\u527D\u5282\u5281\u5290\u5293\u5182\u7F54\u4EBB\u4EC3\u4EC9\u4EC2\u4EE8\u4EE1\u4EEB\u4EDE\u4F1B\u4EF3\u4F22\u4F64\u4EF5\u4F25\u4F27\u4F09\u4F2B\u4F5E\u4F67\u6538\u4F5A\u4F5D\u4F5F\u4F57\u4F32\u4F3D\u4F76\u4F74\u4F91\u4F89\u4F83\u4F8F\u4F7E\u4F7B\u4FAA\u4F7C\u4FAC\u4F94\u4FE6\u4FE8\u4FEA\u4FC5\u4FDA\u4FE3\u4FDC\u4FD1\u4FDF\u4FF8\u5029\u504C\u4FF3\u502C\u500F\u502E\u502D\u4FFE\u501C\u500C\u5025\u5028\u507E\u5043\u5055\u5048\u504E\u506C\u507B\u50A5\u50A7\u50A9\u50BA\u50D6\u5106\u50ED\u50EC\u50E6\u50EE\u5107\u510B\u4EDD\u6C3D\u4F58\u4F65\u4FCE\u9FA0\u6C46\u7C74\u516E\u5DFD\u9EC9\u9998\u5181\u5914\u52F9\u530D\u8A07\u5310\u51EB\u5919\u5155\u4EA0\u5156\u4EB3\u886E\u88A4\u4EB5\u8114\u88D2\u7980\u5B34\u8803\u7FB8\u51AB\u51B1\u51BD\u51BC\u51C7\u5196\u51A2\u51A5\u8BA0\u8BA6\u8BA7\u8BAA\u8BB4\u8BB5\u8BB7\u8BC2\u8BC3\u8BCB\u8BCF\u8BCE\u8BD2\u8BD3\u8BD4\u8BD6\u8BD8\u8BD9\u8BDC\u8BDF\u8BE0\u8BE4\u8BE8\u8BE9\u8BEE\u8BF0\u8BF3\u8BF6\u8BF9\u8BFC\u8BFF\u8C00\u8C02\u8C04\u8C07\u8C0C\u8C0F\u8C11\u8C12\u8C14\u8C15\u8C16\u8C19\u8C1B\u8C18\u8C1D\u8C1F\u8C20\u8C21\u8C25\u8C27\u8C2A\u8C2B\u8C2E\u8C2F\u8C32\u8C33\u8C35\u8C36\u5369\u537A\u961D\u9622\u9621\u9631\u962A\u963D\u963C\u9642\u9649\u9654\u965F\u9667\u966C\u9672\u9674\u9688\u968D\u9697\u96B0\u9097\u909B\u909D\u9099\u90AC\u90A1\u90B4\u90B3\u90B6\u90BA\u90B8\u90B0\u90CF\u90C5\u90BE\u90D0\u90C4\u90C7\u90D3\u90E6\u90E2\u90DC\u90D7\u90DB\u90EB\u90EF\u90FE\u9104\u9122\u911E\u9123\u9131\u912F\u9139\u9143\u9146\u520D\u5942\u52A2\u52AC\u52AD\u52BE\u54FF\u52D0\u52D6\u52F0\u53DF\u71EE\u77CD\u5EF4\u51F5\u51FC\u9B2F\u53B6\u5F01\u755A\u5DEF\u574C\u57A9\u57A1\u587E\u58BC\u58C5\u58D1\u5729\u572C\u572A\u5733\u5739\u572E\u572F\u575C\u573B\u5742\u5769\u5785\u576B\u5786\u577C\u577B\u5768\u576D\u5776\u5773\u57AD\u57A4\u578C\u57B2\u57CF\u57A7\u57B4\u5793\u57A0\u57D5\u57D8\u57DA\u57D9\u57D2\u57B8\u57F4\u57EF\u57F8\u57E4\u57DD\u580B\u580D\u57FD\u57ED\u5800\u581E\u5819\u5844\u5820\u5865\u586C\u5881\u5889\u589A\u5880\u99A8\u9F19\u61FF\u8279\u827D\u827F\u828F\u828A\u82A8\u8284\u828E\u8291\u8297\u8299\u82AB\u82B8\u82BE\u82B0\u82C8\u82CA\u82E3\u8298\u82B7\u82AE\u82CB\u82CC\u82C1\u82A9\u82B4\u82A1\u82AA\u829F\u82C4\u82CE\u82A4\u82E1\u8309\u82F7\u82E4\u830F\u8307\u82DC\u82F4\u82D2\u82D8\u830C\u82FB\u82D3\u8311\u831A\u8306\u8314\u8315\u82E0\u82D5\u831C\u8351\u835B\u835C\u8308\u8392\u833C\u8334\u8331\u839B\u835E\u832F\u834F\u8347\u8343\u835F\u8340\u8317\u8360\u832D\u833A\u8333\u8366\u8365\u8368\u831B\u8369\u836C\u836A\u836D\u836E\u83B0\u8378\u83B3\u83B4\u83A0\u83AA\u8393\u839C\u8385\u837C\u83B6\u83A9\u837D\u83B8\u837B\u8398\u839E\u83A8\u83BA\u83BC\u83C1\u8401\u83E5\u83D8\u5807\u8418\u840B\u83DD\u83FD\u83D6\u841C\u8438\u8411\u8406\u83D4\u83DF\u840F\u8403\u83F8\u83F9\u83EA\u83C5\u83C0\u8426\u83F0\u83E1\u845C\u8451\u845A\u8459\u8473\u8487\u8488\u847A\u8489\u8478\u843C\u8446\u8469\u8476\u848C\u848E\u8431\u846D\u84C1\u84CD\u84D0\u84E6\u84BD\u84D3\u84CA\u84BF\u84BA\u84E0\u84A1\u84B9\u84B4\u8497\u84E5\u84E3\u850C\u750D\u8538\u84F0\u8539\u851F\u853A\u8556\u853B\u84FF\u84FC\u8559\u8548\u8568\u8564\u855E\u857A\u77A2\u8543\u8572\u857B\u85A4\u85A8\u8587\u858F\u8579\u85AE\u859C\u8585\u85B9\u85B7\u85B0\u85D3\u85C1\u85DC\u85FF\u8627\u8605\u8629\u8616\u863C\u5EFE\u5F08\u593C\u5941\u8037\u5955\u595A\u5958\u530F\u5C22\u5C25\u5C2C\u5C34\u624C\u626A\u629F\u62BB\u62CA\u62DA\u62D7\u62EE\u6322\u62F6\u6339\u634B\u6343\u63AD\u63F6\u6371\u637A\u638E\u63B4\u636D\u63AC\u638A\u6369\u63AE\u63BC\u63F2\u63F8\u63E0\u63FF\u63C4\u63DE\u63CE\u6452\u63C6\u63BE\u6445\u6441\u640B\u641B\u6420\u640C\u6426\u6421\u645E\u6484\u646D\u6496\u647A\u64B7\u64B8\u6499\u64BA\u64C0\u64D0\u64D7\u64E4\u64E2\u6509\u6525\u652E\u5F0B\u5FD2\u7519\u5F11\u535F\u53F1\u53FD\u53E9\u53E8\u53FB\u5412\u5416\u5406\u544B\u5452\u5453\u5454\u5456\u5443\u5421\u5457\u5459\u5423\u5432\u5482\u5494\u5477\u5471\u5464\u549A\u549B\u5484\u5476\u5466\u549D\u54D0\u54AD\u54C2\u54B4\u54D2\u54A7\u54A6\u54D3\u54D4\u5472\u54A3\u54D5\u54BB\u54BF\u54CC\u54D9\u54DA\u54DC\u54A9\u54AA\u54A4\u54DD\u54CF\u54DE\u551B\u54E7\u5520\u54FD\u5514\u54F3\u5522\u5523\u550F\u5511\u5527\u552A\u5567\u558F\u55B5\u5549\u556D\u5541\u5555\u553F\u5550\u553C\u5537\u5556\u5575\u5576\u5577\u5533\u5530\u555C\u558B\u55D2\u5583\u55B1\u55B9\u5588\u5581\u559F\u557E\u55D6\u5591\u557B\u55DF\u55BD\u55BE\u5594\u5599\u55EA\u55F7\u55C9\u561F\u55D1\u55EB\u55EC\u55D4\u55E6\u55DD\u55C4\u55EF\u55E5\u55F2\u55F3\u55CC\u55CD\u55E8\u55F5\u55E4\u8F94\u561E\u5608\u560C\u5601\u5624\u5623\u55FE\u5600\u5627\u562D\u5658\u5639\u5657\u562C\u564D\u5662\u5659\u565C\u564C\u5654\u5686\u5664\u5671\u566B\u567B\u567C\u5685\u5693\u56AF\u56D4\u56D7\u56DD\u56E1\u56F5\u56EB\u56F9\u56FF\u5704\u570A\u5709\u571C\u5E0F\u5E19\u5E14\u5E11\u5E31\u5E3B\u5E3C\u5E37\u5E44\u5E54\u5E5B\u5E5E\u5E61\u5C8C\u5C7A\u5C8D\u5C90\u5C96\u5C88\u5C98\u5C99\u5C91\u5C9A\u5C9C\u5CB5\u5CA2\u5CBD\u5CAC\u5CAB\u5CB1\u5CA3\u5CC1\u5CB7\u5CC4\u5CD2\u5CE4\u5CCB\u5CE5\u5D02\u5D03\u5D27\u5D26\u5D2E\u5D24\u5D1E\u5D06\u5D1B\u5D58\u5D3E\u5D34\u5D3D\u5D6C\u5D5B\u5D6F\u5D5D\u5D6B\u5D4B\u5D4A\u5D69\u5D74\u5D82\u5D99\u5D9D\u8C73\u5DB7\u5DC5\u5F73\u5F77\u5F82\u5F87\u5F89\u5F8C\u5F95\u5F99\u5F9C\u5FA8\u5FAD\u5FB5\u5FBC\u8862\u5F61\u72AD\u72B0\u72B4\u72B7\u72B8\u72C3\u72C1\u72CE\u72CD\u72D2\u72E8\u72EF\u72E9\u72F2\u72F4\u72F7\u7301\u72F3\u7303\u72FA\u72FB\u7317\u7313\u7321\u730A\u731E\u731D\u7315\u7322\u7339\u7325\u732C\u7338\u7331\u7350\u734D\u7357\u7360\u736C\u736F\u737E\u821B\u5925\u98E7\u5924\u5902\u9963\u9967\u9968\u9969\u996A\u996B\u996C\u9974\u9977\u997D\u9980\u9984\u9987\u998A\u998D\u9990\u9991\u9993\u9994\u9995\u5E80\u5E91\u5E8B\u5E96\u5EA5\u5EA0\u5EB9\u5EB5\u5EBE\u5EB3\u8D53\u5ED2\u5ED1\u5EDB\u5EE8\u5EEA\u81BA\u5FC4\u5FC9\u5FD6\u5FCF\u6003\u5FEE\u6004\u5FE1\u5FE4\u5FFE\u6005\u6006\u5FEA\u5FED\u5FF8\u6019\u6035\u6026\u601B\u600F\u600D\u6029\u602B\u600A\u603F\u6021\u6078\u6079\u607B\u607A\u6042\u606A\u607D\u6096\u609A\u60AD\u609D\u6083\u6092\u608C\u609B\u60EC\u60BB\u60B1\u60DD\u60D8\u60C6\u60DA\u60B4\u6120\u6126\u6115\u6123\u60F4\u6100\u610E\u612B\u614A\u6175\u61AC\u6194\u61A7\u61B7\u61D4\u61F5\u5FDD\u96B3\u95E9\u95EB\u95F1\u95F3\u95F5\u95F6\u95FC\u95FE\u9603\u9604\u9606\u9608\u960A\u960B\u960C\u960D\u960F\u9612\u9615\u9616\u9617\u9619\u961A\u4E2C\u723F\u6215\u6C35\u6C54\u6C5C\u6C4A\u6CA3\u6C85\u6C90\u6C94\u6C8C\u6C68\u6C69\u6C74\u6C76\u6C86\u6CA9\u6CD0\u6CD4\u6CAD\u6CF7\u6CF8\u6CF1\u6CD7\u6CB2\u6CE0\u6CD6\u6CFA\u6CEB\u6CEE\u6CB1\u6CD3\u6CEF\u6CFE\u6D39\u6D27\u6D0C\u6D43\u6D48\u6D07\u6D04\u6D19\u6D0E\u6D2B\u6D4D\u6D2E\u6D35\u6D1A\u6D4F\u6D52\u6D54\u6D33\u6D91\u6D6F\u6D9E\u6DA0\u6D5E\u6D93\u6D94\u6D5C\u6D60\u6D7C\u6D63\u6E1A\u6DC7\u6DC5\u6DDE\u6E0E\u6DBF\u6DE0\u6E11\u6DE6\u6DDD\u6DD9\u6E16\u6DAB\u6E0C\u6DAE\u6E2B\u6E6E\u6E4E\u6E6B\u6EB2\u6E5F\u6E86\u6E53\u6E54\u6E32\u6E25\u6E44\u6EDF\u6EB1\u6E98\u6EE0\u6F2D\u6EE2\u6EA5\u6EA7\u6EBD\u6EBB\u6EB7\u6ED7\u6EB4\u6ECF\u6E8F\u6EC2\u6E9F\u6F62\u6F46\u6F47\u6F24\u6F15\u6EF9\u6F2F\u6F36\u6F4B\u6F74\u6F2A\u6F09\u6F29\u6F89\u6F8D\u6F8C\u6F78\u6F72\u6F7C\u6F7A\u6FD1\u6FC9\u6FA7\u6FB9\u6FB6\u6FC2\u6FE1\u6FEE\u6FDE\u6FE0\u6FEF\u701A\u7023\u701B\u7039\u7035\u704F\u705E\u5B80\u5B84\u5B95\u5B93\u5BA5\u5BB8\u752F\u9A9E\u6434\u5BE4\u5BEE\u8930\u5BF0\u8E47\u8B07\u8FB6\u8FD3\u8FD5\u8FE5\u8FEE\u8FE4\u8FE9\u8FE6\u8FF3\u8FE8\u9005\u9004\u900B\u9026\u9011\u900D\u9016\u9021\u9035\u9036\u902D\u902F\u9044\u9051\u9052\u9050\u9068\u9058\u9062\u905B\u66B9\u9074\u907D\u9082\u9088\u9083\u908B\u5F50\u5F57\u5F56\u5F58\u5C3B\u54AB\u5C50\u5C59\u5B71\u5C63\u5C66\u7FBC\u5F2A\u5F29\u5F2D\u8274\u5F3C\u9B3B\u5C6E\u5981\u5983\u598D\u59A9\u59AA\u59A3\u5997\u59CA\u59AB\u599E\u59A4\u59D2\u59B2\u59AF\u59D7\u59BE\u5A05\u5A06\u59DD\u5A08\u59E3\u59D8\u59F9\u5A0C\u5A09\u5A32\u5A34\u5A11\u5A23\u5A13\u5A40\u5A67\u5A4A\u5A55\u5A3C\u5A62\u5A75\u80EC\u5AAA\u5A9B\u5A77\u5A7A\u5ABE\u5AEB\u5AB2\u5AD2\u5AD4\u5AB8\u5AE0\u5AE3\u5AF1\u5AD6\u5AE6\u5AD8\u5ADC\u5B09\u5B17\u5B16\u5B32\u5B37\u5B40\u5C15\u5C1C\u5B5A\u5B65\u5B73\u5B51\u5B53\u5B62\u9A75\u9A77\u9A78\u9A7A\u9A7F\u9A7D\u9A80\u9A81\u9A85\u9A88\u9A8A\u9A90\u9A92\u9A93\u9A96\u9A98\u9A9B\u9A9C\u9A9D\u9A9F\u9AA0\u9AA2\u9AA3\u9AA5\u9AA7\u7E9F\u7EA1\u7EA3\u7EA5\u7EA8\u7EA9\u7EAD\u7EB0\u7EBE\u7EC0\u7EC1\u7EC2\u7EC9\u7ECB\u7ECC\u7ED0\u7ED4\u7ED7\u7EDB\u7EE0\u7EE1\u7EE8\u7EEB\u7EEE\u7EEF\u7EF1\u7EF2\u7F0D\u7EF6\u7EFA\u7EFB\u7EFE\u7F01\u7F02\u7F03\u7F07\u7F08\u7F0B\u7F0C\u7F0F\u7F11\u7F12\u7F17\u7F19\u7F1C\u7F1B\u7F1F\u7F21\u7F22\u7F23\u7F24\u7F25\u7F26\u7F27\u7F2A\u7F2B\u7F2C\u7F2D\u7F2F\u7F30\u7F31\u7F32\u7F33\u7F35\u5E7A\u757F\u5DDB\u753E\u9095\u738E\u7391\u73AE\u73A2\u739F\u73CF\u73C2\u73D1\u73B7\u73B3\u73C0\u73C9\u73C8\u73E5\u73D9\u987C\u740A\u73E9\u73E7\u73DE\u73BA\u73F2\u740F\u742A\u745B\u7426\u7425\u7428\u7430\u742E\u742C\u741B\u741A\u7441\u745C\u7457\u7455\u7459\u7477\u746D\u747E\u749C\u748E\u7480\u7481\u7487\u748B\u749E\u74A8\u74A9\u7490\u74A7\u74D2\u74BA\u97EA\u97EB\u97EC\u674C\u6753\u675E\u6748\u6769\u67A5\u6787\u676A\u6773\u6798\u67A7\u6775\u67A8\u679E\u67AD\u678B\u6777\u677C\u67F0\u6809\u67D8\u680A\u67E9\u67B0\u680C\u67D9\u67B5\u67DA\u67B3\u67DD\u6800\u67C3\u67B8\u67E2\u680E\u67C1\u67FD\u6832\u6833\u6860\u6861\u684E\u6862\u6844\u6864\u6883\u681D\u6855\u6866\u6841\u6867\u6840\u683E\u684A\u6849\u6829\u68B5\u688F\u6874\u6877\u6893\u686B\u68C2\u696E\u68FC\u691F\u6920\u68F9\u6924\u68F0\u690B\u6901\u6957\u68E3\u6910\u6971\u6939\u6960\u6942\u695D\u6984\u696B\u6980\u6998\u6978\u6934\u69CC\u6987\u6988\u69CE\u6989\u6966\u6963\u6979\u699B\u69A7\u69BB\u69AB\u69AD\u69D4\u69B1\u69C1\u69CA\u69DF\u6995\u69E0\u698D\u69FF\u6A2F\u69ED\u6A17\u6A18\u6A65\u69F2\u6A44\u6A3E\u6AA0\u6A50\u6A5B\u6A35\u6A8E\u6A79\u6A3D\u6A28\u6A58\u6A7C\u6A91\u6A90\u6AA9\u6A97\u6AAB\u7337\u7352\u6B81\u6B82\u6B87\u6B84\u6B92\u6B93\u6B8D\u6B9A\u6B9B\u6BA1\u6BAA\u8F6B\u8F6D\u8F71\u8F72\u8F73\u8F75\u8F76\u8F78\u8F77\u8F79\u8F7A\u8F7C\u8F7E\u8F81\u8F82\u8F84\u8F87\u8F8B\u8F8D\u8F8E\u8F8F\u8F98\u8F9A\u8ECE\u620B\u6217\u621B\u621F\u6222\u6221\u6225\u6224\u622C\u81E7\u74EF\u74F4\u74FF\u750F\u7511\u7513\u6534\u65EE\u65EF\u65F0\u660A\u6619\u6772\u6603\u6615\u6600\u7085\u66F7\u661D\u6634\u6631\u6636\u6635\u8006\u665F\u6654\u6641\u664F\u6656\u6661\u6657\u6677\u6684\u668C\u66A7\u669D\u66BE\u66DB\u66DC\u66E6\u66E9\u8D32\u8D33\u8D36\u8D3B\u8D3D\u8D40\u8D45\u8D46\u8D48\u8D49\u8D47\u8D4D\u8D55\u8D59\u89C7\u89CA\u89CB\u89CC\u89CE\u89CF\u89D0\u89D1\u726E\u729F\u725D\u7266\u726F\u727E\u727F\u7284\u728B\u728D\u728F\u7292\u6308\u6332\u63B0\u643F\u64D8\u8004\u6BEA\u6BF3\u6BFD\u6BF5\u6BF9\u6C05\u6C07\u6C06\u6C0D\u6C15\u6C18\u6C19\u6C1A\u6C21\u6C29\u6C24\u6C2A\u6C32\u6535\u6555\u656B\u724D\u7252\u7256\u7230\u8662\u5216\u809F\u809C\u8093\u80BC\u670A\u80BD\u80B1\u80AB\u80AD\u80B4\u80B7\u80E7\u80E8\u80E9\u80EA\u80DB\u80C2\u80C4\u80D9\u80CD\u80D7\u6710\u80DD\u80EB\u80F1\u80F4\u80ED\u810D\u810E\u80F2\u80FC\u6715\u8112\u8C5A\u8136\u811E\u812C\u8118\u8132\u8148\u814C\u8153\u8174\u8159\u815A\u8171\u8160\u8169\u817C\u817D\u816D\u8167\u584D\u5AB5\u8188\u8182\u8191\u6ED5\u81A3\u81AA\u81CC\u6726\u81CA\u81BB\u81C1\u81A6\u6B24\u6B37\u6B39\u6B43\u6B46\u6B59\u98D1\u98D2\u98D3\u98D5\u98D9\u98DA\u6BB3\u5F40\u6BC2\u89F3\u6590\u9F51\u6593\u65BC\u65C6\u65C4\u65C3\u65CC\u65CE\u65D2\u65D6\u7080\u709C\u7096\u709D\u70BB\u70C0\u70B7\u70AB\u70B1\u70E8\u70CA\u7110\u7113\u7116\u712F\u7131\u7173\u715C\u7168\u7145\u7172\u714A\u7178\u717A\u7198\u71B3\u71B5\u71A8\u71A0\u71E0\u71D4\u71E7\u71F9\u721D\u7228\u706C\u7118\u7166\u71B9\u623E\u623D\u6243\u6248\u6249\u793B\u7940\u7946\u7949\u795B\u795C\u7953\u795A\u7962\u7957\u7960\u796F\u7967\u797A\u7985\u798A\u799A\u79A7\u79B3\u5FD1\u5FD0\u603C\u605D\u605A\u6067\u6041\u6059\u6063\u60AB\u6106\u610D\u615D\u61A9\u619D\u61CB\u61D1\u6206\u8080\u807F\u6C93\u6CF6\u6DFC\u77F6\u77F8\u7800\u7809\u7817\u7818\u7811\u65AB\u782D\u781C\u781D\u7839\u783A\u783B\u781F\u783C\u7825\u782C\u7823\u7829\u784E\u786D\u7856\u7857\u7826\u7850\u7847\u784C\u786A\u789B\u7893\u789A\u7887\u789C\u78A1\u78A3\u78B2\u78B9\u78A5\u78D4\u78D9\u78C9\u78EC\u78F2\u7905\u78F4\u7913\u7924\u791E\u7934\u9F9B\u9EF9\u9EFB\u9EFC\u76F1\u7704\u770D\u76F9\u7707\u7708\u771A\u7722\u7719\u772D\u7726\u7735\u7738\u7750\u7751\u7747\u7743\u775A\u7768\u7762\u7765\u777F\u778D\u777D\u7780\u778C\u7791\u779F\u77A0\u77B0\u77B5\u77BD\u753A\u7540\u754E\u754B\u7548\u755B\u7572\u7579\u7583\u7F58\u7F61\u7F5F\u8A48\u7F68\u7F74\u7F71\u7F79\u7F81\u7F7E\u76CD\u76E5\u8832\u9485\u9486\u9487\u948B\u948A\u948C\u948D\u948F\u9490\u9494\u9497\u9495\u949A\u949B\u949C\u94A3\u94A4\u94AB\u94AA\u94AD\u94AC\u94AF\u94B0\u94B2\u94B4\u94B6\u94B7\u94B8\u94B9\u94BA\u94BC\u94BD\u94BF\u94C4\u94C8\u94C9\u94CA\u94CB\u94CC\u94CD\u94CE\u94D0\u94D1\u94D2\u94D5\u94D6\u94D7\u94D9\u94D8\u94DB\u94DE\u94DF\u94E0\u94E2\u94E4\u94E5\u94E7\u94E8\u94EA\u94E9\u94EB\u94EE\u94EF\u94F3\u94F4\u94F5\u94F7\u94F9\u94FC\u94FD\u94FF\u9503\u9502\u9506\u9507\u9509\u950A\u950D\u950E\u950F\u9512\u9513\u9514\u9515\u9516\u9518\u951B\u951D\u951E\u951F\u9522\u952A\u952B\u9529\u952C\u9531\u9532\u9534\u9536\u9537\u9538\u953C\u953E\u953F\u9542\u9535\u9544\u9545\u9546\u9549\u954C\u954E\u954F\u9552\u9553\u9554\u9556\u9557\u9558\u9559\u955B\u955E\u955F\u955D\u9561\u9562\u9564\u9565\u9566\u9567\u9568\u9569\u956A\u956B\u956C\u956F\u9571\u9572\u9573\u953A\u77E7\u77EC\u96C9\u79D5\u79ED\u79E3\u79EB\u7A06\u5D47\u7A03\u7A02\u7A1E\u7A14\u7A39\u7A37\u7A51\u9ECF\u99A5\u7A70\u7688\u768E\u7693\u7699\u76A4\u74DE\u74E0\u752C\u9E20\u9E22\u9E28\u9E29\u9E2A\u9E2B\u9E2C\u9E32\u9E31\u9E36\u9E38\u9E37\u9E39\u9E3A\u9E3E\u9E41\u9E42\u9E44\u9E46\u9E47\u9E48\u9E49\u9E4B\u9E4C\u9E4E\u9E51\u9E55\u9E57\u9E5A\u9E5B\u9E5C\u9E5E\u9E63\u9E66\u9E67\u9E68\u9E69\u9E6A\u9E6B\u9E6C\u9E71\u9E6D\u9E73\u7592\u7594\u7596\u75A0\u759D\u75AC\u75A3\u75B3\u75B4\u75B8\u75C4\u75B1\u75B0\u75C3\u75C2\u75D6\u75CD\u75E3\u75E8\u75E6\u75E4\u75EB\u75E7\u7603\u75F1\u75FC\u75FF\u7610\u7600\u7605\u760C\u7617\u760A\u7625\u7618\u7615\u7619\u761B\u763C\u7622\u7620\u7640\u762D\u7630\u763F\u7635\u7643\u763E\u7633\u764D\u765E\u7654\u765C\u7656\u766B\u766F\u7FCA\u7AE6\u7A78\u7A79\u7A80\u7A86\u7A88\u7A95\u7AA6\u7AA0\u7AAC\u7AA8\u7AAD\u7AB3\u8864\u8869\u8872\u887D\u887F\u8882\u88A2\u88C6\u88B7\u88BC\u88C9\u88E2\u88CE\u88E3\u88E5\u88F1\u891A\u88FC\u88E8\u88FE\u88F0\u8921\u8919\u8913\u891B\u890A\u8934\u892B\u8936\u8941\u8966\u897B\u758B\u80E5\u76B2\u76B4\u77DC\u8012\u8014\u8016\u801C\u8020\u8022\u8025\u8026\u8027\u8029\u8028\u8031\u800B\u8035\u8043\u8046\u804D\u8052\u8069\u8071\u8983\u9878\u9880\u9883\u9889\u988C\u988D\u988F\u9894\u989A\u989B\u989E\u989F\u98A1\u98A2\u98A5\u98A6\u864D\u8654\u866C\u866E\u867F\u867A\u867C\u867B\u86A8\u868D\u868B\u86AC\u869D\u86A7\u86A3\u86AA\u8693\u86A9\u86B6\u86C4\u86B5\u86CE\u86B0\u86BA\u86B1\u86AF\u86C9\u86CF\u86B4\u86E9\u86F1\u86F2\u86ED\u86F3\u86D0\u8713\u86DE\u86F4\u86DF\u86D8\u86D1\u8703\u8707\u86F8\u8708\u870A\u870D\u8709\u8723\u873B\u871E\u8725\u872E\u871A\u873E\u8748\u8734\u8731\u8729\u8737\u873F\u8782\u8722\u877D\u877E\u877B\u8760\u8770\u874C\u876E\u878B\u8753\u8763\u877C\u8764\u8759\u8765\u8793\u87AF\u87A8\u87D2\u87C6\u8788\u8785\u87AD\u8797\u8783\u87AB\u87E5\u87AC\u87B5\u87B3\u87CB\u87D3\u87BD\u87D1\u87C0\u87CA\u87DB\u87EA\u87E0\u87EE\u8816\u8813\u87FE\u880A\u881B\u8821\u8839\u883C\u7F36\u7F42\u7F44\u7F45\u8210\u7AFA\u7AFD\u7B08\u7B03\u7B04\u7B15\u7B0A\u7B2B\u7B0F\u7B47\u7B38\u7B2A\u7B19\u7B2E\u7B31\u7B20\u7B25\u7B24\u7B33\u7B3E\u7B1E\u7B58\u7B5A\u7B45\u7B75\u7B4C\u7B5D\u7B60\u7B6E\u7B7B\u7B62\u7B72\u7B71\u7B90\u7BA6\u7BA7\u7BB8\u7BAC\u7B9D\u7BA8\u7B85\u7BAA\u7B9C\u7BA2\u7BAB\u7BB4\u7BD1\u7BC1\u7BCC\u7BDD\u7BDA\u7BE5\u7BE6\u7BEA\u7C0C\u7BFE\u7BFC\u7C0F\u7C16\u7C0B\u7C1F\u7C2A\u7C26\u7C38\u7C41\u7C40\u81FE\u8201\u8202\u8204\u81EC\u8844\u8221\u8222\u8223\u822D\u822F\u8228\u822B\u8238\u823B\u8233\u8234\u823E\u8244\u8249\u824B\u824F\u825A\u825F\u8268\u887E\u8885\u8888\u88D8\u88DF\u895E\u7F9D\u7F9F\u7FA7\u7FAF\u7FB0\u7FB2\u7C7C\u6549\u7C91\u7C9D\u7C9C\u7C9E\u7CA2\u7CB2\u7CBC\u7CBD\u7CC1\u7CC7\u7CCC\u7CCD\u7CC8\u7CC5\u7CD7\u7CE8\u826E\u66A8\u7FBF\u7FCE\u7FD5\u7FE5\u7FE1\u7FE6\u7FE9\u7FEE\u7FF3\u7CF8\u7D77\u7DA6\u7DAE\u7E47\u7E9B\u9EB8\u9EB4\u8D73\u8D84\u8D94\u8D91\u8DB1\u8D67\u8D6D\u8C47\u8C49\u914A\u9150\u914E\u914F\u9164\u9162\u9161\u9170\u9169\u916F\u917D\u917E\u9172\u9174\u9179\u918C\u9185\u9190\u918D\u9191\u91A2\u91A3\u91AA\u91AD\u91AE\u91AF\u91B5\u91B4\u91BA\u8C55\u9E7E\u8DB8\u8DEB\u8E05\u8E59\u8E69\u8DB5\u8DBF\u8DBC\u8DBA\u8DC4\u8DD6\u8DD7\u8DDA\u8DDE\u8DCE\u8DCF\u8DDB\u8DC6\u8DEC\u8DF7\u8DF8\u8DE3\u8DF9\u8DFB\u8DE4\u8E09\u8DFD\u8E14\u8E1D\u8E1F\u8E2C\u8E2E\u8E23\u8E2F\u8E3A\u8E40\u8E39\u8E35\u8E3D\u8E31\u8E49\u8E41\u8E42\u8E51\u8E52\u8E4A\u8E70\u8E76\u8E7C\u8E6F\u8E74\u8E85\u8E8F\u8E94\u8E90\u8E9C\u8E9E\u8C78\u8C82\u8C8A\u8C85\u8C98\u8C94\u659B\u89D6\u89DE\u89DA\u89DC\u89E5\u89EB\u89EF\u8A3E\u8B26\u9753\u96E9\u96F3\u96EF\u9706\u9701\u9708\u970F\u970E\u972A\u972D\u9730\u973E\u9F80\u9F83\u9F85\u9F86\u9F87\u9F88\u9F89\u9F8A\u9F8C\u9EFE\u9F0B\u9F0D\u96B9\u96BC\u96BD\u96CE\u96D2\u77BF\u96E0\u928E\u92AE\u92C8\u933E\u936A\u93CA\u938F\u943E\u946B\u9C7F\u9C82\u9C85\u9C86\u9C87\u9C88\u7A23\u9C8B\u9C8E\u9C90\u9C91\u9C92\u9C94\u9C95\u9C9A\u9C9B\u9C9E\u9C9F\u9CA0\u9CA1\u9CA2\u9CA3\u9CA5\u9CA6\u9CA7\u9CA8\u9CA9\u9CAB\u9CAD\u9CAE\u9CB0\u9CB1\u9CB2\u9CB3\u9CB4\u9CB5\u9CB6\u9CB7\u9CBA\u9CBB\u9CBC\u9CBD\u9CC4\u9CC5\u9CC6\u9CC7\u9CCA\u9CCB\u9CCC\u9CCD\u9CCE\u9CCF\u9CD0\u9CD3\u9CD4\u9CD5\u9CD7\u9CD8\u9CD9\u9CDC\u9CDD\u9CDF\u9CE2\u977C\u9785\u9791\u9792\u9794\u97AF\u97AB\u97A3\u97B2\u97B4\u9AB1\u9AB0\u9AB7\u9E58\u9AB6\u9ABA\u9ABC\u9AC1\u9AC0\u9AC5\u9AC2\u9ACB\u9ACC\u9AD1\u9B45\u9B43\u9B47\u9B49\u9B48\u9B4D\u9B51\u98E8\u990D\u992E\u9955\u9954\u9ADF\u9AE1\u9AE6\u9AEF\u9AEB\u9AFB\u9AED\u9AF9\u9B08\u9B0F\u9B13\u9B1F\u9B23\u9EBD\u9EBE\u7E3B\u9E82\u9E87\u9E88\u9E8B\u9E92\u93D6\u9E9D\u9E9F\u9EDB\u9EDC\u9EDD\u9EE0\u9EDF\u9EE2\u9EE9\u9EE7\u9EE5\u9EEA\u9EEF\u9F22\u9F2C\u9F2F\u9F39\u9F37\u9F3D\u9F3E\u9F44"; - assert_equals(new TextDecoder("hz-gb-2312").decode(new Uint8Array(bytes)), string, "decoded"); - }, - "hz-gb-2312" -); - diff --git a/dom/encoding/test/unit/test_misc.js b/dom/encoding/test/unit/test_misc.js index 29830b0a60ff..e7f8a5201911 100644 --- a/dom/encoding/test/unit/test_misc.js +++ b/dom/encoding/test/unit/test_misc.js @@ -163,15 +163,13 @@ test( test( function () { - var encodings = ["utf-8", "ibm866", "iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-8-i", "iso-8859-10", "iso-8859-13", "iso-8859-14", "iso-8859-15", "iso-8859-16", "koi8-r", "koi8-u", "macintosh", "windows-874", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "windows-1258", "x-mac-cyrillic", "gbk", "gb18030", "hz-gb-2312", "big5", "euc-jp", "iso-2022-jp", "shift_jis", "euc-kr", "x-user-defined"]; + var encodings = ["utf-8", "ibm866", "iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-8-i", "iso-8859-10", "iso-8859-13", "iso-8859-14", "iso-8859-15", "iso-8859-16", "koi8-r", "koi8-u", "macintosh", "windows-874", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "windows-1258", "x-mac-cyrillic", "gbk", "gb18030", "big5", "euc-jp", "iso-2022-jp", "shift_jis", "euc-kr", "x-user-defined"]; encodings.forEach(function (encoding) { var string = '', bytes = []; for (var i = 0; i < 128; ++i) { // Encodings that have escape codes in 0x00-0x7F - if (encoding === "hz-gb-2312" && i === 0x7E) - continue; if (encoding === "iso-2022-jp" && i === 0x1B) continue; @@ -208,7 +206,7 @@ test( var utf_encodings = ["utf-8", "utf-16le", "utf-16be"]; - var legacy_encodings = ["ibm866", "iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-8-i", "iso-8859-10", "iso-8859-13", "iso-8859-14", "iso-8859-15", "iso-8859-16", "koi8-r", "koi8-u", "macintosh", "windows-874", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "windows-1258", "x-mac-cyrillic", "gbk", "gb18030", "hz-gb-2312", "big5", "euc-jp", "iso-2022-jp", "shift_jis", "euc-kr", "x-user-defined"]; + var legacy_encodings = ["ibm866", "iso-8859-2", "iso-8859-3", "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", "iso-8859-8", "iso-8859-8-i", "iso-8859-10", "iso-8859-13", "iso-8859-14", "iso-8859-15", "iso-8859-16", "koi8-r", "koi8-u", "macintosh", "windows-874", "windows-1250", "windows-1251", "windows-1252", "windows-1253", "windows-1254", "windows-1255", "windows-1256", "windows-1257", "windows-1258", "x-mac-cyrillic", "gbk", "gb18030", "big5", "euc-jp", "iso-2022-jp", "shift_jis", "euc-kr", "x-user-defined"]; utf_encodings.forEach(function(encoding) { assert_equals(new TextDecoder(encoding).encoding, encoding); diff --git a/dom/encoding/test/unit/xpcshell.ini b/dom/encoding/test/unit/xpcshell.ini index 1345553e4fa7..7ca8b584dcd2 100644 --- a/dom/encoding/test/unit/xpcshell.ini +++ b/dom/encoding/test/unit/xpcshell.ini @@ -9,6 +9,5 @@ tail = [test_euc-jp.js] [test_euc-kr.js] [test_gbk.js] -[test_hz-gb-2312.js] [test_iso-2022-jp.js] [test_shift_jis.js] diff --git a/dom/events/EventListenerManager.cpp b/dom/events/EventListenerManager.cpp index b9d687e0de68..288707af9c2c 100644 --- a/dom/events/EventListenerManager.cpp +++ b/dom/events/EventListenerManager.cpp @@ -776,9 +776,10 @@ EventListenerManager::CompileEventHandlerInternal(Listener* aListener, // Activate JSAPI, and make sure that exceptions are reported on the right // Window. AutoJSAPI jsapi; - if (NS_WARN_IF(!jsapi.InitWithLegacyErrorReporting(global))) { + if (NS_WARN_IF(!jsapi.Init(global))) { return NS_ERROR_UNEXPECTED; } + jsapi.TakeOwnershipOfErrorReporting(); JSContext* cx = jsapi.cx(); nsCOMPtr typeAtom = aListener->mTypeAtom; @@ -895,7 +896,7 @@ EventListenerManager::CompileEventHandlerInternal(Listener* aListener, .setDefineOnScope(false); JS::Rooted handler(cx); - result = nsJSUtils::CompileFunction(cx, target, options, + result = nsJSUtils::CompileFunction(jsapi, target, options, nsAtomCString(typeAtom), argCount, argNames, *body, handler.address()); NS_ENSURE_SUCCESS(result, result); diff --git a/dom/locales/en-US/chrome/layout/css.properties b/dom/locales/en-US/chrome/layout/css.properties index 964c3fdb4e48..13ed5dca09bc 100644 --- a/dom/locales/en-US/chrome/layout/css.properties +++ b/dom/locales/en-US/chrome/layout/css.properties @@ -56,6 +56,7 @@ PECounterExtendsNotIdent=Expected identifier for extends system but found '%1$S' PECounterASWeight=Each weight in the additive-symbols descriptor must be smaller than the previous weight. PEClassSelEOF=class name PEClassSelNotIdent=Expected identifier for class selector but found '%1$S'. +PECoordinatePair=Expected coordinate pair but found '%1$S'. PETypeSelEOF=element type PETypeSelNotType=Expected element name or '*' but found '%1$S'. PEUnknownNamespacePrefix=Unknown namespace prefix '%1$S'. @@ -106,6 +107,7 @@ PEColorLightnessEOF=lightness PEColorOpacityEOF=opacity in color value PEExpectedNumber=Expected a number but found '%1$S'. PEExpectedCloseParen=Expected ')' but found '%1$S'. +PEClipPathEOF= or reference box PEDeclEndEOF=';' or '}' to end declaration PEParseDeclarationNoColon=Expected ':' but found '%1$S'. PEParseDeclarationDeclExpected=Expected declaration but found '%1$S'. diff --git a/dom/promise/Promise.cpp b/dom/promise/Promise.cpp index f0a01fa51c28..7d747e536b3c 100644 --- a/dom/promise/Promise.cpp +++ b/dom/promise/Promise.cpp @@ -1023,13 +1023,11 @@ Promise::MaybeReportRejected() } nsRefPtr xpcReport = new xpc::ErrorReport(); - if (MOZ_LIKELY(NS_IsMainThread())) { - nsIGlobalObject* global = xpc::NativeGlobal(js::GetGlobalForObjectCrossCompartment(obj)); - xpcReport->Init(report.report(), report.message(), global); - } else { - xpcReport->InitOnWorkerThread(report.report(), report.message(), - GetCurrentThreadWorkerPrivate()->IsChromeWorker()); - } + bool isMainThread = MOZ_LIKELY(NS_IsMainThread()); + bool isChrome = isMainThread ? nsContentUtils::IsSystemPrincipal(nsContentUtils::ObjectPrincipal(obj)) + : GetCurrentThreadWorkerPrivate()->IsChromeWorker(); + nsPIDOMWindow* win = isMainThread ? xpc::WindowGlobalOrNull(obj) : nullptr; + xpcReport->Init(report.report(), report.message(), isChrome, win ? win->WindowID() : 0); // Now post an event to do the real reporting async // Since Promises preserve their wrapper, it is essential to nsRefPtr<> the diff --git a/dom/tests/mochitest/bugs/mochitest.ini b/dom/tests/mochitest/bugs/mochitest.ini index e6f6e3e867bf..543467315a43 100644 --- a/dom/tests/mochitest/bugs/mochitest.ini +++ b/dom/tests/mochitest/bugs/mochitest.ini @@ -155,6 +155,7 @@ skip-if = (buildapp == 'b2g' && toolkit != 'gonk') #Bug 931116, b2g desktop spec [test_devicemotion_multiple_listeners.html] skip-if = toolkit == 'android' || e10s #bug 775227 [test_domparser_after_blank.html] +[test_errorReporting.html] [test_onerror_message.html] [test_protochains.html] [test_resize_move_windows.html] diff --git a/dom/tests/mochitest/bugs/test_errorReporting.html b/dom/tests/mochitest/bugs/test_errorReporting.html new file mode 100644 index 000000000000..8ca001f9a416 --- /dev/null +++ b/dom/tests/mochitest/bugs/test_errorReporting.html @@ -0,0 +1,73 @@ + + + + + + Test for Bug 1070842 + + + + + +Mozilla Bug 1070842 +

+ +
+
+ + diff --git a/dom/tests/mochitest/chrome/test_sandbox_bindings.xul b/dom/tests/mochitest/chrome/test_sandbox_bindings.xul index c4cb377549d6..300ff312ae07 100644 --- a/dom/tests/mochitest/chrome/test_sandbox_bindings.xul +++ b/dom/tests/mochitest/chrome/test_sandbox_bindings.xul @@ -70,27 +70,17 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=741267 } try { var xhr = Components.utils.evalInSandbox("XMLHttpRequest", sandbox); - xhr.prototype = false; - } catch (e) { - ok(true, "'XMLHttpRequest.prototype' should be readonly"); - } - try { - var xhr = Components.utils.evalInSandbox("XMLHttpRequest", sandbox); - delete xhr.prototype; - } catch (e) { - ok(true, "'XMLHttpRequest.prototype' should be permanent"); + xhr.prototype = "notok"; + } finally { + isnot(xhr.prototype, "notok", "'XMLHttpRequest.prototype' should be readonly"); } + var constructorWritable = false; try { var xhr = Components.utils.evalInSandbox("XMLHttpRequest.prototype", sandbox); xhr.constructor = "ok"; - } catch (e) { is(xhr.constructor, "ok", "'XMLHttpRequest.prototype.constructor' should be writeable"); - } - try { - var xhr = Components.utils.evalInSandbox("XMLHttpRequest.prototype", sandbox); - delete xhr.constructor; } catch (e) { - is(xhr.constructor, undefined, "'XMLHttpRequest.prototype.constructor' should be permanent"); + ok(false, "'XMLHttpRequest.prototype.constructor' should be writeable"); } try { var xhr = Components.utils.evalInSandbox("XMLHttpRequest", sandbox); @@ -109,10 +99,16 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=741267 } try { var xhr = Components.utils.evalInSandbox("new XMLHttpRequest()", sandbox); - is("" + xhr, new XMLHttpRequest() + "", "'XMLHttpRequest()' in a sandbox should create an XMLHttpRequest object"); + is("" + xhr, new XMLHttpRequest() + "", "'new XMLHttpRequest()' in a sandbox should create an XMLHttpRequest object"); } catch (e) { ok(false, "'new XMLHttpRequest()' shouldn't throw in a sandbox (1)"); } + try { + var xhr = Components.utils.evalInSandbox("XMLHttpRequest.toString = function () { return 'Failed'; }; XMLHttpRequest;", sandbox); + is(xhr.toString(), XMLHttpRequest + "", "XMLHttpRequest.toString in the sandbox should not override the native toString behaviour"); + } catch (e) { + ok(false, "'XMLHttpRequest' shouldn't throw in a sandbox"); + } try { var xhr = Components.utils.evalInSandbox("XMLHttpRequest.prototype.toString = function () { return 'Failed'; }; new XMLHttpRequest();", sandbox); is(xhr.toString(), new XMLHttpRequest() + "", "XMLHttpRequest.prototype.toString in the sandbox should not override the native toString behaviour"); @@ -136,14 +132,23 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=741267 } catch (e) { ok(false, "XMLHttpRequest.prototype manipulation via an Xray shouldn't throw" + e); } - + try { + Components.utils.evalInSandbox("XMLHttpRequest.prototype.a = 'expando a'", sandbox); + Components.utils.evalInSandbox("XMLHttpRequest.prototype.b = 'expando b'", sandbox); + Components.utils.evalInSandbox("XMLHttpRequest.prototype", sandbox).b = 'xrayexpando'; + var xhr = Components.utils.evalInSandbox("new XMLHttpRequest()", sandbox); + is(xhr.a, undefined, "'XMLHttpRequest()' in a sandbox should not have expandos from inside the sandbox"); + is(xhr.b, "xrayexpando", "'new XMLHttpRequest()' in a sandbox should have Xray expandos"); + } catch (e) { + ok(false, "'new XMLHttpRequest()' shouldn't throw in a sandbox"); + } try { Components.utils.evalInSandbox("document.defaultView.XMLHttpRequest = function() {};", sandbox); var win = Components.utils.evalInSandbox("document.defaultView", sandbox); var xhr = new win.XMLHttpRequest(); - is("" + xhr, new XMLHttpRequest() + "", "'XMLHttpRequest()' in a sandbox should create an XMLHttpRequest object"); + is("" + xhr, new XMLHttpRequest() + "", "'new XMLHttpRequest()' in a sandbox should create an XMLHttpRequest object"); } catch (e) { - ok(false, "'XMLHttpRequest()' shouldn't throw in a sandbox"); + ok(false, "'new XMLHttpRequest()' shouldn't throw in a sandbox"); } try { var canvas = Components.utils.evalInSandbox("document.createElement('canvas').getContext('2d')", sandbox); @@ -155,7 +160,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=741267 var classList = Components.utils.evalInSandbox("document.body.className = 'a b'; document.body.classList", sandbox); is(classList.toString(), "a b", "Stringifier should be called"); } catch (e) { - ok(false, "'document.createElement('canvas').getContext('2D')' shouldn't throw in a sandbox"); + ok(false, "Stringifying shouldn't throw in a sandbox"); } try { var ctx = Components.utils.evalInSandbox("var ctx = document.createElement('canvas').getContext('2d'); ctx.foopy = 5; ctx", sandbox); diff --git a/dom/webidl/Window.webidl b/dom/webidl/Window.webidl index 8641883c42da..7bf30c1de773 100644 --- a/dom/webidl/Window.webidl +++ b/dom/webidl/Window.webidl @@ -63,7 +63,7 @@ typedef any Transferable; // We think the indexed getter is a bug in the spec, it actually needs to live // on the WindowProxy //getter WindowProxy (unsigned long index); - //getter object (DOMString name); + getter object (DOMString name); // the user agent [Throws] readonly attribute Navigator navigator; diff --git a/dom/xbl/nsXBLProtoImpl.cpp b/dom/xbl/nsXBLProtoImpl.cpp index d8dd66116956..186e691bbb66 100644 --- a/dom/xbl/nsXBLProtoImpl.cpp +++ b/dom/xbl/nsXBLProtoImpl.cpp @@ -22,6 +22,7 @@ #include "js/CharacterEncoding.h" using namespace mozilla; +using namespace mozilla::dom; using js::GetGlobalForObjectCrossCompartment; using js::AssertSameCompartment; @@ -210,7 +211,7 @@ nsXBLProtoImpl::InitTargetObjects(nsXBLPrototypeBinding* aBinding, // Make sure the interface object is created before the prototype object // so that XULElement is hidden from content. See bug 909340. bool defineOnGlobal = dom::XULElementBinding::ConstructorEnabled(cx, global); - dom::XULElementBinding::GetConstructorObject(cx, global, defineOnGlobal); + dom::XULElementBinding::GetConstructorObjectHandle(cx, global, defineOnGlobal); rv = nsContentUtils::WrapNative(cx, aBoundElement, &v, /* aAllowWrapping = */ false); @@ -239,9 +240,12 @@ nsXBLProtoImpl::CompilePrototypeMembers(nsXBLPrototypeBinding* aBinding) // We want to pre-compile our implementation's members against a "prototype context". Then when we actually // bind the prototype to a real xbl instance, we'll clone the pre-compiled JS into the real instance's // context. - AutoSafeJSContext cx; + AutoJSAPI jsapi; + if (NS_WARN_IF(!jsapi.Init(xpc::CompilationScope()))) + return NS_ERROR_FAILURE; + jsapi.TakeOwnershipOfErrorReporting(); + JSContext* cx = jsapi.cx(); JS::Rooted compilationGlobal(cx, xpc::CompilationScope()); - JSAutoCompartment ac(cx, compilationGlobal); mPrecompiledMemberHolder = JS_NewObjectWithGivenProto(cx, nullptr, JS::NullPtr(), compilationGlobal); if (!mPrecompiledMemberHolder) @@ -253,7 +257,7 @@ nsXBLProtoImpl::CompilePrototypeMembers(nsXBLPrototypeBinding* aBinding) for (nsXBLProtoImplMember* curr = mMembers; curr; curr = curr->GetNext()) { - nsresult rv = curr->CompileMember(mClassName, rootedHolder); + nsresult rv = curr->CompileMember(jsapi, mClassName, rootedHolder); if (NS_FAILED(rv)) { DestroyMembers(); return rv; diff --git a/dom/xbl/nsXBLProtoImplMember.h b/dom/xbl/nsXBLProtoImplMember.h index 9abc780cbb0c..eebffb880f6a 100644 --- a/dom/xbl/nsXBLProtoImplMember.h +++ b/dom/xbl/nsXBLProtoImplMember.h @@ -80,7 +80,7 @@ public: virtual nsresult InstallMember(JSContext* aCx, JS::Handle aTargetClassObject) = 0; - virtual nsresult CompileMember(const nsCString& aClassStr, + virtual nsresult CompileMember(mozilla::dom::AutoJSAPI& jsapi, const nsCString& aClassStr, JS::Handle aClassObject) = 0; virtual void Trace(const TraceCallbacks& aCallbacks, void *aClosure) = 0; diff --git a/dom/xbl/nsXBLProtoImplMethod.cpp b/dom/xbl/nsXBLProtoImplMethod.cpp index f75ec7de0122..fa745184bbc8 100644 --- a/dom/xbl/nsXBLProtoImplMethod.cpp +++ b/dom/xbl/nsXBLProtoImplMethod.cpp @@ -21,6 +21,7 @@ #include "mozilla/dom/ScriptSettings.h" using namespace mozilla; +using namespace mozilla::dom; nsXBLProtoImplMethod::nsXBLProtoImplMethod(const char16_t* aName) : nsXBLProtoImplMember(aName), @@ -125,7 +126,7 @@ nsXBLProtoImplMethod::InstallMember(JSContext* aCx, } nsresult -nsXBLProtoImplMethod::CompileMember(const nsCString& aClassStr, +nsXBLProtoImplMethod::CompileMember(AutoJSAPI& jsapi, const nsCString& aClassStr, JS::Handle aClassObject) { AssertInCompilationScope(); @@ -188,14 +189,14 @@ nsXBLProtoImplMethod::CompileMember(const nsCString& aClassStr, functionUri.Truncate(hash); } - AutoJSContext cx; + JSContext *cx = jsapi.cx(); JSAutoCompartment ac(cx, aClassObject); JS::CompileOptions options(cx); options.setFileAndLine(functionUri.get(), uncompiledMethod->mBodyText.GetLineNumber()) .setVersion(JSVERSION_LATEST); JS::Rooted methodObject(cx); - nsresult rv = nsJSUtils::CompileFunction(cx, JS::NullPtr(), options, cname, + nsresult rv = nsJSUtils::CompileFunction(jsapi, JS::NullPtr(), options, cname, paramCount, const_cast(args), body, methodObject.address()); diff --git a/dom/xbl/nsXBLProtoImplMethod.h b/dom/xbl/nsXBLProtoImplMethod.h index b42432b0d40a..67d4e31e33cd 100644 --- a/dom/xbl/nsXBLProtoImplMethod.h +++ b/dom/xbl/nsXBLProtoImplMethod.h @@ -91,7 +91,7 @@ public: virtual nsresult InstallMember(JSContext* aCx, JS::Handle aTargetClassObject) MOZ_OVERRIDE; - virtual nsresult CompileMember(const nsCString& aClassStr, + virtual nsresult CompileMember(mozilla::dom::AutoJSAPI& jsapi, const nsCString& aClassStr, JS::Handle aClassObject) MOZ_OVERRIDE; virtual void Trace(const TraceCallbacks& aCallbacks, void *aClosure) MOZ_OVERRIDE; diff --git a/dom/xbl/nsXBLProtoImplProperty.cpp b/dom/xbl/nsXBLProtoImplProperty.cpp index 3104b6bb2c9b..64a895c75fec 100644 --- a/dom/xbl/nsXBLProtoImplProperty.cpp +++ b/dom/xbl/nsXBLProtoImplProperty.cpp @@ -16,6 +16,7 @@ #include "xpcpublic.h" using namespace mozilla; +using namespace mozilla::dom; nsXBLProtoImplProperty::nsXBLProtoImplProperty(const char16_t* aName, const char16_t* aGetter, @@ -157,7 +158,7 @@ nsXBLProtoImplProperty::InstallMember(JSContext *aCx, } nsresult -nsXBLProtoImplProperty::CompileMember(const nsCString& aClassStr, +nsXBLProtoImplProperty::CompileMember(AutoJSAPI& jsapi, const nsCString& aClassStr, JS::Handle aClassObject) { AssertInCompilationScope(); @@ -166,6 +167,7 @@ nsXBLProtoImplProperty::CompileMember(const nsCString& aClassStr, NS_PRECONDITION(aClassObject, "Must have class object to compile"); MOZ_ASSERT(!mGetter.IsCompiled() && !mSetter.IsCompiled()); + JSContext *cx = jsapi.cx(); if (!mName) return NS_ERROR_FAILURE; // Without a valid name, we can't install the member. @@ -187,14 +189,13 @@ nsXBLProtoImplProperty::CompileMember(const nsCString& aClassStr, if (getterText && getterText->GetText()) { nsDependentString getter(getterText->GetText()); if (!getter.IsEmpty()) { - AutoJSContext cx; JSAutoCompartment ac(cx, aClassObject); JS::CompileOptions options(cx); options.setFileAndLine(functionUri.get(), getterText->GetLineNumber()) .setVersion(JSVERSION_LATEST); nsCString name = NS_LITERAL_CSTRING("get_") + NS_ConvertUTF16toUTF8(mName); JS::Rooted getterObject(cx); - rv = nsJSUtils::CompileFunction(cx, JS::NullPtr(), options, name, 0, + rv = nsJSUtils::CompileFunction(jsapi, JS::NullPtr(), options, name, 0, nullptr, getter, getterObject.address()); delete getterText; @@ -233,14 +234,13 @@ nsXBLProtoImplProperty::CompileMember(const nsCString& aClassStr, if (setterText && setterText->GetText()) { nsDependentString setter(setterText->GetText()); if (!setter.IsEmpty()) { - AutoJSContext cx; JSAutoCompartment ac(cx, aClassObject); JS::CompileOptions options(cx); options.setFileAndLine(functionUri.get(), setterText->GetLineNumber()) .setVersion(JSVERSION_LATEST); nsCString name = NS_LITERAL_CSTRING("set_") + NS_ConvertUTF16toUTF8(mName); JS::Rooted setterObject(cx); - rv = nsJSUtils::CompileFunction(cx, JS::NullPtr(), options, name, 1, + rv = nsJSUtils::CompileFunction(jsapi, JS::NullPtr(), options, name, 1, gPropertyArgs, setter, setterObject.address()); diff --git a/dom/xbl/nsXBLProtoImplProperty.h b/dom/xbl/nsXBLProtoImplProperty.h index 113aa5c45a53..632c88b56ec8 100644 --- a/dom/xbl/nsXBLProtoImplProperty.h +++ b/dom/xbl/nsXBLProtoImplProperty.h @@ -35,7 +35,7 @@ public: virtual nsresult InstallMember(JSContext* aCx, JS::Handle aTargetClassObject) MOZ_OVERRIDE; - virtual nsresult CompileMember(const nsCString& aClassStr, + virtual nsresult CompileMember(mozilla::dom::AutoJSAPI& jsapi, const nsCString& aClassStr, JS::Handle aClassObject) MOZ_OVERRIDE; virtual void Trace(const TraceCallbacks& aCallback, void *aClosure) MOZ_OVERRIDE; diff --git a/dom/xbl/nsXBLPrototypeHandler.cpp b/dom/xbl/nsXBLPrototypeHandler.cpp index 01df4b48c792..0a1d8de290bc 100644 --- a/dom/xbl/nsXBLPrototypeHandler.cpp +++ b/dom/xbl/nsXBLPrototypeHandler.cpp @@ -272,9 +272,10 @@ nsXBLPrototypeHandler::ExecuteHandler(EventTarget* aTarget, // Initiatize an AutoJSAPI with aTarget's bound global to make sure any errors // are reported to the correct place. AutoJSAPI jsapi; - if (NS_WARN_IF(!jsapi.InitWithLegacyErrorReporting(boundGlobal))) { + if (NS_WARN_IF(!jsapi.Init(boundGlobal))) { return NS_OK; } + jsapi.TakeOwnershipOfErrorReporting(); JSContext* cx = jsapi.cx(); JS::Rooted handler(cx); @@ -378,7 +379,7 @@ nsXBLPrototypeHandler::EnsureEventHandler(AutoJSAPI& jsapi, nsIAtom* aName, .setVersion(JSVERSION_LATEST); JS::Rooted handlerFun(cx); - nsresult rv = nsJSUtils::CompileFunction(cx, JS::NullPtr(), options, + nsresult rv = nsJSUtils::CompileFunction(jsapi, JS::NullPtr(), options, nsAtomCString(aName), argCount, argNames, handlerText, handlerFun.address()); diff --git a/extensions/universalchardet/src/base/Big5Freq.tab b/extensions/universalchardet/src/base/Big5Freq.tab deleted file mode 100644 index 857f46c5cba3..000000000000 --- a/extensions/universalchardet/src/base/Big5Freq.tab +++ /dev/null @@ -1,908 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// Big5 frequency table -// by Taiwan's Mandarin Promotion Council -// - -/****************************************************************************** - * 128 --> 0.42261 - * 256 --> 0.57851 - * 512 --> 0.74851 - * 1024 --> 0.89384 - * 2048 --> 0.97583 - * - * Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 - * Random Distribution Ration = 512/(5401-512)=0.105 - * - * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - *****************************************************************************/ - -#define BIG5_TYPICAL_DISTRIBUTION_RATIO (float)0.75 - -// Char to FreqOrder table -static const int16_t Big5CharToFreqOrder[] = -{ - 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, // 16 -3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, // 32 -1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, // 48 - 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, // 64 -3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, // 80 -4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, // 96 -5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, // 112 - 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, // 128 - 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, // 144 - 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, // 160 -2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, // 176 -1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, // 192 -3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, // 208 - 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, // 224 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, // 240 -3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, // 256 -2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, // 272 - 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, // 288 -3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, // 304 -1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, // 320 -5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, // 336 - 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, // 352 -5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, // 368 -1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, // 384 - 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, // 400 - 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, // 416 -3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, // 432 -3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, // 448 - 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, // 464 -2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, // 480 -2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, // 496 - 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, // 512 - 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, // 528 -3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, // 544 -1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, // 560 -1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, // 576 -1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, // 592 -2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, // 608 - 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, // 624 -4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, // 640 -1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, // 656 -5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, // 672 -2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, // 688 - 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, // 704 - 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, // 720 - 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, // 736 - 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, // 752 -5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, // 768 - 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, // 784 -1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, // 800 - 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, // 816 - 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, // 832 -5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, // 848 -1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, // 864 - 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, // 880 -3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, // 896 -4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, // 912 -3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, // 928 - 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, // 944 - 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, // 960 -1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, // 976 -4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, // 992 -3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, // 1008 -3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, // 1024 -2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, // 1040 -5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, // 1056 -3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, // 1072 -5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, // 1088 -1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, // 1104 -2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, // 1120 -1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, // 1136 - 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, // 1152 -1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, // 1168 -4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, // 1184 -3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, // 1200 - 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, // 1216 - 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, // 1232 - 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, // 1248 -2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, // 1264 -5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, // 1280 -1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, // 1296 -2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, // 1312 -1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, // 1328 -1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, // 1344 -5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, // 1360 -5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, // 1376 -5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, // 1392 -3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, // 1408 -4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, // 1424 -4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, // 1440 -2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, // 1456 -5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, // 1472 -3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, // 1488 - 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, // 1504 -5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, // 1520 -5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, // 1536 -1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, // 1552 -2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, // 1568 -3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, // 1584 -4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, // 1600 -5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, // 1616 -3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, // 1632 -4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, // 1648 -1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, // 1664 -1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, // 1680 -4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, // 1696 -1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, // 1712 - 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, // 1728 -1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, // 1744 -1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, // 1760 -3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, // 1776 - 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, // 1792 -5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, // 1808 -2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, // 1824 -1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, // 1840 -1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, // 1856 -5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, // 1872 - 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, // 1888 -4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, // 1904 - 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, // 1920 -2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, // 1936 - 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, // 1952 -1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, // 1968 -1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, // 1984 - 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, // 2000 -4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, // 2016 -4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, // 2032 -1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, // 2048 -3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, // 2064 -5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, // 2080 -5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, // 2096 -1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, // 2112 -2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, // 2128 -1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, // 2144 -3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, // 2160 -2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, // 2176 -3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, // 2192 -2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, // 2208 -4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, // 2224 -4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, // 2240 -3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, // 2256 - 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, // 2272 -3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, // 2288 - 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, // 2304 -3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, // 2320 -4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, // 2336 -3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, // 2352 -1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, // 2368 -5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, // 2384 - 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, // 2400 -5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, // 2416 -1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, // 2432 - 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, // 2448 -4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, // 2464 -4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, // 2480 - 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, // 2496 -2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, // 2512 -2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, // 2528 -3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, // 2544 -1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, // 2560 -4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, // 2576 -2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, // 2592 -1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, // 2608 -1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, // 2624 -2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, // 2640 -3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, // 2656 -1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, // 2672 -5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, // 2688 -1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, // 2704 -4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, // 2720 -1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, // 2736 - 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, // 2752 -1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, // 2768 -4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, // 2784 -4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, // 2800 -2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, // 2816 -1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, // 2832 -4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, // 2848 - 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, // 2864 -5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, // 2880 -2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, // 2896 -3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, // 2912 -4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, // 2928 - 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, // 2944 -5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, // 2960 -5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, // 2976 -1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, // 2992 -4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, // 3008 -4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, // 3024 -2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, // 3040 -3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, // 3056 -3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, // 3072 -2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, // 3088 -1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, // 3104 -4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, // 3120 -3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, // 3136 -3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, // 3152 -2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, // 3168 -4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, // 3184 -5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, // 3200 -3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, // 3216 -2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, // 3232 -3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, // 3248 -1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, // 3264 -2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, // 3280 -3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, // 3296 -4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, // 3312 -2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, // 3328 -2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, // 3344 -5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, // 3360 -1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, // 3376 -2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, // 3392 -1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, // 3408 -3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, // 3424 -4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, // 3440 -2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, // 3456 -3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, // 3472 -3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, // 3488 -2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, // 3504 -4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, // 3520 -2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, // 3536 -3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, // 3552 -4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, // 3568 -5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, // 3584 -3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, // 3600 - 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, // 3616 -1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, // 3632 -4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, // 3648 -1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, // 3664 -4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, // 3680 -5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, // 3696 - 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, // 3712 -5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, // 3728 -5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, // 3744 -2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, // 3760 -3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, // 3776 -2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, // 3792 -2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, // 3808 - 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, // 3824 -1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, // 3840 -4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, // 3856 -3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, // 3872 -3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, // 3888 - 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, // 3904 -2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, // 3920 - 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, // 3936 -2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, // 3952 -4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, // 3968 -1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, // 3984 -4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, // 4000 -1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, // 4016 -3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, // 4032 - 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, // 4048 -3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, // 4064 -5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, // 4080 -5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, // 4096 -3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, // 4112 -3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, // 4128 -1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, // 4144 -2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, // 4160 -5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, // 4176 -1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, // 4192 -1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, // 4208 -3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, // 4224 - 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, // 4240 -1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, // 4256 -4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, // 4272 -5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, // 4288 -2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, // 4304 -3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, // 4320 - 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, // 4336 -1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, // 4352 -2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, // 4368 -2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, // 4384 -5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, // 4400 -5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, // 4416 -5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, // 4432 -2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, // 4448 -2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, // 4464 -1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, // 4480 -4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, // 4496 -3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, // 4512 -3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, // 4528 -4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, // 4544 -4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, // 4560 -2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, // 4576 -2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, // 4592 -5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, // 4608 -4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, // 4624 -5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, // 4640 -4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, // 4656 - 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, // 4672 - 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, // 4688 -1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, // 4704 -3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, // 4720 -4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, // 4736 -1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, // 4752 -5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, // 4768 -2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, // 4784 -2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, // 4800 -3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, // 4816 -5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, // 4832 -1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, // 4848 -3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, // 4864 -5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, // 4880 -1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, // 4896 -5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, // 4912 -2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, // 4928 -3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, // 4944 -2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, // 4960 -3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, // 4976 -3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, // 4992 -3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, // 5008 -4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, // 5024 - 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, // 5040 -2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, // 5056 -4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, // 5072 -3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, // 5088 -5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, // 5104 -1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, // 5120 -5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, // 5136 - 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, // 5152 -1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, // 5168 - 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, // 5184 -4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, // 5200 -1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, // 5216 -4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, // 5232 -1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, // 5248 - 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, // 5264 -3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, // 5280 -4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, // 5296 -5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, // 5312 - 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, // 5328 -3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, // 5344 - 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, // 5360 -2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, // 5376 //last 512 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, // 5392 -2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, // 5408 -5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, // 5424 -5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, // 5440 -5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, // 5456 -5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, // 5472 -5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, // 5488 -5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, // 5504 -5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, // 5520 -5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, // 5536 -5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, // 5552 -5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, // 5568 -5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, // 5584 -5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, // 5600 -6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, // 5616 -6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, // 5632 -6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, // 5648 -6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, // 5664 -6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, // 5680 -6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, // 5696 -6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, // 5712 -6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, // 5728 -6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, // 5744 -6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, // 5760 -6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, // 5776 -6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, // 5792 -6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, // 5808 -6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, // 5824 -6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, // 5840 -6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, // 5856 -6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, // 5872 -6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, // 5888 -6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, // 5904 -6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, // 5920 -6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, // 5936 -6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, // 5952 -6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, // 5968 -6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, // 5984 -6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, // 6000 -6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, // 6016 -6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, // 6032 -6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, // 6048 -6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, // 6064 -6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, // 6080 -6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, // 6096 -6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, // 6112 -6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, // 6128 -6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, // 6144 -6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, // 6160 -6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, // 6176 -6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, // 6192 -6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, // 6208 -6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, // 6224 -6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, // 6240 -6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, // 6256 -3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, // 6272 -6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, // 6288 -6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, // 6304 -3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, // 6320 -6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, // 6336 -6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, // 6352 -6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, // 6368 -6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, // 6384 -6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, // 6400 -6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, // 6416 -6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, // 6432 -4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, // 6448 -6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, // 6464 -6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, // 6480 -3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, // 6496 -6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, // 6512 -6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, // 6528 -6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, // 6544 -6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, // 6560 -6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, // 6576 -6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, // 6592 -6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, // 6608 -6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, // 6624 -6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, // 6640 -6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, // 6656 -6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, // 6672 -7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, // 6688 -7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, // 6704 -7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, // 6720 -7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, // 6736 -7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, // 6752 -7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, // 6768 -7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, // 6784 -7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, // 6800 -7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, // 6816 -7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, // 6832 -7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, // 6848 -7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, // 6864 -7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, // 6880 -7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, // 6896 -7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, // 6912 -7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, // 6928 -7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, // 6944 -7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, // 6960 -7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, // 6976 -7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, // 6992 -7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, // 7008 -7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, // 7024 -7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, // 7040 -7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, // 7056 -7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, // 7072 -7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, // 7088 -7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, // 7104 -7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, // 7120 -7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, // 7136 -7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, // 7152 -7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, // 7168 -7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, // 7184 -7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, // 7200 -7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, // 7216 -7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, // 7232 -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, // 7248 -7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, // 7264 -7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, // 7280 -7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, // 7296 -7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, // 7312 -7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, // 7328 -7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, // 7344 -7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, // 7360 -7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, // 7376 -7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, // 7392 -7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, // 7408 -7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, // 7424 -7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, // 7440 -3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, // 7456 -7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, // 7472 -7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, // 7488 -7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, // 7504 -7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, // 7520 -4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, // 7536 -7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, // 7552 -7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, // 7568 -7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, // 7584 -7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, // 7600 -7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, // 7616 -7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, // 7632 -7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, // 7648 -7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, // 7664 -7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, // 7680 -7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, // 7696 -7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, // 7712 -8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, // 7728 -8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, // 7744 -8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, // 7760 -8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, // 7776 -8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, // 7792 -8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, // 7808 -8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, // 7824 -8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, // 7840 -8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, // 7856 -8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, // 7872 -8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, // 7888 -8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, // 7904 -8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, // 7920 -8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, // 7936 -8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, // 7952 -8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, // 7968 -8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, // 7984 -8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, // 8000 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, // 8016 -8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, // 8032 -8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, // 8048 -8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, // 8064 -8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, // 8080 -8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, // 8096 -8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, // 8112 -8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, // 8128 -8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, // 8144 -8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, // 8160 -8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, // 8176 -8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, // 8192 -8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, // 8208 -8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, // 8224 -8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, // 8240 -8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, // 8256 -8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, // 8272 -8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, // 8288 -8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, // 8304 -8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, // 8320 -8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, // 8336 -8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, // 8352 -8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, // 8368 -8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, // 8384 -8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, // 8400 -8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, // 8416 -8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, // 8432 -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, // 8448 -8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, // 8464 -8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, // 8480 -8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, // 8496 -8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, // 8512 -8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, // 8528 -8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, // 8544 -8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, // 8560 -8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, // 8576 -8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, // 8592 -8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, // 8608 -8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, // 8624 -8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, // 8640 -8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, // 8656 -8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, // 8672 -8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, // 8688 -4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, // 8704 -8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, // 8720 -8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, // 8736 -8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, // 8752 -8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, // 8768 -9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, // 8784 -9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, // 8800 -9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, // 8816 -9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, // 8832 -9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, // 8848 -9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, // 8864 -9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, // 8880 -9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, // 8896 -9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, // 8912 -9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, // 8928 -9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, // 8944 -9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, // 8960 -9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, // 8976 -9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, // 8992 -9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, // 9008 -9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, // 9024 -9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, // 9040 -9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, // 9056 -9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, // 9072 -9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, // 9088 -9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, // 9104 -9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, // 9120 -9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, // 9136 -9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, // 9152 -9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, // 9168 -9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, // 9184 -9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, // 9200 -9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, // 9216 -9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, // 9232 -9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, // 9248 -9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, // 9264 -9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, // 9280 -9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, // 9296 -9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, // 9312 -9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, // 9328 -9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, // 9344 -9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, // 9360 -9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, // 9376 -3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, // 9392 -9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, // 9408 -9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, // 9424 -9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, // 9440 -4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, // 9456 -9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, // 9472 -9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, // 9488 -9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, // 9504 -9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, // 9520 -9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, // 9536 -9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, // 9552 -9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, // 9568 -9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, // 9584 -9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, // 9600 -9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, // 9616 -9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, // 9632 -9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, // 9648 -9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, // 9664 -9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, // 9680 -9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, // 9696 -9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, // 9712 -9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, // 9728 -9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, // 9744 -9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, // 9760 -9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, // 9776 -9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, // 9792 -9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, // 9808 -9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, // 9824 -10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, // 9840 -10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, // 9856 -10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, // 9872 -10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, // 9888 -10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, // 9904 -10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, // 9920 -10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, // 9936 -10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, // 9952 -10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, // 9968 -4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, // 9984 -10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, //10000 -10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, //10016 -10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, //10032 -10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, //10048 -10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, //10064 -10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, //10080 -10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, //10096 -10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, //10112 -4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, //10128 -10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, //10144 -10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, //10160 -10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, //10176 -10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, //10192 -10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, //10208 -10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, //10224 -10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, //10240 -10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, //10256 -10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, //10272 -10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, //10288 -10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, //10304 -10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, //10320 -10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, //10336 -10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, //10352 -10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, //10368 -10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, //10384 -10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, //10400 -4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, //10416 -10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, //10432 -10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, //10448 -10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, //10464 -10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, //10480 -10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, //10496 -10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, //10512 -10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, //10528 -10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, //10544 -10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, //10560 -10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, //10576 -10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, //10592 -10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, //10608 -10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, //10624 -10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, //10640 -10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, //10656 -10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, //10672 -10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, //10688 -10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, //10704 -10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, //10720 -10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, //10736 -10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, //10752 -10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, //10768 -10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, //10784 -10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, //10800 -10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, //10816 -10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, //10832 -10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, //10848 -10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, //10864 -10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, //10880 -10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, //10896 -11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, //10912 -11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, //10928 -11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, //10944 -4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, //10960 -11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, //10976 -11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, //10992 -11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, //11008 -11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, //11024 -11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, //11040 -11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, //11056 -11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, //11072 -11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, //11088 -11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, //11104 -11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, //11120 -11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, //11136 -11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, //11152 -11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, //11168 -11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, //11184 -11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, //11200 -11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, //11216 -11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, //11232 -11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, //11248 -11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, //11264 -11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, //11280 -11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, //11296 -11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, //11312 -11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, //11328 -11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, //11344 -11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, //11360 -11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, //11376 -11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, //11392 -11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, //11408 -11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, //11424 -11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, //11440 -11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, //11456 -11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, //11472 -4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, //11488 -11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, //11504 -11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, //11520 -11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, //11536 -11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, //11552 -11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, //11568 -11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, //11584 -11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, //11600 -11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, //11616 -11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, //11632 -11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, //11648 -11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, //11664 -11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, //11680 -11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, //11696 -11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, //11712 -11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, //11728 -11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, //11744 -11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, //11760 -11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, //11776 -11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, //11792 -11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, //11808 -11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, //11824 -11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, //11840 -11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, //11856 -11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, //11872 -11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, //11888 -11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, //11904 -11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, //11920 -11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, //11936 -12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, //11952 -12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, //11968 -12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, //11984 -12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, //12000 -12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, //12016 -12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, //12032 -12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, //12048 -12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, //12064 -12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, //12080 -12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, //12096 -12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, //12112 -12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, //12128 -12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, //12144 -12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, //12160 -12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, //12176 -4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, //12192 -4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, //12208 -4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, //12224 -12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, //12240 -12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, //12256 -12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, //12272 -12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, //12288 -12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, //12304 -12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, //12320 -12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, //12336 -12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, //12352 -12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, //12368 -12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, //12384 -12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, //12400 -12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, //12416 -12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, //12432 -12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, //12448 -12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, //12464 -12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, //12480 -12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, //12496 -12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, //12512 -12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, //12528 -12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, //12544 -12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, //12560 -12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, //12576 -12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, //12592 -12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, //12608 -12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, //12624 -12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, //12640 -12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, //12656 -12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, //12672 -12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, //12688 -12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, //12704 -12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, //12720 -12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, //12736 -12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, //12752 -12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, //12768 -12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, //12784 -12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, //12800 -12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, //12816 -12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, //12832 -12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, //12848 -12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, //12864 -12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, //12880 -12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, //12896 -12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, //12912 -12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, //12928 -12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, //12944 -12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, //12960 -12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, //12976 -4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, //12992 -13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, //13008 -13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, //13024 -13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, //13040 -13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, //13056 -13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, //13072 -13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, //13088 -13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, //13104 -4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, //13120 -13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, //13136 -13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, //13152 -13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, //13168 -13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, //13184 -13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, //13200 -13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, //13216 -13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, //13232 -13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, //13248 -13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, //13264 -13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, //13280 -13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, //13296 -13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, //13312 -13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, //13328 -13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, //13344 -13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, //13360 -5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, //13376 -13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, //13392 -13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, //13408 -13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, //13424 -13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, //13440 -13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, //13456 -13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, //13472 -13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, //13488 -13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, //13504 -13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, //13520 -13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, //13536 -13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, //13552 -13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, //13568 -13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, //13584 -13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, //13600 -13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, //13616 -13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, //13632 -13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, //13648 -13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, //13664 -13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, //13680 -13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, //13696 -13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, //13712 -13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, //13728 -13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, //13744 -13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, //13760 -13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, //13776 -13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, //13792 -13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, //13808 -13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, //13824 -13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, //13840 -13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, //13856 -13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, //13872 -13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, //13888 -13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, //13904 -13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, //13920 -13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, //13936 -13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, //13952 -13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, //13968 -13968,13969,13970,13971,13972, //13973 -****************************************************************************************/ -}; diff --git a/extensions/universalchardet/src/base/CharDistribution.cpp b/extensions/universalchardet/src/base/CharDistribution.cpp index 44c899c31fde..7030bd85e178 100644 --- a/extensions/universalchardet/src/base/CharDistribution.cpp +++ b/extensions/universalchardet/src/base/CharDistribution.cpp @@ -6,10 +6,6 @@ #include "CharDistribution.h" #include "JISFreq.tab" -#include "Big5Freq.tab" -#include "EUCKRFreq.tab" -#include "EUCTWFreq.tab" -#include "GB2312Freq.tab" #include "mozilla/ArrayUtils.h" #define SURE_YES 0.99f @@ -34,34 +30,6 @@ float CharDistributionAnalysis::GetConfidence(void) return SURE_YES; } -EUCTWDistributionAnalysis::EUCTWDistributionAnalysis() -{ - mCharToFreqOrder = EUCTWCharToFreqOrder; - mTableSize = mozilla::ArrayLength(EUCTWCharToFreqOrder); - mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO; -} - -EUCKRDistributionAnalysis::EUCKRDistributionAnalysis() -{ - mCharToFreqOrder = EUCKRCharToFreqOrder; - mTableSize = mozilla::ArrayLength(EUCKRCharToFreqOrder); - mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO; -} - -GB2312DistributionAnalysis::GB2312DistributionAnalysis() -{ - mCharToFreqOrder = GB2312CharToFreqOrder; - mTableSize = mozilla::ArrayLength(GB2312CharToFreqOrder); - mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO; -} - -Big5DistributionAnalysis::Big5DistributionAnalysis() -{ - mCharToFreqOrder = Big5CharToFreqOrder; - mTableSize = mozilla::ArrayLength(Big5CharToFreqOrder); - mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO; -} - SJISDistributionAnalysis::SJISDistributionAnalysis() { mCharToFreqOrder = JISCharToFreqOrder; diff --git a/extensions/universalchardet/src/base/CharDistribution.h b/extensions/universalchardet/src/base/CharDistribution.h index 69a31df302c9..bd5143b8e271 100644 --- a/extensions/universalchardet/src/base/CharDistribution.h +++ b/extensions/universalchardet/src/base/CharDistribution.h @@ -10,12 +10,10 @@ #define ENOUGH_DATA_THRESHOLD 1024 -#define MINIMUM_DATA_THRESHOLD 4 - class CharDistributionAnalysis { public: - CharDistributionAnalysis() {Reset(false);} + CharDistributionAnalysis() {Reset();} //feed a block of data and do distribution analysis void HandleData(const char* aBuf, uint32_t aLen) {} @@ -44,12 +42,12 @@ public: float GetConfidence(void); //Reset analyser, clear any state - void Reset(bool aIsPreferredLanguage) + void Reset() { mDone = false; mTotalChars = 0; mFreqChars = 0; - mDataThreshold = aIsPreferredLanguage ? 0 : MINIMUM_DATA_THRESHOLD; + mDataThreshold = 0; } //It is not necessary to receive all data to draw conclusion. For charset detection, diff --git a/extensions/universalchardet/src/base/EUCKRFreq.tab b/extensions/universalchardet/src/base/EUCKRFreq.tab deleted file mode 100644 index 0a843e0f1109..000000000000 --- a/extensions/universalchardet/src/base/EUCKRFreq.tab +++ /dev/null @@ -1,580 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -//Sampling from about 20M text materials include literature and computer technology - -/****************************************************************************** - * 128 --> 0.79 - * 256 --> 0.92 - * 512 --> 0.986 - * 1024 --> 0.99944 - * 2048 --> 0.99999 - * - * Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 - * Random Distribution Ration = 512 / (2350-512) = 0.279. - * - * Typical Distribution Ratio - *****************************************************************************/ - -#define EUCKR_TYPICAL_DISTRIBUTION_RATIO (float) 6.0 - -// Char to FreqOrder table -static const int16_t EUCKRCharToFreqOrder[] = -{ - 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, -1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, -1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, - 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, - 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, - 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, -1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, - 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, - 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, -1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, -1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, -1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, -1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, -1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, - 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, -1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, -1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, -1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, -1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, - 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, -1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, - 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, - 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, -1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, - 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, -1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, - 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, - 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, -1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, -1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, -1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, -1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, - 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, -1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, - 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, - 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, -1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, -1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, -1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, -1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, -1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, -1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, - 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, - 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, - 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, -1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, - 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, -1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, - 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, - 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, -2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, - 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, - 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, -2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, -2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, -2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, - 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, - 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, -2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, - 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, -1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, -2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, -1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, -2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, -2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, -1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, - 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, -2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, -2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, - 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, - 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, -2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, -1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, -2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, -2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, -2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, -2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, -2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, -2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, -1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, -2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, -2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, -2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, -2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, -2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, -1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, -1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, -2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, -1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, -2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, -1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, - 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, -2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, - 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, -2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, - 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, -2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, -2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, - 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, -2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, -1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, - 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, -1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, -2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, -1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, -2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, - 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, -2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, -1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, -2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, -1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, -2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, -1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, - 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, -2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, -2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, - 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, - 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, -1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, -1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, - 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, -2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, -2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, - 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, - 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, - 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, -2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, - 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, - 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, -2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, -2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, - 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, -2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, -1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, - 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, -2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, -2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, -2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, - 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, - 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, - 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, -2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, -2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, -2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, -1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, -2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, - 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, //512, 256 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, -2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, -2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, -2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, -2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, -2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, -2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, -2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, -2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, -2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, -2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, -2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, -2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, -2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, -1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, -2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, -2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, -2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, -2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, -2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, -2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, -2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, -2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, -2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, -3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, -3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, -3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, -3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, -3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, -3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, -3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, -3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, -3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, -3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, -3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, -3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, -3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, -3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, -3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, -3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, -3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, -3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, -3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, -3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, -3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, -3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, -3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, -3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, -3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, -3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, -3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, -3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, -3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, -3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, -3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, -3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, -1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, -1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, -3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, -3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, -3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, -3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, -3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, -3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, -3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, -3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, -3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, -3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, -3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, -3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, -3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, -1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, -3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, -3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, -3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, -3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, -3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, -3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, -3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, -1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, -3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, -3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, -3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, -3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, -1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, -3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, -3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, -3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, -3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, -3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, -3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, -3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, -4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, -4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, -1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, -4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, -4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, -4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, -4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, -4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, -4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, -4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, -4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, -4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, -4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, -4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, -4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, -4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, -4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, -4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, -4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, -4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, -4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, -4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, -4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, -4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, -4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, -4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, -4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, -4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, -4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, -4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, -4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, -4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, -4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, -4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, -4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, -4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, -4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, -4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, -4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, -4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, -4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, -4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, -4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, -4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, -4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, -1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, -4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, -4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, -4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, -4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, -4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, -4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, -4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, -4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, -4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, -4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, -4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, -4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, -4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, -4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, -4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, -4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, -4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, -4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, -4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, -4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, -5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, -5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, -1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, -5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, -5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, -5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, -5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, -5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, -1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, -5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, -5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, -5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, -5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, -5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, -1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, -5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, -5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, -5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, -5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, -5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, -5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, -5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, -5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, -5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, -5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, -5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, -5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, -5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, -5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, -5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, -5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, -5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, -5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, -5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, -5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, -5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, -5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, -5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, -1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, -5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, -5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, -5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, -5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, -5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, -1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, -5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, -5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, -5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, -5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, -5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, -1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, -5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, -1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, -5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, -5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, -5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, -5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, -5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, -5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, -5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, -5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, -5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, -5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, -5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, -5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, -5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, -5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, -5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, -6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, -6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, -6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, -6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, -6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, -6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, -6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, -6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, -6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, -6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, -6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, -6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, -6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, -6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, -6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, -6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, -6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, //1024 -6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, -6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, -6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, -6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, -6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, -6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, -6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, -6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, -6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, -6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, -6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, -6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, -6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, -6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, -6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, -6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, -6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, -6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, -1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, -6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, -6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, -6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, -6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, -6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, -1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, -6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, -1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, -6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, -6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, -6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, -1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, -6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, -6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, -6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, -6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, -6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, -6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, -6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, -6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, -6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, -6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, -6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, -6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, -6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, -6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, -6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, -6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, -6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, -7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, -7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, -7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, -7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, -7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, -7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, -7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, -7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, -7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, -7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, -7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, -7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, -7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, -7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, -7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, -7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, -7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, -7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, -7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, -7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, -7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, -7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, -7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, -7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, -7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, -7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, -7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, -7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, -7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, -7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, -7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, -7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, -7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, -7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, -7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, -7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, -7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, -7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, -7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, -7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, -7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, -7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, -7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, -7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, -7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, -7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, -7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, -7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, -7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, -7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, -7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, -7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, -7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, -7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, -7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, -7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, -7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, -7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, -7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, -7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, -7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, -7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, -8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, -8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, -8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, -8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, -8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, -8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, -8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, -8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, -8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, -8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, -8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, -8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, -8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, -8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, -8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, -8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, -8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, -8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, -8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, -8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, -8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, -8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, -8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, -8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, -8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, -8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, -8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, -8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, -8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, -8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, -8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, -8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, -8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, -8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, -8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, -8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, -8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, -8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, -8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, -8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, -8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, -8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, -8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, -8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, -8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, -8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, -8736,8737,8738,8739,8740,8741 -****************************************************************************************/ -}; - diff --git a/extensions/universalchardet/src/base/EUCTWFreq.tab b/extensions/universalchardet/src/base/EUCTWFreq.tab deleted file mode 100644 index a88c00f2ebb2..000000000000 --- a/extensions/universalchardet/src/base/EUCTWFreq.tab +++ /dev/null @@ -1,413 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// EUCTW frequency table -// Converted from big5 work -// by Taiwan's Mandarin Promotion Council -// - - -/****************************************************************************** - * 128 --> 0.42261 - * 256 --> 0.57851 - * 512 --> 0.74851 - * 1024 --> 0.89384 - * 2048 --> 0.97583 - * - * Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 - * Random Distribution Ration = 512/(5401-512)=0.105 - * - * Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR - *****************************************************************************/ - -#define EUCTW_TYPICAL_DISTRIBUTION_RATIO (float)0.75 - -// Char to FreqOrder table -static const int16_t EUCTWCharToFreqOrder[] = -{ - 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, // 2742 -3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, // 2758 -1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, // 2774 - 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, // 2790 -3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, // 2806 -4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, // 2822 -7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, // 2838 - 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, // 2854 - 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, // 2870 - 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, // 2886 -2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, // 2902 -1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, // 2918 -3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, // 2934 - 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, // 2950 -1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, // 2966 -3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, // 2982 -2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, // 2998 - 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, // 3014 -3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, // 3030 -1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, // 3046 -7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, // 3062 - 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, // 3078 -7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, // 3094 -1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, // 3110 - 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, // 3126 - 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, // 3142 -3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, // 3158 -3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, // 3174 - 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, // 3190 -2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, // 3206 -2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, // 3222 - 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, // 3238 - 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, // 3254 -3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, // 3270 -1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, // 3286 -1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, // 3302 -1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, // 3318 -2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, // 3334 - 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, // 3350 -4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, // 3366 -1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, // 3382 -7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, // 3398 -2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, // 3414 - 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, // 3430 - 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, // 3446 - 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, // 3462 - 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, // 3478 -7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, // 3494 - 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, // 3510 -1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, // 3526 - 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, // 3542 - 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, // 3558 -7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, // 3574 -1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, // 3590 - 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, // 3606 -3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, // 3622 -4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, // 3638 -3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, // 3654 - 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, // 3670 - 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, // 3686 -1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, // 3702 -4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, // 3718 -3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, // 3734 -3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, // 3750 -2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, // 3766 -7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, // 3782 -3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, // 3798 -7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, // 3814 -1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, // 3830 -2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, // 3846 -1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, // 3862 - 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, // 3878 -1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, // 3894 -4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, // 3910 -3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, // 3926 - 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, // 3942 - 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, // 3958 - 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, // 3974 -2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, // 3990 -7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, // 4006 -1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, // 4022 -2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, // 4038 -1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, // 4054 -1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, // 4070 -7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, // 4086 -7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, // 4102 -7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, // 4118 -3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, // 4134 -4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, // 4150 -1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, // 4166 -7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, // 4182 -2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, // 4198 -7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, // 4214 -3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, // 4230 -3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, // 4246 -7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, // 4262 -2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, // 4278 -7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, // 4294 - 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, // 4310 -4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, // 4326 -2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, // 4342 -7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, // 4358 -3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, // 4374 -2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, // 4390 -2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, // 4406 - 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, // 4422 -2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, // 4438 -1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, // 4454 -1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, // 4470 -2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, // 4486 -1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, // 4502 -7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, // 4518 -7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, // 4534 -2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, // 4550 -4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, // 4566 -1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, // 4582 -7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, // 4598 - 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, // 4614 -4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, // 4630 - 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, // 4646 -2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, // 4662 - 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, // 4678 -1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, // 4694 -1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, // 4710 - 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, // 4726 -3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, // 4742 -3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, // 4758 -1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, // 4774 -3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, // 4790 -7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, // 4806 -7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, // 4822 -1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, // 4838 -2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, // 4854 -1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, // 4870 -3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, // 4886 -2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, // 4902 -3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, // 4918 -2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, // 4934 -4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, // 4950 -4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, // 4966 -3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, // 4982 - 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, // 4998 -3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, // 5014 - 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, // 5030 -3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, // 5046 -3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, // 5062 -3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, // 5078 -1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, // 5094 -7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, // 5110 - 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, // 5126 -7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, // 5142 -1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, // 5158 - 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, // 5174 -4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, // 5190 -3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, // 5206 - 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, // 5222 -2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, // 5238 -2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, // 5254 -3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, // 5270 -1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, // 5286 -4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, // 5302 -2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, // 5318 -1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, // 5334 -1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, // 5350 -2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, // 5366 -3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, // 5382 -1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, // 5398 -7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, // 5414 -1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, // 5430 -4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, // 5446 -1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, // 5462 - 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, // 5478 -1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, // 5494 -3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, // 5510 -3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, // 5526 -2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, // 5542 -1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, // 5558 -4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, // 5574 - 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, // 5590 -7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, // 5606 -2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, // 5622 -3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, // 5638 -4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, // 5654 - 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, // 5670 -7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, // 5686 -7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, // 5702 -1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, // 5718 -4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, // 5734 -3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, // 5750 -2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, // 5766 -3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, // 5782 -3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, // 5798 -2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, // 5814 -1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, // 5830 -4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, // 5846 -3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, // 5862 -3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, // 5878 -2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, // 5894 -4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, // 5910 -7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, // 5926 -3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, // 5942 -2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, // 5958 -3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, // 5974 -1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, // 5990 -2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, // 6006 -3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, // 6022 -4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, // 6038 -2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, // 6054 -2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, // 6070 -7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, // 6086 -1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, // 6102 -2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, // 6118 -1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, // 6134 -3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, // 6150 -4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, // 6166 -2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, // 6182 -3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, // 6198 -3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, // 6214 -2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, // 6230 -4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, // 6246 -2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, // 6262 -3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, // 6278 -4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, // 6294 -7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, // 6310 -3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, // 6326 - 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, // 6342 -1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, // 6358 -4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, // 6374 -1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, // 6390 -4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, // 6406 -7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, // 6422 - 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, // 6438 -7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, // 6454 -2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, // 6470 -1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, // 6486 -1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, // 6502 -3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, // 6518 - 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, // 6534 - 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, // 6550 - 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, // 6566 -3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, // 6582 -2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, // 6598 - 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, // 6614 -7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, // 6630 -1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, // 6646 -3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, // 6662 -7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, // 6678 -1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, // 6694 -7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, // 6710 -4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, // 6726 -1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, // 6742 -2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, // 6758 -2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, // 6774 -4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, // 6790 - 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, // 6806 - 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, // 6822 -3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, // 6838 -3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, // 6854 -1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, // 6870 -2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, // 6886 -7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, // 6902 -1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, // 6918 -1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, // 6934 -3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, // 6950 - 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, // 6966 -1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, // 6982 -4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, // 6998 -7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, // 7014 -2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, // 7030 -3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, // 7046 - 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, // 7062 -1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, // 7078 -2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, // 7094 -2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, // 7110 -7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, // 7126 -7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, // 7142 -7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, // 7158 -2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, // 7174 -2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, // 7190 -1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, // 7206 -4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, // 7222 -3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, // 7238 -3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, // 7254 -4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, // 7270 -4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, // 7286 -2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, // 7302 -2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, // 7318 -7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, // 7334 -4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, // 7350 -7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, // 7366 -2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, // 7382 -1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, // 7398 -3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, // 7414 -4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, // 7430 -2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, // 7446 - 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, // 7462 -2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, // 7478 -1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, // 7494 -2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, // 7510 -2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, // 7526 -4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, // 7542 -7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, // 7558 -1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, // 7574 -3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, // 7590 -7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, // 7606 -1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, // 7622 -8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, // 7638 -2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, // 7654 -8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, // 7670 -2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, // 7686 -2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, // 7702 -8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, // 7718 -8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, // 7734 -8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, // 7750 - 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, // 7766 -8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, // 7782 -4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, // 7798 -3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, // 7814 -8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, // 7830 -1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, // 7846 -8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, // 7862 - 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, // 7878 -1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, // 7894 - 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, // 7910 -4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, // 7926 -1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, // 7942 -4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, // 7958 -1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, // 7974 - 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, // 7990 -3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, // 8006 -4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, // 8022 -8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, // 8038 - 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, // 8054 -3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, // 8070 - 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, // 8086 -2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, // 8102 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, // 8118 -2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, // 8134 -8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, // 8150 -8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, // 8166 -8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, // 8182 -8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, // 8198 -8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, // 8214 -8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, // 8230 -8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, // 8246 -8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, // 8262 -8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, // 8278 -8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, // 8294 -8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, // 8310 -8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, // 8326 -8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, // 8342 -8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, // 8358 -8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, // 8374 -8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, // 8390 -8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, // 8406 -8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, // 8422 -8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, // 8438 -8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, // 8454 -8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, // 8470 -8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, // 8486 -8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, // 8502 -8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, // 8518 -8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, // 8534 -8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, // 8550 -8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, // 8566 -8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, // 8582 -8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, // 8598 -8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, // 8614 -8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, // 8630 -8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, // 8646 -8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, // 8662 -8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, // 8678 -8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, // 8694 -8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, // 8710 -8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, // 8726 -8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741, // 8742 //13973 -****************************************************************************************/ -}; - diff --git a/extensions/universalchardet/src/base/GB2312Freq.tab b/extensions/universalchardet/src/base/GB2312Freq.tab deleted file mode 100644 index 74c5dcacd824..000000000000 --- a/extensions/universalchardet/src/base/GB2312Freq.tab +++ /dev/null @@ -1,457 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -//GB2312 most frequently used character table - -//Char to FreqOrder table , from hz6763 - -/****************************************************************************** - * 512 --> 0.79 -- 0.79 - * 1024 --> 0.92 -- 0.13 - * 2048 --> 0.98 -- 0.06 - * 6768 --> 1.00 -- 0.02 - * - * Idea Distribution Ratio = 0.79135/(1-0.79135) = 3.79 - * Random Distribution Ration = 512 / (3755 - 512) = 0.157 - * - * Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR - *****************************************************************************/ - -#define GB2312_TYPICAL_DISTRIBUTION_RATIO (float)0.9 - -static const int16_t GB2312CharToFreqOrder[] = -{ -1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, -2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, -2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, - 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, -1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, -1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, - 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, -1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, -2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, -3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, - 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, -1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, - 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, -2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, - 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, -2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, -1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, -3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, - 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, -1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, - 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, -2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, -1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, -3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, -1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, -2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, -1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, - 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, -3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, -3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, - 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, -3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, - 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, -1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, -3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, -2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, -1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, - 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, -1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, -4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, - 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, -3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, -3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, - 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, -1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, -2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, -1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, -1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, - 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, -3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, -3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, -4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, - 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, -3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, -1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, -1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, -4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, - 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, - 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, -3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, -1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, - 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, -1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, -2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, - 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, - 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, - 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, -3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, -4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, -3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, - 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, -2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, -2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, -2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, - 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, -2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, - 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, - 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, - 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, -3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, -2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, -2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, -1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, - 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, -2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, - 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, - 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, -1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, -1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, - 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, - 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, -1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, -2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, -3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, -2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, -2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, -2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, -3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, -1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, -1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, -2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, -1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, -3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, -1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, -1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, -3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, - 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, -2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, -1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, -4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, -1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, -1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, -3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, -1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, - 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, - 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, -1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, - 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, -1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, -1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, - 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, -3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, -4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, -3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, -2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, -2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, -1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, -3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, -2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, -1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, -1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, - 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, -2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, -2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, -3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, -4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, -3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, - 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, -3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, -2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, -1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, - 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, - 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, -3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, -4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, -2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, -1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, -1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, - 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, -1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, -3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, - 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, - 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, -1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, - 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, -1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, - 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, -2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, - 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, -2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, -2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, -1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, -1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, -2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, - 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, -1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, -1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, -2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, -2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, -3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, -1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, -4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, - 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, - 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, -3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, -1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, - 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, -3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, -1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, -4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, -1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, -2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, -1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, - 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, -1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, -3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, - 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, -2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, - 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, -1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, -1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, -1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, -3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, -2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, -3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, -3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, -3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, - 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, -2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, - 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, -2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, - 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, -1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, - 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, - 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, -1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, -3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, -3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, -1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, -1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, -3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, -2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, -2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, -1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, -3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, - 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, -4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, -1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, -2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, -3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, -3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, -1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, - 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, - 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, -2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, - 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, -1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, - 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, -1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, -1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, -1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, -1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, -1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, - 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, - 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, //last 512 - -/*************************************************************************************** - *Everything below is of no interest for detection purpose * - *************************************************************************************** - -5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, -5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, -5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, -3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, -4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, -5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, -5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, -4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, -4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, -4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, -4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, -3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, -6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, -4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, -6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, -4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, -4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, -4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, -5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, -3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, -4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, -3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, -4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, -4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, -6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, -6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, -5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, -4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, -6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, -4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, -5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, -5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, -5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, -6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, -3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, -6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, -4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, -5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, -6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, -6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, -4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, -5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, -4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, -5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, -5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, -4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, -4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, -5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, -4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, -4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, -5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, -4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, -4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, -4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, -5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, -5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, -4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, -3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, -4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, -6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, -5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, -5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, -4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, -6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, -5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, -6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, -4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, -5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, -5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, -3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, -5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, -6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, -4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, -6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, -4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, -4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, -6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, -3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, -6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, -4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, -3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, -3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, -3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, -4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, -2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, -5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, -4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, -5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, -5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, -5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, -4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, -5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, -4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, -5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, -1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, -3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, -4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, -4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, -6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, -4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, -5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, -3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, -5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, -5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, -5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, -3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, -5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, -5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, -3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, -5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, -5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, -5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, -6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, -4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, -6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, -4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, -3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, -4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, -5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, -5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, -5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, -3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, -3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, -6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, -6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, -5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, -6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, -6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, -6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, -6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, -6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, -5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, -6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, -6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, -3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, -3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, -4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, -4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, -3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, -5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, -5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, -5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, -5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, -5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, -4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, -5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, -6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, -5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, -4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, -4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, -6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, -3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, -4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, -4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, -5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, -6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, -6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, -4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, -6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, -5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, -5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, -5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, -5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, -5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, -4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, -5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, -5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, -5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, -5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, -6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, -4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, -5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, -4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, -4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, -6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, -4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, -6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, -3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, -5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, -6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, -6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, -6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, -5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, -6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, -6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, -3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, -5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, -4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767, -*******************************************************************************/ -}; - - diff --git a/extensions/universalchardet/src/base/JpCntx.cpp b/extensions/universalchardet/src/base/JpCntx.cpp index 761979cbf488..28ab64336ad8 100644 --- a/extensions/universalchardet/src/base/JpCntx.cpp +++ b/extensions/universalchardet/src/base/JpCntx.cpp @@ -138,7 +138,7 @@ void JapaneseContextAnalysis::HandleData(const char* aBuf, uint32_t aLen) return; } -void JapaneseContextAnalysis::Reset(bool aIsPreferredLanguage) +void JapaneseContextAnalysis::Reset() { mTotalRel = 0; for (uint32_t i = 0; i < NUM_OF_CATEGORY; i++) @@ -146,7 +146,7 @@ void JapaneseContextAnalysis::Reset(bool aIsPreferredLanguage) mNeedToSkipCharNum = 0; mLastCharOrder = -1; mDone = false; - mDataThreshold = aIsPreferredLanguage ? 0 : MINIMUM_DATA_THRESHOLD; + mDataThreshold = 0; } #define DONT_KNOW (float)-1 diff --git a/extensions/universalchardet/src/base/JpCntx.h b/extensions/universalchardet/src/base/JpCntx.h index f53ca4613904..88e096432ca0 100644 --- a/extensions/universalchardet/src/base/JpCntx.h +++ b/extensions/universalchardet/src/base/JpCntx.h @@ -19,7 +19,7 @@ extern const uint8_t jp2CharContext[83][83]; class JapaneseContextAnalysis { public: - JapaneseContextAnalysis() {Reset(false);} + JapaneseContextAnalysis() {Reset();} void HandleData(const char* aBuf, uint32_t aLen); @@ -43,7 +43,7 @@ public: } float GetConfidence(void); - void Reset(bool aIsPreferredLanguage); + void Reset(); bool GotEnoughData() {return mTotalRel > ENOUGH_REL_THRESHOLD;} protected: diff --git a/extensions/universalchardet/src/base/LangBulgarianModel.cpp b/extensions/universalchardet/src/base/LangBulgarianModel.cpp deleted file mode 100644 index 50ee75696166..000000000000 --- a/extensions/universalchardet/src/base/LangBulgarianModel.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsSBCharSetProber.h" -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//Character Mapping Table: -//this talbe is modified base on win1251BulgarianCharToOrderMap, so -//only number <64 is sure valid - -static const unsigned char Latin5_BulgarianCharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70 -194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, //80 -210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, //90 - 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, //a0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //b0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, //c0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //d0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, //e0 - 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, //f0 -}; - -static const unsigned char win1251BulgarianCharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, //40 -110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, //50 -253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, //60 -116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, //70 -206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, //80 -221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, //90 - 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, //a0 - 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, //b0 - 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, //c0 - 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, //d0 - 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, //e0 - 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, //f0 -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 96.9392% -//first 1024 sequences:3.0618% -//rest sequences: 0.2992% -//negative sequences: 0.0020% -static const uint8_t BulgarianLangModel[] = -{ -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, -3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, -0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, -0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, -0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, -0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, -0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, -2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, -3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, -3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, -1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, -3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, -1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, -2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, -2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, -3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, -1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, -2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, -2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, -1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, -2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, -2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, -2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, -1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, -2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, -1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, -3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, -1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, -3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, -1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, -2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, -1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, -2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, -1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, -2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, -1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, -2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, -1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, -2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, -1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, -0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, -1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, -1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, -1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, -0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, -1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, -1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, -1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -}; - -const SequenceModel Latin5BulgarianModel = -{ - Latin5_BulgarianCharToOrderMap, - BulgarianLangModel, - (float)0.969392, - false, - "ISO-8859-5" -}; - -const SequenceModel Win1251BulgarianModel = -{ - win1251BulgarianCharToOrderMap, - BulgarianLangModel, - (float)0.969392, - false, - "windows-1251" -}; diff --git a/extensions/universalchardet/src/base/LangCyrillicModel.cpp b/extensions/universalchardet/src/base/LangCyrillicModel.cpp deleted file mode 100644 index fb408d29f549..000000000000 --- a/extensions/universalchardet/src/base/LangCyrillicModel.cpp +++ /dev/null @@ -1,323 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsSBCharSetProber.h" - - - -//KOI8-R language model -//Character Mapping Table: -static const unsigned char KOI8R_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, //80 -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, //90 -223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, //a0 -238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, //b0 - 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, //c0 - 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, //d0 - 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, //e0 - 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, //f0 -}; - -static const unsigned char win1251_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -}; - -static const unsigned char latin5_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -}; - -static const unsigned char macCyrillic_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, -239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, -}; - -static const unsigned char IBM855_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 -191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, -206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, - 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, -220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, -230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, - 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, - 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, -250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, -}; - -static const unsigned char IBM866_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, //40 -155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, //50 -253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, //60 - 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, //70 - 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, - 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, - 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, -191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, -207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, -223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, - 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, -239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 97.6601% -//first 1024 sequences: 2.3389% -//rest sequences: 0.1237% -//negative sequences: 0.0009% -static const uint8_t RussianLangModel[] = -{ -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, -0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, -0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, -1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, -1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, -2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, -1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, -3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, -1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, -2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, -1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, -1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, -1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, -1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, -3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, -1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, -2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, -1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, -2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, -0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, -1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, -1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, -1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, -3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, -3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, -1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, -1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, -0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, -1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, -1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, -0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, -1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, -2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, -2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, -1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, -1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, -2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, -1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, -0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, -2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, -1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, -1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, -0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, -0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, -0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, -0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, -2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, -0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -}; - - -const SequenceModel Koi8rModel = -{ - KOI8R_CharToOrderMap, - RussianLangModel, - (float)0.976601, - false, - "KOI8-R" -}; - -const SequenceModel Win1251Model = -{ - win1251_CharToOrderMap, - RussianLangModel, - (float)0.976601, - false, - "windows-1251" -}; - -const SequenceModel Latin5Model = -{ - latin5_CharToOrderMap, - RussianLangModel, - (float)0.976601, - false, - "ISO-8859-5" -}; - -const SequenceModel MacCyrillicModel = -{ - macCyrillic_CharToOrderMap, - RussianLangModel, - (float)0.976601, - false, - "x-mac-cyrillic" -}; - -const SequenceModel Ibm866Model = -{ - IBM866_CharToOrderMap, - RussianLangModel, - (float)0.976601, - false, - "IBM866" -}; - -const SequenceModel Ibm855Model = -{ - IBM855_CharToOrderMap, - RussianLangModel, - (float)0.976601, - false, - "IBM855" -}; diff --git a/extensions/universalchardet/src/base/LangGreekModel.cpp b/extensions/universalchardet/src/base/LangGreekModel.cpp deleted file mode 100644 index 90dec85bcafe..000000000000 --- a/extensions/universalchardet/src/base/LangGreekModel.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsSBCharSetProber.h" -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//Character Mapping Table: -static const unsigned char Latin7_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90 -+253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0 -253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, //b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, //f0 -}; - - - -static const unsigned char win1253_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, //40 - 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, //50 -253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, //60 - 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, //70 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //80 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //90 -+253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, //a0 -253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, //b0 -110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, //c0 - 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, //d0 -124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, //e0 - 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, //f0 -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 98.2851% -//first 1024 sequences:1.7001% -//rest sequences: 0.0359% -//negative sequences: 0.0148% -static const uint8_t GreekLangModel[] = -{ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, -2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, -2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, -2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, -0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, -3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, -3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, -2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, -2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, -0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, -0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, -0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, -0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, -0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, -0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, -0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, -0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, -0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, -0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, -0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, -0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, -0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, -0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, -0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, -0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, -0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, -0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, -0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, -0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, -0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, -0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, -0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, -0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, -0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, -0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, -0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}; - -const SequenceModel Latin7Model = -{ - Latin7_CharToOrderMap, - GreekLangModel, - (float)0.982851, - false, - "ISO-8859-7" -}; - -const SequenceModel Win1253Model = -{ - win1253_CharToOrderMap, - GreekLangModel, - (float)0.982851, - false, - "windows-1253" -}; diff --git a/extensions/universalchardet/src/base/LangHebrewModel.cpp b/extensions/universalchardet/src/base/LangHebrewModel.cpp deleted file mode 100644 index 627d0d1b2ac7..000000000000 --- a/extensions/universalchardet/src/base/LangHebrewModel.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsSBCharSetProber.h" - - -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//Windows-1255 language model -//Character Mapping Table: -static const unsigned char win1255_CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, //40 - 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, //50 -253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, //60 - 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, //70 -124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, -215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, - 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, -106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, - 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, -238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, - 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, - 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 98.4004% -//first 1024 sequences: 1.5981% -//rest sequences: 0.087% -//negative sequences: 0.0015% -static const uint8_t HebrewLangModel[] = -{ -0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, -3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, -1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, -1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, -1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, -1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, -0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, -1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, -0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, -0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, -0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, -0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, -0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, -0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, -0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, -3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, -0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, -0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, -0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, -1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, -0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, -3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, -0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, -0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, -0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, -0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, -0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, -0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, -1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, -0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, -1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, -2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, -2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, -0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, -1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, -0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, -}; - -const SequenceModel Win1255Model = -{ - win1255_CharToOrderMap, - HebrewLangModel, - (float)0.984004, - false, - "windows-1255" -}; - diff --git a/extensions/universalchardet/src/base/LangHungarianModel.cpp b/extensions/universalchardet/src/base/LangHungarianModel.cpp deleted file mode 100644 index aca8a0dc7ec6..000000000000 --- a/extensions/universalchardet/src/base/LangHungarianModel.cpp +++ /dev/null @@ -1,210 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsSBCharSetProber.h" -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//Character Mapping Table: -static const unsigned char Latin2_HungarianCharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, -175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, - 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, - 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, -245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, -}; - -static const unsigned char win1250HungarianCharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, - 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, -253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, - 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, -161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, -177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, -191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, - 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, -221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, -232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, - 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, -245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, -}; - -//Model Table: -//total sequences: 100% -//first 512 sequences: 94.7368% -//first 1024 sequences:5.2623% -//rest sequences: 0.8894% -//negative sequences: 0.0009% -static const uint8_t HungarianLangModel[] = -{ -0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, -3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, -3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, -3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, -0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, -3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, -3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, -0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, -2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, -0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, -3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, -1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, -1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, -3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, -2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, -2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, -2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, -2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, -2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, -1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, -1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, -3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, -1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, -1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, -2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, -2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, -2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, -3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, -2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, -1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, -1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, -2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, -1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, -2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, -1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, -1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, -2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, -2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, -2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, -1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, -1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, -0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, -2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, -1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, -2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, -1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, -1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, -2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, -2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, -2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, -1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, -2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, -0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, -2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, -}; - -const SequenceModel Latin2HungarianModel = -{ - Latin2_HungarianCharToOrderMap, - HungarianLangModel, - (float)0.947368, - true, - "ISO-8859-2" -}; - -const SequenceModel Win1250HungarianModel = -{ - win1250HungarianCharToOrderMap, - HungarianLangModel, - (float)0.947368, - true, - "windows-1250" -}; diff --git a/extensions/universalchardet/src/base/LangThaiModel.cpp b/extensions/universalchardet/src/base/LangThaiModel.cpp deleted file mode 100644 index 4870f94083fe..000000000000 --- a/extensions/universalchardet/src/base/LangThaiModel.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsSBCharSetProber.h" - - -/**************************************************************** -255: Control characters that usually does not exist in any text -254: Carriage/Return -253: symbol (punctuation) that does not belong to word -252: 0 - 9 - -*****************************************************************/ - -//The following result for thai was collected from a limited sample (1M). - -//Character Mapping Table: -static const unsigned char TIS620CharToOrderMap[] = -{ -255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, //00 -255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, //10 -+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, //20 -252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, //30 -253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, //40 -188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, //50 -253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, //60 - 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, //70 -209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, -223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, -236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, - 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, - 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, - 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, - 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, - 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, -}; - - - - -//Model Table: -//total sequences: 100% -//first 512 sequences: 92.6386% -//first 1024 sequences:7.3177% -//rest sequences: 1.0230% -//negative sequences: 0.0436% -static const uint8_t ThaiLangModel[] = -{ -0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, -0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, -3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, -0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, -3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, -3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, -3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, -3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, -3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, -2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, -3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, -0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, -1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, -3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, -3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, -1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, -0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, -0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, -3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, -2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, -3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, -0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, -3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, -3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, -2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, -2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, -3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, -3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, -3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, -3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, -3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, -1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, -0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, -0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, -3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, -3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, -1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, -3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, -3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, -0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, -0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, -1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, -1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, -3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, -0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, -0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, -3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, -0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, -0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, -0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, -0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, -0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, -0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, -0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, -3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, -0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, -0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, -3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, -2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, -0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, -3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, -0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, -1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, -1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, -1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, -1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, -1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -}; - - -const SequenceModel TIS620ThaiModel = -{ - TIS620CharToOrderMap, - ThaiLangModel, - (float)0.926386, - false, - "windows-874" -}; diff --git a/extensions/universalchardet/src/base/moz.build b/extensions/universalchardet/src/base/moz.build index 6bbd70da450e..2ffb6254efb8 100644 --- a/extensions/universalchardet/src/base/moz.build +++ b/extensions/universalchardet/src/base/moz.build @@ -7,26 +7,13 @@ UNIFIED_SOURCES += [ 'CharDistribution.cpp', 'JpCntx.cpp', - 'LangBulgarianModel.cpp', - 'LangCyrillicModel.cpp', - 'LangGreekModel.cpp', - 'LangHebrewModel.cpp', - 'LangHungarianModel.cpp', - 'LangThaiModel.cpp', - 'nsBig5Prober.cpp', 'nsCharSetProber.cpp', 'nsEscCharsetProber.cpp', 'nsEscSM.cpp', 'nsEUCJPProber.cpp', - 'nsEUCKRProber.cpp', - 'nsEUCTWProber.cpp', - 'nsGB2312Prober.cpp', - 'nsHebrewProber.cpp', 'nsLatin1Prober.cpp', 'nsMBCSGroupProber.cpp', 'nsMBCSSM.cpp', - 'nsSBCharSetProber.cpp', - 'nsSBCSGroupProber.cpp', 'nsSJISProber.cpp', 'nsUniversalDetector.cpp', 'nsUTF8Prober.cpp', diff --git a/extensions/universalchardet/src/base/nsBig5Prober.cpp b/extensions/universalchardet/src/base/nsBig5Prober.cpp deleted file mode 100644 index a7acec8f5e65..000000000000 --- a/extensions/universalchardet/src/base/nsBig5Prober.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsBig5Prober.h" -#include "nsDebug.h" - -void nsBig5Prober::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mDistributionAnalyser.Reset(mIsPreferredLanguage); -} - -nsProbingState nsBig5Prober::HandleData(const char* aBuf, uint32_t aLen) -{ - NS_ASSERTION(aLen, "HandleData called with empty buffer"); - nsSMState codingState; - - for (uint32_t i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - uint32_t charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; - - return mState; -} - -float nsBig5Prober::GetConfidence(void) -{ - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (float)distribCf; -} - diff --git a/extensions/universalchardet/src/base/nsBig5Prober.h b/extensions/universalchardet/src/base/nsBig5Prober.h deleted file mode 100644 index 0a6194176c4d..000000000000 --- a/extensions/universalchardet/src/base/nsBig5Prober.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsBig5Prober_h__ -#define nsBig5Prober_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "CharDistribution.h" - -class nsBig5Prober: public nsCharSetProber { -public: - explicit nsBig5Prober(bool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&Big5SMModel); - Reset();} - virtual ~nsBig5Prober(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, uint32_t aLen); - const char* GetCharSetName() {return "Big5";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - -protected: - void GetDistribution(uint32_t aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - //Big5ContextAnalysis mContextAnalyser; - Big5DistributionAnalysis mDistributionAnalyser; - char mLastChar[2]; - bool mIsPreferredLanguage; - -}; - - -#endif /* nsBig5Prober_h__ */ - diff --git a/extensions/universalchardet/src/base/nsEUCJPProber.cpp b/extensions/universalchardet/src/base/nsEUCJPProber.cpp index baf909c3375b..663421f03744 100644 --- a/extensions/universalchardet/src/base/nsEUCJPProber.cpp +++ b/extensions/universalchardet/src/base/nsEUCJPProber.cpp @@ -15,8 +15,8 @@ void nsEUCJPProber::Reset(void) { mCodingSM->Reset(); mState = eDetecting; - mContextAnalyser.Reset(mIsPreferredLanguage); - mDistributionAnalyser.Reset(mIsPreferredLanguage); + mContextAnalyser.Reset(); + mDistributionAnalyser.Reset(); } nsProbingState nsEUCJPProber::HandleData(const char* aBuf, uint32_t aLen) diff --git a/extensions/universalchardet/src/base/nsEUCJPProber.h b/extensions/universalchardet/src/base/nsEUCJPProber.h index 2e923220e9d0..4880151e567d 100644 --- a/extensions/universalchardet/src/base/nsEUCJPProber.h +++ b/extensions/universalchardet/src/base/nsEUCJPProber.h @@ -18,8 +18,7 @@ class nsEUCJPProber: public nsCharSetProber { public: - explicit nsEUCJPProber(bool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) + nsEUCJPProber() {mCodingSM = new nsCodingStateMachine(&EUCJPSMModel); Reset();} virtual ~nsEUCJPProber(void){delete mCodingSM;} @@ -37,7 +36,6 @@ protected: EUCJPDistributionAnalysis mDistributionAnalyser; char mLastChar[2]; - bool mIsPreferredLanguage; }; diff --git a/extensions/universalchardet/src/base/nsEUCKRProber.cpp b/extensions/universalchardet/src/base/nsEUCKRProber.cpp deleted file mode 100644 index 343ec8fca281..000000000000 --- a/extensions/universalchardet/src/base/nsEUCKRProber.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsEUCKRProber.h" -#include "nsDebug.h" - -void nsEUCKRProber::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mDistributionAnalyser.Reset(mIsPreferredLanguage); - //mContextAnalyser.Reset(); -} - -nsProbingState nsEUCKRProber::HandleData(const char* aBuf, uint32_t aLen) -{ - NS_ASSERTION(aLen, "HandleData called with empty buffer"); - nsSMState codingState; - - for (uint32_t i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - uint32_t charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; -// else -// mDistributionAnalyser.HandleData(aBuf, aLen); - - return mState; -} - -float nsEUCKRProber::GetConfidence(void) -{ - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (float)distribCf; -} - diff --git a/extensions/universalchardet/src/base/nsEUCKRProber.h b/extensions/universalchardet/src/base/nsEUCKRProber.h deleted file mode 100644 index c60934c68994..000000000000 --- a/extensions/universalchardet/src/base/nsEUCKRProber.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsEUCKRProber_h__ -#define nsEUCKRProber_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "CharDistribution.h" - -class nsEUCKRProber: public nsCharSetProber { -public: - explicit nsEUCKRProber(bool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&EUCKRSMModel); - Reset(); - } - virtual ~nsEUCKRProber(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, uint32_t aLen); - const char* GetCharSetName() {return "EUC-KR";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - -protected: - void GetDistribution(uint32_t aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - //EUCKRContextAnalysis mContextAnalyser; - EUCKRDistributionAnalysis mDistributionAnalyser; - char mLastChar[2]; - bool mIsPreferredLanguage; - -}; - - -#endif /* nsEUCKRProber_h__ */ - diff --git a/extensions/universalchardet/src/base/nsEUCTWProber.cpp b/extensions/universalchardet/src/base/nsEUCTWProber.cpp deleted file mode 100644 index 3f23fc24c066..000000000000 --- a/extensions/universalchardet/src/base/nsEUCTWProber.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsEUCTWProber.h" -#include "nsDebug.h" - -void nsEUCTWProber::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mDistributionAnalyser.Reset(mIsPreferredLanguage); - //mContextAnalyser.Reset(); -} - -nsProbingState nsEUCTWProber::HandleData(const char* aBuf, uint32_t aLen) -{ - NS_ASSERTION(aLen, "HandleData called with empty buffer"); - nsSMState codingState; - - for (uint32_t i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - uint32_t charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; -// else -// mDistributionAnalyser.HandleData(aBuf, aLen); - - return mState; -} - -float nsEUCTWProber::GetConfidence(void) -{ - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (float)distribCf; -} - diff --git a/extensions/universalchardet/src/base/nsEUCTWProber.h b/extensions/universalchardet/src/base/nsEUCTWProber.h deleted file mode 100644 index 48504956e614..000000000000 --- a/extensions/universalchardet/src/base/nsEUCTWProber.h +++ /dev/null @@ -1,41 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsEUCTWProber_h__ -#define nsEUCTWProber_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "CharDistribution.h" - -class nsEUCTWProber: public nsCharSetProber { -public: - explicit nsEUCTWProber(bool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&EUCTWSMModel); - Reset();} - virtual ~nsEUCTWProber(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, uint32_t aLen); - const char* GetCharSetName() {return "x-euc-tw";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - -protected: - void GetDistribution(uint32_t aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - //EUCTWContextAnalysis mContextAnalyser; - EUCTWDistributionAnalysis mDistributionAnalyser; - char mLastChar[2]; - bool mIsPreferredLanguage; - -}; - - -#endif /* nsEUCTWProber_h__ */ - diff --git a/extensions/universalchardet/src/base/nsEscCharsetProber.cpp b/extensions/universalchardet/src/base/nsEscCharsetProber.cpp index b6ea2d375fe3..b4fbfeb00b4f 100644 --- a/extensions/universalchardet/src/base/nsEscCharsetProber.cpp +++ b/extensions/universalchardet/src/base/nsEscCharsetProber.cpp @@ -7,60 +7,37 @@ #include "nsEscCharsetProber.h" #include "nsUniversalDetector.h" -nsEscCharSetProber::nsEscCharSetProber(uint32_t aLanguageFilter) +nsEscCharSetProber::nsEscCharSetProber() { - for (uint32_t i = 0; i < NUM_OF_ESC_CHARSETS; i++) - mCodingSM[i] = nullptr; - if (aLanguageFilter & NS_FILTER_CHINESE_SIMPLIFIED) - { - mCodingSM[0] = new nsCodingStateMachine(&HZSMModel); - mCodingSM[1] = new nsCodingStateMachine(&ISO2022CNSMModel); - } - if (aLanguageFilter & NS_FILTER_JAPANESE) - mCodingSM[2] = new nsCodingStateMachine(&ISO2022JPSMModel); - if (aLanguageFilter & NS_FILTER_KOREAN) - mCodingSM[3] = new nsCodingStateMachine(&ISO2022KRSMModel); - mActiveSM = NUM_OF_ESC_CHARSETS; + mCodingSM = new nsCodingStateMachine(&ISO2022JPSMModel); mState = eDetecting; mDetectedCharset = nullptr; } nsEscCharSetProber::~nsEscCharSetProber(void) { - for (uint32_t i = 0; i < NUM_OF_ESC_CHARSETS; i++) - delete mCodingSM[i]; } void nsEscCharSetProber::Reset(void) { mState = eDetecting; - for (uint32_t i = 0; i < NUM_OF_ESC_CHARSETS; i++) - if (mCodingSM[i]) - mCodingSM[i]->Reset(); - mActiveSM = NUM_OF_ESC_CHARSETS; + mCodingSM->Reset(); mDetectedCharset = nullptr; } nsProbingState nsEscCharSetProber::HandleData(const char* aBuf, uint32_t aLen) { nsSMState codingState; - int32_t j; uint32_t i; for ( i = 0; i < aLen && mState == eDetecting; i++) { - for (j = mActiveSM-1; j>= 0; j--) + codingState = mCodingSM->NextState(aBuf[i]); + if (codingState == eItsMe) { - if (mCodingSM[j]) - { - codingState = mCodingSM[j]->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - mDetectedCharset = mCodingSM[j]->GetCodingStateMachine(); - return mState; - } - } + mState = eFoundIt; + mDetectedCharset = mCodingSM->GetCodingStateMachine(); + return mState; } } diff --git a/extensions/universalchardet/src/base/nsEscCharsetProber.h b/extensions/universalchardet/src/base/nsEscCharsetProber.h index a264968f49c0..4507972d0574 100644 --- a/extensions/universalchardet/src/base/nsEscCharsetProber.h +++ b/extensions/universalchardet/src/base/nsEscCharsetProber.h @@ -8,12 +8,11 @@ #include "nsCharSetProber.h" #include "nsCodingStateMachine.h" - -#define NUM_OF_ESC_CHARSETS 4 +#include "nsAutoPtr.h" class nsEscCharSetProber: public nsCharSetProber { public: - explicit nsEscCharSetProber(uint32_t aLanguageFilter); + nsEscCharSetProber(); virtual ~nsEscCharSetProber(void); nsProbingState HandleData(const char* aBuf, uint32_t aLen); const char* GetCharSetName() {return mDetectedCharset;} @@ -24,8 +23,7 @@ public: protected: void GetDistribution(uint32_t aCharLen, const char* aStr); - nsCodingStateMachine* mCodingSM[NUM_OF_ESC_CHARSETS] ; - uint32_t mActiveSM; + nsAutoPtr mCodingSM; nsProbingState mState; const char * mDetectedCharset; }; diff --git a/extensions/universalchardet/src/base/nsEscSM.cpp b/extensions/universalchardet/src/base/nsEscSM.cpp index b0cf988d6a32..77a223fec309 100644 --- a/extensions/universalchardet/src/base/nsEscSM.cpp +++ b/extensions/universalchardet/src/base/nsEscSM.cpp @@ -4,119 +4,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsCodingStateMachine.h" -static const uint32_t HZ_cls[ 256 / 8 ] = { -PCK4BITS(1,0,0,0,0,0,0,0), // 00 - 07 -PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f -PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 -PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f -PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27 -PCK4BITS(0,0,0,0,0,0,0,0), // 28 - 2f -PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 -PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f -PCK4BITS(0,0,0,0,0,0,0,0), // 40 - 47 -PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f -PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 -PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f -PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 -PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f -PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 -PCK4BITS(0,0,0,4,0,5,2,0), // 78 - 7f -PCK4BITS(1,1,1,1,1,1,1,1), // 80 - 87 -PCK4BITS(1,1,1,1,1,1,1,1), // 88 - 8f -PCK4BITS(1,1,1,1,1,1,1,1), // 90 - 97 -PCK4BITS(1,1,1,1,1,1,1,1), // 98 - 9f -PCK4BITS(1,1,1,1,1,1,1,1), // a0 - a7 -PCK4BITS(1,1,1,1,1,1,1,1), // a8 - af -PCK4BITS(1,1,1,1,1,1,1,1), // b0 - b7 -PCK4BITS(1,1,1,1,1,1,1,1), // b8 - bf -PCK4BITS(1,1,1,1,1,1,1,1), // c0 - c7 -PCK4BITS(1,1,1,1,1,1,1,1), // c8 - cf -PCK4BITS(1,1,1,1,1,1,1,1), // d0 - d7 -PCK4BITS(1,1,1,1,1,1,1,1), // d8 - df -PCK4BITS(1,1,1,1,1,1,1,1), // e0 - e7 -PCK4BITS(1,1,1,1,1,1,1,1), // e8 - ef -PCK4BITS(1,1,1,1,1,1,1,1), // f0 - f7 -PCK4BITS(1,1,1,1,1,1,1,1) // f8 - ff -}; - - -static const uint32_t HZ_st [ 6] = { -PCK4BITS(eStart,eError, 3,eStart,eStart,eStart,eError,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError),//10-17 -PCK4BITS( 5,eError, 6,eError, 5, 5, 4,eError),//18-1f -PCK4BITS( 4,eError, 4, 4, 4,eError, 4,eError),//20-27 -PCK4BITS( 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f -}; - -static const uint32_t HZCharLenTable[] = {0, 0, 0, 0, 0, 0}; - -const SMModel HZSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, HZ_cls }, - 6, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, HZ_st }, - CHAR_LEN_TABLE(HZCharLenTable), - "HZ-GB-2312", -}; - - -static const uint32_t ISO2022CN_cls [ 256 / 8 ] = { -PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 -PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f -PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 -PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f -PCK4BITS(0,0,0,0,0,0,0,0), // 20 - 27 -PCK4BITS(0,3,0,0,0,0,0,0), // 28 - 2f -PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 -PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f -PCK4BITS(0,0,0,4,0,0,0,0), // 40 - 47 -PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f -PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 -PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f -PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 -PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f -PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 -PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f -PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87 -PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f -PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97 -PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f -PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff -}; - - -static const uint32_t ISO2022CN_st [ 8] = { -PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eStart,eStart),//00-07 -PCK4BITS(eStart,eError,eError,eError,eError,eError,eError,eError),//08-0f -PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe),//10-17 -PCK4BITS(eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError),//18-1f -PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//20-27 -PCK4BITS( 5, 6,eError,eError,eError,eError,eError,eError),//28-2f -PCK4BITS(eError,eError,eError,eItsMe,eError,eError,eError,eError),//30-37 -PCK4BITS(eError,eError,eError,eError,eError,eItsMe,eError,eStart) //38-3f -}; - -static const uint32_t ISO2022CNCharLenTable[] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; - -const SMModel ISO2022CNSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022CN_cls }, - 9, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022CN_st }, - CHAR_LEN_TABLE(ISO2022CNCharLenTable), - "ISO-2022-CN", -}; - static const uint32_t ISO2022JP_cls [ 256 / 8 ] = { PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 PCK4BITS(0,0,0,0,0,0,2,2), // 08 - 0f @@ -174,58 +61,3 @@ const SMModel ISO2022JPSMModel = { CHAR_LEN_TABLE(ISO2022JPCharLenTable), "ISO-2022-JP", }; - -static const uint32_t ISO2022KR_cls [ 256 / 8 ] = { -PCK4BITS(2,0,0,0,0,0,0,0), // 00 - 07 -PCK4BITS(0,0,0,0,0,0,0,0), // 08 - 0f -PCK4BITS(0,0,0,0,0,0,0,0), // 10 - 17 -PCK4BITS(0,0,0,1,0,0,0,0), // 18 - 1f -PCK4BITS(0,0,0,0,3,0,0,0), // 20 - 27 -PCK4BITS(0,4,0,0,0,0,0,0), // 28 - 2f -PCK4BITS(0,0,0,0,0,0,0,0), // 30 - 37 -PCK4BITS(0,0,0,0,0,0,0,0), // 38 - 3f -PCK4BITS(0,0,0,5,0,0,0,0), // 40 - 47 -PCK4BITS(0,0,0,0,0,0,0,0), // 48 - 4f -PCK4BITS(0,0,0,0,0,0,0,0), // 50 - 57 -PCK4BITS(0,0,0,0,0,0,0,0), // 58 - 5f -PCK4BITS(0,0,0,0,0,0,0,0), // 60 - 67 -PCK4BITS(0,0,0,0,0,0,0,0), // 68 - 6f -PCK4BITS(0,0,0,0,0,0,0,0), // 70 - 77 -PCK4BITS(0,0,0,0,0,0,0,0), // 78 - 7f -PCK4BITS(2,2,2,2,2,2,2,2), // 80 - 87 -PCK4BITS(2,2,2,2,2,2,2,2), // 88 - 8f -PCK4BITS(2,2,2,2,2,2,2,2), // 90 - 97 -PCK4BITS(2,2,2,2,2,2,2,2), // 98 - 9f -PCK4BITS(2,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,2,2,2), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,2) // f8 - ff -}; - - -static const uint32_t ISO2022KR_st [ 5] = { -PCK4BITS(eStart, 3,eError,eStart,eStart,eStart,eError,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eError,eError,eError, 4,eError,eError),//10-17 -PCK4BITS(eError,eError,eError,eError, 5,eError,eError,eError),//18-1f -PCK4BITS(eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart) //20-27 -}; - -static const uint32_t ISO2022KRCharLenTable[] = {0, 0, 0, 0, 0, 0}; - -const SMModel ISO2022KRSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022KR_cls }, - 6, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, ISO2022KR_st }, - CHAR_LEN_TABLE(ISO2022KRCharLenTable), - "ISO-2022-KR", -}; - diff --git a/extensions/universalchardet/src/base/nsGB2312Prober.cpp b/extensions/universalchardet/src/base/nsGB2312Prober.cpp deleted file mode 100644 index 59b58a4d109e..000000000000 --- a/extensions/universalchardet/src/base/nsGB2312Prober.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// for S-JIS encoding, obeserve characteristic: -// 1, kana character (or hankaku?) often have hight frequency of appereance -// 2, kana character often exist in group -// 3, certain combination of kana is never used in japanese language - -#include "nsGB2312Prober.h" -#include "nsDebug.h" - -void nsGB18030Prober::Reset(void) -{ - mCodingSM->Reset(); - mState = eDetecting; - mDistributionAnalyser.Reset(mIsPreferredLanguage); - //mContextAnalyser.Reset(); -} - -nsProbingState nsGB18030Prober::HandleData(const char* aBuf, uint32_t aLen) -{ - NS_ASSERTION(aLen, "HandleData called with empty buffer"); - nsSMState codingState; - - for (uint32_t i = 0; i < aLen; i++) - { - codingState = mCodingSM->NextState(aBuf[i]); - if (codingState == eItsMe) - { - mState = eFoundIt; - break; - } - if (codingState == eStart) - { - uint32_t charLen = mCodingSM->GetCurrentCharLen(); - - if (i == 0) - { - mLastChar[1] = aBuf[0]; - mDistributionAnalyser.HandleOneChar(mLastChar, charLen); - } - else - mDistributionAnalyser.HandleOneChar(aBuf+i-1, charLen); - } - } - - mLastChar[0] = aBuf[aLen-1]; - - if (mState == eDetecting) - if (mDistributionAnalyser.GotEnoughData() && GetConfidence() > SHORTCUT_THRESHOLD) - mState = eFoundIt; -// else -// mDistributionAnalyser.HandleData(aBuf, aLen); - - return mState; -} - -float nsGB18030Prober::GetConfidence(void) -{ - float distribCf = mDistributionAnalyser.GetConfidence(); - - return (float)distribCf; -} - diff --git a/extensions/universalchardet/src/base/nsGB2312Prober.h b/extensions/universalchardet/src/base/nsGB2312Prober.h deleted file mode 100644 index 989fd755a143..000000000000 --- a/extensions/universalchardet/src/base/nsGB2312Prober.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsGB2312Prober_h__ -#define nsGB2312Prober_h__ - -#include "nsCharSetProber.h" -#include "nsCodingStateMachine.h" -#include "CharDistribution.h" - -// We use gb18030 to replace gb2312, because 18030 is a superset. - -class nsGB18030Prober: public nsCharSetProber { -public: - explicit nsGB18030Prober(bool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) - {mCodingSM = new nsCodingStateMachine(&GB18030SMModel); - Reset();} - virtual ~nsGB18030Prober(void){delete mCodingSM;} - nsProbingState HandleData(const char* aBuf, uint32_t aLen); - const char* GetCharSetName() {return "gb18030";} - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - -protected: - void GetDistribution(uint32_t aCharLen, const char* aStr); - - nsCodingStateMachine* mCodingSM; - nsProbingState mState; - - //GB2312ContextAnalysis mContextAnalyser; - GB2312DistributionAnalysis mDistributionAnalyser; - char mLastChar[2]; - bool mIsPreferredLanguage; - -}; - - -#endif /* nsGB2312Prober_h__ */ - diff --git a/extensions/universalchardet/src/base/nsHebrewProber.cpp b/extensions/universalchardet/src/base/nsHebrewProber.cpp deleted file mode 100644 index 9fa5f72a9559..000000000000 --- a/extensions/universalchardet/src/base/nsHebrewProber.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsHebrewProber.h" -#include - -// windows-1255 / ISO-8859-8 code points of interest -#define FINAL_KAF ('\xea') -#define NORMAL_KAF ('\xeb') -#define FINAL_MEM ('\xed') -#define NORMAL_MEM ('\xee') -#define FINAL_NUN ('\xef') -#define NORMAL_NUN ('\xf0') -#define FINAL_PE ('\xf3') -#define NORMAL_PE ('\xf4') -#define FINAL_TSADI ('\xf5') -#define NORMAL_TSADI ('\xf6') - -// Minimum Visual vs Logical final letter score difference. -// If the difference is below this, don't rely solely on the final letter score distance. -#define MIN_FINAL_CHAR_DISTANCE (5) - -// Minimum Visual vs Logical model score difference. -// If the difference is below this, don't rely at all on the model score distance. -#define MIN_MODEL_DISTANCE (0.01) - -#define VISUAL_HEBREW_NAME ("ISO-8859-8") -#define LOGICAL_HEBREW_NAME ("windows-1255") - -bool nsHebrewProber::isFinal(char c) -{ - return ((c == FINAL_KAF) || (c == FINAL_MEM) || (c == FINAL_NUN) || (c == FINAL_PE) || (c == FINAL_TSADI)); -} - -bool nsHebrewProber::isNonFinal(char c) -{ - return ((c == NORMAL_KAF) || (c == NORMAL_MEM) || (c == NORMAL_NUN) || (c == NORMAL_PE)); - // The normal Tsadi is not a good Non-Final letter due to words like - // 'lechotet' (to chat) containing an apostrophe after the tsadi. This - // apostrophe is converted to a space in FilterWithoutEnglishLetters causing - // the Non-Final tsadi to appear at an end of a word even though this is not - // the case in the original text. - // The letters Pe and Kaf rarely display a related behavior of not being a - // good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' for - // example legally end with a Non-Final Pe or Kaf. However, the benefit of - // these letters as Non-Final letters outweighs the damage since these words - // are quite rare. -} - -/** HandleData - * Final letter analysis for logical-visual decision. - * Look for evidence that the received buffer is either logical Hebrew or - * visual Hebrew. - * The following cases are checked: - * 1) A word longer than 1 letter, ending with a final letter. This is an - * indication that the text is laid out "naturally" since the final letter - * really appears at the end. +1 for logical score. - * 2) A word longer than 1 letter, ending with a Non-Final letter. In normal - * Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, should not end with - * the Non-Final form of that letter. Exceptions to this rule are mentioned - * above in isNonFinal(). This is an indication that the text is laid out - * backwards. +1 for visual score - * 3) A word longer than 1 letter, starting with a final letter. Final letters - * should not appear at the beginning of a word. This is an indication that - * the text is laid out backwards. +1 for visual score. - * - * The visual score and logical score are accumulated throughout the text and - * are finally checked against each other in GetCharSetName(). - * No checking for final letters in the middle of words is done since that case - * is not an indication for either Logical or Visual text. - * - * The input buffer should not contain any white spaces that are not (' ') - * or any low-ascii punctuation marks. - */ -nsProbingState nsHebrewProber::HandleData(const char* aBuf, uint32_t aLen) -{ - // Both model probers say it's not them. No reason to continue. - if (GetState() == eNotMe) - return eNotMe; - - const char *curPtr, *endPtr = aBuf+aLen; - char cur; - - for (curPtr = (char*)aBuf; curPtr < endPtr; ++curPtr) - { - cur = *curPtr; - if (cur == ' ') // We stand on a space - a word just ended - { - if (mBeforePrev != ' ') // *(curPtr-2) was not a space so prev is not a 1 letter word - { - if (isFinal(mPrev)) // case (1) [-2:not space][-1:final letter][cur:space] - ++mFinalCharLogicalScore; - else if (isNonFinal(mPrev)) // case (2) [-2:not space][-1:Non-Final letter][cur:space] - ++mFinalCharVisualScore; - } - } - else // Not standing on a space - { - if ((mBeforePrev == ' ') && (isFinal(mPrev)) && (cur != ' ')) // case (3) [-2:space][-1:final letter][cur:not space] - ++mFinalCharVisualScore; - } - mBeforePrev = mPrev; - mPrev = cur; - } - - // Forever detecting, till the end or until both model probers return eNotMe (handled above). - return eDetecting; -} - -// Make the decision: is it Logical or Visual? -const char* nsHebrewProber::GetCharSetName() -{ - // If the final letter score distance is dominant enough, rely on it. - int32_t finalsub = mFinalCharLogicalScore - mFinalCharVisualScore; - if (finalsub >= MIN_FINAL_CHAR_DISTANCE) - return LOGICAL_HEBREW_NAME; - if (finalsub <= -(MIN_FINAL_CHAR_DISTANCE)) - return VISUAL_HEBREW_NAME; - - // It's not dominant enough, try to rely on the model scores instead. - float modelsub = mLogicalProb->GetConfidence() - mVisualProb->GetConfidence(); - if (modelsub > MIN_MODEL_DISTANCE) - return LOGICAL_HEBREW_NAME; - if (modelsub < -(MIN_MODEL_DISTANCE)) - return VISUAL_HEBREW_NAME; - - // Still no good, back to final letter distance, maybe it'll save the day. - if (finalsub < 0) - return VISUAL_HEBREW_NAME; - - // (finalsub > 0 - Logical) or (don't know what to do) default to Logical. - return LOGICAL_HEBREW_NAME; -} - - -void nsHebrewProber::Reset(void) -{ - mFinalCharLogicalScore = 0; - mFinalCharVisualScore = 0; - - // mPrev and mBeforePrev are initialized to space in order to simulate a word - // delimiter at the beginning of the data - mPrev = ' '; - mBeforePrev = ' '; -} - -nsProbingState nsHebrewProber::GetState(void) -{ - // Remain active as long as any of the model probers are active. - if ((mLogicalProb->GetState() == eNotMe) && (mVisualProb->GetState() == eNotMe)) - return eNotMe; - return eDetecting; -} - -#ifdef DEBUG_chardet -void nsHebrewProber::DumpStatus() -{ - printf(" HEB: %d - %d [Logical-Visual score]\r\n", mFinalCharLogicalScore, mFinalCharVisualScore); -} -#endif diff --git a/extensions/universalchardet/src/base/nsHebrewProber.h b/extensions/universalchardet/src/base/nsHebrewProber.h deleted file mode 100644 index 4dc8d5b3bdaf..000000000000 --- a/extensions/universalchardet/src/base/nsHebrewProber.h +++ /dev/null @@ -1,143 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsHebrewProber_h__ -#define nsHebrewProber_h__ - -#include "nsSBCharSetProber.h" - -// This prober doesn't actually recognize a language or a charset. -// It is a helper prober for the use of the Hebrew model probers -class nsHebrewProber: public nsCharSetProber -{ -public: - nsHebrewProber(void) :mLogicalProb(0), mVisualProb(0) { Reset(); } - - virtual ~nsHebrewProber(void) {} - virtual nsProbingState HandleData(const char* aBuf, uint32_t aLen); - virtual const char* GetCharSetName(); - virtual void Reset(void); - - virtual nsProbingState GetState(void); - - virtual float GetConfidence(void) { return (float)0.0; } - - void SetModelProbers(nsCharSetProber *logicalPrb, nsCharSetProber *visualPrb) - { mLogicalProb = logicalPrb; mVisualProb = visualPrb; } - -#ifdef DEBUG_chardet - virtual void DumpStatus(); -#endif - -protected: - static bool isFinal(char c); - static bool isNonFinal(char c); - - int32_t mFinalCharLogicalScore, mFinalCharVisualScore; - - // The two last characters seen in the previous buffer. - char mPrev, mBeforePrev; - - // These probers are owned by the group prober. - nsCharSetProber *mLogicalProb, *mVisualProb; -}; - -/** - * ** General ideas of the Hebrew charset recognition ** - * - * Four main charsets exist in Hebrew: - * "ISO-8859-8" - Visual Hebrew - * "windows-1255" - Logical Hebrew - * "ISO-8859-8-I" - Logical Hebrew - * "x-mac-hebrew" - ?? Logical Hebrew ?? - * - * Both "ISO" charsets use a completely identical set of code points, whereas - * "windows-1255" and "x-mac-hebrew" are two different proper supersets of - * these code points. windows-1255 defines additional characters in the range - * 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific - * diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. - * x-mac-hebrew defines similar additional code points but with a different - * mapping. - * - * As far as an average Hebrew text with no diacritics is concerned, all four - * charsets are identical with respect to code points. Meaning that for the - * main Hebrew alphabet, all four map the same values to all 27 Hebrew letters - * (including final letters). - * - * The dominant difference between these charsets is their directionality. - * "Visual" directionality means that the text is ordered as if the renderer is - * not aware of a BIDI rendering algorithm. The renderer sees the text and - * draws it from left to right. The text itself when ordered naturally is read - * backwards. A buffer of Visual Hebrew generally looks like so: - * "[last word of first line spelled backwards] [whole line ordered backwards - * and spelled backwards] [first word of first line spelled backwards] - * [end of line] [last word of second line] ... etc' " - * adding punctuation marks, numbers and English text to visual text is - * naturally also "visual" and from left to right. - * - * "Logical" directionality means the text is ordered "naturally" according to - * the order it is read. It is the responsibility of the renderer to display - * the text from right to left. A BIDI algorithm is used to place general - * punctuation marks, numbers and English text in the text. - * - * Texts in x-mac-hebrew are almost impossible to find on the Internet. From - * what little evidence I could find, it seems that its general directionality - * is Logical. - * - * To sum up all of the above, the Hebrew probing mechanism knows about two - * charsets: - * Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are - * backwards while line order is natural. For charset recognition purposes - * the line order is unimportant (In fact, for this implementation, even - * word order is unimportant). - * Logical Hebrew - "windows-1255" - normal, naturally ordered text. - * - * "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be - * specifically identified. - * "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew - * that contain special punctuation marks or diacritics is displayed with - * some unconverted characters showing as question marks. This problem might - * be corrected using another model prober for x-mac-hebrew. Due to the fact - * that x-mac-hebrew texts are so rare, writing another model prober isn't - * worth the effort and performance hit. - * - * *** The Prober *** - * - * The prober is divided between two nsSBCharSetProbers and an nsHebrewProber, - * all of which are managed, created, fed data, inquired and deleted by the - * nsSBCSGroupProber. The two nsSBCharSetProbers identify that the text is in - * fact some kind of Hebrew, Logical or Visual. The final decision about which - * one is it is made by the nsHebrewProber by combining final-letter scores - * with the scores of the two nsSBCharSetProbers to produce a final answer. - * - * The nsSBCSGroupProber is responsible for stripping the original text of HTML - * tags, English characters, numbers, low-ASCII punctuation characters, spaces - * and new lines. It reduces any sequence of such characters to a single space. - * The buffer fed to each prober in the SBCS group prober is pure text in - * high-ASCII. - * The two nsSBCharSetProbers (model probers) share the same language model: - * Win1255Model. - * The first nsSBCharSetProber uses the model normally as any other - * nsSBCharSetProber does, to recognize windows-1255, upon which this model was - * built. The second nsSBCharSetProber is told to make the pair-of-letter - * lookup in the language model backwards. This in practice exactly simulates - * a visual Hebrew model using the windows-1255 logical Hebrew model. - * - * The nsHebrewProber is not using any language model. All it does is look for - * final-letter evidence suggesting the text is either logical Hebrew or visual - * Hebrew. Disjointed from the model probers, the results of the nsHebrewProber - * alone are meaningless. nsHebrewProber always returns 0.00 as confidence - * since it never identifies a charset by itself. Instead, the pointer to the - * nsHebrewProber is passed to the model probers as a helper "Name Prober". - * When the Group prober receives a positive identification from any prober, - * it asks for the name of the charset identified. If the prober queried is a - * Hebrew model prober, the model prober forwards the call to the - * nsHebrewProber to make the final decision. In the nsHebrewProber, the - * decision is made according to the final-letters scores maintained and Both - * model probers scores. The answer is returned in the form of the name of the - * charset identified, either "windows-1255" or "ISO-8859-8". - * - */ -#endif /* nsHebrewProber_h__ */ diff --git a/extensions/universalchardet/src/base/nsMBCSGroupProber.cpp b/extensions/universalchardet/src/base/nsMBCSGroupProber.cpp index efd208bed77f..b47691443f7d 100644 --- a/extensions/universalchardet/src/base/nsMBCSGroupProber.cpp +++ b/extensions/universalchardet/src/base/nsMBCSGroupProber.cpp @@ -13,34 +13,15 @@ const char *ProberName[] = "UTF8", "SJIS", "EUCJP", - "GB18030", - "EUCKR", - "Big5", - "EUCTW", }; #endif -nsMBCSGroupProber::nsMBCSGroupProber(uint32_t aLanguageFilter) +nsMBCSGroupProber::nsMBCSGroupProber() { - for (uint32_t i = 0; i < NUM_OF_PROBERS; i++) - mProbers[i] = nullptr; - mProbers[0] = new nsUTF8Prober(); - if (aLanguageFilter & NS_FILTER_JAPANESE) - { - mProbers[1] = new nsSJISProber(aLanguageFilter == NS_FILTER_JAPANESE); - mProbers[2] = new nsEUCJPProber(aLanguageFilter == NS_FILTER_JAPANESE); - } - if (aLanguageFilter & NS_FILTER_CHINESE_SIMPLIFIED) - mProbers[3] = new nsGB18030Prober(aLanguageFilter == NS_FILTER_CHINESE_SIMPLIFIED); - if (aLanguageFilter & NS_FILTER_KOREAN) - mProbers[4] = new nsEUCKRProber(aLanguageFilter == NS_FILTER_KOREAN); - if (aLanguageFilter & NS_FILTER_CHINESE_TRADITIONAL) - { - mProbers[5] = new nsBig5Prober(aLanguageFilter == NS_FILTER_CHINESE_TRADITIONAL); - mProbers[6] = new nsEUCTWProber(aLanguageFilter == NS_FILTER_CHINESE_TRADITIONAL); - } + mProbers[1] = new nsSJISProber(); + mProbers[2] = new nsEUCJPProber(); Reset(); } diff --git a/extensions/universalchardet/src/base/nsMBCSGroupProber.h b/extensions/universalchardet/src/base/nsMBCSGroupProber.h index f5ece26f9332..444b31d09d5a 100644 --- a/extensions/universalchardet/src/base/nsMBCSGroupProber.h +++ b/extensions/universalchardet/src/base/nsMBCSGroupProber.h @@ -9,16 +9,12 @@ #include "nsSJISProber.h" #include "nsUTF8Prober.h" #include "nsEUCJPProber.h" -#include "nsGB2312Prober.h" -#include "nsEUCKRProber.h" -#include "nsBig5Prober.h" -#include "nsEUCTWProber.h" -#define NUM_OF_PROBERS 7 +#define NUM_OF_PROBERS 3 class nsMBCSGroupProber: public nsCharSetProber { public: - explicit nsMBCSGroupProber(uint32_t aLanguageFilter); + nsMBCSGroupProber(); virtual ~nsMBCSGroupProber(); nsProbingState HandleData(const char* aBuf, uint32_t aLen); const char* GetCharSetName(); diff --git a/extensions/universalchardet/src/base/nsMBCSSM.cpp b/extensions/universalchardet/src/base/nsMBCSSM.cpp index e3c9e480e37a..6a1adbf86b52 100644 --- a/extensions/universalchardet/src/base/nsMBCSSM.cpp +++ b/extensions/universalchardet/src/base/nsMBCSSM.cpp @@ -10,61 +10,6 @@ Modification from frank tang's original work: text stream. */ -// BIG5 - -static const uint32_t BIG5_cls [ 256 / 8 ] = { -//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 //allow 0x00 as legal value -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 -PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 -PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f -PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 -PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f -PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 -PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f -PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 -PCK4BITS(2,2,2,2,2,2,2,1), // 78 - 7f -PCK4BITS(4,4,4,4,4,4,4,4), // 80 - 87 -PCK4BITS(4,4,4,4,4,4,4,4), // 88 - 8f -PCK4BITS(4,4,4,4,4,4,4,4), // 90 - 97 -PCK4BITS(4,4,4,4,4,4,4,4), // 98 - 9f -PCK4BITS(4,3,3,3,3,3,3,3), // a0 - a7 -PCK4BITS(3,3,3,3,3,3,3,3), // a8 - af -PCK4BITS(3,3,3,3,3,3,3,3), // b0 - b7 -PCK4BITS(3,3,3,3,3,3,3,3), // b8 - bf -PCK4BITS(3,3,3,3,3,3,3,3), // c0 - c7 -PCK4BITS(3,3,3,3,3,3,3,3), // c8 - cf -PCK4BITS(3,3,3,3,3,3,3,3), // d0 - d7 -PCK4BITS(3,3,3,3,3,3,3,3), // d8 - df -PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7 -PCK4BITS(3,3,3,3,3,3,3,3), // e8 - ef -PCK4BITS(3,3,3,3,3,3,3,3), // f0 - f7 -PCK4BITS(3,3,3,3,3,3,3,0) // f8 - ff -}; - - -static const uint32_t BIG5_st [ 3] = { -PCK4BITS(eError,eStart,eStart, 3,eError,eError,eError,eError),//00-07 -PCK4BITS(eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError),//08-0f -PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart) //10-17 -}; - -static const uint32_t Big5CharLenTable[] = {0, 1, 1, 2, 0}; - -SMModel const Big5SMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_cls }, - 5, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, BIG5_st }, - CHAR_LEN_TABLE(Big5CharLenTable), - "Big5", -}; - static const uint32_t EUCJP_cls [ 256 / 8 ] = { //PCK4BITS(5,4,4,4,4,4,4,4), // 00 - 07 PCK4BITS(4,4,4,4,4,4,4,4), // 00 - 07 @@ -120,230 +65,6 @@ const SMModel EUCJPSMModel = { "EUC-JP", }; -static const uint32_t EUCKR_cls [ 256 / 8 ] = { -//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 -PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47 -PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f -PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57 -PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f -PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67 -PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f -PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77 -PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f -PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87 -PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f -PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 -PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f -PCK4BITS(0,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,2,2,2,3,3,3), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,3,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,0) // f8 - ff -}; - - -static const uint32_t EUCKR_st [ 2] = { -PCK4BITS(eError,eStart, 3,eError,eError,eError,eError,eError),//00-07 -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f -}; - -static const uint32_t EUCKRCharLenTable[] = {0, 1, 2, 0}; - -const SMModel EUCKRSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_cls }, - 4, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCKR_st }, - CHAR_LEN_TABLE(EUCKRCharLenTable), - "EUC-KR", -}; - -static const uint32_t EUCTW_cls [ 256 / 8 ] = { -//PCK4BITS(0,2,2,2,2,2,2,2), // 00 - 07 -PCK4BITS(2,2,2,2,2,2,2,2), // 00 - 07 -PCK4BITS(2,2,2,2,2,2,0,0), // 08 - 0f -PCK4BITS(2,2,2,2,2,2,2,2), // 10 - 17 -PCK4BITS(2,2,2,0,2,2,2,2), // 18 - 1f -PCK4BITS(2,2,2,2,2,2,2,2), // 20 - 27 -PCK4BITS(2,2,2,2,2,2,2,2), // 28 - 2f -PCK4BITS(2,2,2,2,2,2,2,2), // 30 - 37 -PCK4BITS(2,2,2,2,2,2,2,2), // 38 - 3f -PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 -PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f -PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 -PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f -PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 -PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f -PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 -PCK4BITS(2,2,2,2,2,2,2,2), // 78 - 7f -PCK4BITS(0,0,0,0,0,0,0,0), // 80 - 87 -PCK4BITS(0,0,0,0,0,0,6,0), // 88 - 8f -PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 -PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f -PCK4BITS(0,3,4,4,4,4,4,4), // a0 - a7 -PCK4BITS(5,5,1,1,1,1,1,1), // a8 - af -PCK4BITS(1,1,1,1,1,1,1,1), // b0 - b7 -PCK4BITS(1,1,1,1,1,1,1,1), // b8 - bf -PCK4BITS(1,1,3,1,3,3,3,3), // c0 - c7 -PCK4BITS(3,3,3,3,3,3,3,3), // c8 - cf -PCK4BITS(3,3,3,3,3,3,3,3), // d0 - d7 -PCK4BITS(3,3,3,3,3,3,3,3), // d8 - df -PCK4BITS(3,3,3,3,3,3,3,3), // e0 - e7 -PCK4BITS(3,3,3,3,3,3,3,3), // e8 - ef -PCK4BITS(3,3,3,3,3,3,3,3), // f0 - f7 -PCK4BITS(3,3,3,3,3,3,3,0) // f8 - ff -}; - - -static const uint32_t EUCTW_st [ 6] = { -PCK4BITS(eError,eError,eStart, 3, 3, 3, 4,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError),//10-17 -PCK4BITS(eStart,eStart,eStart,eError,eError,eError,eError,eError),//18-1f -PCK4BITS( 5,eError,eError,eError,eStart,eError,eStart,eStart),//20-27 -PCK4BITS(eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f -}; - -static const uint32_t EUCTWCharLenTable[] = {0, 0, 1, 2, 2, 2, 3}; - -const SMModel EUCTWSMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_cls }, - 7, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, EUCTW_st }, - CHAR_LEN_TABLE(EUCTWCharLenTable), - "x-euc-tw", -}; - -/* obsolete GB2312 by gb18030 -static uint32_t GB2312_cls [ 256 / 8 ] = { -//PCK4BITS(0,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(1,1,1,1,1,1,1,1), // 30 - 37 -PCK4BITS(1,1,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(1,1,1,1,1,1,1,1), // 40 - 47 -PCK4BITS(1,1,1,1,1,1,1,1), // 48 - 4f -PCK4BITS(1,1,1,1,1,1,1,1), // 50 - 57 -PCK4BITS(1,1,1,1,1,1,1,1), // 58 - 5f -PCK4BITS(1,1,1,1,1,1,1,1), // 60 - 67 -PCK4BITS(1,1,1,1,1,1,1,1), // 68 - 6f -PCK4BITS(1,1,1,1,1,1,1,1), // 70 - 77 -PCK4BITS(1,1,1,1,1,1,1,1), // 78 - 7f -PCK4BITS(1,0,0,0,0,0,0,0), // 80 - 87 -PCK4BITS(0,0,0,0,0,0,0,0), // 88 - 8f -PCK4BITS(0,0,0,0,0,0,0,0), // 90 - 97 -PCK4BITS(0,0,0,0,0,0,0,0), // 98 - 9f -PCK4BITS(0,2,2,2,2,2,2,2), // a0 - a7 -PCK4BITS(2,2,3,3,3,3,3,3), // a8 - af -PCK4BITS(2,2,2,2,2,2,2,2), // b0 - b7 -PCK4BITS(2,2,2,2,2,2,2,2), // b8 - bf -PCK4BITS(2,2,2,2,2,2,2,2), // c0 - c7 -PCK4BITS(2,2,2,2,2,2,2,2), // c8 - cf -PCK4BITS(2,2,2,2,2,2,2,2), // d0 - d7 -PCK4BITS(2,2,2,2,2,2,2,2), // d8 - df -PCK4BITS(2,2,2,2,2,2,2,2), // e0 - e7 -PCK4BITS(2,2,2,2,2,2,2,2), // e8 - ef -PCK4BITS(2,2,2,2,2,2,2,2), // f0 - f7 -PCK4BITS(2,2,2,2,2,2,2,0) // f8 - ff -}; - - -static uint32_t GB2312_st [ 2] = { -PCK4BITS(eError,eStart, 3,eError,eError,eError,eError,eError),//00-07 -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart) //08-0f -}; - -static const uint32_t GB2312CharLenTable[] = {0, 1, 2, 0}; - -SMModel GB2312SMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_cls }, - 4, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB2312_st }, - CHAR_LEN_TABLE(GB2312CharLenTable), - "GB2312", -}; -*/ - -// the following state machine data was created by perl script in -// intl/chardet/tools. It should be the same as in PSM detector. -static const uint32_t GB18030_cls [ 256 / 8 ] = { -PCK4BITS(1,1,1,1,1,1,1,1), // 00 - 07 -PCK4BITS(1,1,1,1,1,1,0,0), // 08 - 0f -PCK4BITS(1,1,1,1,1,1,1,1), // 10 - 17 -PCK4BITS(1,1,1,0,1,1,1,1), // 18 - 1f -PCK4BITS(1,1,1,1,1,1,1,1), // 20 - 27 -PCK4BITS(1,1,1,1,1,1,1,1), // 28 - 2f -PCK4BITS(3,3,3,3,3,3,3,3), // 30 - 37 -PCK4BITS(3,3,1,1,1,1,1,1), // 38 - 3f -PCK4BITS(2,2,2,2,2,2,2,2), // 40 - 47 -PCK4BITS(2,2,2,2,2,2,2,2), // 48 - 4f -PCK4BITS(2,2,2,2,2,2,2,2), // 50 - 57 -PCK4BITS(2,2,2,2,2,2,2,2), // 58 - 5f -PCK4BITS(2,2,2,2,2,2,2,2), // 60 - 67 -PCK4BITS(2,2,2,2,2,2,2,2), // 68 - 6f -PCK4BITS(2,2,2,2,2,2,2,2), // 70 - 77 -PCK4BITS(2,2,2,2,2,2,2,4), // 78 - 7f -PCK4BITS(5,6,6,6,6,6,6,6), // 80 - 87 -PCK4BITS(6,6,6,6,6,6,6,6), // 88 - 8f -PCK4BITS(6,6,6,6,6,6,6,6), // 90 - 97 -PCK4BITS(6,6,6,6,6,6,6,6), // 98 - 9f -PCK4BITS(6,6,6,6,6,6,6,6), // a0 - a7 -PCK4BITS(6,6,6,6,6,6,6,6), // a8 - af -PCK4BITS(6,6,6,6,6,6,6,6), // b0 - b7 -PCK4BITS(6,6,6,6,6,6,6,6), // b8 - bf -PCK4BITS(6,6,6,6,6,6,6,6), // c0 - c7 -PCK4BITS(6,6,6,6,6,6,6,6), // c8 - cf -PCK4BITS(6,6,6,6,6,6,6,6), // d0 - d7 -PCK4BITS(6,6,6,6,6,6,6,6), // d8 - df -PCK4BITS(6,6,6,6,6,6,6,6), // e0 - e7 -PCK4BITS(6,6,6,6,6,6,6,6), // e8 - ef -PCK4BITS(6,6,6,6,6,6,6,6), // f0 - f7 -PCK4BITS(6,6,6,6,6,6,6,0) // f8 - ff -}; - - -static const uint32_t GB18030_st [ 6] = { -PCK4BITS(eError,eStart,eStart,eStart,eStart,eStart, 3,eError),//00-07 -PCK4BITS(eError,eError,eError,eError,eError,eError,eItsMe,eItsMe),//08-0f -PCK4BITS(eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart),//10-17 -PCK4BITS( 4,eError,eStart,eStart,eError,eError,eError,eError),//18-1f -PCK4BITS(eError,eError, 5,eError,eError,eError,eItsMe,eError),//20-27 -PCK4BITS(eError,eError,eStart,eStart,eStart,eStart,eStart,eStart) //28-2f -}; - -// To be accurate, the length of class 6 can be either 2 or 4. -// But it is not necessary to discriminate between the two since -// it is used for frequency analysis only, and we are validing -// each code range there as well. So it is safe to set it to be -// 2 here. -static const uint32_t GB18030CharLenTable[] = {0, 1, 1, 1, 1, 1, 2}; - -const SMModel GB18030SMModel = { - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_cls }, - 7, - {eIdxSft4bits, eSftMsk4bits, eBitSft4bits, eUnitMsk4bits, GB18030_st }, - CHAR_LEN_TABLE(GB18030CharLenTable), - "GB18030", -}; - // sjis static const uint32_t SJIS_cls [ 256 / 8 ] = { diff --git a/extensions/universalchardet/src/base/nsSBCSGroupProber.cpp b/extensions/universalchardet/src/base/nsSBCSGroupProber.cpp deleted file mode 100644 index c4a0560a43fe..000000000000 --- a/extensions/universalchardet/src/base/nsSBCSGroupProber.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include -#include "prmem.h" - -#include "nsSBCharSetProber.h" -#include "nsSBCSGroupProber.h" - -#include "nsHebrewProber.h" - -nsSBCSGroupProber::nsSBCSGroupProber() -{ - mProbers[0] = new nsSingleByteCharSetProber(&Win1251Model); - mProbers[1] = new nsSingleByteCharSetProber(&Koi8rModel); - mProbers[2] = new nsSingleByteCharSetProber(&Latin5Model); - mProbers[3] = new nsSingleByteCharSetProber(&MacCyrillicModel); - mProbers[4] = new nsSingleByteCharSetProber(&Ibm866Model); - mProbers[5] = new nsSingleByteCharSetProber(&Ibm855Model); - mProbers[6] = new nsSingleByteCharSetProber(&Latin7Model); - mProbers[7] = new nsSingleByteCharSetProber(&Win1253Model); - mProbers[8] = new nsSingleByteCharSetProber(&Latin5BulgarianModel); - mProbers[9] = new nsSingleByteCharSetProber(&Win1251BulgarianModel); - mProbers[10] = new nsSingleByteCharSetProber(&TIS620ThaiModel); - - nsHebrewProber *hebprober = new nsHebrewProber(); - // Notice: Any change in these indexes - 10,11,12 must be reflected - // in the code below as well. - mProbers[11] = hebprober; - mProbers[12] = new nsSingleByteCharSetProber(&Win1255Model, false, hebprober); // Logical Hebrew - mProbers[13] = new nsSingleByteCharSetProber(&Win1255Model, true, hebprober); // Visual Hebrew - // Tell the Hebrew prober about the logical and visual probers - if (mProbers[11] && mProbers[12] && mProbers[13]) // all are not null - { - hebprober->SetModelProbers(mProbers[12], mProbers[13]); - } - else // One or more is null. avoid any Hebrew probing, null them all - { - for (uint32_t i = 11; i <= 13; ++i) - { - delete mProbers[i]; - mProbers[i] = 0; - } - } - - // disable latin2 before latin1 is available, otherwise all latin1 - // will be detected as latin2 because of their similarity. - //mProbers[10] = new nsSingleByteCharSetProber(&Latin2HungarianModel); - //mProbers[11] = new nsSingleByteCharSetProber(&Win1250HungarianModel); - - Reset(); -} - -nsSBCSGroupProber::~nsSBCSGroupProber() -{ - for (uint32_t i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - delete mProbers[i]; - } -} - - -const char* nsSBCSGroupProber::GetCharSetName() -{ - //if we have no answer yet - if (mBestGuess == -1) - { - GetConfidence(); - //no charset seems positive - if (mBestGuess == -1) - //we will use default. - mBestGuess = 0; - } - return mProbers[mBestGuess]->GetCharSetName(); -} - -void nsSBCSGroupProber::Reset(void) -{ - mActiveNum = 0; - for (uint32_t i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - if (mProbers[i]) // not null - { - mProbers[i]->Reset(); - mIsActive[i] = true; - ++mActiveNum; - } - else - mIsActive[i] = false; - } - mBestGuess = -1; - mState = eDetecting; -} - - -nsProbingState nsSBCSGroupProber::HandleData(const char* aBuf, uint32_t aLen) -{ - nsProbingState st; - uint32_t i; - char *newBuf1 = 0; - uint32_t newLen1 = 0; - - //apply filter to original buffer, and we got new buffer back - //depend on what script it is, we will feed them the new buffer - //we got after applying proper filter - //this is done without any consideration to KeepEnglishLetters - //of each prober since as of now, there are no probers here which - //recognize languages with English characters. - if (!FilterWithoutEnglishLetters(aBuf, aLen, &newBuf1, newLen1)) - goto done; - - if (newLen1 == 0) - goto done; // Nothing to see here, move on. - - for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - if (!mIsActive[i]) - continue; - st = mProbers[i]->HandleData(newBuf1, newLen1); - if (st == eFoundIt) - { - mBestGuess = i; - mState = eFoundIt; - break; - } - else if (st == eNotMe) - { - mIsActive[i] = false; - mActiveNum--; - if (mActiveNum <= 0) - { - mState = eNotMe; - break; - } - } - } - -done: - PR_FREEIF(newBuf1); - - return mState; -} - -float nsSBCSGroupProber::GetConfidence(void) -{ - uint32_t i; - float bestConf = 0.0, cf; - - switch (mState) - { - case eFoundIt: - return (float)0.99; //sure yes - case eNotMe: - return (float)0.01; //sure no - default: - for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - if (!mIsActive[i]) - continue; - cf = mProbers[i]->GetConfidence(); - if (bestConf < cf) - { - bestConf = cf; - mBestGuess = i; - } - } - } - return bestConf; -} - -#ifdef DEBUG_chardet -void nsSBCSGroupProber::DumpStatus() -{ - uint32_t i; - float cf; - - cf = GetConfidence(); - printf(" SBCS Group Prober --------begin status \r\n"); - for (i = 0; i < NUM_OF_SBCS_PROBERS; i++) - { - if (!mIsActive[i]) - printf(" inactive: [%s] (i.e. confidence is too low).\r\n", mProbers[i]->GetCharSetName()); - else - mProbers[i]->DumpStatus(); - } - printf(" SBCS Group found best match [%s] confidence %f.\r\n", - mProbers[mBestGuess]->GetCharSetName(), cf); -} -#endif diff --git a/extensions/universalchardet/src/base/nsSBCSGroupProber.h b/extensions/universalchardet/src/base/nsSBCSGroupProber.h deleted file mode 100644 index 875abdf0e437..000000000000 --- a/extensions/universalchardet/src/base/nsSBCSGroupProber.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsSBCSGroupProber_h__ -#define nsSBCSGroupProber_h__ - - -#define NUM_OF_SBCS_PROBERS 14 - -class nsCharSetProber; -class nsSBCSGroupProber: public nsCharSetProber { -public: - nsSBCSGroupProber(); - virtual ~nsSBCSGroupProber(); - nsProbingState HandleData(const char* aBuf, uint32_t aLen); - const char* GetCharSetName(); - nsProbingState GetState(void) {return mState;} - void Reset(void); - float GetConfidence(void); - -#ifdef DEBUG_chardet - void DumpStatus(); -#endif - -protected: - nsProbingState mState; - nsCharSetProber* mProbers[NUM_OF_SBCS_PROBERS]; - bool mIsActive[NUM_OF_SBCS_PROBERS]; - int32_t mBestGuess; - uint32_t mActiveNum; -}; - -#endif /* nsSBCSGroupProber_h__ */ - diff --git a/extensions/universalchardet/src/base/nsSBCharSetProber.cpp b/extensions/universalchardet/src/base/nsSBCharSetProber.cpp deleted file mode 100644 index ac090ecdb546..000000000000 --- a/extensions/universalchardet/src/base/nsSBCharSetProber.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include -#include "nsSBCharSetProber.h" - -nsProbingState nsSingleByteCharSetProber::HandleData(const char* aBuf, uint32_t aLen) -{ - unsigned char order; - - for (uint32_t i = 0; i < aLen; i++) - { - order = mModel->charToOrderMap[(unsigned char)aBuf[i]]; - - if (order < SYMBOL_CAT_ORDER) - mTotalChar++; - if (order < SAMPLE_SIZE) - { - mFreqChar++; - - if (mLastOrder < SAMPLE_SIZE) - { - mTotalSeqs++; - if (!mReversed) - ++(mSeqCounters[mModel->precedenceMatrix[mLastOrder*SAMPLE_SIZE+order]]); - else // reverse the order of the letters in the lookup - ++(mSeqCounters[mModel->precedenceMatrix[order*SAMPLE_SIZE+mLastOrder]]); - } - } - mLastOrder = order; - } - - if (mState == eDetecting) - if (mTotalSeqs > SB_ENOUGH_REL_THRESHOLD) - { - float cf = GetConfidence(); - if (cf > POSITIVE_SHORTCUT_THRESHOLD) - mState = eFoundIt; - else if (cf < NEGATIVE_SHORTCUT_THRESHOLD) - mState = eNotMe; - } - - return mState; -} - -void nsSingleByteCharSetProber::Reset(void) -{ - mState = eDetecting; - mLastOrder = 255; - for (uint32_t i = 0; i < NUMBER_OF_SEQ_CAT; i++) - mSeqCounters[i] = 0; - mTotalSeqs = 0; - mTotalChar = 0; - mFreqChar = 0; -} - -//#define NEGATIVE_APPROACH 1 - -float nsSingleByteCharSetProber::GetConfidence(void) -{ -#ifdef NEGATIVE_APPROACH - if (mTotalSeqs > 0) - if (mTotalSeqs > mSeqCounters[NEGATIVE_CAT]*10 ) - return ((float)(mTotalSeqs - mSeqCounters[NEGATIVE_CAT]*10))/mTotalSeqs * mFreqChar / mTotalChar; - return (float)0.01; -#else //POSITIVE_APPROACH - float r; - - if (mTotalSeqs > 0) { - r = ((float)1.0) * mSeqCounters[POSITIVE_CAT] / mTotalSeqs / mModel->mTypicalPositiveRatio; - r = r*mFreqChar/mTotalChar; - if (r >= (float)1.00) - r = (float)0.99; - return r; - } - return (float)0.01; -#endif -} - -const char* nsSingleByteCharSetProber::GetCharSetName() -{ - if (!mNameProber) - return mModel->charsetName; - return mNameProber->GetCharSetName(); -} - -#ifdef DEBUG_chardet -void nsSingleByteCharSetProber::DumpStatus() -{ - printf(" SBCS: %1.3f [%s]\r\n", GetConfidence(), GetCharSetName()); -} -#endif diff --git a/extensions/universalchardet/src/base/nsSBCharSetProber.h b/extensions/universalchardet/src/base/nsSBCharSetProber.h deleted file mode 100644 index 8df3638f612e..000000000000 --- a/extensions/universalchardet/src/base/nsSBCharSetProber.h +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef nsSingleByteCharSetProber_h__ -#define nsSingleByteCharSetProber_h__ - -#include "nsCharSetProber.h" - -#define SAMPLE_SIZE 64 -#define SB_ENOUGH_REL_THRESHOLD 1024 -#define POSITIVE_SHORTCUT_THRESHOLD (float)0.95 -#define NEGATIVE_SHORTCUT_THRESHOLD (float)0.05 -#define SYMBOL_CAT_ORDER 250 -#define NUMBER_OF_SEQ_CAT 4 -#define POSITIVE_CAT (NUMBER_OF_SEQ_CAT-1) -#define NEGATIVE_CAT 0 - -typedef struct -{ - const unsigned char* const charToOrderMap; // [256] table use to find a char's order - const uint8_t* const precedenceMatrix; // [SAMPLE_SIZE][SAMPLE_SIZE]; table to find a 2-char sequence's frequency - float mTypicalPositiveRatio; // = freqSeqs / totalSeqs - bool keepEnglishLetter; // says if this script contains English characters (not implemented) - const char* const charsetName; -} SequenceModel; - - -class nsSingleByteCharSetProber : public nsCharSetProber{ -public: - explicit nsSingleByteCharSetProber(const SequenceModel *model) - :mModel(model), mReversed(false), mNameProber(0) { Reset(); } - nsSingleByteCharSetProber(const SequenceModel *model, bool reversed, nsCharSetProber* nameProber) - :mModel(model), mReversed(reversed), mNameProber(nameProber) { Reset(); } - - virtual const char* GetCharSetName(); - virtual nsProbingState HandleData(const char* aBuf, uint32_t aLen); - virtual nsProbingState GetState(void) {return mState;} - virtual void Reset(void); - virtual float GetConfidence(void); - - // This feature is not implemented yet. any current language model - // contain this parameter as false. No one is looking at this - // parameter or calling this method. - // Moreover, the nsSBCSGroupProber which calls the HandleData of this - // prober has a hard-coded call to FilterWithoutEnglishLetters which gets rid - // of the English letters. - bool KeepEnglishLetters() {return mModel->keepEnglishLetter;} // (not implemented) - -#ifdef DEBUG_chardet - virtual void DumpStatus(); -#endif - -protected: - nsProbingState mState; - const SequenceModel* const mModel; - const bool mReversed; // true if we need to reverse every pair in the model lookup - - //char order of last character - unsigned char mLastOrder; - - uint32_t mTotalSeqs; - uint32_t mSeqCounters[NUMBER_OF_SEQ_CAT]; - - uint32_t mTotalChar; - //characters that fall in our sampling range - uint32_t mFreqChar; - - // Optional auxiliary prober for name decision. created and destroyed by the GroupProber - nsCharSetProber* mNameProber; - -}; - - -extern const SequenceModel Koi8rModel; -extern const SequenceModel Win1251Model; -extern const SequenceModel Latin5Model; -extern const SequenceModel MacCyrillicModel; -extern const SequenceModel Ibm866Model; -extern const SequenceModel Ibm855Model; -extern const SequenceModel Latin7Model; -extern const SequenceModel Win1253Model; -extern const SequenceModel Latin5BulgarianModel; -extern const SequenceModel Win1251BulgarianModel; -extern const SequenceModel Latin2HungarianModel; -extern const SequenceModel Win1250HungarianModel; -extern const SequenceModel Win1255Model; -extern const SequenceModel TIS620ThaiModel; - -#endif /* nsSingleByteCharSetProber_h__ */ - diff --git a/extensions/universalchardet/src/base/nsSJISProber.cpp b/extensions/universalchardet/src/base/nsSJISProber.cpp index 82e704968386..73d615bd94fa 100644 --- a/extensions/universalchardet/src/base/nsSJISProber.cpp +++ b/extensions/universalchardet/src/base/nsSJISProber.cpp @@ -15,8 +15,8 @@ void nsSJISProber::Reset(void) { mCodingSM->Reset(); mState = eDetecting; - mContextAnalyser.Reset(mIsPreferredLanguage); - mDistributionAnalyser.Reset(mIsPreferredLanguage); + mContextAnalyser.Reset(); + mDistributionAnalyser.Reset(); } nsProbingState nsSJISProber::HandleData(const char* aBuf, uint32_t aLen) diff --git a/extensions/universalchardet/src/base/nsSJISProber.h b/extensions/universalchardet/src/base/nsSJISProber.h index 507d6c32c5f3..6044fae871e1 100644 --- a/extensions/universalchardet/src/base/nsSJISProber.h +++ b/extensions/universalchardet/src/base/nsSJISProber.h @@ -19,8 +19,7 @@ class nsSJISProber: public nsCharSetProber { public: - explicit nsSJISProber(bool aIsPreferredLanguage) - :mIsPreferredLanguage(aIsPreferredLanguage) + nsSJISProber() {mCodingSM = new nsCodingStateMachine(&SJISSMModel); Reset();} virtual ~nsSJISProber(void){delete mCodingSM;} @@ -38,8 +37,6 @@ protected: SJISDistributionAnalysis mDistributionAnalyser; char mLastChar[2]; - bool mIsPreferredLanguage; - }; diff --git a/extensions/universalchardet/src/base/nsUniversalDetector.cpp b/extensions/universalchardet/src/base/nsUniversalDetector.cpp index 20dd9d61b58f..d272827b815c 100644 --- a/extensions/universalchardet/src/base/nsUniversalDetector.cpp +++ b/extensions/universalchardet/src/base/nsUniversalDetector.cpp @@ -8,11 +8,10 @@ #include "nsUniversalDetector.h" #include "nsMBCSGroupProber.h" -#include "nsSBCSGroupProber.h" #include "nsEscCharsetProber.h" #include "nsLatin1Prober.h" -nsUniversalDetector::nsUniversalDetector(uint32_t aLanguageFilter) +nsUniversalDetector::nsUniversalDetector() { mDone = false; mBestGuess = -1; //illegal value as signal @@ -24,7 +23,6 @@ nsUniversalDetector::nsUniversalDetector(uint32_t aLanguageFilter) mGotData = false; mInputState = ePureAscii; mLastChar = '\0'; - mLanguageFilter = aLanguageFilter; uint32_t i; for (i = 0; i < NUM_OF_CHARSET_PROBERS; i++) @@ -128,17 +126,10 @@ nsresult nsUniversalDetector::HandleData(const char* aBuf, uint32_t aLen) //start multibyte and singlebyte charset prober if (nullptr == mCharSetProbers[0]) { - mCharSetProbers[0] = new nsMBCSGroupProber(mLanguageFilter); + mCharSetProbers[0] = new nsMBCSGroupProber(); if (nullptr == mCharSetProbers[0]) return NS_ERROR_OUT_OF_MEMORY; } - if (nullptr == mCharSetProbers[1] && - (mLanguageFilter & NS_FILTER_NON_CJK)) - { - mCharSetProbers[1] = new nsSBCSGroupProber; - if (nullptr == mCharSetProbers[1]) - return NS_ERROR_OUT_OF_MEMORY; - } if (nullptr == mCharSetProbers[2]) { mCharSetProbers[2] = new nsLatin1Prober; @@ -150,10 +141,9 @@ nsresult nsUniversalDetector::HandleData(const char* aBuf, uint32_t aLen) else { //ok, just pure ascii so far - if ( ePureAscii == mInputState && - (aBuf[i] == '\033' || (aBuf[i] == '{' && mLastChar == '~')) ) + if ((ePureAscii == mInputState) && (aBuf[i] == '\033')) { - //found escape character or HZ "~{" + //found escape character mInputState = eEscAscii; } mLastChar = aBuf[i]; @@ -165,7 +155,7 @@ nsresult nsUniversalDetector::HandleData(const char* aBuf, uint32_t aLen) { case eEscAscii: if (nullptr == mEscCharSetProber) { - mEscCharSetProber = new nsEscCharSetProber(mLanguageFilter); + mEscCharSetProber = new nsEscCharSetProber(); if (nullptr == mEscCharSetProber) return NS_ERROR_OUT_OF_MEMORY; } diff --git a/extensions/universalchardet/src/base/nsUniversalDetector.h b/extensions/universalchardet/src/base/nsUniversalDetector.h index b4fe587243c9..345e74f9f966 100644 --- a/extensions/universalchardet/src/base/nsUniversalDetector.h +++ b/extensions/universalchardet/src/base/nsUniversalDetector.h @@ -16,22 +16,9 @@ typedef enum { eHighbyte = 2 } nsInputState; -#define NS_FILTER_CHINESE_SIMPLIFIED 0x01 -#define NS_FILTER_CHINESE_TRADITIONAL 0x02 -#define NS_FILTER_JAPANESE 0x04 -#define NS_FILTER_KOREAN 0x08 -#define NS_FILTER_NON_CJK 0x10 -#define NS_FILTER_ALL 0x1F -#define NS_FILTER_CHINESE (NS_FILTER_CHINESE_SIMPLIFIED | \ - NS_FILTER_CHINESE_TRADITIONAL) -#define NS_FILTER_CJK (NS_FILTER_CHINESE_SIMPLIFIED | \ - NS_FILTER_CHINESE_TRADITIONAL | \ - NS_FILTER_JAPANESE | \ - NS_FILTER_KOREAN) - class nsUniversalDetector { public: - explicit nsUniversalDetector(uint32_t aLanguageFilter); + nsUniversalDetector(); virtual ~nsUniversalDetector(); virtual nsresult HandleData(const char* aBuf, uint32_t aLen); virtual void DataEnd(void); diff --git a/extensions/universalchardet/src/xpcom/nsUdetXPCOMWrapper.cpp b/extensions/universalchardet/src/xpcom/nsUdetXPCOMWrapper.cpp index adb7f4741bfc..750b1fd078b4 100644 --- a/extensions/universalchardet/src/xpcom/nsUdetXPCOMWrapper.cpp +++ b/extensions/universalchardet/src/xpcom/nsUdetXPCOMWrapper.cpp @@ -16,8 +16,8 @@ #include "nsCOMPtr.h" //--------------------------------------------------------------------- -nsXPCOMDetector:: nsXPCOMDetector(uint32_t aLanguageFilter) - : nsUniversalDetector(aLanguageFilter) +nsXPCOMDetector:: nsXPCOMDetector() + : nsUniversalDetector() { } //--------------------------------------------------------------------- @@ -92,8 +92,8 @@ void nsXPCOMDetector::Report(const char* aCharset) //--------------------------------------------------------------------- -nsXPCOMStringDetector:: nsXPCOMStringDetector(uint32_t aLanguageFilter) - : nsUniversalDetector(aLanguageFilter) +nsXPCOMStringDetector:: nsXPCOMStringDetector() + : nsUniversalDetector() { } //--------------------------------------------------------------------- diff --git a/extensions/universalchardet/src/xpcom/nsUdetXPCOMWrapper.h b/extensions/universalchardet/src/xpcom/nsUdetXPCOMWrapper.h index 240fca3d9375..cd1306f98d0e 100644 --- a/extensions/universalchardet/src/xpcom/nsUdetXPCOMWrapper.h +++ b/extensions/universalchardet/src/xpcom/nsUdetXPCOMWrapper.h @@ -13,14 +13,6 @@ #include "nsIFactory.h" -// {374E0CDE-F605-4259-8C92-E639C6C2EEEF} -#define NS_UNIVERSAL_DETECTOR_CID \ -{ 0x374e0cde, 0xf605, 0x4259, { 0x8c, 0x92, 0xe6, 0x39, 0xc6, 0xc2, 0xee, 0xef } } - -// {6EE5301A-3981-49bd-85F8-1A2CC228CF3E} -#define NS_UNIVERSAL_STRING_DETECTOR_CID \ -{ 0x6ee5301a, 0x3981, 0x49bd, { 0x85, 0xf8, 0x1a, 0x2c, 0xc2, 0x28, 0xcf, 0x3e } } - // {12BB8F1B-2389-11d3-B3BF-00805F8A6670} #define NS_JA_PSMDETECTOR_CID \ { 0x12bb8f1b, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } @@ -29,49 +21,6 @@ #define NS_JA_STRING_PSMDETECTOR_CID \ { 0x12bb8f1c, 0x2389, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } -// {EA06D4E1-2B3D-11d3-B3BF-00805F8A6670} -#define NS_KO_PSMDETECTOR_CID \ -{ 0xea06d4e1, 0x2b3d, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - -// {EA06D4E2-2B3D-11d3-B3BF-00805F8A6670} -#define NS_ZHCN_PSMDETECTOR_CID \ -{ 0xea06d4e2, 0x2b3d, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - -// {EA06D4E3-2B3D-11d3-B3BF-00805F8A6670} -#define NS_ZHTW_PSMDETECTOR_CID \ -{ 0xea06d4e3, 0x2b3d, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - - -// {EA06D4E4-2B3D-11d3-B3BF-00805F8A6670} -#define NS_KO_STRING_PSMDETECTOR_CID \ -{ 0xea06d4e4, 0x2b3d, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - -// {EA06D4E5-2B3D-11d3-B3BF-00805F8A6670} -#define NS_ZHCN_STRING_PSMDETECTOR_CID \ -{ 0xea06d4e5, 0x2b3d, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - -// {EA06D4E6-2B3D-11d3-B3BF-00805F8A6670} -#define NS_ZHTW_STRING_PSMDETECTOR_CID \ -{ 0xea06d4e6, 0x2b3d, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - - -// {FCACEF21-2B40-11d3-B3BF-00805F8A6670} -#define NS_ZH_STRING_PSMDETECTOR_CID \ -{ 0xfcacef21, 0x2b40, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - -// {FCACEF22-2B40-11d3-B3BF-00805F8A6670} -#define NS_CJK_STRING_PSMDETECTOR_CID \ -{ 0xfcacef22, 0x2b40, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - - -// {FCACEF23-2B40-11d3-B3BF-00805F8A6670} -#define NS_ZH_PSMDETECTOR_CID \ -{ 0xfcacef23, 0x2b40, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - -// {FCACEF24-2B40-11d3-B3BF-00805F8A6670} -#define NS_CJK_PSMDETECTOR_CID \ -{ 0xfcacef24, 0x2b40, 0x11d3, { 0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70 } } - //===================================================================== class nsXPCOMDetector : public nsUniversalDetector, @@ -79,7 +28,7 @@ class nsXPCOMDetector : { NS_DECL_ISUPPORTS public: - explicit nsXPCOMDetector(uint32_t aLanguageFilter); + nsXPCOMDetector(); NS_IMETHOD Init(nsICharsetDetectionObserver* aObserver); NS_IMETHOD DoIt(const char* aBuf, uint32_t aLen, bool *oDontFeedMe); NS_IMETHOD Done(); @@ -98,7 +47,7 @@ class nsXPCOMStringDetector : { NS_DECL_ISUPPORTS public: - explicit nsXPCOMStringDetector(uint32_t aLanguageFilter); + nsXPCOMStringDetector(); NS_IMETHOD DoIt(const char* aBuf, uint32_t aLen, const char** oCharset, nsDetectionConfident &oConf); protected: @@ -110,102 +59,19 @@ class nsXPCOMStringDetector : }; //===================================================================== -class nsUniversalXPCOMDetector : public nsXPCOMDetector -{ -public: - nsUniversalXPCOMDetector() - : nsXPCOMDetector(NS_FILTER_ALL) {} -}; - -class nsUniversalXPCOMStringDetector : public nsXPCOMStringDetector -{ -public: - nsUniversalXPCOMStringDetector() - : nsXPCOMStringDetector(NS_FILTER_ALL) {} -}; class nsJAPSMDetector : public nsXPCOMDetector { public: nsJAPSMDetector() - : nsXPCOMDetector(NS_FILTER_JAPANESE) {} + : nsXPCOMDetector() {} }; class nsJAStringPSMDetector : public nsXPCOMStringDetector { public: nsJAStringPSMDetector() - : nsXPCOMStringDetector(NS_FILTER_JAPANESE) {} -}; - -class nsKOPSMDetector : public nsXPCOMDetector -{ -public: - nsKOPSMDetector() - : nsXPCOMDetector(NS_FILTER_KOREAN) {} -}; - -class nsKOStringPSMDetector : public nsXPCOMStringDetector -{ -public: - nsKOStringPSMDetector() - : nsXPCOMStringDetector(NS_FILTER_KOREAN) {} -}; - -class nsZHTWPSMDetector : public nsXPCOMDetector -{ -public: - nsZHTWPSMDetector() - : nsXPCOMDetector(NS_FILTER_CHINESE_TRADITIONAL) {} -}; - -class nsZHTWStringPSMDetector : public nsXPCOMStringDetector -{ -public: - nsZHTWStringPSMDetector() - : nsXPCOMStringDetector(NS_FILTER_CHINESE_TRADITIONAL) {} -}; - -class nsZHCNPSMDetector : public nsXPCOMDetector -{ -public: - nsZHCNPSMDetector() - : nsXPCOMDetector(NS_FILTER_CHINESE_SIMPLIFIED) {} -}; - -class nsZHCNStringPSMDetector : public nsXPCOMStringDetector -{ -public: - nsZHCNStringPSMDetector() - : nsXPCOMStringDetector(NS_FILTER_CHINESE_SIMPLIFIED) {} -}; - -class nsZHPSMDetector : public nsXPCOMDetector -{ -public: - nsZHPSMDetector() - : nsXPCOMDetector(NS_FILTER_CHINESE) {} -}; - -class nsZHStringPSMDetector : public nsXPCOMStringDetector -{ -public: - nsZHStringPSMDetector() - : nsXPCOMStringDetector(NS_FILTER_CHINESE) {} -}; - -class nsCJKPSMDetector : public nsXPCOMDetector -{ -public: - nsCJKPSMDetector() - : nsXPCOMDetector(NS_FILTER_CJK) {} -}; - -class nsCJKStringPSMDetector : public nsXPCOMStringDetector -{ -public: - nsCJKStringPSMDetector() - : nsXPCOMStringDetector(NS_FILTER_CJK) {} + : nsXPCOMStringDetector() {} }; #endif //_nsUdetXPCOMWrapper_h__ diff --git a/extensions/universalchardet/src/xpcom/nsUniversalCharDetModule.cpp b/extensions/universalchardet/src/xpcom/nsUniversalCharDetModule.cpp index 3cfbd1290aa4..38e2e60bd1e4 100644 --- a/extensions/universalchardet/src/xpcom/nsUniversalCharDetModule.cpp +++ b/extensions/universalchardet/src/xpcom/nsUniversalCharDetModule.cpp @@ -20,80 +20,25 @@ #include "nsUniversalDetector.h" #include "nsUdetXPCOMWrapper.h" - -NS_GENERIC_FACTORY_CONSTRUCTOR(nsUniversalXPCOMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsUniversalXPCOMStringDetector) NS_GENERIC_FACTORY_CONSTRUCTOR(nsJAPSMDetector) NS_GENERIC_FACTORY_CONSTRUCTOR(nsJAStringPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsKOPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsKOStringPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsZHTWPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsZHTWStringPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsZHCNPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsZHCNStringPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsZHPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsZHStringPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsCJKPSMDetector) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsCJKStringPSMDetector) -NS_DEFINE_NAMED_CID(NS_UNIVERSAL_DETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_UNIVERSAL_STRING_DETECTOR_CID); NS_DEFINE_NAMED_CID(NS_JA_PSMDETECTOR_CID); NS_DEFINE_NAMED_CID(NS_JA_STRING_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_KO_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_KO_STRING_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_ZHTW_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_ZHTW_STRING_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_ZHCN_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_ZHCN_STRING_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_ZH_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_ZH_STRING_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_CJK_PSMDETECTOR_CID); -NS_DEFINE_NAMED_CID(NS_CJK_STRING_PSMDETECTOR_CID); static const mozilla::Module::CIDEntry kChardetCIDs[] = { - { &kNS_UNIVERSAL_DETECTOR_CID, false, nullptr, nsUniversalXPCOMDetectorConstructor }, - { &kNS_UNIVERSAL_STRING_DETECTOR_CID, false, nullptr, nsUniversalXPCOMStringDetectorConstructor }, { &kNS_JA_PSMDETECTOR_CID, false, nullptr, nsJAPSMDetectorConstructor }, { &kNS_JA_STRING_PSMDETECTOR_CID, false, nullptr, nsJAStringPSMDetectorConstructor }, - { &kNS_KO_PSMDETECTOR_CID, false, nullptr, nsKOPSMDetectorConstructor }, - { &kNS_KO_STRING_PSMDETECTOR_CID, false, nullptr, nsKOStringPSMDetectorConstructor }, - { &kNS_ZHTW_PSMDETECTOR_CID, false, nullptr, nsZHTWPSMDetectorConstructor }, - { &kNS_ZHTW_STRING_PSMDETECTOR_CID, false, nullptr, nsZHTWStringPSMDetectorConstructor }, - { &kNS_ZHCN_PSMDETECTOR_CID, false, nullptr, nsZHCNPSMDetectorConstructor }, - { &kNS_ZHCN_STRING_PSMDETECTOR_CID, false, nullptr, nsZHCNStringPSMDetectorConstructor }, - { &kNS_ZH_PSMDETECTOR_CID, false, nullptr, nsZHPSMDetectorConstructor }, - { &kNS_ZH_STRING_PSMDETECTOR_CID, false, nullptr, nsZHStringPSMDetectorConstructor }, - { &kNS_CJK_PSMDETECTOR_CID, false, nullptr, nsCJKPSMDetectorConstructor }, - { &kNS_CJK_STRING_PSMDETECTOR_CID, false, nullptr, nsCJKStringPSMDetectorConstructor }, { nullptr } }; static const mozilla::Module::ContractIDEntry kChardetContracts[] = { - { NS_CHARSET_DETECTOR_CONTRACTID_BASE "universal_charset_detector", &kNS_UNIVERSAL_DETECTOR_CID }, - { NS_STRCDETECTOR_CONTRACTID_BASE "universal_charset_detector", &kNS_UNIVERSAL_STRING_DETECTOR_CID }, { NS_CHARSET_DETECTOR_CONTRACTID_BASE "ja_parallel_state_machine", &kNS_JA_PSMDETECTOR_CID }, { NS_STRCDETECTOR_CONTRACTID_BASE "ja_parallel_state_machine", &kNS_JA_STRING_PSMDETECTOR_CID }, - { NS_CHARSET_DETECTOR_CONTRACTID_BASE "ko_parallel_state_machine", &kNS_KO_PSMDETECTOR_CID }, - { NS_STRCDETECTOR_CONTRACTID_BASE "ko_parallel_state_machine", &kNS_KO_STRING_PSMDETECTOR_CID }, - { NS_CHARSET_DETECTOR_CONTRACTID_BASE "zhtw_parallel_state_machine", &kNS_ZHTW_PSMDETECTOR_CID }, - { NS_STRCDETECTOR_CONTRACTID_BASE "zhtw_parallel_state_machine", &kNS_ZHTW_STRING_PSMDETECTOR_CID }, - { NS_CHARSET_DETECTOR_CONTRACTID_BASE "zhcn_parallel_state_machine", &kNS_ZHCN_PSMDETECTOR_CID }, - { NS_STRCDETECTOR_CONTRACTID_BASE "zhcn_parallel_state_machine", &kNS_ZHCN_STRING_PSMDETECTOR_CID }, - { NS_CHARSET_DETECTOR_CONTRACTID_BASE "zh_parallel_state_machine", &kNS_ZH_PSMDETECTOR_CID }, - { NS_STRCDETECTOR_CONTRACTID_BASE "zh_parallel_state_machine", &kNS_ZH_STRING_PSMDETECTOR_CID }, - { NS_CHARSET_DETECTOR_CONTRACTID_BASE "cjk_parallel_state_machine", &kNS_CJK_PSMDETECTOR_CID }, - { NS_STRCDETECTOR_CONTRACTID_BASE "cjk_parallel_state_machine", &kNS_CJK_STRING_PSMDETECTOR_CID }, { nullptr } }; static const mozilla::Module::CategoryEntry kChardetCategories[] = { - { NS_CHARSET_DETECTOR_CATEGORY, "universal_charset_detector", NS_CHARSET_DETECTOR_CONTRACTID_BASE "universal_charset_detector" }, { NS_CHARSET_DETECTOR_CATEGORY, "ja_parallel_state_machine", NS_CHARSET_DETECTOR_CONTRACTID_BASE "ja_parallel_state_machine" }, - { NS_CHARSET_DETECTOR_CATEGORY, "ko_parallel_state_machine", NS_CHARSET_DETECTOR_CONTRACTID_BASE "ko_parallel_state_machine" }, - { NS_CHARSET_DETECTOR_CATEGORY, "zhtw_parallel_state_machine", NS_CHARSET_DETECTOR_CONTRACTID_BASE "zhtw_parallel_state_machine" }, - { NS_CHARSET_DETECTOR_CATEGORY, "zhcn_parallel_state_machine", NS_CHARSET_DETECTOR_CONTRACTID_BASE "zhcn_parallel_state_machine" }, - { NS_CHARSET_DETECTOR_CATEGORY, "zh_parallel_state_machine", NS_CHARSET_DETECTOR_CONTRACTID_BASE "zh_parallel_state_machine" }, - { NS_CHARSET_DETECTOR_CATEGORY, "cjk_parallel_state_machine", NS_CHARSET_DETECTOR_CONTRACTID_BASE "cjk_parallel_state_machine" }, { nullptr } }; diff --git a/extensions/universalchardet/tests/bug171813_text.html b/extensions/universalchardet/tests/bug171813_text.html deleted file mode 100644 index cd44f8ebc81a..000000000000 --- a/extensions/universalchardet/tests/bug171813_text.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - -
- -
- - - - - - - - - - - - - - -
-
-
-
- -
-

²¦95933ÉÏÍøħÁ¦±¦±´Ãâ·ÑÍæ

-
- -
- diff --git a/extensions/universalchardet/tests/bug488426_text.html b/extensions/universalchardet/tests/bug488426_text.html deleted file mode 100644 index f4508db11b5d..000000000000 --- a/extensions/universalchardet/tests/bug488426_text.html +++ /dev/null @@ -1,5 +0,0 @@ - - -ÃËÑÊÊÓËÃѺÍÑ¡¢ÃÐä·Â·Õèãªé¡Ñº¤ÍÁ¾ÔÇàµÍÃì - - diff --git a/extensions/universalchardet/tests/bug9357_text.html b/extensions/universalchardet/tests/bug9357_text.html deleted file mode 100644 index ad8706faf225..000000000000 --- a/extensions/universalchardet/tests/bug9357_text.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - EUC-KR test - - -

¿äûÇϽŠÀ¥ ÆäÀÌÁö¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.
ãÀ¸½Ã´Â À¥ ÆäÀÌÁö°¡ ÇöÀç »ç¿ëÇÒ ¼ö ¾ø°Å³ª
À¥ ÆäÀÌÁöÀÇ À̸§ÀÌ º¯°æ ¶Ç´Â »èÁ¦ µÇ¾ú½À´Ï´Ù.
À̺¥Æ® °ü·Ã ¹®ÀÇ´Â °í°´¹®ÀǸ¦ ÀÌ¿ëÇϽñ⠹ٶø´Ï´Ù

- - - - - - - - diff --git a/extensions/universalchardet/tests/chrome.ini b/extensions/universalchardet/tests/chrome.ini index 3f2ab3341792..995ff043fb52 100644 --- a/extensions/universalchardet/tests/chrome.ini +++ b/extensions/universalchardet/tests/chrome.ini @@ -1,15 +1,12 @@ [DEFAULT] support-files = CharsetDetectionTests.js - bug171813_text.html bug306272_text.html bug421271_text.html bug426271_text-euc-jp.html bug426271_text-utf-8.html bug431054_text.html - bug488426_text.html bug547487_text.html - bug620106_text.html bug631751be_text.html bug631751le_text.html bug638318_text.html @@ -27,18 +24,14 @@ support-files = bug811363-invalid-3.text bug811363-invalid-4.text bug811363-invalid-5.text - bug9357_text.html -[test_bug171813.html] [test_bug306272.html] [test_bug421271.html] [test_bug426271-euc-jp.html] [test_bug426271-utf-8.html] [test_bug431054-japanese.html] [test_bug431054.html] -[test_bug488426.html] [test_bug547487.html] -[test_bug620106.html] [test_bug631751be.html] [test_bug631751le.html] [test_bug638318.html] @@ -56,4 +49,4 @@ support-files = [test_bug811363-2-7.html] [test_bug811363-2-8.html] [test_bug811363-2-9.html] -[test_bug9357.html] + diff --git a/extensions/universalchardet/tests/test_bug171813.html b/extensions/universalchardet/tests/test_bug171813.html deleted file mode 100644 index b2678fa69f08..000000000000 --- a/extensions/universalchardet/tests/test_bug171813.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - Test for Bug 171813 - - - - - -Mozilla Bug 171813 -

- - -
-
-
- - - diff --git a/extensions/universalchardet/tests/test_bug306272.html b/extensions/universalchardet/tests/test_bug306272.html index 9f22799e6342..d797b45af47b 100644 --- a/extensions/universalchardet/tests/test_bug306272.html +++ b/extensions/universalchardet/tests/test_bug306272.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=306272 /** Test for Bug 306272 **/ CharsetDetectionTests("bug306272_text.html", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug426271-euc-jp.html b/extensions/universalchardet/tests/test_bug426271-euc-jp.html index f2bb1b712b34..4eeca8282542 100644 --- a/extensions/universalchardet/tests/test_bug426271-euc-jp.html +++ b/extensions/universalchardet/tests/test_bug426271-euc-jp.html @@ -23,9 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=426271 /** Test for Bug 426271 **/ CharsetDetectionTests("bug426271_text-euc-jp.html", "EUC-JP", - new Array("ja_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug426271-utf-8.html b/extensions/universalchardet/tests/test_bug426271-utf-8.html index 59e471fb86ef..a393e624e51e 100644 --- a/extensions/universalchardet/tests/test_bug426271-utf-8.html +++ b/extensions/universalchardet/tests/test_bug426271-utf-8.html @@ -20,16 +20,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=426271
 
 
diff --git a/extensions/universalchardet/tests/test_bug488426.html b/extensions/universalchardet/tests/test_bug488426.html deleted file mode 100644 index 638ae104c536..000000000000 --- a/extensions/universalchardet/tests/test_bug488426.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Test for Bug 488426 - - - - - -Mozilla Bug 488426 -

- - -
-
-
- - diff --git a/extensions/universalchardet/tests/test_bug620106.html b/extensions/universalchardet/tests/test_bug620106.html deleted file mode 100644 index f97bb2f988ae..000000000000 --- a/extensions/universalchardet/tests/test_bug620106.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Test for Bug 620106 - - - - - -Mozilla Bug 620106 -

- - -
-
-
- - diff --git a/extensions/universalchardet/tests/test_bug811363-1-1.html b/extensions/universalchardet/tests/test_bug811363-1-1.html index f809bb1b9df3..6583d39b41d5 100644 --- a/extensions/universalchardet/tests/test_bug811363-1-1.html +++ b/extensions/universalchardet/tests/test_bug811363-1-1.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-invalid-1.text", "windows-1252", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-1-2.html b/extensions/universalchardet/tests/test_bug811363-1-2.html index 3bbf5e717d63..86d00828d432 100644 --- a/extensions/universalchardet/tests/test_bug811363-1-2.html +++ b/extensions/universalchardet/tests/test_bug811363-1-2.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-invalid-2.text", "windows-1252", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-1-3.html b/extensions/universalchardet/tests/test_bug811363-1-3.html index 6f5138c9c484..782fba27463e 100644 --- a/extensions/universalchardet/tests/test_bug811363-1-3.html +++ b/extensions/universalchardet/tests/test_bug811363-1-3.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-invalid-3.text", "windows-1252", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-1-4.html b/extensions/universalchardet/tests/test_bug811363-1-4.html index a55f29775147..590f221b147a 100644 --- a/extensions/universalchardet/tests/test_bug811363-1-4.html +++ b/extensions/universalchardet/tests/test_bug811363-1-4.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-invalid-4.text", "windows-1252", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-1-5.html b/extensions/universalchardet/tests/test_bug811363-1-5.html index ddf0bb37fc62..11233dc24c51 100644 --- a/extensions/universalchardet/tests/test_bug811363-1-5.html +++ b/extensions/universalchardet/tests/test_bug811363-1-5.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-invalid-5.text", "windows-1252", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-1.html b/extensions/universalchardet/tests/test_bug811363-2-1.html index 187c69fbd170..e380f7269009 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-1.html +++ b/extensions/universalchardet/tests/test_bug811363-2-1.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-1.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-2.html b/extensions/universalchardet/tests/test_bug811363-2-2.html index 673ad23a3121..0a4e41f3c40d 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-2.html +++ b/extensions/universalchardet/tests/test_bug811363-2-2.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-2.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-3.html b/extensions/universalchardet/tests/test_bug811363-2-3.html index 0fc5bb4a7872..713a191f1c94 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-3.html +++ b/extensions/universalchardet/tests/test_bug811363-2-3.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-3.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-4.html b/extensions/universalchardet/tests/test_bug811363-2-4.html index bee93fcbbab9..725e1b7f4db8 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-4.html +++ b/extensions/universalchardet/tests/test_bug811363-2-4.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-4.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-5.html b/extensions/universalchardet/tests/test_bug811363-2-5.html index 90ddb7ac7a95..8bdd8b8ce486 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-5.html +++ b/extensions/universalchardet/tests/test_bug811363-2-5.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-5.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-6.html b/extensions/universalchardet/tests/test_bug811363-2-6.html index 9a7b8cef7501..6208f73896eb 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-6.html +++ b/extensions/universalchardet/tests/test_bug811363-2-6.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-6.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-7.html b/extensions/universalchardet/tests/test_bug811363-2-7.html index 826d719dd2d8..694ff73b3594 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-7.html +++ b/extensions/universalchardet/tests/test_bug811363-2-7.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-7.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-8.html b/extensions/universalchardet/tests/test_bug811363-2-8.html index 704f72db0bee..49d094d7beec 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-8.html +++ b/extensions/universalchardet/tests/test_bug811363-2-8.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-8.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug811363-2-9.html b/extensions/universalchardet/tests/test_bug811363-2-9.html index 5235fac5ae8b..5f2312cdf141 100644 --- a/extensions/universalchardet/tests/test_bug811363-2-9.html +++ b/extensions/universalchardet/tests/test_bug811363-2-9.html @@ -23,12 +23,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=811363 /** Test for Bug 811363 **/ CharsetDetectionTests("bug811363-9.text", "UTF-8", - new Array("ja_parallel_state_machine", - "zh_parallel_state_machine", - "zhtw_parallel_state_machine", - "zhcn_parallel_state_machine", - "cjk_parallel_state_machine", - "universal_charset_detector")); + new Array("ja_parallel_state_machine")); diff --git a/extensions/universalchardet/tests/test_bug9357.html b/extensions/universalchardet/tests/test_bug9357.html deleted file mode 100644 index 1aced29ade33..000000000000 --- a/extensions/universalchardet/tests/test_bug9357.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Test for Bug 9357 - - - - - -Mozilla Bug 9357 -

- - -
-
-
- - - diff --git a/gfx/2d/2D.h b/gfx/2d/2D.h index 4f4da1517b3a..678fb05904bc 100644 --- a/gfx/2d/2D.h +++ b/gfx/2d/2D.h @@ -992,7 +992,7 @@ public: inline void ConcatTransform(const Matrix &aTransform) { SetTransform(aTransform * Matrix(GetTransform())); } - SurfaceFormat GetFormat() { return mFormat; } + SurfaceFormat GetFormat() const { return mFormat; } /** Tries to get a native surface for a DrawTarget, this may fail if the * draw target cannot convert to this surface type. diff --git a/gfx/2d/PatternHelpers.h b/gfx/2d/PatternHelpers.h new file mode 100644 index 000000000000..79c2502b985d --- /dev/null +++ b/gfx/2d/PatternHelpers.h @@ -0,0 +1,137 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef _MOZILLA_GFX_PATTERNHELPERS_H +#define _MOZILLA_GFX_PATTERNHELPERS_H + +#include "mozilla/Alignment.h" +#include "mozilla/gfx/2D.h" + +namespace mozilla { +namespace gfx { + +/** + * This class is used to allow general pattern creation functions to return + * any type of pattern via an out-paramater without allocating a pattern + * instance on the free-store (an instance of this class being created on the + * stack before passing it in to the creation function). Without this class + * writing pattern creation functions would be a pain since Pattern objects are + * not reference counted, making lifetime management of instances created on + * the free-store and returned from a creation function hazardous. Besides + * that, in the case that ColorPattern's are expected to be common, it is + * particularly desirable to avoid the overhead of allocating on the + * free-store. + */ +class GeneralPattern +{ +public: + explicit GeneralPattern() + : mPattern(nullptr) + {} + + GeneralPattern(const GeneralPattern& aOther) + : mPattern(nullptr) + {} + + ~GeneralPattern() { + if (mPattern) { + mPattern->~Pattern(); + } + } + + Pattern* Init(const Pattern& aPattern) { + MOZ_ASSERT(!mPattern); + switch (aPattern.GetType()) { + case PatternType::COLOR: + mPattern = new (mColorPattern.addr()) + ColorPattern(static_cast(aPattern)); + break; + case PatternType::LINEAR_GRADIENT: + mPattern = new (mLinearGradientPattern.addr()) + LinearGradientPattern(static_cast(aPattern)); + break; + case PatternType::RADIAL_GRADIENT: + mPattern = new (mRadialGradientPattern.addr()) + RadialGradientPattern(static_cast(aPattern)); + break; + case PatternType::SURFACE: + mPattern = new (mSurfacePattern.addr()) + SurfacePattern(static_cast(aPattern)); + break; + default: + MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("Unknown pattern type"); + } + return mPattern; + } + + ColorPattern* InitColorPattern(const Color &aColor) { + MOZ_ASSERT(!mPattern); + mPattern = new (mColorPattern.addr()) ColorPattern(aColor); + return mColorPattern.addr(); + } + + LinearGradientPattern* InitLinearGradientPattern(const Point &aBegin, + const Point &aEnd, + GradientStops *aStops, + const Matrix &aMatrix = Matrix()) { + MOZ_ASSERT(!mPattern); + mPattern = new (mLinearGradientPattern.addr()) + LinearGradientPattern(aBegin, aEnd, aStops, aMatrix); + return mLinearGradientPattern.addr(); + } + + RadialGradientPattern* InitRadialGradientPattern(const Point &aCenter1, + const Point &aCenter2, + Float aRadius1, + Float aRadius2, + GradientStops *aStops, + const Matrix &aMatrix = Matrix()) { + MOZ_ASSERT(!mPattern); + mPattern = new (mRadialGradientPattern.addr()) + RadialGradientPattern(aCenter1, aCenter2, aRadius1, aRadius2, aStops, aMatrix); + return mRadialGradientPattern.addr(); + } + + SurfacePattern* InitSurfacePattern(SourceSurface *aSourceSurface, + ExtendMode aExtendMode, + const Matrix &aMatrix = Matrix(), + Filter aFilter = Filter::GOOD, + const IntRect &aSamplingRect = IntRect()) { + MOZ_ASSERT(!mPattern); + mPattern = new (mSurfacePattern.addr()) + SurfacePattern(aSourceSurface, aExtendMode, aMatrix, aFilter, aSamplingRect); + return mSurfacePattern.addr(); + } + + Pattern* GetPattern() { + return mPattern; + } + + const Pattern* GetPattern() const { + return mPattern; + } + + operator Pattern&() { + if (!mPattern) { + MOZ_CRASH("GeneralPattern not initialized"); + } + return *mPattern; + } + +private: + union { + AlignedStorage2 mColorPattern; + AlignedStorage2 mLinearGradientPattern; + AlignedStorage2 mRadialGradientPattern; + AlignedStorage2 mSurfacePattern; + }; + Pattern *mPattern; +}; + +} // namespace gfx +} // namespace mozilla + +#endif // _MOZILLA_GFX_PATTERNHELPERS_H + diff --git a/gfx/2d/moz.build b/gfx/2d/moz.build index dfbe2528d26c..162a31e3f01c 100644 --- a/gfx/2d/moz.build +++ b/gfx/2d/moz.build @@ -27,6 +27,7 @@ EXPORTS.mozilla.gfx += [ 'Logging.h', 'Matrix.h', 'PathHelpers.h', + 'PatternHelpers.h', 'Point.h', 'Rect.h', 'Scale.h', diff --git a/gfx/layers/client/TiledContentClient.cpp b/gfx/layers/client/TiledContentClient.cpp index 329551ea3629..90f6884c3d14 100644 --- a/gfx/layers/client/TiledContentClient.cpp +++ b/gfx/layers/client/TiledContentClient.cpp @@ -689,31 +689,10 @@ TileClient::DiscardBackBuffer() mManager->ReportClientLost(*mBackBufferOnWhite); } } else { -#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 17 - // If this assertions stops being true, we need to add - // ReturnTextureClientDeferred(*mBackBufferOnWhite) below. - MOZ_ASSERT(!mBackBufferOnWhite); - if (mBackBuffer->GetIPDLActor() && - mCompositableClient && mCompositableClient->GetIPDLActor()) { - // remove old buffer from CompositableHost - RefPtr tracker = new RemoveTextureFromCompositableTracker(); - // Hold TextureClient until transaction complete. - tracker->SetTextureClient(mBackBuffer); - mBackBuffer->SetRemoveFromCompositableTracker(tracker); - // RemoveTextureFromCompositableAsync() expects CompositorChild's presence. - mManager->AsShadowForwarder()->RemoveTextureFromCompositableAsync(tracker, - mCompositableClient, - mBackBuffer); - } - // TextureClient can be reused after transaction complete, - // when RemoveTextureFromCompositableTracker is used. - mManager->ReturnTextureClientDeferred(*mBackBuffer); -#else mManager->ReturnTextureClient(*mBackBuffer); if (mBackBufferOnWhite) { mManager->ReturnTextureClient(*mBackBufferOnWhite); } -#endif } mBackLock->ReadUnlock(); if (mBackBuffer->IsLocked()) { diff --git a/gfx/layers/d3d11/TextureD3D11.cpp b/gfx/layers/d3d11/TextureD3D11.cpp index 28f5d3d1c0b4..6e1242023568 100644 --- a/gfx/layers/d3d11/TextureD3D11.cpp +++ b/gfx/layers/d3d11/TextureD3D11.cpp @@ -264,6 +264,9 @@ void TextureClientD3D11::Unlock() { MOZ_ASSERT(mIsLocked, "Unlocked called while the texture is not locked!"); + if (!mIsLocked) { + return; + } if (mDrawTarget) { // see the comment on TextureClient::BorrowDrawTarget. diff --git a/gfx/layers/d3d9/TextureD3D9.cpp b/gfx/layers/d3d9/TextureD3D9.cpp index 4db3f374f23e..8d1045651db6 100644 --- a/gfx/layers/d3d9/TextureD3D9.cpp +++ b/gfx/layers/d3d9/TextureD3D9.cpp @@ -631,6 +631,10 @@ void CairoTextureClientD3D9::Unlock() { MOZ_ASSERT(mIsLocked, "Unlocked called while the texture is not locked!"); + if (!mIsLocked) { + return; + } + if (mDrawTarget) { mDrawTarget->Flush(); mDrawTarget = nullptr; diff --git a/gfx/thebes/gfxContext.cpp b/gfx/thebes/gfxContext.cpp index ba704ca2032e..acc580f93b99 100644 --- a/gfx/thebes/gfxContext.cpp +++ b/gfx/thebes/gfxContext.cpp @@ -39,11 +39,11 @@ UserDataKey gfxContext::sDontUseAsSourceKey; /* This class lives on the stack and allows gfxContext users to easily, and * performantly get a gfx::Pattern to use for drawing in their current context. */ -class GeneralPattern +class PatternFromState { public: - explicit GeneralPattern(gfxContext *aContext) : mContext(aContext), mPattern(nullptr) {} - ~GeneralPattern() { if (mPattern) { mPattern->~Pattern(); } } + explicit PatternFromState(gfxContext *aContext) : mContext(aContext), mPattern(nullptr) {} + ~PatternFromState() { if (mPattern) { mPattern->~Pattern(); } } operator mozilla::gfx::Pattern&() { @@ -261,34 +261,52 @@ gfxContext::CurrentPoint() void gfxContext::Stroke() +{ + Stroke(PatternFromState(this)); +} + +void +gfxContext::Stroke(const Pattern& aPattern) { AzureState &state = CurrentState(); if (mPathIsRect) { MOZ_ASSERT(!mTransformChanged); - mDT->StrokeRect(mRect, GeneralPattern(this), + mDT->StrokeRect(mRect, aPattern, state.strokeOptions, DrawOptions(1.0f, GetOp(), state.aaMode)); } else { EnsurePath(); - mDT->Stroke(mPath, GeneralPattern(this), state.strokeOptions, + mDT->Stroke(mPath, aPattern, state.strokeOptions, DrawOptions(1.0f, GetOp(), state.aaMode)); } } void gfxContext::Fill() +{ + Fill(PatternFromState(this)); +} + +void +gfxContext::Fill(const Pattern& aPattern) { PROFILER_LABEL("gfxContext", "Fill", js::ProfileEntry::Category::GRAPHICS); - FillAzure(1.0f); + FillAzure(aPattern, 1.0f); } void gfxContext::FillWithOpacity(gfxFloat aOpacity) { - FillAzure(Float(aOpacity)); + FillWithOpacity(PatternFromState(this), aOpacity); +} + +void +gfxContext::FillWithOpacity(const Pattern& aPattern, gfxFloat aOpacity) +{ + FillAzure(aPattern, Float(aOpacity)); } void @@ -723,13 +741,13 @@ gfxContext::CurrentMiterLimit() const void gfxContext::SetFillRule(FillRule rule) { - CurrentState().fillRule = rule == FILL_RULE_WINDING ? gfx::FillRule::FILL_WINDING : gfx::FillRule::FILL_EVEN_ODD; + CurrentState().fillRule = rule; } -gfxContext::FillRule +FillRule gfxContext::CurrentFillRule() const { - return FILL_RULE_WINDING; + return CurrentState().fillRule; } // clipping @@ -926,7 +944,7 @@ gfxContext::Mask(SourceSurface* aSurface, const Matrix& aTransform) Matrix mat = aTransform * mTransform; ChangeTransform(mat); - mDT->MaskSurface(GeneralPattern(this), aSurface, Point(), + mDT->MaskSurface(PatternFromState(this), aSurface, Point(), DrawOptions(1.0f, CurrentState().op, CurrentState().aaMode)); ChangeTransform(old); } @@ -954,7 +972,7 @@ void gfxContext::Mask(SourceSurface *surface, const Point& offset) { // We clip here to bind to the mask surface bounds, see above. - mDT->MaskSurface(GeneralPattern(this), + mDT->MaskSurface(PatternFromState(this), surface, offset, DrawOptions(1.0f, CurrentState().op, CurrentState().aaMode)); @@ -995,7 +1013,7 @@ gfxContext::Paint(gfxFloat alpha) if (state.opIsClear) { mDT->ClearRect(paintRect); } else { - mDT->FillRect(paintRect, GeneralPattern(this), + mDT->FillRect(paintRect, PatternFromState(this), DrawOptions(Float(alpha), GetOp())); } } @@ -1385,7 +1403,7 @@ gfxContext::EnsurePathBuilder() } void -gfxContext::FillAzure(Float aOpacity) +gfxContext::FillAzure(const Pattern& aPattern, Float aOpacity) { AzureState &state = CurrentState(); @@ -1399,16 +1417,16 @@ gfxContext::FillAzure(Float aOpacity) } else if (op == CompositionOp::OP_SOURCE) { // Emulate cairo operator source which is bound by mask! mDT->ClearRect(mRect); - mDT->FillRect(mRect, GeneralPattern(this), DrawOptions(aOpacity)); + mDT->FillRect(mRect, aPattern, DrawOptions(aOpacity)); } else { - mDT->FillRect(mRect, GeneralPattern(this), DrawOptions(aOpacity, op, state.aaMode)); + mDT->FillRect(mRect, aPattern, DrawOptions(aOpacity, op, state.aaMode)); } } else { EnsurePath(); NS_ASSERTION(!state.opIsClear, "We shouldn't be clearing complex paths!"); - mDT->Fill(mPath, GeneralPattern(this), DrawOptions(aOpacity, op, state.aaMode)); + mDT->Fill(mPath, aPattern, DrawOptions(aOpacity, op, state.aaMode)); } } diff --git a/gfx/thebes/gfxContext.h b/gfx/thebes/gfxContext.h index 1695e30e454b..99d0ba252f2f 100644 --- a/gfx/thebes/gfxContext.h +++ b/gfx/thebes/gfxContext.h @@ -37,7 +37,9 @@ template class FallibleTArray; * as opposed to app units. */ class gfxContext MOZ_FINAL { + typedef mozilla::gfx::FillRule FillRule; typedef mozilla::gfx::Path Path; + typedef mozilla::gfx::Pattern Pattern; NS_INLINE_DECL_REFCOUNTING(gfxContext) @@ -106,12 +108,14 @@ public: * Does not consume the current path. */ void Stroke(); + void Stroke(const Pattern& aPattern); /** * Fill the current path according to the current settings. * * Does not consume the current path. */ void Fill(); + void Fill(const Pattern& aPattern); /** * Fill the current path according to the current settings and @@ -120,6 +124,7 @@ public: * Does not consume the current path. */ void FillWithOpacity(gfxFloat aOpacity); + void FillWithOpacity(const Pattern& aPattern, gfxFloat aOpacity); /** * Forgets the current path. @@ -469,10 +474,6 @@ public: ** Fill Properties **/ - enum FillRule { - FILL_RULE_WINDING, - FILL_RULE_EVEN_ODD - }; void SetFillRule(FillRule rule); FillRule CurrentFillRule() const; @@ -671,7 +672,7 @@ public: private: ~gfxContext(); - friend class GeneralPattern; + friend class PatternFromState; friend class GlyphBufferAzure; typedef mozilla::gfx::Matrix Matrix; @@ -727,7 +728,7 @@ private: void EnsurePath(); // This ensures mPathBuilder contains a valid PathBuilder (in user space!) void EnsurePathBuilder(); - void FillAzure(mozilla::gfx::Float aOpacity); + void FillAzure(const Pattern& aPattern, mozilla::gfx::Float aOpacity); void PushClipsToDT(mozilla::gfx::DrawTarget *aDT); CompositionOp GetOp(); void ChangeTransform(const mozilla::gfx::Matrix &aNewMatrix, bool aUpdatePatternTransform = true); diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp index f502e8f74d8b..b83be18fc6b1 100644 --- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -1548,6 +1548,7 @@ private: nsRefPtr fillPattern; if (!mFontParams.contextPaint || !(fillPattern = mFontParams.contextPaint->GetFillPattern( + mRunParams.context->GetDrawTarget(), mRunParams.context->CurrentMatrix()))) { if (state.pattern) { pat = state.pattern->GetPattern(mRunParams.dt, @@ -1630,6 +1631,7 @@ private: if (mFontParams.contextPaint) { nsRefPtr strokePattern = mFontParams.contextPaint->GetStrokePattern( + mRunParams.context->GetDrawTarget(), mRunParams.context->CurrentMatrix()); if (strokePattern) { mRunParams.dt->Stroke(path, diff --git a/gfx/thebes/gfxFontUtils.cpp b/gfx/thebes/gfxFontUtils.cpp index 13e39014d8b5..adcf1335c14b 100644 --- a/gfx/thebes/gfxFontUtils.cpp +++ b/gfx/thebes/gfxFontUtils.cpp @@ -1308,8 +1308,8 @@ const gfxFontUtils::MacFontNameCharsetMapping gfxFontUtils::gMacFontNameCharsets { ENCODING_ID_MAC_DEVANAGARI, ANY, "x-mac-devanagari"}, { ENCODING_ID_MAC_GURMUKHI, ANY, "x-mac-gurmukhi" }, { ENCODING_ID_MAC_GUJARATI, ANY, "x-mac-gujarati" }, - { ENCODING_ID_MAC_SIMP_CHINESE, LANG_ID_MAC_SIMP_CHINESE, "GB2312" }, - { ENCODING_ID_MAC_SIMP_CHINESE, ANY, "GB2312" } + { ENCODING_ID_MAC_SIMP_CHINESE, LANG_ID_MAC_SIMP_CHINESE, "gb18030" }, + { ENCODING_ID_MAC_SIMP_CHINESE, ANY, "gb18030" } }; const char* gfxFontUtils::gISOFontNameCharsets[] = diff --git a/gfx/thebes/gfxGradientCache.cpp b/gfx/thebes/gfxGradientCache.cpp index 5bfbb71c2c9e..bb15913d696e 100644 --- a/gfx/thebes/gfxGradientCache.cpp +++ b/gfx/thebes/gfxGradientCache.cpp @@ -178,7 +178,7 @@ class GradientCache MOZ_FINAL : public nsExpirationTracker static GradientCache* gGradientCache = nullptr; GradientStops * -gfxGradientCache::GetGradientStops(DrawTarget *aDT, nsTArray& aStops, ExtendMode aExtend) +gfxGradientCache::GetGradientStops(const DrawTarget *aDT, nsTArray& aStops, ExtendMode aExtend) { if (!gGradientCache) { gGradientCache = new GradientCache(); @@ -189,7 +189,7 @@ gfxGradientCache::GetGradientStops(DrawTarget *aDT, nsTArray& aSto } GradientStops * -gfxGradientCache::GetOrCreateGradientStops(DrawTarget *aDT, nsTArray& aStops, ExtendMode aExtend) +gfxGradientCache::GetOrCreateGradientStops(const DrawTarget *aDT, nsTArray& aStops, ExtendMode aExtend) { RefPtr gs = GetGradientStops(aDT, aStops, aExtend); if (!gs) { diff --git a/gfx/thebes/gfxGradientCache.h b/gfx/thebes/gfxGradientCache.h index b783d15ff83d..b4c3478ac7e3 100644 --- a/gfx/thebes/gfxGradientCache.h +++ b/gfx/thebes/gfxGradientCache.h @@ -17,12 +17,12 @@ namespace gfx { class gfxGradientCache { public: static gfx::GradientStops* - GetGradientStops(gfx::DrawTarget *aDT, + GetGradientStops(const gfx::DrawTarget *aDT, nsTArray& aStops, gfx::ExtendMode aExtend); static gfx::GradientStops* - GetOrCreateGradientStops(gfx::DrawTarget *aDT, + GetOrCreateGradientStops(const gfx::DrawTarget *aDT, nsTArray& aStops, gfx::ExtendMode aExtend); diff --git a/gfx/thebes/gfxPattern.cpp b/gfx/thebes/gfxPattern.cpp index 774d14e4fde0..9aaa6d880a58 100644 --- a/gfx/thebes/gfxPattern.cpp +++ b/gfx/thebes/gfxPattern.cpp @@ -20,18 +20,14 @@ using namespace mozilla::gfx; gfxPattern::gfxPattern(const gfxRGBA& aColor) : mExtend(EXTEND_NONE) { - mGfxPattern = - new (mColorPattern.addr()) ColorPattern(Color(aColor.r, aColor.g, aColor.b, aColor.a)); + mGfxPattern.InitColorPattern(Color(aColor.r, aColor.g, aColor.b, aColor.a)); } // linear gfxPattern::gfxPattern(gfxFloat x0, gfxFloat y0, gfxFloat x1, gfxFloat y1) : mExtend(EXTEND_NONE) { - mGfxPattern = - new (mLinearGradientPattern.addr()) LinearGradientPattern(Point(x0, y0), - Point(x1, y1), - nullptr); + mGfxPattern.InitLinearGradientPattern(Point(x0, y0), Point(x1, y1), nullptr); } // radial @@ -39,11 +35,8 @@ gfxPattern::gfxPattern(gfxFloat cx0, gfxFloat cy0, gfxFloat radius0, gfxFloat cx1, gfxFloat cy1, gfxFloat radius1) : mExtend(EXTEND_NONE) { - mGfxPattern = - new (mRadialGradientPattern.addr()) RadialGradientPattern(Point(cx0, cy0), - Point(cx1, cy1), - radius0, radius1, - nullptr); + mGfxPattern.InitRadialGradientPattern(Point(cx0, cy0), Point(cx1, cy1), + radius0, radius1, nullptr); } // Azure @@ -51,23 +44,15 @@ gfxPattern::gfxPattern(SourceSurface *aSurface, const Matrix &aPatternToUserSpac : mPatternToUserSpace(aPatternToUserSpace) , mExtend(EXTEND_NONE) { - mGfxPattern = new (mSurfacePattern.addr()) - SurfacePattern(aSurface, ToExtendMode(mExtend), Matrix(), // matrix is overridden in GetPattern() - mozilla::gfx::Filter::GOOD); -} - -gfxPattern::~gfxPattern() -{ - if (mGfxPattern) { - mGfxPattern->~Pattern(); - } + mGfxPattern.InitSurfacePattern(aSurface, ToExtendMode(mExtend), Matrix(), // matrix is overridden in GetPattern() + mozilla::gfx::Filter::GOOD); } void gfxPattern::AddColorStop(gfxFloat offset, const gfxRGBA& c) { - if (mGfxPattern->GetType() != PatternType::LINEAR_GRADIENT && - mGfxPattern->GetType() != PatternType::RADIAL_GRADIENT) { + if (mGfxPattern.GetPattern()->GetType() != PatternType::LINEAR_GRADIENT && + mGfxPattern.GetPattern()->GetType() != PatternType::RADIAL_GRADIENT) { return; } @@ -93,7 +78,7 @@ gfxPattern::SetColorStops(GradientStops* aStops) } void -gfxPattern::CacheColorStops(DrawTarget *aDT) +gfxPattern::CacheColorStops(const DrawTarget *aDT) { mStops = gfxGradientCache::GetOrCreateGradientStops(aDT, mStopsList, ToExtendMode(mExtend)); @@ -126,7 +111,7 @@ gfxPattern::GetInverseMatrix() const } Pattern* -gfxPattern::GetPattern(DrawTarget *aTarget, +gfxPattern::GetPattern(const DrawTarget *aTarget, Matrix *aOriginalUserToDevice) { Matrix patternToUser = mPatternToUserSpace; @@ -156,25 +141,31 @@ gfxPattern::GetPattern(DrawTarget *aTarget, ToExtendMode(mExtend)); } - switch (mGfxPattern->GetType()) { - case PatternType::SURFACE: - mSurfacePattern.addr()->mMatrix = patternToUser; - mSurfacePattern.addr()->mExtendMode = ToExtendMode(mExtend); + switch (mGfxPattern.GetPattern()->GetType()) { + case PatternType::SURFACE: { + SurfacePattern* surfacePattern = static_cast(mGfxPattern.GetPattern()); + surfacePattern->mMatrix = patternToUser; + surfacePattern->mExtendMode = ToExtendMode(mExtend); break; - case PatternType::LINEAR_GRADIENT: - mLinearGradientPattern.addr()->mMatrix = patternToUser; - mLinearGradientPattern.addr()->mStops = mStops; + } + case PatternType::LINEAR_GRADIENT: { + LinearGradientPattern* linearGradientPattern = static_cast(mGfxPattern.GetPattern()); + linearGradientPattern->mMatrix = patternToUser; + linearGradientPattern->mStops = mStops; break; - case PatternType::RADIAL_GRADIENT: - mRadialGradientPattern.addr()->mMatrix = patternToUser; - mRadialGradientPattern.addr()->mStops = mStops; + } + case PatternType::RADIAL_GRADIENT: { + RadialGradientPattern* radialGradientPattern = static_cast(mGfxPattern.GetPattern()); + radialGradientPattern->mMatrix = patternToUser; + radialGradientPattern->mStops = mStops; break; + } default: /* Reassure the compiler we are handling all the enum values. */ break; } - return mGfxPattern; + return mGfxPattern.GetPattern(); } void @@ -187,11 +178,11 @@ gfxPattern::SetExtend(GraphicsExtend extend) bool gfxPattern::IsOpaque() { - if (mGfxPattern->GetType() != PatternType::SURFACE) { + if (mGfxPattern.GetPattern()->GetType() != PatternType::SURFACE) { return false; } - if (mSurfacePattern.addr()->mSurface->GetFormat() == SurfaceFormat::B8G8R8X8) { + if (static_cast(mGfxPattern.GetPattern())->mSurface->GetFormat() == SurfaceFormat::B8G8R8X8) { return true; } return false; @@ -206,27 +197,27 @@ gfxPattern::Extend() const void gfxPattern::SetFilter(GraphicsFilter filter) { - if (mGfxPattern->GetType() != PatternType::SURFACE) { + if (mGfxPattern.GetPattern()->GetType() != PatternType::SURFACE) { return; } - mSurfacePattern.addr()->mFilter = ToFilter(filter); + static_cast(mGfxPattern.GetPattern())->mFilter = ToFilter(filter); } GraphicsFilter gfxPattern::Filter() const { - if (mGfxPattern->GetType() != PatternType::SURFACE) { + if (mGfxPattern.GetPattern()->GetType() != PatternType::SURFACE) { return GraphicsFilter::FILTER_GOOD; } - return ThebesFilter(mSurfacePattern.addr()->mFilter); + return ThebesFilter(static_cast(mGfxPattern.GetPattern())->mFilter); } bool gfxPattern::GetSolidColor(gfxRGBA& aColor) { - if (mGfxPattern->GetType() == PatternType::COLOR) { - aColor = ThebesColor(mColorPattern.addr()->mColor); + if (mGfxPattern.GetPattern()->GetType() == PatternType::COLOR) { + aColor = ThebesColor(static_cast(mGfxPattern.GetPattern())->mColor); return true; } @@ -236,7 +227,7 @@ gfxPattern::GetSolidColor(gfxRGBA& aColor) gfxPattern::GraphicsPatternType gfxPattern::GetType() const { - return ThebesPatternType(mGfxPattern->GetType()); + return ThebesPatternType(mGfxPattern.GetPattern()->GetType()); } int diff --git a/gfx/thebes/gfxPattern.h b/gfx/thebes/gfxPattern.h index 0670b4497975..ee2c97590492 100644 --- a/gfx/thebes/gfxPattern.h +++ b/gfx/thebes/gfxPattern.h @@ -11,6 +11,7 @@ #include "gfxMatrix.h" #include "mozilla/Alignment.h" #include "mozilla/gfx/2D.h" +#include "mozilla/gfx/PatternHelpers.h" #include "GraphicsFilter.h" #include "nsISupportsImpl.h" #include "nsAutoPtr.h" @@ -40,7 +41,7 @@ public: // This should only be called on a cairo pattern that we want to use with // Azure. We will read back the color stops from cairo and try to look // them up in the cache. - void CacheColorStops(mozilla::gfx::DrawTarget *aDT); + void CacheColorStops(const mozilla::gfx::DrawTarget *aDT); void SetMatrix(const gfxMatrix& matrix); gfxMatrix GetMatrix() const; @@ -51,7 +52,7 @@ public: * was set. When this is nullptr it is assumed the transform is identical * to the current transform. */ - mozilla::gfx::Pattern *GetPattern(mozilla::gfx::DrawTarget *aTarget, + mozilla::gfx::Pattern *GetPattern(const mozilla::gfx::DrawTarget *aTarget, mozilla::gfx::Matrix *aOriginalUserToDevice = nullptr); bool IsOpaque(); @@ -95,17 +96,9 @@ public: private: // Private destructor, to discourage deletion outside of Release(): - ~gfxPattern(); - - union { - mozilla::AlignedStorage2 mColorPattern; - mozilla::AlignedStorage2 mLinearGradientPattern; - mozilla::AlignedStorage2 mRadialGradientPattern; - mozilla::AlignedStorage2 mSurfacePattern; - }; - - mozilla::gfx::Pattern *mGfxPattern; + ~gfxPattern() {} + mozilla::gfx::GeneralPattern mGfxPattern; mozilla::RefPtr mSourceSurface; mozilla::gfx::Matrix mPatternToUserSpace; mozilla::RefPtr mStops; diff --git a/gfx/thebes/gfxSVGGlyphs.h b/gfx/thebes/gfxSVGGlyphs.h index 7b191f752c12..af996b711103 100644 --- a/gfx/thebes/gfxSVGGlyphs.h +++ b/gfx/thebes/gfxSVGGlyphs.h @@ -6,6 +6,7 @@ #define GFX_SVG_GLYPHS_WRAPPER_H #include "gfxFontUtils.h" +#include "mozilla/gfx/2D.h" #include "nsString.h" #include "nsAutoPtr.h" #include "nsClassHashtable.h" @@ -166,6 +167,8 @@ private: class gfxTextContextPaint { protected: + typedef mozilla::gfx::DrawTarget DrawTarget; + gfxTextContextPaint() { } public: @@ -176,9 +179,11 @@ public: * This lets us inherit paints and paint opacities (i.e. fill/stroke and * fill-opacity/stroke-opacity) separately. */ - virtual already_AddRefed GetFillPattern(float aOpacity, + virtual already_AddRefed GetFillPattern(const DrawTarget* aDrawTarget, + float aOpacity, const gfxMatrix& aCTM) = 0; - virtual already_AddRefed GetStrokePattern(float aOpacity, + virtual already_AddRefed GetStrokePattern(const DrawTarget* aDrawTarget, + float aOpacity, const gfxMatrix& aCTM) = 0; virtual float GetFillOpacity() { return 1.0f; } @@ -199,12 +204,14 @@ public: return mStrokeWidth; } - already_AddRefed GetFillPattern(const gfxMatrix& aCTM) { - return GetFillPattern(GetFillOpacity(), aCTM); + already_AddRefed GetFillPattern(const DrawTarget* aDrawTarget, + const gfxMatrix& aCTM) { + return GetFillPattern(aDrawTarget, GetFillOpacity(), aCTM); } - already_AddRefed GetStrokePattern(const gfxMatrix& aCTM) { - return GetStrokePattern(GetStrokeOpacity(), aCTM); + already_AddRefed GetStrokePattern(const DrawTarget* aDrawTarget, + const gfxMatrix& aCTM) { + return GetStrokePattern(aDrawTarget, GetStrokeOpacity(), aCTM); } virtual ~gfxTextContextPaint() { } @@ -247,7 +254,8 @@ public: mStrokeMatrix = SetupDeviceToPatternMatrix(aStrokePattern, aCTM); } - already_AddRefed GetFillPattern(float aOpacity, + already_AddRefed GetFillPattern(const DrawTarget* aDrawTarget, + float aOpacity, const gfxMatrix& aCTM) { if (mFillPattern) { mFillPattern->SetMatrix(aCTM * mFillMatrix); @@ -256,7 +264,8 @@ public: return fillPattern.forget(); } - already_AddRefed GetStrokePattern(float aOpacity, + already_AddRefed GetStrokePattern(const DrawTarget* aDrawTarget, + float aOpacity, const gfxMatrix& aCTM) { if (mStrokePattern) { mStrokePattern->SetMatrix(aCTM * mStrokeMatrix); diff --git a/image/test/reftest/downscaling/reftest.list b/image/test/reftest/downscaling/reftest.list index 31e34db7d1ef..a01b4e50ad7a 100644 --- a/image/test/reftest/downscaling/reftest.list +++ b/image/test/reftest/downscaling/reftest.list @@ -29,7 +29,7 @@ == downscale-svg-1a.html downscale-svg-1-ref.html?80 fuzzy(80,468) == downscale-svg-1b.html downscale-svg-1-ref.html?72 == downscale-svg-1c.html downscale-svg-1-ref.html?64 -fuzzy(17,208) fuzzy-if(B2G,254,207) == downscale-svg-1d.html downscale-svg-1-ref.html?53 # right side is 1 pixel off for B2G, probably regression from 974242 +fuzzy(17,208) fuzzy-if(B2G,255,207) == downscale-svg-1d.html downscale-svg-1-ref.html?53 # right side is 1 pixel off for B2G, probably regression from 974242 fuzzy(78,216) == downscale-svg-1e.html downscale-svg-1-ref.html?40 fuzzy(51,90) == downscale-svg-1f.html downscale-svg-1-ref.html?24 diff --git a/intl/locale/unix/unixcharset.properties b/intl/locale/unix/unixcharset.properties index cead2deeb04a..9ff094a6c3b7 100644 --- a/intl/locale/unix/unixcharset.properties +++ b/intl/locale/unix/unixcharset.properties @@ -27,8 +27,8 @@ locale.all.C=ISO-8859-1 # HP locale.all.C.iso885915=ISO-8859-15 locale.all.c-french.iso88591=ISO-8859-1 -locale.all.chinese=GB2312 -locale.all.chinese-s=GB2312 +locale.all.chinese=gb18030 +locale.all.chinese-s=gb18030 locale.all.chinese-t.big5=Big5 locale.all.cs=ISO-8859-2 locale.all.cs_CZ=ISO-8859-2 @@ -510,18 +510,18 @@ locale.all.th=windows-874 locale.all.th_TH.UTF-8=UTF-8 # RedHat 7 reported by Garaschenko Slava \"" + dispOut + "\"\n"); -} - -function error(inString, outString, msg){ - dumpStrings(inString, outString); - do_throw("security risk: " + msg); -} - -function run_test() { - var ScriptableUnicodeConverter = - Components.Constructor("@mozilla.org/intl/scriptableunicodeconverter", - "nsIScriptableUnicodeConverter"); - - var converter = new ScriptableUnicodeConverter(); - converter.charset = charset; - - var leadByte, trailByte; - var inString; - for (leadByte = 1; leadByte < 0x100; ++leadByte) { - for (trailByte = 1; trailByte < 0x100; ++trailByte) { - if (leadByte == 0x7e) { - if (trailByte == 0x7b || - trailByte == 0xa || - trailByte == 0x7e) { - // ignore escape sequences: - // ~{ (sets HZ-GB mode) - // ~\n ( ==> \n) - // ~~ ( ==> ~) - continue; - } - } - inString = String.fromCharCode(leadByte, trailByte, 65); - var outString = converter.ConvertToUnicode(inString) + - converter.Finish(); - switch (outString.length) { - case 1: - error(inString, outString, "2 byte sequence eaten"); - break; - case 2: - if (outString.charCodeAt(0) < 0x80 && - outString.charCodeAt(1) < 0x80) { - error(inString, outString, - "2 byte sequence converted to 1 ASCII"); - } - break; - case 3: - if (outString != inString && - outString.charCodeAt(0) < 0x80 && - outString.charCodeAt(1) < 0x80) { - error(inString, outString, - "2 byte sequence converted to 2 ASCII"); - } - break; - } - } - } -} diff --git a/intl/uconv/tests/unit/test_bug90411.js b/intl/uconv/tests/unit/test_bug90411.js deleted file mode 100644 index abecd1bfe985..000000000000 --- a/intl/uconv/tests/unit/test_bug90411.js +++ /dev/null @@ -1,67 +0,0 @@ -/* Test case for bug 90411 - * - * Uses nsIConverterInputStream to decode GB_HK test. - * - * Sample text is: - * 问他è°æ˜¯å‚»ç“œäº†5分钟。但是,他è°ä¸è¦æ±‚ä»ç„¶æ˜¯ä¸€ä¸ªå‚»ç“œæ°¸è¿œ - * 我å¬è§ 我忘记; æˆ‘çœ‹è§ æˆ‘è®°ä½; æˆ‘åš æˆ‘äº†è§£ã€‚ - */ - -const sample = "~{NJK{K-JGI59OAK~}5~{7VVS!%235+JG%23,K{K-2;R*GsHTH;JGR;8vI59OS@T6!%23~} ~{NRL}<{~} ~{NRM| - - Table in Debug form -Begin of Item 0000 - Format 2 - srcBegin = 0080 - destBegin = 20AC -End of Item 0000 - -========================================================*/ -/* Offset=0x0000 ItemOfList */ - 0x0001, -/*-------------------------------------------------------*/ -/* Offset=0x0001 offsetToFormatArray */ - 0x0004, -/*-------------------------------------------------------*/ -/* Offset=0x0002 offsetToMapCellArray */ - 0x0005, -/*-------------------------------------------------------*/ -/* Offset=0x0003 offsetToMappingTable */ - 0x0008, -/*-------------------------------------------------------*/ -/* Offset=0x0004 Start of Format Array */ -/* Total of Format 0 : 0x0000 */ -/* Total of Format 1 : 0x0000 */ -/* Total of Format 2 : 0x0001 */ -/* Total of Format 3 : 0x0000 */ - -0x0002, -/*-------------------------------------------------------*/ -/* Offset=0x0005 Start of MapCell Array */ -/* 0000 */ 0x0080, 0x0000, 0x20AC, -/*-------------------------------------------------------*/ -/* Offset=0x0008 Start of MappingTable */ - -/* End of table Total Length = 0x0008 * 2 */ diff --git a/intl/uconv/ucvcn/nsGB2312ToUnicodeV2.h b/intl/uconv/ucvcn/nsGB2312ToUnicodeV2.h deleted file mode 100644 index 4e311dea7006..000000000000 --- a/intl/uconv/ucvcn/nsGB2312ToUnicodeV2.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsGB2312ToUnicodeV2_h___ -#define nsGB2312ToUnicodeV2_h___ - -#include "nsUCSupport.h" -#include "gbku.h" -#include "nsGBKToUnicode.h" -//---------------------------------------------------------------------- -// Class nsGB2312ToUnicodeV2 [declaration] - -/** - * A character set converter from GB2312 to Unicode. - * - * @created 06/Apr/1999 - * @author Catalin Rotaru [CATA] - */ -class nsGB2312ToUnicodeV2 : public nsGB18030ToUnicode -{ -public: - - /** - * Class constructor. - */ - nsGB2312ToUnicodeV2(){} -}; - - -#endif /* nsGB2312ToUnicodeV2_h___ */ diff --git a/intl/uconv/ucvcn/nsGBKToUnicode.cpp b/intl/uconv/ucvcn/nsGBKToUnicode.cpp index f28f818b372a..0751cc6fd7c6 100644 --- a/intl/uconv/ucvcn/nsGBKToUnicode.cpp +++ b/intl/uconv/ucvcn/nsGBKToUnicode.cpp @@ -13,28 +13,6 @@ #include "nsGBKToUnicode.h" #include "gbku.h" - -//------------------------------------------------------------ -// nsGBKUnique2BytesToUnicode -//------------------------------------------------------------ -class nsGBKUnique2BytesToUnicode : public nsTableDecoderSupport -{ -public: - nsGBKUnique2BytesToUnicode(); - virtual ~nsGBKUnique2BytesToUnicode() - { } -protected: -}; - -static const uint16_t g_utGBKUnique2Bytes[] = { -#include "gbkuniq2b.ut" -}; -nsGBKUnique2BytesToUnicode::nsGBKUnique2BytesToUnicode() - : nsTableDecoderSupport(u2BytesCharset, nullptr, - (uMappingTable*) &g_utGBKUnique2Bytes, 1) -{ -} - //------------------------------------------------------------ // nsGB18030Unique2BytesToUnicode //------------------------------------------------------------ @@ -97,10 +75,10 @@ nsGB18030Unique4BytesToUnicode::nsGB18030Unique4BytesToUnicode() #define LEGAL_GBK_4BYTE_FORTH_BYTE(c) \ (UINT8_IN_RANGE(0x30, (c), 0x39)) -NS_IMETHODIMP nsGBKToUnicode::ConvertNoBuff(const char* aSrc, - int32_t * aSrcLength, - char16_t *aDest, - int32_t * aDestLength) +NS_IMETHODIMP nsGB18030ToUnicode::ConvertNoBuff(const char* aSrc, + int32_t * aSrcLength, + char16_t *aDest, + int32_t * aDestLength) { int32_t i=0; int32_t iSrcLength = (*aSrcLength); @@ -229,15 +207,6 @@ NS_IMETHODIMP nsGBKToUnicode::ConvertNoBuff(const char* aSrc, return rv; } - -void nsGBKToUnicode::CreateExtensionDecoder() -{ - mExtensionDecoder = new nsGBKUnique2BytesToUnicode(); -} -void nsGBKToUnicode::Create4BytesDecoder() -{ - m4BytesDecoder = nullptr; -} void nsGB18030ToUnicode::CreateExtensionDecoder() { mExtensionDecoder = new nsGB18030Unique2BytesToUnicode(); @@ -279,7 +248,7 @@ bool nsGB18030ToUnicode::DecodeToSurrogate(const char* aSrc, char16_t* aOut) return true; } -bool nsGBKToUnicode::TryExtensionDecoder(const char* aSrc, char16_t* aOut) +bool nsGB18030ToUnicode::TryExtensionDecoder(const char* aSrc, char16_t* aOut) { if(!mExtensionDecoder) CreateExtensionDecoder(); @@ -300,11 +269,8 @@ bool nsGBKToUnicode::TryExtensionDecoder(const char* aSrc, char16_t* aOut) } return false; } -bool nsGBKToUnicode::DecodeToSurrogate(const char* aSrc, char16_t* aOut) -{ - return false; -} -bool nsGBKToUnicode::Try4BytesDecoder(const char* aSrc, char16_t* aOut) + +bool nsGB18030ToUnicode::Try4BytesDecoder(const char* aSrc, char16_t* aOut) { if(!m4BytesDecoder) Create4BytesDecoder(); diff --git a/intl/uconv/ucvcn/nsGBKToUnicode.h b/intl/uconv/ucvcn/nsGBKToUnicode.h index 6264944e708e..9830e93efa40 100644 --- a/intl/uconv/ucvcn/nsGBKToUnicode.h +++ b/intl/uconv/ucvcn/nsGBKToUnicode.h @@ -2,8 +2,8 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef nsGBK2312ToUnicode_h___ -#define nsGBK2312ToUnicode_h___ +#ifndef nsGBKToUnicode_h___ +#define nsGBKToUnicode_h___ #include "nsCOMPtr.h" #include "nsIUnicodeDecoder.h" @@ -11,23 +11,23 @@ #include "nsGBKConvUtil.h" //---------------------------------------------------------------------- -// Class nsGBKToUnicode [declaration] +// Class nsGB18030ToUnicode [declaration] /** - * A character set converter from GBK to Unicode. + * A character set converter from GB18030 to Unicode. * * * @created 07/Sept/1999 * @author Yueheng Xu, Yueheng.Xu@intel.com */ -class nsGBKToUnicode : public nsBufferDecoderSupport +class nsGB18030ToUnicode : public nsBufferDecoderSupport { public: /** * Class constructor. */ - nsGBKToUnicode() : nsBufferDecoderSupport(1) + nsGB18030ToUnicode() : nsBufferDecoderSupport(1) { mExtensionDecoder = nullptr; m4BytesDecoder = nullptr; @@ -44,25 +44,13 @@ protected: nsCOMPtr mExtensionDecoder; nsCOMPtr m4BytesDecoder; - virtual void CreateExtensionDecoder(); - virtual void Create4BytesDecoder(); + void CreateExtensionDecoder(); + void Create4BytesDecoder(); bool TryExtensionDecoder(const char* aSrc, char16_t* aDest); bool Try4BytesDecoder(const char* aSrc, char16_t* aDest); - virtual bool DecodeToSurrogate(const char* aSrc, char16_t* aDest); + bool DecodeToSurrogate(const char* aSrc, char16_t* aDest); }; - -class nsGB18030ToUnicode : public nsGBKToUnicode -{ -public: - nsGB18030ToUnicode() {} - virtual ~nsGB18030ToUnicode() {} -protected: - virtual void CreateExtensionDecoder(); - virtual void Create4BytesDecoder(); - virtual bool DecodeToSurrogate(const char* aSrc, char16_t* aDest); -}; - -#endif /* nsGBK2312ToUnicode_h___ */ +#endif /* nsGBKToUnicode_h___ */ diff --git a/intl/uconv/ucvcn/nsHZToUnicode.cpp b/intl/uconv/ucvcn/nsHZToUnicode.cpp deleted file mode 100644 index 758644db37d5..000000000000 --- a/intl/uconv/ucvcn/nsHZToUnicode.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -/** - * A character set converter from HZ to Unicode. - * - * - * @created 08/Sept/1999 - * @author Yueheng Xu, Yueheng.Xu@intel.com - * - * Note: in this HZ-GB-2312 converter, we accept a string composed of 7-bit HZ - * encoded Chinese chars,as it is defined in RFC1843 available at - * http://www.cis.ohio-state.edu/htbin/rfc/rfc1843.html - * and RFC1842 available at http://www.cis.ohio-state.edu/htbin/rfc/rfc1842.html. - * - * Earlier versions of the converter said: - * "In an effort to match the similar extended capability of Microsoft - * Internet Explorer 5.0. We also accept the 8-bit GB encoded chars - * mixed in a HZ string. - * But this should not be a recommendedd practice for HTML authors." - * However, testing in current versions of IE shows that it only accepts - * 8-bit characters when the converter is in GB state, and when in ASCII - * state each single 8-bit character is converted to U+FFFD - * - * The priority of converting are as follows: first convert 8-bit GB code; then, - * consume HZ ESC sequences such as '~{', '~}', '~~'; then, depending on the current - * state ( default to ASCII state ) of the string, each 7-bit char is converted as an - * ASCII, or two 7-bit chars are converted into a Chinese character. - */ - - - -#include "nsHZToUnicode.h" -#include "gbku.h" -#include "mozilla/Telemetry.h" - -//---------------------------------------------------------------------- -// Class nsHZToUnicode [implementation] - -//---------------------------------------------------------------------- -// Subclassing of nsTablesDecoderSupport class [implementation] - -#define HZ_STATE_GB 1 -#define HZ_STATE_ASCII 2 -#define HZ_STATE_ODD_BYTE_FLAG 0x80 -#define HZLEAD1 '~' -#define HZLEAD2 '{' -#define HZLEAD3 '}' -#define HZ_ODD_BYTE_STATE (mHZState & (HZ_STATE_ODD_BYTE_FLAG)) -#define HZ_ENCODING_STATE (mHZState & ~(HZ_STATE_ODD_BYTE_FLAG)) - -using namespace mozilla; - -nsHZToUnicode::nsHZToUnicode() : nsBufferDecoderSupport(1) -{ - mHZState = HZ_STATE_ASCII; // per HZ spec, default to ASCII state - mRunLength = 0; - mOddByte = 0; - Telemetry::Accumulate(Telemetry::DECODER_INSTANTIATED_HZ, true); -} - -//Overwriting the ConvertNoBuff() in nsUCvCnSupport.cpp. -NS_IMETHODIMP nsHZToUnicode::ConvertNoBuff( - const char* aSrc, - int32_t * aSrcLength, - char16_t *aDest, - int32_t * aDestLength) -{ - int32_t i=0; - int32_t iSrcLength = *aSrcLength; - int32_t iDestlen = 0; - *aSrcLength=0; - nsresult res = NS_OK; - char oddByte = mOddByte; - - for (i=0; i= (*aDestLength)) { - res = NS_OK_UDEC_MOREOUTPUT; - break; - } - - char srcByte = *aSrc++; - (*aSrcLength)++; - - if (!HZ_ODD_BYTE_STATE) { - if (srcByte == HZLEAD1 || - (HZ_ENCODING_STATE == HZ_STATE_GB && - (UINT8_IN_RANGE(0x21, srcByte, 0x7E) || - UINT8_IN_RANGE(0x81, srcByte, 0xFE)))) { - oddByte = srcByte; - mHZState |= HZ_STATE_ODD_BYTE_FLAG; - } else { - *aDest++ = (srcByte & 0x80) ? UCS2_NO_MAPPING : - CAST_CHAR_TO_UNICHAR(srcByte); - iDestlen++; - } - } else { - if (oddByte & 0x80) { - // Accept legal 8-bit GB 2312-80 sequences in GB mode only - NS_ASSERTION(HZ_ENCODING_STATE == HZ_STATE_GB, - "Invalid lead byte in ASCII mode"); - *aDest++ = (UINT8_IN_RANGE(0x81, oddByte, 0xFE) && - UINT8_IN_RANGE(0x40, srcByte, 0xFE)) ? - mUtil.GBKCharToUnicode(oddByte, srcByte) : UCS2_NO_MAPPING; - mRunLength++; - iDestlen++; - // otherwise, it is a 7-bit byte - // The source will be an ASCII or a 7-bit HZ code depending on oddByte - } else if (oddByte == HZLEAD1) { // if it is lead by '~' - switch (srcByte) { - case HZLEAD2: - // we got a '~{' - // we are switching to HZ state - mHZState = HZ_STATE_GB; - mRunLength = 0; - break; - - case HZLEAD3: - // we got a '~}' - // we are switching to ASCII state - mHZState = HZ_STATE_ASCII; - if (mRunLength == 0) { - *aDest++ = UCS2_NO_MAPPING; - iDestlen++; - } - mRunLength = 0; - break; - - case HZLEAD1: - // we got a '~~', process like an ASCII, but no state change - *aDest++ = CAST_CHAR_TO_UNICHAR(srcByte); - iDestlen++; - mRunLength++; - break; - - default: - // Undefined ESC sequence '~X': treat as an error if X is a - // printable character or we are in ASCII mode, and resynchronize - // on the second character. - // - // N.B. For compatibility with other implementations, we treat '~\n' - // as an illegal sequence even though RFC1843 permits it, and for - // the same reason we pass through control characters including '\n' - // and ' ' even in GB mode. - if (srcByte > 0x20 || HZ_ENCODING_STATE == HZ_STATE_ASCII) { - *aDest++ = UCS2_NO_MAPPING; - iDestlen++; - } - aSrc--; - (*aSrcLength)--; - i--; - break; - } - } else if (HZ_ENCODING_STATE == HZ_STATE_GB) { - *aDest++ = (UINT8_IN_RANGE(0x21, oddByte, 0x7E) && - UINT8_IN_RANGE(0x21, srcByte, 0x7E)) ? - mUtil.GBKCharToUnicode(oddByte|0x80, srcByte|0x80) : - UCS2_NO_MAPPING; - mRunLength++; - iDestlen++; - } else { - NS_NOTREACHED("2-byte sequence that we don't know how to handle"); - *aDest++ = UCS2_NO_MAPPING; - iDestlen++; - } - oddByte = 0; - mHZState &= ~HZ_STATE_ODD_BYTE_FLAG; - } - } // for loop - mOddByte = HZ_ODD_BYTE_STATE ? oddByte : 0; - *aDestLength = iDestlen; - return res; -} - - diff --git a/intl/uconv/ucvcn/nsHZToUnicode.h b/intl/uconv/ucvcn/nsHZToUnicode.h deleted file mode 100644 index ef2dbb9a704e..000000000000 --- a/intl/uconv/ucvcn/nsHZToUnicode.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsHZToUnicode_h___ -#define nsHZToUnicode_h___ - -#include "nsUCSupport.h" -#include "nsGBKConvUtil.h" - -//---------------------------------------------------------------------- -// Class nsHZToUnicode [declaration] - -/** - * A character set converter from GBK to Unicode. - * - * - * @created 08/Sept/1999 - * @author Yueheng Xu, Yueheng.Xu@intel.com - */ -class nsHZToUnicode : public nsBufferDecoderSupport -{ -public: - - /** - * Class constructor. - */ - nsHZToUnicode(); - -protected: - - //-------------------------------------------------------------------- - // Subclassing of nsDecoderSupport class [declaration] - NS_IMETHOD ConvertNoBuff(const char* aSrc, int32_t * aSrcLength, - char16_t *aDest, int32_t * aDestLength); - nsGBKConvUtil mUtil; - -private: - int16_t mHZState; - uint32_t mRunLength; // length of a run of 8-bit GB-encoded characters - char mOddByte; // first byte of a multi-byte sequence from a previous buffer - -}; - -#endif /* nsHZToUnicode_h___ */ diff --git a/intl/uconv/ucvcn/nsUCvCnCID.h b/intl/uconv/ucvcn/nsUCvCnCID.h index 77410527b45d..9feaca4d0480 100644 --- a/intl/uconv/ucvcn/nsUCvCnCID.h +++ b/intl/uconv/ucvcn/nsUCvCnCID.h @@ -8,35 +8,16 @@ #include "nsISupports.h" -// Class ID for our GB2312ToUnicode charset converter// {379C2774-EC77-11d2-8AAC-00600811A836} -#define NS_GB2312TOUNICODE_CID \ - { 0x379c2774, 0xec77, 0x11d2, {0x8a, 0xac, 0x0, 0x60, 0x8, 0x11, 0xa8, 0x36}} - -// Class ID for our HZToUnicode charset converter -// {BA61519A-1DFA-11d3-B3BF-00805F8A6670} -#define NS_HZTOUNICODE_CID \ - { 0xba61519a, 0x1dfa, 0x11d3, {0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70}} - // Class ID for our GBKToUnicode charset converter // {BA61519E-1DFA-11d3-B3BF-00805F8A6670} #define NS_GBKTOUNICODE_CID \ { 0xba61519e, 0x1dfa, 0x11d3, {0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70}} -// Class ID for our UnicodeToGB2312 charset converter -// {379C2777-EC77-11d2-8AAC-00600811A836} -#define NS_UNICODETOGB2312_CID \ - { 0x379c2777, 0xec77, 0x11d2, {0x8a, 0xac, 0x0, 0x60, 0x8, 0x11, 0xa8, 0x36}} - // Class ID for our UnicodeToGBK charset converter // {BA61519B-1DFA-11d3-B3BF-00805F8A6670} #define NS_UNICODETOGBK_CID \ { 0xba61519b, 0x1dfa, 0x11d3, {0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70}} -// Class ID for our UnicodeToHZ charset converter -// {BA61519D-1DFA-11d3-B3BF-00805F8A6670} -#define NS_UNICODETOHZ_CID \ - { 0xba61519d, 0x1dfa, 0x11d3, {0xb3, 0xbf, 0x0, 0x80, 0x5f, 0x8a, 0x66, 0x70}} - // Class ID for our UnicodeToGB18030 charset converter // {A59DA932-4091-11d5-A145-005004832142} #define NS_UNICODETOGB18030_CID \ diff --git a/intl/uconv/ucvcn/nsUnicodeToGB2312V2.cpp b/intl/uconv/ucvcn/nsUnicodeToGB2312V2.cpp deleted file mode 100644 index b633a7594de9..000000000000 --- a/intl/uconv/ucvcn/nsUnicodeToGB2312V2.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "nsUnicodeToGB2312V2.h" -#include "gbku.h" - -//---------------------------------------------------------------------- -// Class nsUnicodeToGB2312V2 [implementation] -nsUnicodeToGB2312V2::nsUnicodeToGB2312V2() : - nsEncoderSupport(2) -{ -} - -NS_IMETHODIMP nsUnicodeToGB2312V2::ConvertNoBuff(const char16_t * aSrc, - int32_t * aSrcLength, - char * aDest, - int32_t * aDestLength) -{ - int32_t iSrcLength = 0; - int32_t iDestLength = 0; - nsresult res = NS_OK; - - while (iSrcLength < *aSrcLength) - { - //if unicode's hi byte has something, it is not ASCII, must be a GB - if(IS_ASCII(*aSrc)) - { - // this is an ASCII - *aDest = CAST_UNICHAR_TO_CHAR(*aSrc); - aDest++; // increment 1 byte - iDestLength +=1; - } else { - char byte1, byte2; - if(mUtil.UnicodeToGBKChar(*aSrc, false, &byte1, &byte2)) - { - if(iDestLength+2 > *aDestLength) - { - res = NS_OK_UENC_MOREOUTPUT; - break; - } - aDest[0]=byte1; - aDest[1]=byte2; - aDest += 2; // increment 2 bytes - iDestLength +=2; // each GB char count as two in char* string - } else { - // cannot convert - res= NS_ERROR_UENC_NOMAPPING; - iSrcLength++; // include length of the unmapped character - break; - } - } - iSrcLength++ ; // each unicode char just count as one in char16_t* string - aSrc++; - if ( iDestLength >= (*aDestLength) && (iSrcLength < *aSrcLength )) - { - res = NS_OK_UENC_MOREOUTPUT; - break; - } - } - *aDestLength = iDestLength; - *aSrcLength = iSrcLength; - return res; -} diff --git a/intl/uconv/ucvcn/nsUnicodeToGB2312V2.h b/intl/uconv/ucvcn/nsUnicodeToGB2312V2.h deleted file mode 100644 index 4e6e0bd57d03..000000000000 --- a/intl/uconv/ucvcn/nsUnicodeToGB2312V2.h +++ /dev/null @@ -1,50 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef nsUnicodeToGB2312V2_h___ -#define nsUnicodeToGB2312V2_h___ - -#include "nsUCSupport.h" -#include "nsGBKConvUtil.h" - -//---------------------------------------------------------------------- -// Class nsUnicodeToGB2312V2 [declaration] - -/** - * A character set converter from Unicode to GB2312. - * - * @created 06/Apr/1999 - * @author Catalin Rotaru [CATA] - */ -class nsUnicodeToGB2312V2 : public nsEncoderSupport -{ -public: - - /** - * Class constructor. - */ - nsUnicodeToGB2312V2(); - -protected: - - NS_IMETHOD ConvertNoBuff(const char16_t * aSrc, - int32_t * aSrcLength, - char * aDest, - int32_t * aDestLength); - - //-------------------------------------------------------------------- - // Subclassing of nsEncoderSupport class [declaration] - - NS_IMETHOD ConvertNoBuffNoErr(const char16_t * aSrc, int32_t * aSrcLength, - char * aDest, int32_t * aDestLength) - { - return NS_OK; - } // just make it not abstract; - -protected: - nsGBKConvUtil mUtil; -}; - -#endif /* nsUnicodeToGB2312V2_h___ */ diff --git a/intl/uconv/ucvcn/nsUnicodeToHZ.cpp b/intl/uconv/ucvcn/nsUnicodeToHZ.cpp deleted file mode 100644 index 745d5d7d55e4..000000000000 --- a/intl/uconv/ucvcn/nsUnicodeToHZ.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - /** - * A character set converter from Unicode to HZ. - * - * - * @created 08/Sept/1999 - * @author Yueheng Xu, Yueheng.Xu@intel.com - * Revision History - * 04/Oct/1999. Yueheng Xu: Fixed line continuation problem when line - * ended by '~'; - * Used table UnicodeToGBK[] to speed up the mapping. - */ -#include "nsUnicodeToHZ.h" -#include "gbku.h" -//---------------------------------------------------------------------- -// Class nsUnicodeToGBK [implementation] -#define HZ_STATE_GB 1 -#define HZ_STATE_ASCII 2 -#define HZ_STATE_TILD 3 -#define HZLEAD1 '~' -#define HZLEAD2 '{' -#define HZLEAD3 '}' -#define UNICODE_TILD 0x007E -nsUnicodeToHZ::nsUnicodeToHZ() : nsEncoderSupport(6) -{ - mHZState = HZ_STATE_ASCII; // per HZ spec, default to HZ mode -} -NS_IMETHODIMP nsUnicodeToHZ::ConvertNoBuff( - const char16_t * aSrc, - int32_t * aSrcLength, - char * aDest, - int32_t * aDestLength) -{ - int32_t i=0; - int32_t iSrcLength = *aSrcLength; - int32_t iDestLength = 0; - - for (i=0;i< iSrcLength;i++) - { - if(! IS_ASCII(*aSrc)) - { - // hi byte has something, it is not ASCII, process as a GB - if ( mHZState != HZ_STATE_GB ) - { - // we are adding a '~{' ESC sequence to star a HZ string - mHZState = HZ_STATE_GB; - aDest[0] = '~'; - aDest[1] = '{'; - aDest += 2; // increment 2 bytes - iDestLength +=2; - } - if(mUtil.UnicodeToGBKChar(*aSrc, true, &aDest[0], &aDest[1])) { - aDest += 2; // increment 2 bytes - iDestLength +=2; - } else { - // some thing that we cannot convert - // xxx fix me ftang - // error handling here - } - } else { - // this is an ASCII - - // if we are in HZ mode, end it by adding a '~}' ESC sequence - if ( mHZState == HZ_STATE_GB ) - { - mHZState = HZ_STATE_ASCII; - aDest[0] = '~'; - aDest[1] = '}'; - aDest += 2; // increment 2 bytes - iDestLength +=2; - } - - // if this is a regular char '~' , convert it to two '~' - if ( *aSrc == UNICODE_TILD ) - { - aDest[0] = '~'; - aDest[1] = '~'; - aDest += 2; // increment 2 bytes - iDestLength +=2; - } else { - // other regular ASCII chars convert by normal ways - - // Is this works for both little endian and big endian machines ? - *aDest = (char) ( (char16_t)(*aSrc) ); - aDest++; // increment 1 byte - iDestLength +=1; - } - } - aSrc++; // increment 2 bytes - if ( iDestLength >= (*aDestLength) ) - { - break; - } - } - *aDestLength = iDestLength; - *aSrcLength = i; - return NS_OK; -} - -NS_IMETHODIMP nsUnicodeToHZ::FinishNoBuff(char * aDest, int32_t * aDestLength) -{ - if ( mHZState == HZ_STATE_GB ) - { - // if we are in HZ mode, end it by adding a '~}' ESC sequence - mHZState = HZ_STATE_ASCII; - aDest[0] = '~'; - aDest[1] = '}'; - *aDestLength = 2; - } else { - *aDestLength = 0; - } - return NS_OK; -} diff --git a/intl/uconv/ucvcn/nsUnicodeToHZ.h b/intl/uconv/ucvcn/nsUnicodeToHZ.h deleted file mode 100644 index a786abf7cabb..000000000000 --- a/intl/uconv/ucvcn/nsUnicodeToHZ.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - - /** - * A character set converter from Unicode to GBK. - * - * - * @created 08/Sept/1999 - * @author Yueheng Xu, Yueheng.Xu@intel.com - */ - -#ifndef nsUnicodeToHZ_h___ -#define nsUnicodeToHZ_h___ - -#include "nsUCSupport.h" -#include "nsGBKConvUtil.h" -//---------------------------------------------------------------------- -// Class nsUnicodeToHZ [declaration] - -class nsUnicodeToHZ: public nsEncoderSupport -{ -public: - - /** - * Class constructor. - */ - nsUnicodeToHZ(); - -protected: - - //-------------------------------------------------------------------- - // Subclassing of nsEncoderSupport class [declaration] - NS_IMETHOD ConvertNoBuff(const char16_t * aSrc, - int32_t * aSrcLength, - char * aDest, - int32_t * aDestLength); - - NS_IMETHOD FinishNoBuff(char * aDest, int32_t * aDestLength); - - NS_IMETHOD ConvertNoBuffNoErr(const char16_t * aSrc, int32_t * aSrcLength, - char * aDest, int32_t * aDestLength) - { - return NS_OK; - } // just make it not abstract; - - uint16_t mHZState; -protected: - nsGBKConvUtil mUtil; - - -}; - -#endif /* nsUnicodeToHZ_h___ */ diff --git a/intl/uconv/ucvja/nsJapaneseToUnicode.cpp b/intl/uconv/ucvja/nsJapaneseToUnicode.cpp index f8b4714da18c..6e7febd8a758 100644 --- a/intl/uconv/ucvja/nsJapaneseToUnicode.cpp +++ b/intl/uconv/ucvja/nsJapaneseToUnicode.cpp @@ -764,7 +764,7 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert( if (!mGB2312Decoder) { // creating a delegate converter (GB2312) mGB2312Decoder = - EncodingUtils::DecoderForEncoding(NS_LITERAL_CSTRING("GB2312")); + EncodingUtils::DecoderForEncoding("gb18030"); } if (!mGB2312Decoder) {// failed creating a delegate converter goto error2; diff --git a/ipc/chromium/src/base/histogram.cc b/ipc/chromium/src/base/histogram.cc index a7a2cfccb97b..2cd337637906 100644 --- a/ipc/chromium/src/base/histogram.cc +++ b/ipc/chromium/src/base/histogram.cc @@ -1048,6 +1048,61 @@ FlagHistogram::AddSampleSet(const SampleSet& sample) { Accumulate(1, 1, one_index); } } + +//------------------------------------------------------------------------------ +// CountHistogram: +//------------------------------------------------------------------------------ + +Histogram * +CountHistogram::FactoryGet(const std::string &name, Flags flags) +{ + Histogram *h(nullptr); + + if (!StatisticsRecorder::FindHistogram(name, &h)) { + CountHistogram *fh = new CountHistogram(name); + fh->InitializeBucketRange(); + fh->SetFlags(flags); + h = StatisticsRecorder::RegisterOrDeleteDuplicate(fh); + } + + return h; +} + +CountHistogram::CountHistogram(const std::string &name) + : LinearHistogram(name, 1, 2, 3) { +} + +Histogram::ClassType +CountHistogram::histogram_type() const +{ + return COUNT_HISTOGRAM; +} + +void +CountHistogram::Accumulate(Sample value, Count count, size_t index) +{ + size_t zero_index = BucketIndex(0); + LinearHistogram::Accumulate(1, 1, zero_index); +} + +void +CountHistogram::AddSampleSet(const SampleSet& sample) { + DCHECK_EQ(bucket_count(), sample.size()); + // We can't be sure the SampleSet provided came from another CountHistogram, + // so we at least check that the unused buckets are empty. + + const size_t indices[] = { BucketIndex(0), BucketIndex(1), BucketIndex(2) }; + + if (sample.counts(indices[1]) != 0 || sample.counts(indices[2]) != 0) { + return; + } + + if (sample.counts(indices[0]) != 0) { + Accumulate(1, sample.counts(indices[0]), indices[0]); + } +} + + //------------------------------------------------------------------------------ // CustomHistogram: //------------------------------------------------------------------------------ diff --git a/ipc/chromium/src/base/histogram.h b/ipc/chromium/src/base/histogram.h index b316094fa72f..887cbb7c0524 100644 --- a/ipc/chromium/src/base/histogram.h +++ b/ipc/chromium/src/base/histogram.h @@ -278,6 +278,7 @@ class Histogram { LINEAR_HISTOGRAM, BOOLEAN_HISTOGRAM, FLAG_HISTOGRAM, + COUNT_HISTOGRAM, CUSTOM_HISTOGRAM, NOT_VALID_IN_RENDERER }; @@ -690,6 +691,24 @@ private: DISALLOW_COPY_AND_ASSIGN(FlagHistogram); }; +// CountHistogram only allows a single monotic counter value. +class CountHistogram : public LinearHistogram +{ +public: + static Histogram *FactoryGet(const std::string &name, Flags flags); + + virtual ClassType histogram_type() const; + + virtual void Accumulate(Sample value, Count count, size_t index); + + virtual void AddSampleSet(const SampleSet& sample); + +private: + explicit CountHistogram(const std::string &name); + + DISALLOW_COPY_AND_ASSIGN(CountHistogram); +}; + //------------------------------------------------------------------------------ // CustomHistogram is a histogram for a set of custom integers. diff --git a/js/public/Class.h b/js/public/Class.h index 39b1971faaf0..f3469b22e7e9 100644 --- a/js/public/Class.h +++ b/js/public/Class.h @@ -580,9 +580,10 @@ IsObjectWithClass(const JS::Value &v, ESClassValue classValue, JSContext *cx); inline bool Unbox(JSContext *cx, JS::HandleObject obj, JS::MutableHandleValue vp); +/* Check whether the object's class supplies objectMovedOp for non-global objects. */ #ifdef DEBUG JS_FRIEND_API(bool) -HasObjectMovedOp(JSObject *obj); +HasObjectMovedOpIfRequired(JSObject *obj); #endif } /* namespace js */ diff --git a/js/src/asmjs/AsmJSLink.cpp b/js/src/asmjs/AsmJSLink.cpp index 4c95e36ad66f..eeaac8f268c1 100644 --- a/js/src/asmjs/AsmJSLink.cpp +++ b/js/src/asmjs/AsmJSLink.cpp @@ -348,68 +348,31 @@ ValidateSimdOperation(JSContext *cx, AsmJSModule::Global &global, HandleValue gl Native native = nullptr; switch (global.simdOperationType()) { +#define SET_NATIVE_INT32X4(op) case AsmJSSimdOperation_##op: native = simd_int32x4_##op; break; +#define SET_NATIVE_FLOAT32X4(op) case AsmJSSimdOperation_##op: native = simd_float32x4_##op; break; +#define FALLTHROUGH(op) case AsmJSSimdOperation_##op: case AsmJSSimdType_int32x4: switch (global.simdOperation()) { - case AsmJSSimdOperation_add: native = simd_int32x4_add; break; - case AsmJSSimdOperation_sub: native = simd_int32x4_sub; break; - case AsmJSSimdOperation_lessThan: native = simd_int32x4_lessThan; break; - case AsmJSSimdOperation_greaterThan: native = simd_int32x4_greaterThan; break; - case AsmJSSimdOperation_equal: native = simd_int32x4_equal; break; - case AsmJSSimdOperation_and: native = simd_int32x4_and; break; - case AsmJSSimdOperation_or: native = simd_int32x4_or; break; - case AsmJSSimdOperation_xor: native = simd_int32x4_xor; break; - case AsmJSSimdOperation_select: native = simd_int32x4_select; break; - case AsmJSSimdOperation_splat: native = simd_int32x4_splat; break; - case AsmJSSimdOperation_withX: native = simd_int32x4_withX; break; - case AsmJSSimdOperation_withY: native = simd_int32x4_withY; break; - case AsmJSSimdOperation_withZ: native = simd_int32x4_withZ; break; - case AsmJSSimdOperation_withW: native = simd_int32x4_withW; break; - case AsmJSSimdOperation_fromFloat32x4: native = simd_int32x4_fromFloat32x4; break; - case AsmJSSimdOperation_fromFloat32x4Bits: native = simd_int32x4_fromFloat32x4Bits; break; - case AsmJSSimdOperation_lessThanOrEqual: - case AsmJSSimdOperation_greaterThanOrEqual: - case AsmJSSimdOperation_notEqual: - case AsmJSSimdOperation_mul: - case AsmJSSimdOperation_div: - case AsmJSSimdOperation_max: - case AsmJSSimdOperation_min: - case AsmJSSimdOperation_fromInt32x4: - case AsmJSSimdOperation_fromInt32x4Bits: + FOREACH_INT32X4_SIMD_OP(SET_NATIVE_INT32X4) + FOREACH_COMMONX4_SIMD_OP(SET_NATIVE_INT32X4) + FOREACH_FLOAT32X4_SIMD_OP(FALLTHROUGH) MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("shouldn't have been validated in the first " "place"); } break; case AsmJSSimdType_float32x4: switch (global.simdOperation()) { - case AsmJSSimdOperation_add: native = simd_float32x4_add; break; - case AsmJSSimdOperation_sub: native = simd_float32x4_sub; break; - case AsmJSSimdOperation_mul: native = simd_float32x4_mul; break; - case AsmJSSimdOperation_div: native = simd_float32x4_div; break; - case AsmJSSimdOperation_max: native = simd_float32x4_max; break; - case AsmJSSimdOperation_min: native = simd_float32x4_min; break; - case AsmJSSimdOperation_lessThan: native = simd_float32x4_lessThan ; break; - case AsmJSSimdOperation_lessThanOrEqual: native = simd_float32x4_lessThanOrEqual; break; - case AsmJSSimdOperation_equal: native = simd_float32x4_equal; break; - case AsmJSSimdOperation_notEqual: native = simd_float32x4_notEqual ; break; - case AsmJSSimdOperation_greaterThan: native = simd_float32x4_greaterThan; break; - case AsmJSSimdOperation_greaterThanOrEqual: native = simd_float32x4_greaterThanOrEqual ; break; - case AsmJSSimdOperation_and: native = simd_float32x4_and; break; - case AsmJSSimdOperation_or: native = simd_float32x4_or; break; - case AsmJSSimdOperation_xor: native = simd_float32x4_xor; break; - case AsmJSSimdOperation_select: native = simd_float32x4_select; break; - case AsmJSSimdOperation_splat: native = simd_float32x4_splat; break; - case AsmJSSimdOperation_withX: native = simd_float32x4_withX; break; - case AsmJSSimdOperation_withY: native = simd_float32x4_withY; break; - case AsmJSSimdOperation_withZ: native = simd_float32x4_withZ; break; - case AsmJSSimdOperation_withW: native = simd_float32x4_withW; break; - case AsmJSSimdOperation_fromInt32x4: native = simd_float32x4_fromInt32x4; break; - case AsmJSSimdOperation_fromInt32x4Bits: native = simd_float32x4_fromInt32x4Bits; break; - case AsmJSSimdOperation_fromFloat32x4: - case AsmJSSimdOperation_fromFloat32x4Bits: + FOREACH_FLOAT32X4_SIMD_OP(SET_NATIVE_FLOAT32X4) + FOREACH_COMMONX4_SIMD_OP(SET_NATIVE_FLOAT32X4) + FOREACH_INT32X4_SIMD_OP(FALLTHROUGH) MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("shouldn't have been validated in the first " "place"); } break; +#undef FALLTHROUGH +#undef SET_NATIVE_FLOAT32X4 +#undef SET_NATIVE_INT32X4 +#undef SET_NATIVE } if (!native || !IsNativeFunction(v, native)) return LinkFail(cx, "bad SIMD.type.* operation"); @@ -776,7 +739,7 @@ HandleDynamicLinkFailure(JSContext *cx, CallArgs args, AsmJSModule &module, Hand formals.infallibleAppend(module.bufferArgumentName()); CompileOptions options(cx); - options.setOriginPrincipals(module.scriptSource()->originPrincipals()) + options.setMutedErrors(module.scriptSource()->mutedErrors()) .setFile(module.scriptSource()->filename()) .setCompileAndGo(false) .setNoScriptRval(false); diff --git a/js/src/asmjs/AsmJSModule.h b/js/src/asmjs/AsmJSModule.h index 75d173ddb158..45bc4fc8bda5 100644 --- a/js/src/asmjs/AsmJSModule.h +++ b/js/src/asmjs/AsmJSModule.h @@ -76,31 +76,9 @@ enum AsmJSSimdType // Set of known operations, for a given SIMD type (int32x4, float32x4,...) enum AsmJSSimdOperation { - AsmJSSimdOperation_add, - AsmJSSimdOperation_sub, - AsmJSSimdOperation_mul, - AsmJSSimdOperation_div, - AsmJSSimdOperation_max, - AsmJSSimdOperation_min, - AsmJSSimdOperation_lessThan, - AsmJSSimdOperation_lessThanOrEqual, - AsmJSSimdOperation_equal, - AsmJSSimdOperation_notEqual, - AsmJSSimdOperation_greaterThan, - AsmJSSimdOperation_greaterThanOrEqual, - AsmJSSimdOperation_and, - AsmJSSimdOperation_or, - AsmJSSimdOperation_xor, - AsmJSSimdOperation_select, - AsmJSSimdOperation_splat, - AsmJSSimdOperation_withX, - AsmJSSimdOperation_withY, - AsmJSSimdOperation_withZ, - AsmJSSimdOperation_withW, - AsmJSSimdOperation_fromInt32x4, - AsmJSSimdOperation_fromFloat32x4, - AsmJSSimdOperation_fromInt32x4Bits, - AsmJSSimdOperation_fromFloat32x4Bits +#define ASMJSSIMDOPERATION(op) AsmJSSimdOperation_##op, + FORALL_SIMD_OP(ASMJSSIMDOPERATION) +#undef ASMJSSIMDOPERATION }; // These labels describe positions in the prologue/epilogue of functions while diff --git a/js/src/asmjs/AsmJSValidate.cpp b/js/src/asmjs/AsmJSValidate.cpp index 2bad2a13e742..a114443c61bc 100644 --- a/js/src/asmjs/AsmJSValidate.cpp +++ b/js/src/asmjs/AsmJSValidate.cpp @@ -1406,35 +1406,13 @@ class MOZ_STACK_CLASS ModuleCompiler return false; } - if (!standardLibrarySimdOpNames_.init() || - !addStandardLibrarySimdOpName("add", AsmJSSimdOperation_add) || - !addStandardLibrarySimdOpName("sub", AsmJSSimdOperation_sub) || - !addStandardLibrarySimdOpName("mul", AsmJSSimdOperation_mul) || - !addStandardLibrarySimdOpName("div", AsmJSSimdOperation_div) || - !addStandardLibrarySimdOpName("lessThanOrEqual", AsmJSSimdOperation_lessThanOrEqual) || - !addStandardLibrarySimdOpName("lessThan", AsmJSSimdOperation_lessThan) || - !addStandardLibrarySimdOpName("equal", AsmJSSimdOperation_equal) || - !addStandardLibrarySimdOpName("notEqual", AsmJSSimdOperation_notEqual) || - !addStandardLibrarySimdOpName("greaterThan", AsmJSSimdOperation_greaterThan) || - !addStandardLibrarySimdOpName("greaterThanOrEqual", AsmJSSimdOperation_greaterThanOrEqual) || - !addStandardLibrarySimdOpName("and", AsmJSSimdOperation_and) || - !addStandardLibrarySimdOpName("or", AsmJSSimdOperation_or) || - !addStandardLibrarySimdOpName("xor", AsmJSSimdOperation_xor) || - !addStandardLibrarySimdOpName("select", AsmJSSimdOperation_select) || - !addStandardLibrarySimdOpName("splat", AsmJSSimdOperation_splat) || - !addStandardLibrarySimdOpName("max", AsmJSSimdOperation_max) || - !addStandardLibrarySimdOpName("min", AsmJSSimdOperation_min) || - !addStandardLibrarySimdOpName("withX", AsmJSSimdOperation_withX) || - !addStandardLibrarySimdOpName("withY", AsmJSSimdOperation_withY) || - !addStandardLibrarySimdOpName("withZ", AsmJSSimdOperation_withZ) || - !addStandardLibrarySimdOpName("withW", AsmJSSimdOperation_withW) || - !addStandardLibrarySimdOpName("fromFloat32x4", AsmJSSimdOperation_fromFloat32x4) || - !addStandardLibrarySimdOpName("fromInt32x4", AsmJSSimdOperation_fromInt32x4) || - !addStandardLibrarySimdOpName("fromFloat32x4Bits", AsmJSSimdOperation_fromFloat32x4Bits) || - !addStandardLibrarySimdOpName("fromInt32x4Bits", AsmJSSimdOperation_fromInt32x4Bits)) +#define ADDSTDLIBSIMDOPNAME(op) || !addStandardLibrarySimdOpName(#op, AsmJSSimdOperation_##op) + if (!standardLibrarySimdOpNames_.init() + FORALL_SIMD_OP(ADDSTDLIBSIMDOPNAME)) { return false; } +#undef ADDSTDLIBSIMDOPNAME uint32_t srcStart = parser_.pc->maybeFunction->pn_body->pn_pos.begin; uint32_t srcBodyStart = tokenStream().currentToken().pos.end; @@ -3589,34 +3567,14 @@ static bool IsSimdValidOperationType(AsmJSSimdType type, AsmJSSimdOperation op) { switch (op) { - case AsmJSSimdOperation_add: - case AsmJSSimdOperation_sub: - case AsmJSSimdOperation_lessThan: - case AsmJSSimdOperation_equal: - case AsmJSSimdOperation_greaterThan: - case AsmJSSimdOperation_and: - case AsmJSSimdOperation_or: - case AsmJSSimdOperation_xor: - case AsmJSSimdOperation_select: - case AsmJSSimdOperation_splat: - case AsmJSSimdOperation_withX: - case AsmJSSimdOperation_withY: - case AsmJSSimdOperation_withZ: - case AsmJSSimdOperation_withW: +#define CASE(op) case AsmJSSimdOperation_##op: + FOREACH_COMMONX4_SIMD_OP(CASE) return true; - case AsmJSSimdOperation_fromFloat32x4: - case AsmJSSimdOperation_fromFloat32x4Bits: + FOREACH_INT32X4_SIMD_OP(CASE) return type == AsmJSSimdType_int32x4; - case AsmJSSimdOperation_mul: - case AsmJSSimdOperation_div: - case AsmJSSimdOperation_max: - case AsmJSSimdOperation_min: - case AsmJSSimdOperation_lessThanOrEqual: - case AsmJSSimdOperation_notEqual: - case AsmJSSimdOperation_greaterThanOrEqual: - case AsmJSSimdOperation_fromInt32x4: - case AsmJSSimdOperation_fromInt32x4Bits: + FOREACH_FLOAT32X4_SIMD_OP(CASE) return type == AsmJSSimdType_float32x4; +#undef CASE } return false; } @@ -4934,6 +4892,19 @@ CheckSimdWith(FunctionCompiler &f, ParseNode *call, Type retType, SimdLane lane, return true; } +template +static bool +CheckSimdCast(FunctionCompiler &f, ParseNode *call, Type fromType, Type toType, MDefinition **def, + Type *type) +{ + DefinitionVector defs; + if (!CheckSimdCallArgs(f, call, 1, CheckArgIsSubtypeOf(fromType), &defs)) + return false; + *def = f.convertSimd(defs[0], fromType.toMIRType(), toType.toMIRType()); + *type = toType; + return true; +} + static bool CheckSimdOperationCall(FunctionCompiler &f, ParseNode *call, const ModuleCompiler::Global *global, MDefinition **def, Type *type) @@ -4985,38 +4956,14 @@ CheckSimdOperationCall(FunctionCompiler &f, ParseNode *call, const ModuleCompile case AsmJSSimdOperation_withW: return CheckSimdWith(f, call, retType, SimdLane::LaneW, def, type); - case AsmJSSimdOperation_fromInt32x4: { - DefinitionVector defs; - if (!CheckSimdCallArgs(f, call, 1, CheckArgIsSubtypeOf(Type::Int32x4), &defs)) - return false; - *def = f.convertSimd(defs[0], MIRType_Int32x4, retType.toMIRType()); - *type = retType; - return true; - } - case AsmJSSimdOperation_fromInt32x4Bits: { - DefinitionVector defs; - if (!CheckSimdCallArgs(f, call, 1, CheckArgIsSubtypeOf(Type::Int32x4), &defs)) - return false; - *def = f.convertSimd(defs[0], MIRType_Int32x4, retType.toMIRType()); - *type = retType; - return true; - } - case AsmJSSimdOperation_fromFloat32x4: { - DefinitionVector defs; - if (!CheckSimdCallArgs(f, call, 1, CheckArgIsSubtypeOf(Type::Float32x4), &defs)) - return false; - *def = f.convertSimd(defs[0], MIRType_Float32x4, retType.toMIRType()); - *type = retType; - return true; - } - case AsmJSSimdOperation_fromFloat32x4Bits: { - DefinitionVector defs; - if (!CheckSimdCallArgs(f, call, 1, CheckArgIsSubtypeOf(Type::Float32x4), &defs)) - return false; - *def = f.convertSimd(defs[0], MIRType_Float32x4, retType.toMIRType()); - *type = retType; - return true; - } + case AsmJSSimdOperation_fromInt32x4: + return CheckSimdCast(f, call, Type::Int32x4, retType, def, type); + case AsmJSSimdOperation_fromInt32x4Bits: + return CheckSimdCast(f, call, Type::Int32x4, retType, def, type); + case AsmJSSimdOperation_fromFloat32x4: + return CheckSimdCast(f, call, Type::Float32x4, retType, def, type); + case AsmJSSimdOperation_fromFloat32x4Bits: + return CheckSimdCast(f, call, Type::Float32x4, retType, def, type); case AsmJSSimdOperation_splat: { DefinitionVector defs; diff --git a/js/src/builtin/Eval.cpp b/js/src/builtin/Eval.cpp index 83ee176e19c3..ad985495e938 100644 --- a/js/src/builtin/Eval.cpp +++ b/js/src/builtin/Eval.cpp @@ -312,10 +312,10 @@ EvalKernel(JSContext *cx, const CallArgs &args, EvalType evalType, AbstractFrame RootedScript maybeScript(cx); unsigned lineno; const char *filename; - JSPrincipals *originPrincipals; + bool mutedErrors; uint32_t pcOffset; DescribeScriptedCallerForCompilation(cx, &maybeScript, &filename, &lineno, &pcOffset, - &originPrincipals, + &mutedErrors, evalType == DIRECT_EVAL ? CALLED_FROM_JSOP_EVAL : NOT_CALLED_FROM_JSOP_EVAL); @@ -329,7 +329,7 @@ EvalKernel(JSContext *cx, const CallArgs &args, EvalType evalType, AbstractFrame .setCompileAndGo(true) .setForEval(true) .setNoScriptRval(false) - .setOriginPrincipals(originPrincipals) + .setMutedErrors(mutedErrors) .setIntroductionInfo(introducerFilename, "eval", lineno, maybeScript, pcOffset); AutoStableStringChars flatChars(cx); @@ -388,10 +388,10 @@ js::DirectEvalStringFromIon(JSContext *cx, RootedScript maybeScript(cx); const char *filename; unsigned lineno; - JSPrincipals *originPrincipals; + bool mutedErrors; uint32_t pcOffset; DescribeScriptedCallerForCompilation(cx, &maybeScript, &filename, &lineno, &pcOffset, - &originPrincipals, CALLED_FROM_JSOP_EVAL); + &mutedErrors, CALLED_FROM_JSOP_EVAL); const char *introducerFilename = filename; if (maybeScript && maybeScript->scriptSource()->introducerFilename()) @@ -402,7 +402,7 @@ js::DirectEvalStringFromIon(JSContext *cx, .setCompileAndGo(true) .setForEval(true) .setNoScriptRval(false) - .setOriginPrincipals(originPrincipals) + .setMutedErrors(mutedErrors) .setIntroductionInfo(introducerFilename, "eval", lineno, maybeScript, pcOffset); AutoStableStringChars flatChars(cx); diff --git a/js/src/builtin/SIMD.h b/js/src/builtin/SIMD.h index 4b531e54804e..e884c66a10bd 100644 --- a/js/src/builtin/SIMD.h +++ b/js/src/builtin/SIMD.h @@ -113,6 +113,39 @@ INT32X4_TERNARY_FUNCTION_LIST(V) \ INT32X4_QUARTERNARY_FUNCTION_LIST(V) +#define FOREACH_INT32X4_SIMD_OP(_) \ + _(fromFloat32x4) \ + _(fromFloat32x4Bits) +#define FOREACH_FLOAT32X4_SIMD_OP(_) \ + _(fromInt32x4) \ + _(fromInt32x4Bits) \ + _(mul) \ + _(div) \ + _(max) \ + _(min) \ + _(lessThanOrEqual) \ + _(notEqual) \ + _(greaterThanOrEqual) +#define FOREACH_COMMONX4_SIMD_OP(_) \ + _(add) \ + _(sub) \ + _(lessThan) \ + _(equal) \ + _(greaterThan) \ + _(and) \ + _(or) \ + _(xor) \ + _(select) \ + _(splat) \ + _(withX) \ + _(withY) \ + _(withZ) \ + _(withW) +#define FORALL_SIMD_OP(_) \ + FOREACH_INT32X4_SIMD_OP(_) \ + FOREACH_FLOAT32X4_SIMD_OP(_) \ + FOREACH_COMMONX4_SIMD_OP(_) + namespace js { class SIMDObject : public JSObject diff --git a/js/src/builtin/TypedObject.cpp b/js/src/builtin/TypedObject.cpp index cd2f918f8a06..c4d974d67993 100644 --- a/js/src/builtin/TypedObject.cpp +++ b/js/src/builtin/TypedObject.cpp @@ -1189,7 +1189,9 @@ StructTypeDescr::maybeForwardedFieldDescr(size_t index) const JSObject &fieldDescrs = *MaybeForwarded(&getReservedSlot(JS_DESCR_SLOT_STRUCT_FIELD_TYPES).toObject()); JS_ASSERT(index < fieldDescrs.getDenseInitializedLength()); - return fieldDescrs.getDenseElement(index).toObject().as(); + JSObject &descr = + *MaybeForwarded(&fieldDescrs.getDenseElement(index).toObject()); + return descr.as(); } /****************************************************************************** @@ -1479,7 +1481,7 @@ TypedObject::length() const if (is()) return typeDescr().as().length(); - return getReservedSlot(JS_BUFVIEW_SLOT_LENGTH).toInt32(); + return as().length(); } uint8_t * @@ -1763,15 +1765,10 @@ OutlineTypedObject::obj_trace(JSTracer *trc, JSObject *object) // prototypes) are never allocated in the nursery. TypeDescr &descr = typedObj.maybeForwardedTypeDescr(); - if (!descr.opaque() || !typedObj.maybeForwardedIsAttached()) { - gc::MarkSlot(trc, &typedObj.getFixedSlotRef(JS_BUFVIEW_SLOT_OWNER), "typed object owner"); - return; - } - // Mark the owner, watching in case it is moved by the tracer. - JSObject *oldOwner = &typedObj.owner(); + JSObject *oldOwner = typedObj.maybeOwner(); gc::MarkSlot(trc, &typedObj.getFixedSlotRef(JS_BUFVIEW_SLOT_OWNER), "typed object owner"); - JSObject *owner = &typedObj.owner(); + JSObject *owner = typedObj.maybeOwner(); uint8_t *mem = typedObj.outOfLineTypedMem(); @@ -1785,6 +1782,9 @@ OutlineTypedObject::obj_trace(JSTracer *trc, JSObject *object) typedObj.setPrivate(mem); } + if (!descr.opaque() || !typedObj.maybeForwardedIsAttached()) + return; + switch (descr.kind()) { case type::Scalar: case type::Reference: @@ -1795,8 +1795,11 @@ OutlineTypedObject::obj_trace(JSTracer *trc, JSObject *object) break; case type::UnsizedArray: - descr.as().elementType().traceInstances(trc, mem, typedObj.length()); + { + SizedTypeDescr &elemType = descr.as().maybeForwardedElementType(); + elemType.traceInstances(trc, mem, typedObj.length()); break; + } } } diff --git a/js/src/builtin/TypedObject.h b/js/src/builtin/TypedObject.h index 8d9851a3e042..fc625fc97220 100644 --- a/js/src/builtin/TypedObject.h +++ b/js/src/builtin/TypedObject.h @@ -428,6 +428,12 @@ class UnsizedArrayTypeDescr : public TypeDescr SizedTypeDescr &elementType() const { return getReservedSlot(JS_DESCR_SLOT_ARRAY_ELEM_TYPE).toObject().as(); } + + SizedTypeDescr &maybeForwardedElementType() const { + JSObject *elemType = + MaybeForwarded(&getReservedSlot(JS_DESCR_SLOT_ARRAY_ELEM_TYPE).toObject()); + return elemType->as(); + } }; /* @@ -687,10 +693,18 @@ class OutlineTypedObject : public TypedObject return getReservedSlot(JS_BUFVIEW_SLOT_OWNER).toObject(); } + JSObject *maybeOwner() const { + return getReservedSlot(JS_BUFVIEW_SLOT_OWNER).toObjectOrNull(); + } + uint8_t *outOfLineTypedMem() const { return static_cast(getPrivate(DATA_SLOT)); } + int32_t length() const { + return getReservedSlot(JS_BUFVIEW_SLOT_LENGTH).toInt32(); + } + // Helper for createUnattached() static OutlineTypedObject *createUnattachedWithClass(JSContext *cx, const Class *clasp, diff --git a/js/src/frontend/BytecodeCompiler.cpp b/js/src/frontend/BytecodeCompiler.cpp index 3c3c7ef7d31a..3ba9c9d576a0 100644 --- a/js/src/frontend/BytecodeCompiler.cpp +++ b/js/src/frontend/BytecodeCompiler.cpp @@ -466,7 +466,7 @@ frontend::CompileLazyFunction(JSContext *cx, Handle lazy, const cha JS_ASSERT(cx->compartment() == lazy->functionNonDelazifying()->compartment()); CompileOptions options(cx, lazy->version()); - options.setOriginPrincipals(lazy->originPrincipals()) + options.setMutedErrors(lazy->mutedErrors()) .setFileAndLine(lazy->source()->filename(), lazy->lineno()) .setColumn(lazy->column()) .setCompileAndGo(true) diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index 575c3d639101..5c6e97300f8a 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -5175,7 +5175,7 @@ EmitFunc(ExclusiveContext *cx, BytecodeEmitter *bce, ParseNode *pn) // Inherit most things (principals, version, etc) from the parent. Rooted parent(cx, bce->script); CompileOptions options(cx, bce->parser->options()); - options.setOriginPrincipals(parent->originPrincipals()) + options.setMutedErrors(parent->mutedErrors()) .setCompileAndGo(parent->compileAndGo()) .setSelfHostingMode(parent->selfHosted()) .setNoScriptRval(false) diff --git a/js/src/frontend/TokenStream.cpp b/js/src/frontend/TokenStream.cpp index b2c751e4856a..d8e8448f1c89 100644 --- a/js/src/frontend/TokenStream.cpp +++ b/js/src/frontend/TokenStream.cpp @@ -301,13 +301,9 @@ TokenStream::TokenStream(ExclusiveContext *cx, const ReadOnlyCompileOptions &opt sourceMapURL_(nullptr), tokenbuf(cx), cx(cx), - originPrincipals(options.originPrincipals(cx)), + mutedErrors(options.mutedErrors()), strictModeGetter(smg) { - // The caller must ensure that a reference is held on the supplied principals - // throughout compilation. - JS_ASSERT_IF(originPrincipals, originPrincipals->refcount > 0); - // Column numbers are computed as offsets from the current line's base, so the // initial line's base must be included in the buffer. linebase and userbuf // were adjusted above, and if we are starting tokenization part way through @@ -354,7 +350,6 @@ TokenStream::TokenStream(ExclusiveContext *cx, const ReadOnlyCompileOptions &opt TokenStream::~TokenStream() { - JS_ASSERT_IF(originPrincipals, originPrincipals->refcount); } // Use the fastest available getc. @@ -642,7 +637,7 @@ TokenStream::reportCompileErrorNumberVA(uint32_t offset, unsigned flags, unsigne err.report.flags = flags; err.report.errorNumber = errorNumber; err.report.filename = filename; - err.report.originPrincipals = originPrincipals; + err.report.isMuted = mutedErrors; if (offset == NoOffset) { err.report.lineno = 0; err.report.column = 0; diff --git a/js/src/frontend/TokenStream.h b/js/src/frontend/TokenStream.h index 3364d096325b..8ca1d78161a2 100644 --- a/js/src/frontend/TokenStream.h +++ b/js/src/frontend/TokenStream.h @@ -270,7 +270,7 @@ class MOZ_STACK_CLASS TokenStream const char *getFilename() const { return filename; } unsigned getLineno() const { return lineno; } unsigned getColumn() const { return userbuf.addressOfNextRawChar() - linebase - 1; } - JSPrincipals *getOriginPrincipals() const { return originPrincipals; } + bool getMutedErrors() const { return mutedErrors; } JSVersion versionNumber() const { return VersionNumber(options().version); } JSVersion versionWithFlags() const { return options().version; } @@ -770,7 +770,7 @@ class MOZ_STACK_CLASS TokenStream bool maybeStrSpecial[256]; // speeds up string scanning uint8_t isExprEnding[TOK_LIMIT];// which tokens definitely terminate exprs? ExclusiveContext *const cx; - JSPrincipals *const originPrincipals; + bool mutedErrors; StrictModeGetter *strictModeGetter; // used to test for strict mode }; diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index 57eab92e189b..7544df24a3d3 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -218,7 +218,9 @@ CheckMarkedThing(JSTracer *trc, T **thingp) JS_ASSERT_IF(gcMarker->getMarkColor() == GRAY, !thing->zone()->isGCMarkingBlack() || rt->isAtomsZone(thing->zone())); - JS_ASSERT(!(thing->zone()->isGCSweeping() || thing->zone()->isGCFinished())); + JS_ASSERT(!(thing->zone()->isGCSweeping() || + thing->zone()->isGCFinished() || + thing->zone()->isGCCompacting())); } /* diff --git a/js/src/jit/LiveRangeAllocator.cpp b/js/src/jit/LiveRangeAllocator.cpp index f23b35771cd6..1033dad329a3 100644 --- a/js/src/jit/LiveRangeAllocator.cpp +++ b/js/src/jit/LiveRangeAllocator.cpp @@ -801,10 +801,14 @@ LiveRangeAllocator::buildLivenessInfo() hasUseRegister = true; } } + JS_ASSERT(!(hasUseRegister && hasUseRegisterAtStart)); - JS_ASSERT_IF(hasUnaliasedDouble() && hasFloat32Def && vregs[use].type() == LDefinition::DOUBLE, + // LSRA has issues with *AtStart, see bug 1039993. + JS_ASSERT_IF(forLSRA && hasUnaliasedDouble() && hasFloat32Def + && vregs[use].type() == LDefinition::DOUBLE, !use->usedAtStart()); - JS_ASSERT_IF(hasMultiAlias() && hasDoubleDef && vregs[use].type() == LDefinition::FLOAT32, + JS_ASSERT_IF(forLSRA && hasMultiAlias() && hasDoubleDef + && vregs[use].type() == LDefinition::FLOAT32, !use->usedAtStart()); #endif diff --git a/js/src/jit/Lowering.cpp b/js/src/jit/Lowering.cpp index da89e71fc7ce..683cc0e0be41 100644 --- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -1778,14 +1778,18 @@ LIRGenerator::visitToDouble(MToDouble *convert) case MIRType_Float32: { - // Bug 1039993: this used to be useRegisterAtStart, and theoreticall, it + LFloat32ToDouble *lir; +#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS) + // Bug 1039993: this used to be useRegisterAtStart, and theoretically, it // should still be, however, there is a bug in LSRA's implementation of // *AtStart, which is quite fundamental. This should be reverted when that // is fixed, or lsra is deprecated. -#if defined(JS_CODEGEN_ARM) || defined(JS_CODEGEN_MIPS) - LFloat32ToDouble *lir = new(alloc()) LFloat32ToDouble(useRegister(opd)); + if (gen->optimizationInfo().registerAllocator() == RegisterAllocator_LSRA) + lir = new (alloc()) LFloat32ToDouble(useRegister(opd)); + else + lir = new (alloc()) LFloat32ToDouble(useRegisterAtStart(opd)); #else - LFloat32ToDouble *lir = new(alloc()) LFloat32ToDouble(useRegisterAtStart(opd)); + lir = new (alloc()) LFloat32ToDouble(useRegisterAtStart(opd)); #endif return define(lir, convert); } diff --git a/js/src/jit/MIR.h b/js/src/jit/MIR.h index 1db38d1a9417..d89ef0ce23a8 100644 --- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -1295,6 +1295,8 @@ class MSimdValueX4 : public MQuaternaryInstruction } MDefinition *foldsTo(TempAllocator &alloc); + + ALLOW_CLONE(MSimdValueX4) }; // Generic constructor of SIMD valuesX4. @@ -1329,6 +1331,8 @@ class MSimdSplatX4 : public MUnaryInstruction } MDefinition *foldsTo(TempAllocator &alloc); + + ALLOW_CLONE(MSimdSplatX4) }; // A constant SIMD value. @@ -1362,6 +1366,8 @@ class MSimdConstant : public MNullaryInstruction AliasSet getAliasSet() const { return AliasSet::None(); } + + ALLOW_CLONE(MSimdConstant) }; // Converts all lanes of a given vector into the type of another vector @@ -1459,6 +1465,7 @@ class MSimdExtractElement : public MUnaryInstruction return false; return congruentIfOperandsEqual(other); } + ALLOW_CLONE(MSimdExtractElement) }; // Replaces the datum in the given lane by a scalar value of the same type. @@ -1503,6 +1510,8 @@ class MSimdInsertElement : public MBinaryInstruction bool congruentTo(const MDefinition *ins) const { return binaryCongruentTo(ins) && lane_ == ins->toSimdInsertElement()->lane(); } + + ALLOW_CLONE(MSimdInsertElement) }; // Extracts the sign bits from a given vector, returning an MIRType_Int32. @@ -1532,6 +1541,8 @@ class MSimdSignMask : public MUnaryInstruction return false; return congruentIfOperandsEqual(ins); } + + ALLOW_CLONE(MSimdSignMask) }; // Compares each value of a SIMD vector to each corresponding lane's value of @@ -1597,6 +1608,8 @@ class MSimdBinaryComp : public MBinaryInstruction return false; return operation_ == ins->toSimdBinaryComp()->operation(); } + + ALLOW_CLONE(MSimdBinaryComp) }; class MSimdBinaryArith : public MBinaryInstruction @@ -1658,6 +1671,8 @@ class MSimdBinaryArith : public MBinaryInstruction return false; return operation_ == ins->toSimdBinaryArith()->operation(); } + + ALLOW_CLONE(MSimdBinaryArith) }; class MSimdBinaryBitwise : public MBinaryInstruction @@ -1702,6 +1717,8 @@ class MSimdBinaryBitwise : public MBinaryInstruction return false; return operation_ == ins->toSimdBinaryBitwise()->operation(); } + + ALLOW_CLONE(MSimdBinaryBitwise) }; class MSimdTernaryBitwise : public MTernaryInstruction @@ -1738,6 +1755,8 @@ class MSimdTernaryBitwise : public MTernaryInstruction } Operation operation() const { return operation_; } + + ALLOW_CLONE(MSimdTernaryBitwise) }; // Deep clone a constant JSObject. diff --git a/js/src/jsapi-tests/moz.build b/js/src/jsapi-tests/moz.build index 5390a8a6ec1f..97ce03d107e2 100644 --- a/js/src/jsapi-tests/moz.build +++ b/js/src/jsapi-tests/moz.build @@ -49,12 +49,12 @@ UNIFIED_SOURCES += [ 'testLookup.cpp', 'testLooselyEqual.cpp', 'testMappedArrayBuffer.cpp', + 'testMutedErrors.cpp', 'testNewObject.cpp', 'testNullRoot.cpp', 'testObjectEmulatingUndefined.cpp', 'testOOM.cpp', 'testOps.cpp', - 'testOriginPrincipals.cpp', 'testParseJSON.cpp', 'testPersistentRooted.cpp', 'testPreserveJitCode.cpp', diff --git a/js/src/jsapi-tests/testOriginPrincipals.cpp b/js/src/jsapi-tests/testMutedErrors.cpp similarity index 65% rename from js/src/jsapi-tests/testOriginPrincipals.cpp rename to js/src/jsapi-tests/testMutedErrors.cpp index 69cf068edff4..5096f61a14ba 100644 --- a/js/src/jsapi-tests/testOriginPrincipals.cpp +++ b/js/src/jsapi-tests/testMutedErrors.cpp @@ -6,18 +6,9 @@ #include "js/OldDebugAPI.h" #include "jsapi-tests/tests.h" -static JSPrincipals *sOriginPrincipalsInErrorReporter = nullptr; -static TestJSPrincipals prin1(1); -static TestJSPrincipals prin2(1); - -BEGIN_TEST(testOriginPrincipals) +static bool sErrorReportMuted = false; +BEGIN_TEST(testMutedErrors) { - /* - * Currently, the only way to set a non-trivial originPrincipal is to use - * JS_EvaluateUCScriptForPrincipalsVersionOrigin. This does not expose the - * compiled script, so we can only test nested scripts. - */ - CHECK(testOuter("function f() {return 1}; f;")); CHECK(testOuter("function outer() { return (function () {return 2}); }; outer();")); CHECK(testOuter("eval('(function() {return 3})');")); @@ -38,7 +29,7 @@ BEGIN_TEST(testOriginPrincipals) /* * NB: uncaught exceptions, when reported, have nothing on the stack so - * both the filename and originPrincipals are null. E.g., this would fail: + * both the filename and mutedErrors are empty. E.g., this would fail: * * CHECK(testError("throw 3")); */ @@ -48,11 +39,11 @@ BEGIN_TEST(testOriginPrincipals) static void ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report) { - sOriginPrincipalsInErrorReporter = report->originPrincipals; + sErrorReportMuted = report->isMuted; } bool -eval(const char *asciiChars, JSPrincipals *principals, JSPrincipals *originPrincipals, JS::MutableHandleValue rval) +eval(const char *asciiChars, bool mutedErrors, JS::MutableHandleValue rval) { size_t len = strlen(asciiChars); char16_t *chars = new char16_t[len+1]; @@ -60,14 +51,14 @@ eval(const char *asciiChars, JSPrincipals *principals, JSPrincipals *originPrinc chars[i] = asciiChars[i]; chars[len] = 0; - JS::RootedObject global(cx, JS_NewGlobalObject(cx, getGlobalClass(), principals, JS::FireOnNewGlobalHook)); + JS::RootedObject global(cx, JS_NewGlobalObject(cx, getGlobalClass(), nullptr, JS::FireOnNewGlobalHook)); CHECK(global); JSAutoCompartment ac(cx, global); CHECK(JS_InitStandardClasses(cx, global)); JS::CompileOptions options(cx); - options.setOriginPrincipals(originPrincipals) + options.setMutedErrors(mutedErrors) .setFileAndLine("", 0); bool ok = JS::Evaluate(cx, global, options, chars, len, rval); @@ -79,21 +70,20 @@ eval(const char *asciiChars, JSPrincipals *principals, JSPrincipals *originPrinc bool testOuter(const char *asciiChars) { - CHECK(testInner(asciiChars, &prin1, &prin1)); - CHECK(testInner(asciiChars, &prin1, &prin2)); + CHECK(testInner(asciiChars, false)); + CHECK(testInner(asciiChars, true)); return true; } bool -testInner(const char *asciiChars, JSPrincipals *principal, JSPrincipals *originPrincipal) +testInner(const char *asciiChars, bool mutedErrors) { JS::RootedValue rval(cx); - CHECK(eval(asciiChars, principal, originPrincipal, &rval)); + CHECK(eval(asciiChars, mutedErrors, &rval)); JS::RootedFunction fun(cx, &rval.toObject().as()); JSScript *script = JS_GetFunctionScript(cx, fun); - CHECK(JS_GetScriptPrincipals(script) == principal); - CHECK(JS_GetScriptOriginPrincipals(script) == originPrincipal); + CHECK(JS_ScriptHasMutedErrors(script) == mutedErrors); return true; } @@ -102,9 +92,9 @@ bool testError(const char *asciiChars) { JS::RootedValue rval(cx); - CHECK(!eval(asciiChars, &prin1, &prin2 /* = originPrincipals */, &rval)); + CHECK(!eval(asciiChars, true, &rval)); CHECK(JS_ReportPendingException(cx)); - CHECK(sOriginPrincipalsInErrorReporter == &prin2); + CHECK(sErrorReportMuted == true); return true; } -END_TEST(testOriginPrincipals) +END_TEST(testMutedErrors) diff --git a/js/src/jsapi-tests/testXDR.cpp b/js/src/jsapi-tests/testXDR.cpp index 0fb3bf4d80e1..5ef0586eb03f 100644 --- a/js/src/jsapi-tests/testXDR.cpp +++ b/js/src/jsapi-tests/testXDR.cpp @@ -12,30 +12,6 @@ #include "jsscriptinlines.h" -static JSScript * -CompileScriptForPrincipalsVersionOrigin(JSContext *cx, JS::HandleObject obj, - JSPrincipals *originPrincipals, - const char *bytes, size_t nbytes, - const char *filename, unsigned lineno, - JSVersion version) -{ - size_t nchars; - if (!JS_DecodeBytes(cx, bytes, nbytes, nullptr, &nchars)) - return nullptr; - char16_t *chars = static_cast(JS_malloc(cx, nchars * sizeof(char16_t))); - if (!chars) - return nullptr; - JS_ALWAYS_TRUE(JS_DecodeBytes(cx, bytes, nbytes, chars, &nchars)); - JS::CompileOptions options(cx); - options.setOriginPrincipals(originPrincipals) - .setFileAndLine(filename, lineno) - .setVersion(version); - JS::RootedScript script(cx); - JS::Compile(cx, obj, options, chars, nchars, &script); - JS_free(cx, chars); - return script; -} - static JSScript * FreezeThaw(JSContext *cx, JS::HandleScript script) { @@ -46,66 +22,11 @@ FreezeThaw(JSContext *cx, JS::HandleScript script) return nullptr; // thaw - JSScript *script2 = JS_DecodeScript(cx, memory, nbytes, - script->originPrincipals()); + JSScript *script2 = JS_DecodeScript(cx, memory, nbytes); js_free(memory); return script2; } -static JSScript * -GetScript(JSContext *cx, JS::HandleObject funobj) -{ - JS::RootedFunction fun(cx, JS_GetObjectFunction(funobj)); - return JS_GetFunctionScript(cx, fun); -} - -static JSObject * -FreezeThaw(JSContext *cx, JS::HandleObject funobj) -{ - // freeze - uint32_t nbytes; - void *memory = JS_EncodeInterpretedFunction(cx, funobj, &nbytes); - if (!memory) - return nullptr; - - // thaw - JSScript *script = GetScript(cx, funobj); - JSObject *funobj2 = JS_DecodeInterpretedFunction(cx, memory, nbytes, - script->originPrincipals()); - js_free(memory); - return funobj2; -} - -static TestJSPrincipals testPrincipal0(1); -static TestJSPrincipals testPrincipal1(1); - -BEGIN_TEST(testXDR_principals) -{ - JSScript *script; - JSCompartment *compartment = js::GetContextCompartment(cx); - for (int i = TEST_FIRST; i != TEST_END; ++i) { - // Appease the new JSAPI assertions. The stuff being tested here is - // going away anyway. - JS_SetCompartmentPrincipals(compartment, &testPrincipal0); - script = createScriptViaXDR(nullptr, i); - CHECK(script); - CHECK(JS_GetScriptPrincipals(script) == &testPrincipal0); - CHECK(JS_GetScriptOriginPrincipals(script) == &testPrincipal0); - - script = createScriptViaXDR(&testPrincipal0, i); - CHECK(script); - CHECK(JS_GetScriptPrincipals(script) == &testPrincipal0); - CHECK(JS_GetScriptOriginPrincipals(script) == &testPrincipal0); - - script = createScriptViaXDR(&testPrincipal1, i); - CHECK(script); - CHECK(JS_GetScriptPrincipals(script) == &testPrincipal0); - CHECK(JS_GetScriptOriginPrincipals(script) == &testPrincipal1); - } - - return true; -} - enum TestCase { TEST_FIRST, TEST_SCRIPT = TEST_FIRST, @@ -114,42 +35,6 @@ enum TestCase { TEST_END }; -JSScript *createScriptViaXDR(JSPrincipals *orig, int testCase) -{ - const char src[] = - "function f() { return 1; }\n" - "f;\n"; - - JS::RootedObject global(cx, JS::CurrentGlobalOrNull(cx)); - JS::RootedScript script(cx, CompileScriptForPrincipalsVersionOrigin(cx, global, orig, - src, strlen(src), "test", 1, - JSVERSION_DEFAULT)); - if (!script) - return nullptr; - - if (testCase == TEST_SCRIPT || testCase == TEST_SERIALIZED_FUNCTION) { - script = FreezeThaw(cx, script); - if (!script) - return nullptr; - if (testCase == TEST_SCRIPT) - return script; - } - - JS::RootedValue v(cx); - bool ok = JS_ExecuteScript(cx, global, script, &v); - if (!ok || !v.isObject()) - return nullptr; - JS::RootedObject funobj(cx, &v.toObject()); - if (testCase == TEST_FUNCTION) { - funobj = FreezeThaw(cx, funobj); - if (!funobj) - return nullptr; - } - return GetScript(cx, funobj); -} - -END_TEST(testXDR_principals) - BEGIN_TEST(testXDR_bug506491) { const char *s = diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 11ed9db5dae0..5badfe04fd28 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -4335,12 +4335,6 @@ JS::ReadOnlyCompileOptions::copyPODOptions(const ReadOnlyCompileOptions &rhs) hasIntroductionInfo = rhs.hasIntroductionInfo; } -JSPrincipals * -JS::ReadOnlyCompileOptions::originPrincipals(ExclusiveContext *cx) const -{ - return NormalizeOriginPrincipals(cx->compartment()->principals, originPrincipals_); -} - JS::OwningCompileOptions::OwningCompileOptions(JSContext *cx) : ReadOnlyCompileOptions(), runtime(GetRuntime(cx)), @@ -4352,9 +4346,6 @@ JS::OwningCompileOptions::OwningCompileOptions(JSContext *cx) JS::OwningCompileOptions::~OwningCompileOptions() { - if (originPrincipals_) - JS_DropPrincipals(runtime, originPrincipals_); - // OwningCompileOptions always owns these, so these casts are okay. js_free(const_cast(filename_)); js_free(const_cast(sourceMapURL_)); @@ -4366,7 +4357,7 @@ JS::OwningCompileOptions::copy(JSContext *cx, const ReadOnlyCompileOptions &rhs) { copyPODOptions(rhs); - setOriginPrincipals(rhs.originPrincipals(cx)); + setMutedErrors(rhs.mutedErrors()); setElement(rhs.element()); setElementAttributeName(rhs.elementAttributeName()); setIntroductionScript(rhs.introductionScript()); @@ -6504,10 +6495,9 @@ JS_EncodeInterpretedFunction(JSContext *cx, HandleObject funobjArg, uint32_t *le } JS_PUBLIC_API(JSScript *) -JS_DecodeScript(JSContext *cx, const void *data, uint32_t length, - JSPrincipals *originPrincipals) +JS_DecodeScript(JSContext *cx, const void *data, uint32_t length) { - XDRDecoder decoder(cx, data, length, originPrincipals); + XDRDecoder decoder(cx, data, length); RootedScript script(cx); if (!decoder.codeScript(&script)) return nullptr; @@ -6515,10 +6505,9 @@ JS_DecodeScript(JSContext *cx, const void *data, uint32_t length, } JS_PUBLIC_API(JSObject *) -JS_DecodeInterpretedFunction(JSContext *cx, const void *data, uint32_t length, - JSPrincipals *originPrincipals) +JS_DecodeInterpretedFunction(JSContext *cx, const void *data, uint32_t length) { - XDRDecoder decoder(cx, data, length, originPrincipals); + XDRDecoder decoder(cx, data, length); RootedObject funobj(cx); if (!decoder.codeFunction(&funobj)) return nullptr; diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 565e29daa6b3..6b226a46c261 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -3544,7 +3544,18 @@ class JS_FRIEND_API(ReadOnlyCompileOptions) friend class CompileOptions; protected: - JSPrincipals *originPrincipals_; + // The Web Platform allows scripts to be loaded from arbitrary cross-origin + // sources. This allows an attack by which a malicious website loads a + // sensitive file (say, a bank statement) cross-origin (using the user's + // cookies), and sniffs the generated syntax errors (via a window.onerror + // handler) for juicy morsels of its contents. + // + // To counter this attack, HTML5 specifies that script errors should be + // sanitized ("muted") when the script is not same-origin with the global + // for which it is loaded. Callers should set this flag for cross-origin + // scripts, and it will be propagated appropriately to child scripts and + // passed back in JSErrorReports. + bool mutedErrors_; const char *filename_; const char *introducerFilename_; const char16_t *sourceMapURL_; @@ -3554,7 +3565,7 @@ class JS_FRIEND_API(ReadOnlyCompileOptions) // classes' constructors take care of that, in ways appropriate to their // purpose. ReadOnlyCompileOptions() - : originPrincipals_(nullptr), + : mutedErrors_(false), filename_(nullptr), introducerFilename_(nullptr), sourceMapURL_(nullptr), @@ -3589,7 +3600,7 @@ class JS_FRIEND_API(ReadOnlyCompileOptions) public: // Read-only accessors for non-POD options. The proper way to set these // depends on the derived type. - JSPrincipals *originPrincipals(js::ExclusiveContext *cx) const; + bool mutedErrors() const { return mutedErrors_; } const char *filename() const { return filename_; } const char *introducerFilename() const { return introducerFilename_; } const char16_t *sourceMapURL() const { return sourceMapURL_; } @@ -3684,10 +3695,8 @@ class JS_FRIEND_API(OwningCompileOptions) : public ReadOnlyCompileOptions introductionScriptRoot = s; return *this; } - OwningCompileOptions &setOriginPrincipals(JSPrincipals *p) { - if (p) JS_HoldPrincipals(p); - if (originPrincipals_) JS_DropPrincipals(runtime, originPrincipals_); - originPrincipals_ = p; + OwningCompileOptions &setMutedErrors(bool mute) { + mutedErrors_ = mute; return *this; } OwningCompileOptions &setVersion(JSVersion v) { @@ -3743,7 +3752,7 @@ class MOZ_STACK_CLASS JS_FRIEND_API(CompileOptions) : public ReadOnlyCompileOpti { copyPODOptions(rhs); - originPrincipals_ = rhs.originPrincipals_; + mutedErrors_ = rhs.mutedErrors_; filename_ = rhs.filename(); sourceMapURL_ = rhs.sourceMapURL(); elementRoot = rhs.element(); @@ -3770,8 +3779,8 @@ class MOZ_STACK_CLASS JS_FRIEND_API(CompileOptions) : public ReadOnlyCompileOpti introductionScriptRoot = s; return *this; } - CompileOptions &setOriginPrincipals(JSPrincipals *p) { - originPrincipals_ = p; + CompileOptions &setMutedErrors(bool mute) { + mutedErrors_ = mute; return *this; } CompileOptions &setVersion(JSVersion v) { @@ -4638,7 +4647,7 @@ JS_ReportAllocationOverflow(JSContext *cx); struct JSErrorReport { const char *filename; /* source file name, URL, etc., or null */ - JSPrincipals *originPrincipals; /* see 'originPrincipals' comment above */ + bool isMuted; /* See the comment in ReadOnlyCompileOptions. */ unsigned lineno; /* source line number */ const char *linebuf; /* offending source line without final \n */ const char *tokenptr; /* pointer to error token in linebuf */ @@ -5064,11 +5073,10 @@ extern JS_PUBLIC_API(void *) JS_EncodeInterpretedFunction(JSContext *cx, JS::HandleObject funobj, uint32_t *lengthp); extern JS_PUBLIC_API(JSScript *) -JS_DecodeScript(JSContext *cx, const void *data, uint32_t length, JSPrincipals *originPrincipals); +JS_DecodeScript(JSContext *cx, const void *data, uint32_t length); extern JS_PUBLIC_API(JSObject *) -JS_DecodeInterpretedFunction(JSContext *cx, const void *data, uint32_t length, - JSPrincipals *originPrincipals); +JS_DecodeInterpretedFunction(JSContext *cx, const void *data, uint32_t length); namespace JS { diff --git a/js/src/jscntxt.cpp b/js/src/jscntxt.cpp index 73455261fb86..7e66b07a9a02 100644 --- a/js/src/jscntxt.cpp +++ b/js/src/jscntxt.cpp @@ -314,7 +314,7 @@ ReportError(JSContext *cx, const char *message, JSErrorReport *reportp, /* * The given JSErrorReport object have been zeroed and must not outlive - * cx->fp() (otherwise report->originPrincipals may become invalid). + * cx->fp() (otherwise owned fields may become invalid). */ static void PopulateReportBlame(JSContext *cx, JSErrorReport *report) @@ -329,7 +329,7 @@ PopulateReportBlame(JSContext *cx, JSErrorReport *report) report->filename = iter.scriptFilename(); report->lineno = iter.computeLine(&report->column); - report->originPrincipals = iter.originPrincipals(); + report->isMuted = iter.mutedErrors(); } /* diff --git a/js/src/jsexn.cpp b/js/src/jsexn.cpp index a3ddae77bdad..d2e83aa6f6d3 100644 --- a/js/src/jsexn.cpp +++ b/js/src/jsexn.cpp @@ -231,10 +231,8 @@ js::CopyErrorReport(JSContext *cx, JSErrorReport *report) } JS_ASSERT(cursor + filenameSize == (uint8_t *)copy + mallocSize); - /* HOLD called by the destination error object. */ - copy->originPrincipals = report->originPrincipals; - /* Copy non-pointer members. */ + copy->isMuted = report->isMuted; copy->lineno = report->lineno; copy->column = report->column; copy->errorNumber = report->errorNumber; @@ -327,12 +325,8 @@ js::ComputeStackString(JSContext *cx) static void exn_finalize(FreeOp *fop, JSObject *obj) { - if (JSErrorReport *report = obj->as().getErrorReport()) { - /* These were held by ErrorObject::init. */ - if (JSPrincipals *prin = report->originPrincipals) - JS_DropPrincipals(fop->runtime(), prin); + if (JSErrorReport *report = obj->as().getErrorReport()) fop->free_(report); - } } JSErrorReport * @@ -875,7 +869,7 @@ ErrorReport::populateUncaughtExceptionReportVA(JSContext *cx, va_list ap) if (!iter.done()) { ownedReport.filename = iter.scriptFilename(); ownedReport.lineno = iter.computeLine(&ownedReport.column); - ownedReport.originPrincipals = iter.originPrincipals(); + ownedReport.isMuted = iter.mutedErrors(); } if (!js_ExpandErrorArguments(cx, js_GetErrorMessage, nullptr, diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 54b705f9c31e..775fefd27088 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -264,10 +264,10 @@ JS_GetScriptPrincipals(JSScript *script) return script->principals(); } -JS_FRIEND_API(JSPrincipals *) -JS_GetScriptOriginPrincipals(JSScript *script) +JS_FRIEND_API(bool) +JS_ScriptHasMutedErrors(JSScript *script) { - return script->originPrincipals(); + return script->mutedErrors(); } JS_FRIEND_API(bool) @@ -1434,8 +1434,8 @@ js::IsInRequest(JSContext *cx) } bool -js::HasObjectMovedOp(JSObject *obj) { - return !!GetObjectClass(obj)->ext.objectMovedOp; +js::HasObjectMovedOpIfRequired(JSObject *obj) { + return obj->is() || !!GetObjectClass(obj)->ext.objectMovedOp; } #endif diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index bafbfb879d40..89e6c7d6dc86 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -143,8 +143,9 @@ JS_SetCompartmentPrincipals(JSCompartment *compartment, JSPrincipals *principals extern JS_FRIEND_API(JSPrincipals *) JS_GetScriptPrincipals(JSScript *script); -extern JS_FRIEND_API(JSPrincipals *) -JS_GetScriptOriginPrincipals(JSScript *script); +extern JS_FRIEND_API(bool) +JS_ScriptHasMutedErrors(JSScript *script); + /* Safe to call with input obj == nullptr. Returns non-nullptr iff obj != nullptr. */ extern JS_FRIEND_API(JSObject *) diff --git a/js/src/jsfun.cpp b/js/src/jsfun.cpp index 545969d123f8..52338da1f664 100644 --- a/js/src/jsfun.cpp +++ b/js/src/jsfun.cpp @@ -1698,10 +1698,10 @@ FunctionConstructor(JSContext *cx, unsigned argc, Value *vp, GeneratorKind gener RootedScript maybeScript(cx); const char *filename; unsigned lineno; - JSPrincipals *originPrincipals; + bool mutedErrors; uint32_t pcOffset; DescribeScriptedCallerForCompilation(cx, &maybeScript, &filename, &lineno, &pcOffset, - &originPrincipals); + &mutedErrors); const char *introductionType = "Function"; if (generatorKind != NotGenerator) @@ -1712,7 +1712,7 @@ FunctionConstructor(JSContext *cx, unsigned argc, Value *vp, GeneratorKind gener introducerFilename = maybeScript->scriptSource()->introducerFilename(); CompileOptions options(cx); - options.setOriginPrincipals(originPrincipals) + options.setMutedErrors(mutedErrors) .setFileAndLine(filename, 1) .setNoScriptRval(false) .setCompileAndGo(true) diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index 50f691ae7cac..8e7720210e6e 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -2114,13 +2114,11 @@ static bool CanRelocateArena(ArenaHeader *arena) { /* - * We can't currently move global objects because their address is baked - * into compiled code. We therefore skip moving the contents of any arena - * containing a global if ion or baseline are enabled. + * We can't currently move global objects because their address can be baked + * into compiled code so we skip relocation of any area containing one. */ JSRuntime *rt = arena->zone->runtimeFromMainThread(); - return arena->getAllocKind() <= FINALIZE_OBJECT_LAST && - ((!rt->options().baseline() && !rt->options().ion()) || !ArenaContainsGlobal(arena)); + return arena->getAllocKind() <= FINALIZE_OBJECT_LAST && !ArenaContainsGlobal(arena); } static bool @@ -2393,6 +2391,9 @@ UpdateCellPointers(MovingTracer *trc, Cell *cell, JSGCTraceKind traceKind) { } else if (traceKind == JSTRACE_BASE_SHAPE) { BaseShape *base = static_cast(cell); base->fixupAfterMovingGC(); + } else if (traceKind == JSTRACE_TYPE_OBJECT) { + types::TypeObject *type = static_cast(cell); + type->fixupAfterMovingGC(); } TraceChildren(trc, cell, traceKind); diff --git a/js/src/jsinfer.cpp b/js/src/jsinfer.cpp index 3760e551ccf0..5ceab613e0c2 100644 --- a/js/src/jsinfer.cpp +++ b/js/src/jsinfer.cpp @@ -2570,6 +2570,14 @@ struct types::ArrayTableKey : public DefaultHasher static inline bool match(const ArrayTableKey &v1, const ArrayTableKey &v2) { return v1.type == v2.type && v1.proto == v2.proto; } + + bool operator==(const ArrayTableKey& other) { + return type == other.type && proto == other.proto; + } + + bool operator!=(const ArrayTableKey& other) { + return !(*this == other); + } }; void @@ -3218,6 +3226,8 @@ TypeObject::markUnknown(ExclusiveContext *cx) void TypeObject::maybeClearNewScriptOnOOM() { + MOZ_ASSERT(zone()->isGCSweeping()); + if (!isMarked()) return; @@ -3234,7 +3244,7 @@ TypeObject::maybeClearNewScriptOnOOM() // This method is called during GC sweeping, so there is no write barrier // that needs to be triggered. - js_free(newScript_); + js_delete(newScript()); newScript_.unsafeSet(nullptr); } @@ -4593,7 +4603,9 @@ TypeObject::clearProperties() inline void TypeObject::sweep(FreeOp *fop, bool *oom) { - if (!isMarked()) { + MOZ_ASSERT(zone()->isGCSweepingOrCompacting()); + + if (zone()->isGCSweeping() && !isMarked()) { // Take care of any finalization required for this object. if (newScript()) fop->delete_(newScript()); @@ -4689,27 +4701,29 @@ TypeCompartment::sweep(FreeOp *fop) if (arrayTypeTable) { for (ArrayTypeTable::Enum e(*arrayTypeTable); !e.empty(); e.popFront()) { - const ArrayTableKey &key = e.front().key(); + ArrayTableKey key = e.front().key(); JS_ASSERT(key.type.isUnknown() || !key.type.isSingleObject()); bool remove = false; - TypeObject *typeObject = nullptr; if (!key.type.isUnknown() && key.type.isTypeObject()) { - typeObject = key.type.typeObjectNoBarrier(); + TypeObject *typeObject = key.type.typeObjectNoBarrier(); if (IsTypeObjectAboutToBeFinalized(&typeObject)) remove = true; + else + key.type = Type::ObjectType(typeObject); + } + if (key.proto && key.proto != TaggedProto::LazyProto && + IsObjectAboutToBeFinalized(&key.proto)) + { + remove = true; } if (IsTypeObjectAboutToBeFinalized(e.front().value().unsafeGet())) remove = true; - if (remove) { + if (remove) e.removeFront(); - } else if (typeObject && typeObject != key.type.typeObjectNoBarrier()) { - ArrayTableKey newKey; - newKey.type = Type::ObjectType(typeObject); - newKey.proto = key.proto; - e.rekeyFront(newKey); - } + else if (key != e.front().key()) + e.rekeyFront(key); } } @@ -4788,6 +4802,7 @@ JSCompartment::sweepNewTypeObjectTable(TypeObjectWithNewScriptSet &table) } #ifdef JSGC_COMPACTING + void JSCompartment::fixupNewTypeObjectTable(TypeObjectWithNewScriptSet &table) { @@ -4822,7 +4837,33 @@ JSCompartment::fixupNewTypeObjectTable(TypeObjectWithNewScriptSet &table) } } } -#endif + +void +TypeNewScript::fixupAfterMovingGC() +{ + if (fun && IsForwarded(fun.get())) + fun = Forwarded(fun.get()); + /* preliminaryObjects are handled by sweep(). */ + if (templateObject_ && IsForwarded(templateObject_.get())) + templateObject_ = Forwarded(templateObject_.get()); + if (initializedShape_ && IsForwarded(initializedShape_.get())) + initializedShape_ = Forwarded(initializedShape_.get()); +} + +void +TypeObject::fixupAfterMovingGC() +{ + if (proto().isObject() && IsForwarded(proto_.get())) + proto_ = Forwarded(proto_.get()); + if (singleton_ && !lazy() && IsForwarded(singleton_.get())) + singleton_ = Forwarded(singleton_.get()); + if (newScript_) + newScript_->fixupAfterMovingGC(); + if (interpretedFunction && IsForwarded(interpretedFunction.get())) + interpretedFunction = Forwarded(interpretedFunction.get()); +} + +#endif // JSGC_COMPACTING #ifdef JSGC_HASH_TABLE_CHECKS diff --git a/js/src/jsinfer.h b/js/src/jsinfer.h index 6340f441b401..a2575e037eea 100644 --- a/js/src/jsinfer.h +++ b/js/src/jsinfer.h @@ -970,6 +970,10 @@ class TypeNewScript void trace(JSTracer *trc); void sweep(FreeOp *fop); +#ifdef JSGC_COMPACTING + void fixupAfterMovingGC(); +#endif + void registerNewObject(JSObject *res); void unregisterNewObject(JSObject *res); bool maybeAnalyze(JSContext *cx, TypeObject *type, bool *regenerate, bool force = false); @@ -1209,6 +1213,10 @@ struct TypeObject : public gc::TenuredCell inline void clearProperties(); inline void sweep(FreeOp *fop, bool *oom); +#ifdef JSGC_COMPACTING + void fixupAfterMovingGC(); +#endif + size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const; /* diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index becba6173fbb..ffe511a8f890 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -739,7 +739,6 @@ js::XDRScript(XDRState *xdr, HandleObject enclosingScope, HandleScript enc * aren't preserved by XDR. So this can be simple. */ CompileOptions options(cx); - options.setOriginPrincipals(xdr->originPrincipals()); ss->initFromOptions(cx, options); sourceObject = ScriptSourceObject::create(cx, ss); if (!sourceObject || @@ -1796,9 +1795,6 @@ ScriptSource::~ScriptSource() default: break; } - - if (originPrincipals_) - JS_DropPrincipals(TlsPerThreadData.get()->runtimeFromMainThread(), originPrincipals_); } void @@ -1994,9 +1990,7 @@ ScriptSource::initFromOptions(ExclusiveContext *cx, const ReadOnlyCompileOptions JS_ASSERT(!filename_); JS_ASSERT(!introducerFilename_); - originPrincipals_ = options.originPrincipals(cx); - if (originPrincipals_) - JS_HoldPrincipals(originPrincipals_); + mutedErrors_ = options.mutedErrors(); introductionType_ = options.introductionType; setIntroductionOffset(options.introductionOffset); @@ -2864,7 +2858,7 @@ js_GetScriptLineExtent(JSScript *script) void js::DescribeScriptedCallerForCompilation(JSContext *cx, MutableHandleScript maybeScript, const char **file, unsigned *linenop, - uint32_t *pcOffset, JSPrincipals **origin, + uint32_t *pcOffset, bool *mutedErrors, LineOption opt) { if (opt == CALLED_FROM_JSOP_EVAL) { @@ -2877,7 +2871,7 @@ js::DescribeScriptedCallerForCompilation(JSContext *cx, MutableHandleScript mayb *linenop = GET_UINT16(pc + (JSOp(*pc) == JSOP_EVAL ? JSOP_EVAL_LENGTH : JSOP_SPREADEVAL_LENGTH)); *pcOffset = pc - maybeScript->code(); - *origin = maybeScript->originPrincipals(); + *mutedErrors = maybeScript->mutedErrors(); return; } @@ -2888,13 +2882,13 @@ js::DescribeScriptedCallerForCompilation(JSContext *cx, MutableHandleScript mayb *file = nullptr; *linenop = 0; *pcOffset = 0; - *origin = cx->compartment()->principals; + *mutedErrors = false; return; } *file = iter.scriptFilename(); *linenop = iter.computeLine(); - *origin = iter.originPrincipals(); + *mutedErrors = iter.mutedErrors(); // These values are only used for introducer fields which are debugging // information and can be safely left null for asm.js frames. @@ -3038,7 +3032,7 @@ js::CloneScript(JSContext *cx, HandleObject enclosingScope, HandleFunction fun, /* Now that all fallible allocation is complete, create the GC thing. */ CompileOptions options(cx); - options.setOriginPrincipals(src->originPrincipals()) + options.setMutedErrors(src->mutedErrors()) .setCompileAndGo(src->compileAndGo()) .setSelfHostingMode(src->selfHosted()) .setNoScriptRval(src->noScriptRval()) diff --git a/js/src/jsscript.h b/js/src/jsscript.h index cd72e7d9035c..f393b5280c24 100644 --- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -437,7 +437,7 @@ class ScriptSource mozilla::UniquePtr displayURL_; mozilla::UniquePtr sourceMapURL_; - JSPrincipals *originPrincipals_; + bool mutedErrors_; // bytecode offset in caller script that generated this code. // This is present for eval-ed code, as well as "new Function(...)"-introduced @@ -487,7 +487,7 @@ class ScriptSource filename_(nullptr), displayURL_(nullptr), sourceMapURL_(nullptr), - originPrincipals_(nullptr), + mutedErrors_(false), introductionOffset_(0), introducerFilename_(nullptr), introductionType_(nullptr), @@ -597,7 +597,7 @@ class ScriptSource return sourceMapURL_.get(); } - JSPrincipals *originPrincipals() const { return originPrincipals_; } + bool mutedErrors() const { return mutedErrors_; } bool hasIntroductionOffset() const { return hasIntroductionOffset_; } uint32_t introductionOffset() const { @@ -1410,7 +1410,7 @@ class JSScript : public js::gc::TenuredCell } js::ScriptSourceObject &scriptSourceUnwrap() const; js::ScriptSource *scriptSource() const; - JSPrincipals *originPrincipals() const { return scriptSource()->originPrincipals(); } + bool mutedErrors() const { return scriptSource()->mutedErrors(); } const char *filename() const { return scriptSource()->filename(); } public: @@ -1852,8 +1852,8 @@ class LazyScript : public gc::TenuredCell ScriptSource *scriptSource() const { return sourceObject()->source(); } - JSPrincipals *originPrincipals() const { - return scriptSource()->originPrincipals(); + bool mutedErrors() const { + return scriptSource()->mutedErrors(); } JSVersion version() const { JS_STATIC_ASSERT(JSVERSION_UNKNOWN == -1); @@ -2091,26 +2091,13 @@ enum LineOption { extern void DescribeScriptedCallerForCompilation(JSContext *cx, MutableHandleScript maybeScript, const char **file, unsigned *linenop, - uint32_t *pcOffset, JSPrincipals **origin, + uint32_t *pcOffset, bool *mutedErrors, LineOption opt = NOT_CALLED_FROM_JSOP_EVAL); bool CloneFunctionScript(JSContext *cx, HandleFunction original, HandleFunction clone, NewObjectKind newKind = GenericObject); -/* - * JSAPI clients are allowed to leave CompileOptions.originPrincipals nullptr in - * which case the JS engine sets options.originPrincipals = origin.principals. - * This normalization step must occur before the originPrincipals get stored in - * the JSScript/ScriptSource. - */ - -static inline JSPrincipals * -NormalizeOriginPrincipals(JSPrincipals *principals, JSPrincipals *originPrincipals) -{ - return originPrincipals ? originPrincipals : principals; -} - } /* namespace js */ // JS::ubi::Nodes can point to js::LazyScripts; they're js::gc::Cell instances diff --git a/js/src/proxy/Proxy.cpp b/js/src/proxy/Proxy.cpp index 6872e184ada2..59b54eeb6c20 100644 --- a/js/src/proxy/Proxy.cpp +++ b/js/src/proxy/Proxy.cpp @@ -321,6 +321,10 @@ Proxy::set(JSContext *cx, HandleObject proxy, HandleObject receiver, HandleId id if (desc.object() && desc.setter() && desc.setter() != JS_StrictPropertyStub) return CallSetter(cx, receiver, id, desc.setter(), desc.attributes(), strict, vp); + if (desc.isReadonly()) { + return strict ? Throw(cx, id, JSMSG_READ_ONLY) : true; + } + // Ok. Either there was no pre-existing property, or it was a value prop // that we're going to shadow. Make a property descriptor and define it. // diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 4ff44c1db70f..2abd5957cbc1 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -1267,7 +1267,7 @@ Evaluate(JSContext *cx, unsigned argc, jsval *vp) } if (loadBytecode) { - script = JS_DecodeScript(cx, loadBuffer, loadLength, options.originPrincipals(cx)); + script = JS_DecodeScript(cx, loadBuffer, loadLength); } else { mozilla::Range chars = codeChars.twoByteRange(); (void) JS::Compile(cx, global, options, chars.start().get(), chars.length(), &script); diff --git a/js/src/vm/ErrorObject.cpp b/js/src/vm/ErrorObject.cpp index d0d30f1d1995..39aef0b18134 100644 --- a/js/src/vm/ErrorObject.cpp +++ b/js/src/vm/ErrorObject.cpp @@ -76,9 +76,6 @@ js::ErrorObject::init(JSContext *cx, Handle obj, JSExnType type, if (message) obj->nativeSetSlotWithType(cx, messageShape, StringValue(message)); - if (report && report->originPrincipals) - JS_HoldPrincipals(report->originPrincipals); - return true; } diff --git a/js/src/vm/Stack.cpp b/js/src/vm/Stack.cpp index a8a46973decb..8f3a433e1216 100644 --- a/js/src/vm/Stack.cpp +++ b/js/src/vm/Stack.cpp @@ -973,17 +973,17 @@ FrameIter::computeLine(uint32_t *column) const MOZ_CRASH("Unexpected state"); } -JSPrincipals * -FrameIter::originPrincipals() const +bool +FrameIter::mutedErrors() const { switch (data_.state_) { case DONE: break; case INTERP: case JIT: - return script()->originPrincipals(); + return script()->mutedErrors(); case ASMJS: - return data_.activations_->asAsmJS()->module().scriptSource()->originPrincipals(); + return data_.activations_->asAsmJS()->module().scriptSource()->mutedErrors(); } MOZ_CRASH("Unexpected state"); diff --git a/js/src/vm/Stack.h b/js/src/vm/Stack.h index cb20f5a78cee..9b5d0e598ebf 100644 --- a/js/src/vm/Stack.h +++ b/js/src/vm/Stack.h @@ -1638,7 +1638,7 @@ class FrameIter const char *scriptFilename() const; unsigned computeLine(uint32_t *column = nullptr) const; JSAtom *functionDisplayAtom() const; - JSPrincipals *originPrincipals() const; + bool mutedErrors() const; bool hasScript() const { return !isAsmJS(); } diff --git a/js/src/vm/Xdr.cpp b/js/src/vm/Xdr.cpp index e877eff4a8b5..006e673e38a3 100644 --- a/js/src/vm/Xdr.cpp +++ b/js/src/vm/Xdr.cpp @@ -138,12 +138,10 @@ XDRState::codeConstValue(MutableHandleValue vp) return XDRScriptConst(this, vp); } -XDRDecoder::XDRDecoder(JSContext *cx, const void *data, uint32_t length, - JSPrincipals *originPrincipals) +XDRDecoder::XDRDecoder(JSContext *cx, const void *data, uint32_t length) : XDRState(cx) { buf.setData(data, length); - this->originPrincipals_ = originPrincipals; } template class js::XDRState; diff --git a/js/src/vm/Xdr.h b/js/src/vm/Xdr.h index 3a3d327cdf28..5315048e50cc 100644 --- a/js/src/vm/Xdr.h +++ b/js/src/vm/Xdr.h @@ -28,7 +28,7 @@ namespace js { * * https://developer.mozilla.org/en-US/docs/SpiderMonkey/Internals/Bytecode */ -static const uint32_t XDR_BYTECODE_VERSION = uint32_t(0xb973c0de - 184); +static const uint32_t XDR_BYTECODE_VERSION = uint32_t(0xb973c0de - 185); class XDRBuffer { public: @@ -100,21 +100,14 @@ class XDRState { XDRBuffer buf; protected: - JSPrincipals *originPrincipals_; - explicit XDRState(JSContext *cx) - : buf(cx), originPrincipals_(nullptr) { - } + : buf(cx) { } public: JSContext *cx() const { return buf.cx(); } - JSPrincipals *originPrincipals() const { - return originPrincipals_; - } - bool codeUint8(uint8_t *n) { if (mode == XDR_ENCODE) { uint8_t *ptr = buf.write(sizeof *n); @@ -260,8 +253,7 @@ class XDREncoder : public XDRState { class XDRDecoder : public XDRState { public: - XDRDecoder(JSContext *cx, const void *data, uint32_t length, - JSPrincipals *originPrincipals); + XDRDecoder(JSContext *cx, const void *data, uint32_t length); }; diff --git a/js/xpconnect/loader/mozJSLoaderUtils.cpp b/js/xpconnect/loader/mozJSLoaderUtils.cpp index 3159878ead4a..f4ba5f158c69 100644 --- a/js/xpconnect/loader/mozJSLoaderUtils.cpp +++ b/js/xpconnect/loader/mozJSLoaderUtils.cpp @@ -31,7 +31,7 @@ ReadCachedScript(StartupCache* cache, nsACString &uri, JSContext *cx, if (NS_FAILED(rv)) return rv; // don't warn since NOT_AVAILABLE is an ok error - scriptp.set(JS_DecodeScript(cx, buf, len, nullptr)); + scriptp.set(JS_DecodeScript(cx, buf, len)); if (!scriptp) return NS_ERROR_OUT_OF_MEMORY; return NS_OK; @@ -63,7 +63,6 @@ WriteCachedScript(StartupCache* cache, nsACString &uri, JSContext *cx, nsIPrincipal *systemPrincipal, HandleScript script) { MOZ_ASSERT(JS_GetScriptPrincipals(script) == nsJSPrincipals::get(systemPrincipal)); - MOZ_ASSERT(JS_GetScriptOriginPrincipals(script) == nsJSPrincipals::get(systemPrincipal)); uint32_t size; void *data = JS_EncodeScript(cx, script, &size); diff --git a/js/xpconnect/public/SandboxPrivate.h b/js/xpconnect/public/SandboxPrivate.h index f857de9413ec..b344b88fb2bb 100644 --- a/js/xpconnect/public/SandboxPrivate.h +++ b/js/xpconnect/public/SandboxPrivate.h @@ -49,11 +49,6 @@ public: ClearWrapper(); } - void ObjectMoved(JSObject *obj, const JSObject *old) - { - UpdateWrapper(obj, old); - } - private: virtual ~SandboxPrivate() { } diff --git a/js/xpconnect/src/Sandbox.cpp b/js/xpconnect/src/Sandbox.cpp index e82d60b2b389..b313781d0260 100644 --- a/js/xpconnect/src/Sandbox.cpp +++ b/js/xpconnect/src/Sandbox.cpp @@ -310,7 +310,7 @@ sandbox_resolve(JSContext *cx, HandleObject obj, HandleId id) } static void -sandbox_finalize(js::FreeOp *fop, JSObject *obj) +sandbox_finalize(JSFreeOp *fop, JSObject *obj) { nsIScriptObjectPrincipal *sop = static_cast(xpc_GetJSPrivate(obj)); @@ -324,15 +324,6 @@ sandbox_finalize(js::FreeOp *fop, JSObject *obj) DestroyProtoAndIfaceCache(obj); } -static void -sandbox_moved(JSObject *obj, const JSObject *old) -{ - nsIScriptObjectPrincipal *sop = - static_cast(xpc_GetJSPrivate(obj)); - MOZ_ASSERT(sop); - static_cast(sop)->ObjectMoved(obj, old); -} - static bool sandbox_convert(JSContext *cx, HandleObject obj, JSType type, MutableHandleValue vp) { @@ -452,42 +443,22 @@ sandbox_addProperty(JSContext *cx, HandleObject obj, HandleId id, MutableHandleV #define XPCONNECT_SANDBOX_CLASS_METADATA_SLOT (XPCONNECT_GLOBAL_EXTRA_SLOT_OFFSET) -static const js::Class SandboxClass = { +static const JSClass SandboxClass = { "Sandbox", XPCONNECT_GLOBAL_FLAGS_WITH_EXTRA_SLOTS(1), JS_PropertyStub, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub, sandbox_enumerate, sandbox_resolve, sandbox_convert, sandbox_finalize, - nullptr, nullptr, nullptr, JS_GlobalObjectTraceHook, - JS_NULL_CLASS_SPEC, - { - nullptr, /* outerObject */ - nullptr, /* innerObject */ - nullptr, /* iteratorObject */ - false, /* isWrappedNative */ - nullptr, /* weakmapKeyDelegateOp */ - sandbox_moved /* objectMovedOp */ - }, - JS_NULL_OBJECT_OPS + nullptr, nullptr, nullptr, JS_GlobalObjectTraceHook }; // Note to whomever comes here to remove addProperty hooks: billm has promised // to do the work for this class. -static const js::Class SandboxWriteToProtoClass = { +static const JSClass SandboxWriteToProtoClass = { "Sandbox", XPCONNECT_GLOBAL_FLAGS_WITH_EXTRA_SLOTS(1), sandbox_addProperty, JS_DeletePropertyStub, JS_PropertyStub, JS_StrictPropertyStub, sandbox_enumerate, sandbox_resolve, sandbox_convert, sandbox_finalize, - nullptr, nullptr, nullptr, JS_GlobalObjectTraceHook, - JS_NULL_CLASS_SPEC, - { - nullptr, /* outerObject */ - nullptr, /* innerObject */ - nullptr, /* iteratorObject */ - false, /* isWrappedNative */ - nullptr, /* weakmapKeyDelegateOp */ - sandbox_moved /* objectMovedOp */ - }, - JS_NULL_OBJECT_OPS + nullptr, nullptr, nullptr, JS_GlobalObjectTraceHook }; static const JSFunctionSpec SandboxFunctions[] = { @@ -500,7 +471,7 @@ static const JSFunctionSpec SandboxFunctions[] = { bool xpc::IsSandbox(JSObject *obj) { - const Class *clasp = GetObjectClass(obj); + const JSClass *clasp = GetObjectJSClass(obj); return clasp == &SandboxClass || clasp == &SandboxWriteToProtoClass; } @@ -890,11 +861,11 @@ xpc::CreateSandboxObject(JSContext *cx, MutableHandleValue vp, nsISupports *prin compartmentOptions.setAddonId(addonId); - const Class *clasp = options.writeToGlobalPrototype - ? &SandboxWriteToProtoClass - : &SandboxClass; + const JSClass *clasp = options.writeToGlobalPrototype + ? &SandboxWriteToProtoClass + : &SandboxClass; - RootedObject sandbox(cx, xpc::CreateGlobalObject(cx, js::Jsvalify(clasp), + RootedObject sandbox(cx, xpc::CreateGlobalObject(cx, clasp, principal, compartmentOptions)); if (!sandbox) return NS_ERROR_FAILURE; diff --git a/js/xpconnect/src/nsXPConnect.cpp b/js/xpconnect/src/nsXPConnect.cpp index a48921186d21..dd6c77dab440 100644 --- a/js/xpconnect/src/nsXPConnect.cpp +++ b/js/xpconnect/src/nsXPConnect.cpp @@ -187,38 +187,13 @@ nsXPConnect::IsISupportsDescendant(nsIInterfaceInfo* info) } void -xpc::ErrorReport::Init(JSErrorReport *aReport, - const char *aFallbackMessage, - nsIGlobalObject *aGlobal) +xpc::ErrorReport::Init(JSErrorReport *aReport, const char *aFallbackMessage, + bool aIsChrome, uint64_t aWindowID) { - MOZ_ASSERT(NS_IsMainThread()); - MOZ_ASSERT(aGlobal); + mCategory = aIsChrome ? NS_LITERAL_CSTRING("chrome javascript") + : NS_LITERAL_CSTRING("content javascript"); + mWindowID = aWindowID; - mGlobal = aGlobal; - mWindow = do_QueryInterface(mGlobal); - MOZ_ASSERT_IF(mWindow, mWindow->IsInnerWindow()); - - nsIPrincipal *prin = mGlobal->PrincipalOrNull(); - mIsChrome = nsContentUtils::IsSystemPrincipal(prin); - - InitInternal(aReport, aFallbackMessage); -} - -void -xpc::ErrorReport::InitOnWorkerThread(JSErrorReport *aReport, - const char *aFallbackMessage, - bool aIsChrome) -{ - MOZ_ASSERT(!NS_IsMainThread()); - mIsChrome = aIsChrome; - - InitInternal(aReport, aFallbackMessage); -} - -void -xpc::ErrorReport::InitInternal(JSErrorReport *aReport, - const char *aFallbackMessage) -{ const char16_t* m = static_cast(aReport->ucmessage); if (m) { JSFlatString* name = js::GetErrorTypeName(CycleCollectedJSRuntime::Get()->Runtime(), aReport->exnType); @@ -244,6 +219,7 @@ xpc::ErrorReport::InitInternal(JSErrorReport *aReport, mLineNumber = aReport->lineno; mColumn = aReport->column; mFlags = aReport->flags; + mIsMuted = aReport->isMuted; } #ifdef PR_LOGGING @@ -295,8 +271,8 @@ xpc::ErrorReport::LogToConsole() NS_ENSURE_TRUE_VOID(consoleService && errorObject); nsresult rv = errorObject->InitWithWindowID(mErrorMsg, mFileName, mSourceLine, - mLineNumber, mColumn, mFlags, Category(), - mWindow ? mWindow->WindowID() : 0); + mLineNumber, mColumn, mFlags, + mCategory, mWindowID); NS_ENSURE_SUCCESS_VOID(rv); consoleService->LogMessage(errorObject); @@ -1298,10 +1274,6 @@ nsXPConnect::NotifyDidPaint() return NS_OK; } -// Note - We used to have HAS_PRINCIPALS_FLAG = 1 here, so reusing that flag -// will require bumping the XDR version number. -static const uint8_t HAS_ORIGIN_PRINCIPALS_FLAG = 2; - static nsresult WriteScriptOrFunction(nsIObjectOutputStream *stream, JSContext *cx, JSScript *scriptArg, HandleObject functionObj) @@ -1315,28 +1287,11 @@ WriteScriptOrFunction(nsIObjectOutputStream *stream, JSContext *cx, script.set(JS_GetFunctionScript(cx, fun)); } - nsIPrincipal *principal = - nsJSPrincipals::get(JS_GetScriptPrincipals(script)); - nsIPrincipal *originPrincipal = - nsJSPrincipals::get(JS_GetScriptOriginPrincipals(script)); - - uint8_t flags = 0; - - // Optimize for the common case when originPrincipals == principals. As - // originPrincipals is set to principals when the former is null we can - // simply skip the originPrincipals when they are the same as principals. - if (originPrincipal && originPrincipal != principal) - flags |= HAS_ORIGIN_PRINCIPALS_FLAG; - + uint8_t flags = 0; // We don't have flags anymore. nsresult rv = stream->Write8(flags); if (NS_FAILED(rv)) return rv; - if (flags & HAS_ORIGIN_PRINCIPALS_FLAG) { - rv = stream->WriteObject(originPrincipal, true); - if (NS_FAILED(rv)) - return rv; - } uint32_t size; void* data; @@ -1370,16 +1325,11 @@ ReadScriptOrFunction(nsIObjectInputStream *stream, JSContext *cx, if (NS_FAILED(rv)) return rv; - nsJSPrincipals* originPrincipal = nullptr; - nsCOMPtr readOriginPrincipal; - if (flags & HAS_ORIGIN_PRINCIPALS_FLAG) { - nsCOMPtr supports; - rv = stream->ReadObject(true, getter_AddRefs(supports)); - if (NS_FAILED(rv)) - return rv; - readOriginPrincipal = do_QueryInterface(supports); - originPrincipal = nsJSPrincipals::get(readOriginPrincipal); - } + // We don't serialize mutedError-ness of scripts, which is fine as long as + // we only serialize system and XUL-y things. We can detect this by checking + // where the caller wants us to deserialize. + MOZ_RELEASE_ASSERT(nsContentUtils::IsCallerChrome() || + CurrentGlobalOrNull(cx) == xpc::CompilationScope()); uint32_t size; rv = stream->Read32(&size); @@ -1393,14 +1343,13 @@ ReadScriptOrFunction(nsIObjectInputStream *stream, JSContext *cx, { if (scriptp) { - JSScript *script = JS_DecodeScript(cx, data, size, originPrincipal); + JSScript *script = JS_DecodeScript(cx, data, size); if (!script) rv = NS_ERROR_OUT_OF_MEMORY; else *scriptp = script; } else { - JSObject *funobj = JS_DecodeInterpretedFunction(cx, data, size, - originPrincipal); + JSObject *funobj = JS_DecodeInterpretedFunction(cx, data, size); if (!funobj) rv = NS_ERROR_OUT_OF_MEMORY; else diff --git a/js/xpconnect/src/xpcpublic.h b/js/xpconnect/src/xpcpublic.h index 0f685ca22c1d..39204ab309f9 100644 --- a/js/xpconnect/src/xpcpublic.h +++ b/js/xpconnect/src/xpcpublic.h @@ -505,44 +505,37 @@ class ErrorReport { public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ErrorReport); - ErrorReport() : mIsChrome(false) + ErrorReport() : mWindowID(0) , mLineNumber(0) , mColumn(0) , mFlags(0) + , mIsMuted(false) {} void Init(JSErrorReport *aReport, const char *aFallbackMessage, - nsIGlobalObject *aGlobal); - void InitOnWorkerThread(JSErrorReport *aReport, const char *aFallbackMessage, - bool aIsChrome); - + bool aIsChrome, uint64_t aWindowID); void LogToConsole(); - private: - void InitInternal(JSErrorReport *aReport, const char *aFallbackMessage); - bool mIsChrome; - public: - const nsCString Category() { - return mIsChrome ? NS_LITERAL_CSTRING("chrome javascript") - : NS_LITERAL_CSTRING("content javascript"); - } + nsCString mCategory; nsString mErrorMsg; nsString mFileName; nsString mSourceLine; + uint64_t mWindowID; uint32_t mLineNumber; uint32_t mColumn; uint32_t mFlags; - - // These are both null for ErrorReports initialized on a worker thread. - nsCOMPtr mGlobal; - nsCOMPtr mWindow; + bool mIsMuted; private: ~ErrorReport() {} }; +void +DispatchScriptErrorEvent(nsPIDOMWindow *win, JSRuntime *rt, xpc::ErrorReport *xpcReport, + JS::Handle exception); + } // namespace xpc namespace mozilla { diff --git a/js/xpconnect/tests/chrome/test_nodelists.xul b/js/xpconnect/tests/chrome/test_nodelists.xul index 7517f727f4d2..7b91d7887579 100644 --- a/js/xpconnect/tests/chrome/test_nodelists.xul +++ b/js/xpconnect/tests/chrome/test_nodelists.xul @@ -21,17 +21,27 @@ var win = $('ifr').contentWindow; var list = win.document.getElementsByTagName('p'); is(list.length, 3, "can get the length"); - ok(list[0].toString().indexOf("[object HTMLParagraphElement") >= 0, "can get list[0]"); + ok(list[0] instanceof HTMLParagraphElement, "can get list[0]"); is(list[0], list.item(0), "list.item works"); is(list.item, list.item, "don't recreate functions for each get"); var list2 = list[2]; - ok(list[2].toString().indexOf("[object HTMLParagraphElement") >= 0, "list[2] exists"); + ok(list[2] instanceof HTMLParagraphElement, "list[2] exists"); ok("2" in list, "in operator works"); is(win.document.body.removeChild(win.document.body.lastChild), list2, "remove last paragraph element"); ok(!("2" in list), "in operator doesn't see phantom element"); is(list[2], undefined, "no node there!"); + + var optionList = win.document.createElement("select").options; + var option = win.document.createElement("option"); + optionList[0] = option; + is(optionList.item(0), option, "Creators work"); + + option = win.document.createElement("option"); + optionList[0] = option; + is(optionList.item(0), option, "Setters work"); + SimpleTest.finish(); } ]]> diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 2fdd00815b6a..5eb8097b708d 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -8,11 +8,10 @@ #include "AccessCheck.h" #include "WrapperFactory.h" -#include "nsIContent.h" #include "nsIControllers.h" +#include "nsDependentString.h" #include "nsIScriptError.h" #include "mozilla/dom/Element.h" -#include "nsContentUtils.h" #include "XPCWrapper.h" #include "xpcprivate.h" @@ -1053,9 +1052,6 @@ IsWindow(JSContext *cx, JSObject *wrapper) return !!AsWindow(cx, wrapper); } -static nsQueryInterface -do_QueryInterfaceNative(JSContext* cx, HandleObject wrapper); - void XPCWrappedNativeXrayTraits::preserveWrapper(JSObject *target) { @@ -1066,6 +1062,9 @@ XPCWrappedNativeXrayTraits::preserveWrapper(JSObject *target) ci->PreserveWrapper(wn->Native()); } +static bool +XrayToString(JSContext *cx, unsigned argc, JS::Value *vp); + bool XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wrapper, HandleObject holder, HandleId id, @@ -1139,8 +1138,21 @@ XPCWrappedNativeXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wr return true; } - if (!(iface = ccx.GetInterface()) || !(member = ccx.GetMember())) - return true; + if (!(iface = ccx.GetInterface()) || !(member = ccx.GetMember())) { + if (id != nsXPConnect::GetRuntimeInstance()->GetStringID(XPCJSRuntime::IDX_TO_STRING)) + return true; + + JSFunction *toString = JS_NewFunction(cx, XrayToString, 0, 0, holder, "toString"); + if (!toString) + return false; + + FillPropertyDescriptor(desc, wrapper, 0, + ObjectValue(*JS_GetFunctionObject(toString))); + + return JS_DefinePropertyById(cx, holder, id, desc.value(), desc.attributes(), + desc.getter(), desc.setter()) && + JS_GetPropertyDescriptorById(cx, holder, id, desc); + } desc.object().set(holder); desc.setAttributes(JSPROP_ENUMERATE); @@ -1280,15 +1292,6 @@ XrayTraits::resolveOwnProperty(JSContext *cx, const Wrapper &jsWrapper, return true; } -bool -XrayTraits::set(JSContext *cx, HandleObject wrapper, HandleObject receiver, HandleId id, - bool strict, MutableHandleValue vp) -{ - // Skip our Base if it isn't already BaseProxyHandler. - const js::BaseProxyHandler *handler = js::GetProxyHandler(wrapper); - return handler->js::BaseProxyHandler::set(cx, wrapper, receiver, id, strict, vp); -} - bool XPCWrappedNativeXrayTraits::resolveOwnProperty(JSContext *cx, const Wrapper &jsWrapper, HandleObject wrapper, HandleObject holder, @@ -1438,21 +1441,6 @@ XPCWrappedNativeXrayTraits::construct(JSContext *cx, HandleObject wrapper, } -bool -DOMXrayTraits::resolveNativeProperty(JSContext *cx, HandleObject wrapper, - HandleObject holder, HandleId id, - MutableHandle desc) -{ - bool unused; - RootedObject obj(cx, getTargetObject(wrapper)); - if (!XrayResolveNativeProperty(cx, wrapper, obj, id, desc, unused)) - return false; - - MOZ_ASSERT(!desc.object() || desc.object() == wrapper, "What did we resolve this on?"); - - return true; -} - bool DOMXrayTraits::resolveOwnProperty(JSContext *cx, const Wrapper &jsWrapper, HandleObject wrapper, HandleObject holder, HandleId id, @@ -1527,24 +1515,6 @@ DOMXrayTraits::defineProperty(JSContext *cx, HandleObject wrapper, HandleId id, return XrayDefineProperty(cx, wrapper, obj, id, desc, defined); } -bool -DOMXrayTraits::set(JSContext *cx, HandleObject wrapper, HandleObject receiver, HandleId id, - bool strict, MutableHandleValue vp) -{ - MOZ_ASSERT(xpc::WrapperFactory::IsXrayWrapper(wrapper)); - RootedObject obj(cx, getTargetObject(wrapper)); - if (IsDOMProxy(obj)) { - const DOMProxyHandler* handler = GetDOMProxyHandler(obj); - - bool done; - if (!handler->setCustom(cx, obj, id, vp, &done)) - return false; - if (done) - return true; - } - return XrayTraits::set(cx, wrapper, receiver, id, strict, vp); -} - bool DOMXrayTraits::enumerateNames(JSContext *cx, HandleObject wrapper, unsigned flags, AutoIdVector &props) @@ -1608,6 +1578,14 @@ DOMXrayTraits::construct(JSContext *cx, HandleObject wrapper, return true; } +bool +DOMXrayTraits::getPrototypeOf(JSContext *cx, JS::HandleObject wrapper, + JS::HandleObject target, + JS::MutableHandleObject protop) +{ + return mozilla::dom::XrayGetNativeProto(cx, target, protop); +} + void DOMXrayTraits::preserveWrapper(JSObject *target) { @@ -1701,11 +1679,7 @@ XrayToString(JSContext *cx, unsigned argc, Value *vp) } RootedObject obj(cx, XrayTraits::getTargetObject(wrapper)); - XrayType type = GetXrayType(obj); - if (type == XrayForDOMObject) - return NativeToString(cx, wrapper, obj, args.rval()); - - if (type != XrayForWrappedNative) { + if (GetXrayType(obj) != XrayForWrappedNative) { JS_ReportError(cx, "XrayToString called on an incompatible object"); return false; } @@ -1735,43 +1709,6 @@ XrayToString(JSContext *cx, unsigned argc, Value *vp) return true; } -#ifdef DEBUG - -static void -DEBUG_CheckXBLCallable(JSContext *cx, JSObject *obj) -{ - // In general, we shouldn't have cross-compartment wrappers here, because - // we should be running in an XBL scope, and the content prototype should - // contain wrappers to functions defined in the XBL scope. But if the node - // has been adopted into another compartment, those prototypes will now point - // to a different XBL scope (which is ok). - MOZ_ASSERT_IF(js::IsCrossCompartmentWrapper(obj), - xpc::IsContentXBLScope(js::GetObjectCompartment(js::UncheckedUnwrap(obj)))); - MOZ_ASSERT(JS::IsCallable(obj)); -} - -static void -DEBUG_CheckXBLLookup(JSContext *cx, JSPropertyDescriptor *desc) -{ - if (!desc->obj) - return; - if (!desc->value.isUndefined()) { - MOZ_ASSERT(desc->value.isObject()); - DEBUG_CheckXBLCallable(cx, &desc->value.toObject()); - } - if (desc->getter) { - MOZ_ASSERT(desc->attrs & JSPROP_GETTER); - DEBUG_CheckXBLCallable(cx, JS_FUNC_TO_DATA_PTR(JSObject *, desc->getter)); - } - if (desc->setter) { - MOZ_ASSERT(desc->attrs & JSPROP_SETTER); - DEBUG_CheckXBLCallable(cx, JS_FUNC_TO_DATA_PTR(JSObject *, desc->setter)); - } -} -#else -#define DEBUG_CheckXBLLookup(a, b) {} -#endif - template bool XrayWrapper::isExtensible(JSContext *cx, JS::Handle wrapper, @@ -1869,44 +1806,6 @@ XrayWrapper::getPropertyDescriptor(JSContext *cx, HandleObject wra } } - if (!desc.object() && - id == nsXPConnect::GetRuntimeInstance()->GetStringID(XPCJSRuntime::IDX_TO_STRING)) - { - - JSFunction *toString = JS_NewFunction(cx, XrayToString, 0, 0, wrapper, "toString"); - if (!toString) - return false; - - desc.object().set(wrapper); - desc.setAttributes(0); - desc.setGetter(nullptr); - desc.setSetter(nullptr); - desc.value().setObject(*JS_GetFunctionObject(toString)); - } - - // If we're a special scope for in-content XBL, our script expects to see - // the bound XBL methods and attributes when accessing content. However, - // these members are implemented in content via custom-spliced prototypes, - // and thus aren't visible through Xray wrappers unless we handle them - // explicitly. So we check if we're running in such a scope, and if so, - // whether the wrappee is a bound element. If it is, we do a lookup via - // specialized XBL machinery. - // - // While we have to do some sketchy walking through content land, we should - // be protected by read-only/non-configurable properties, and any functions - // we end up with should _always_ be living in an XBL scope (usually ours, - // but could be another if the node has been adopted). - // - // Make sure to assert this. - nsCOMPtr content; - if (!desc.object() && ObjectScope(wrapper)->IsContentXBLScope() && - (content = do_QueryInterfaceNative(cx, wrapper))) - { - if (!nsContentUtils::LookupBindingMember(cx, content, id, desc)) - return false; - DEBUG_CheckXBLLookup(cx, desc.address()); - } - // If we still have nothing, we're done. if (!desc.object()) return true; @@ -2135,10 +2034,11 @@ XrayWrapper::set(JSContext *cx, HandleObject wrapper, HandleObject receiver, HandleId id, bool strict, MutableHandleValue vp) const { - // Delegate to Traits. + MOZ_ASSERT(!Traits::HasPrototype); + // Skip our Base if it isn't already BaseProxyHandler. // NB: None of the functions we call are prepared for the receiver not // being the wrapper, so ignore the receiver here. - return Traits::set(cx, wrapper, Traits::HasPrototype ? receiver : wrapper, id, strict, vp); + return js::BaseProxyHandler::set(cx, wrapper, wrapper, id, strict, vp); } template @@ -2306,25 +2206,4 @@ template<> const SCSecurityXrayXPCWN SCSecurityXrayXPCWN::singleton(0); template class SCSecurityXrayXPCWN; -static nsQueryInterface -do_QueryInterfaceNative(JSContext* cx, HandleObject wrapper) -{ - nsISupports* nativeSupports = nullptr; - if (IsWrapper(wrapper) && WrapperFactory::IsXrayWrapper(wrapper)) { - RootedObject target(cx, XrayTraits::getTargetObject(wrapper)); - XrayType type = GetXrayType(target); - if (type == XrayForDOMObject) { - nativeSupports = UnwrapDOMObjectToISupports(target); - } else if (type == XrayForWrappedNative) { - XPCWrappedNative *wn = XPCWrappedNative::Get(target); - nativeSupports = wn->Native(); - } - } else { - nsIXPConnect *xpc = nsXPConnect::XPConnect(); - nativeSupports = xpc->GetNativeOfWrapper(cx, wrapper); - } - - return nsQueryInterface(nativeSupports); -} - } diff --git a/js/xpconnect/wrappers/XrayWrapper.h b/js/xpconnect/wrappers/XrayWrapper.h index 8a2dc9d3cd04..0a440599049a 100644 --- a/js/xpconnect/wrappers/XrayWrapper.h +++ b/js/xpconnect/wrappers/XrayWrapper.h @@ -80,9 +80,6 @@ public: virtual void preserveWrapper(JSObject *target) = 0; - static bool set(JSContext *cx, JS::HandleObject wrapper, JS::HandleObject receiver, JS::HandleId id, - bool strict, JS::MutableHandleValue vp); - JSObject* getExpandoObject(JSContext *cx, JS::HandleObject target, JS::HandleObject consumer); JSObject* ensureExpandoObject(JSContext *cx, JS::HandleObject wrapper, @@ -154,22 +151,32 @@ class DOMXrayTraits : public XrayTraits { public: enum { - HasPrototype = 0 + HasPrototype = 1 }; static const XrayType Type = XrayForDOMObject; virtual bool resolveNativeProperty(JSContext *cx, JS::HandleObject wrapper, JS::HandleObject holder, JS::HandleId id, - JS::MutableHandle desc) MOZ_OVERRIDE; + JS::MutableHandle desc) MOZ_OVERRIDE + { + // Xrays for DOM binding objects have a prototype chain that consists of + // Xrays for the prototypes of the DOM binding object (ignoring changes + // in the prototype chain made by script, plugins or XBL). All properties for + // these Xrays are really own properties, either of the instance object or + // of the prototypes. + // FIXME https://bugzilla.mozilla.org/show_bug.cgi?id=1072482 + // This should really be: + // MOZ_CRASH("resolveNativeProperty hook should never be called with HasPrototype = 1"); + // but we can't do that yet because XrayUtils::HasNativeProperty calls this. + return true; + } virtual bool resolveOwnProperty(JSContext *cx, const js::Wrapper &jsWrapper, JS::HandleObject wrapper, JS::HandleObject holder, JS::HandleId id, JS::MutableHandle desc) MOZ_OVERRIDE; bool defineProperty(JSContext *cx, JS::HandleObject wrapper, JS::HandleId id, JS::MutableHandle desc, JS::Handle existingDesc, bool *defined); - static bool set(JSContext *cx, JS::HandleObject wrapper, JS::HandleObject receiver, JS::HandleId id, - bool strict, JS::MutableHandleValue vp); virtual bool enumerateNames(JSContext *cx, JS::HandleObject wrapper, unsigned flags, JS::AutoIdVector &props); static bool call(JSContext *cx, JS::HandleObject wrapper, @@ -177,6 +184,10 @@ public: static bool construct(JSContext *cx, JS::HandleObject wrapper, const JS::CallArgs &args, const js::Wrapper& baseInstance); + static bool getPrototypeOf(JSContext *cx, JS::HandleObject wrapper, + JS::HandleObject target, + JS::MutableHandleObject protop); + virtual void preserveWrapper(JSObject *target) MOZ_OVERRIDE; virtual JSObject* createHolder(JSContext *cx, JSObject *wrapper) MOZ_OVERRIDE; diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 4263290719a2..b1c9eddc3454 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -1337,7 +1337,7 @@ nsCSSRendering::PaintBoxShadowOuter(nsPresContext* aPresContext, renderContext->Rectangle(frameGfxRect); } - renderContext->SetFillRule(gfxContext::FILL_RULE_EVEN_ODD); + renderContext->SetFillRule(FillRule::FILL_EVEN_ODD); renderContext->Clip(); // Clip the shadow so that we only get the part that applies to aForFrame. @@ -1560,7 +1560,7 @@ nsCSSRendering::PaintBoxShadowInner(nsPresContext* aPresContext, shadowContext->RoundedRectangle(shadowClipGfxRect, clipRectRadii, false); else shadowContext->Rectangle(shadowClipGfxRect); - shadowContext->SetFillRule(gfxContext::FILL_RULE_EVEN_ODD); + shadowContext->SetFillRule(FillRule::FILL_EVEN_ODD); shadowContext->Fill(); blurringArea.DoPaint(); @@ -4699,6 +4699,7 @@ nsImageRenderer::DrawableForElement(const nsRect& aImageRect, nsRefPtr drawable = nsSVGIntegrationUtils::DrawableFromPaintServer( mPaintServerFrame, mForFrame, mSize, imageSize, + aRenderingContext.GetDrawTarget(), aRenderingContext.ThebesContext()->CurrentMatrix(), mFlags & FLAG_SYNC_DECODE_IMAGES ? nsSVGIntegrationUtils::FLAG_SYNC_DECODE_IMAGES diff --git a/layout/base/nsCounterManager.cpp b/layout/base/nsCounterManager.cpp index 342e207e8c48..3e5094b59f74 100644 --- a/layout/base/nsCounterManager.cpp +++ b/layout/base/nsCounterManager.cpp @@ -48,8 +48,17 @@ nsCounterUseNode::GetCounterStyle() { if (!mCounterStyle) { const nsCSSValue& style = mCounterFunction->Item(mAllCounters ? 2 : 1); - mCounterStyle = mPresContext->CounterStyleManager()-> - BuildCounterStyle(nsDependentString(style.GetStringBufferValue())); + CounterStyleManager* manager = mPresContext->CounterStyleManager(); + if (style.GetUnit() == eCSSUnit_Ident) { + nsString ident; + style.GetStringValue(ident); + mCounterStyle = manager->BuildCounterStyle(ident); + } else if (style.GetUnit() == eCSSUnit_Symbols) { + mCounterStyle = manager->BuildCounterStyle(style.GetArrayValue()); + } else { + NS_NOTREACHED("Unknown counter style"); + mCounterStyle = CounterStyleManager::GetDecimalStyle(); + } } return mCounterStyle; } diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index af1560b7c23f..37076b0b4c2d 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -607,6 +607,22 @@ nsLayoutUtils::CSSFiltersEnabled() return sCSSFiltersEnabled; } +bool +nsLayoutUtils::CSSClipPathShapesEnabled() +{ + static bool sCSSClipPathShapesEnabled; + static bool sCSSClipPathShapesPrefCached = false; + + if (!sCSSClipPathShapesPrefCached) { + sCSSClipPathShapesPrefCached = true; + Preferences::AddBoolVarCache(&sCSSClipPathShapesEnabled, + "layout.css.clip-path-shapes.enabled", + false); + } + + return sCSSClipPathShapesEnabled; +} + bool nsLayoutUtils::UnsetValueEnabled() { diff --git a/layout/base/nsLayoutUtils.h b/layout/base/nsLayoutUtils.h index 01d87e74eb72..2dec2e6a9ef4 100644 --- a/layout/base/nsLayoutUtils.h +++ b/layout/base/nsLayoutUtils.h @@ -1929,6 +1929,11 @@ public: */ static bool CSSFiltersEnabled(); + /** + * Checks if we should enable parsing for CSS clip-path basic shapes. + */ + static bool CSSClipPathShapesEnabled(); + /** * Checks whether support for the CSS-wide "unset" value is enabled. */ diff --git a/layout/reftests/bugs/801681-1-ref.html b/layout/reftests/bugs/801681-1-ref.html deleted file mode 100644 index 718eda20eb66..000000000000 --- a/layout/reftests/bugs/801681-1-ref.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - Bug 801681 - - -

� This line should be green

- - diff --git a/layout/reftests/bugs/801681-1.html b/layout/reftests/bugs/801681-1.html deleted file mode 100644 index 40f64ec03a5a..000000000000 --- a/layout/reftests/bugs/801681-1.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - Bug 801681 - - -

~ This line should be green

- \ No newline at end of file diff --git a/layout/reftests/bugs/801681-2-ref.html b/layout/reftests/bugs/801681-2-ref.html deleted file mode 100644 index 541eb24a90df..000000000000 --- a/layout/reftests/bugs/801681-2-ref.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Bug 801681 - - -

火狐

- - diff --git a/layout/reftests/bugs/801681-2.html b/layout/reftests/bugs/801681-2.html deleted file mode 100644 index e1c07fcb8d76..000000000000 --- a/layout/reftests/bugs/801681-2.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Bug 801681 - - -

~{;p:|~ ~ ~ ~ ~ ~}

- - diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 02d53faec612..15b1ada57ef1 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -1736,8 +1736,6 @@ random-if(Android&&AndroidVersion<15) == 776265-1a.html 776265-1-ref.html == 796847-1.svg 796847-1-ref.svg fuzzy(40,850) fuzzy-if(azureQuartz,73,542) == 797797-1.html 797797-1-ref.html # 'opacity:N' and rgba(,,,N) text don't match precisely fuzzy(40,850) fuzzy-if(azureQuartz,68,586) == 797797-2.html 797797-2-ref.html # 'opacity:N' and rgba(,,,N) text don't match precisely -== 801681-1.html 801681-1-ref.html -== 801681-2.html 801681-2-ref.html == 801994-1.html 801994-1-ref.html == 804323-1.html 804323-1-ref.html fuzzy-if(Android,8,608) == 811301-1.html 811301-1-ref.html diff --git a/layout/reftests/counter-style/reftest.list b/layout/reftests/counter-style/reftest.list index f50fe7f5d6cd..5aad57b218ee 100644 --- a/layout/reftests/counter-style/reftest.list +++ b/layout/reftests/counter-style/reftest.list @@ -31,3 +31,5 @@ fails-if(B2G) == descriptor-suffix.html descriptor-suffix-ref.html # B2G kerni == redefine-builtin.html redefine-builtin-ref.html == redefine-attr-mapping.html redefine-attr-mapping-ref.html == disclosure-styles.html disclosure-styles-ref.html +== symbols-function.html symbols-function-ref.html +== symbols-function-invalid.html symbols-function-invalid-ref.html diff --git a/layout/reftests/counter-style/symbols-function-invalid-ref.html b/layout/reftests/counter-style/symbols-function-invalid-ref.html new file mode 100644 index 000000000000..a2f2f0107a6f --- /dev/null +++ b/layout/reftests/counter-style/symbols-function-invalid-ref.html @@ -0,0 +1,11 @@ + + + +
    +
  1. +
  2. +
diff --git a/layout/reftests/counter-style/symbols-function-invalid.html b/layout/reftests/counter-style/symbols-function-invalid.html new file mode 100644 index 000000000000..eded7ed91111 --- /dev/null +++ b/layout/reftests/counter-style/symbols-function-invalid.html @@ -0,0 +1,18 @@ + + + +
    +
  1. +
  2. +
diff --git a/layout/reftests/counter-style/symbols-function-ref.html b/layout/reftests/counter-style/symbols-function-ref.html new file mode 100644 index 000000000000..9383c4310460 --- /dev/null +++ b/layout/reftests/counter-style/symbols-function-ref.html @@ -0,0 +1,86 @@ + + + +
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
+
    +
  1. +
  2. +
diff --git a/layout/reftests/counter-style/symbols-function.html b/layout/reftests/counter-style/symbols-function.html new file mode 100644 index 000000000000..442e07f9089d --- /dev/null +++ b/layout/reftests/counter-style/symbols-function.html @@ -0,0 +1,67 @@ + + + +
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
  2. +
+
    +
  1. +
+
    +
  1. +
  2. +
diff --git a/layout/reftests/svg/as-image/reftest.list b/layout/reftests/svg/as-image/reftest.list index 62eb687a2005..1616e0f0675a 100644 --- a/layout/reftests/svg/as-image/reftest.list +++ b/layout/reftests/svg/as-image/reftest.list @@ -71,7 +71,7 @@ random == img-and-image-1.html img-and-image-1-ref.svg # bug 645267 # More complex tests == img-blobURI-1.html lime100x100-ref.html random == img-blobURI-2.html lime100x100-ref.html -== img-content-outside-viewBox-1.html img-content-outside-viewBox-1-ref.html +fuzzy-if(d2d,16,10) == img-content-outside-viewBox-1.html img-content-outside-viewBox-1-ref.html # d2d is bug 1074161 == img-display-none-1.html about:blank == img-dyn-1.html img-dyn-1-ref.html == img-foreignObject-1.html lime100x100-ref.html diff --git a/layout/style/CounterStyleManager.cpp b/layout/style/CounterStyleManager.cpp index fabf666e462f..cb905331ea6f 100644 --- a/layout/style/CounterStyleManager.cpp +++ b/layout/style/CounterStyleManager.cpp @@ -542,6 +542,37 @@ EthiopicToText(CounterValue aOrdinal, nsSubstring& aResult) return true; } +static uint8_t +GetDefaultSpeakAsForSystem(uint8_t aSystem) +{ + NS_ABORT_IF_FALSE(aSystem != NS_STYLE_COUNTER_SYSTEM_EXTENDS, + "Extends system does not have static default speak-as"); + switch (aSystem) { + case NS_STYLE_COUNTER_SYSTEM_ALPHABETIC: + return NS_STYLE_COUNTER_SPEAKAS_SPELL_OUT; + case NS_STYLE_COUNTER_SYSTEM_CYCLIC: + return NS_STYLE_COUNTER_SPEAKAS_BULLETS; + default: + return NS_STYLE_COUNTER_SPEAKAS_NUMBERS; + } +} + +static bool +SystemUsesNegativeSign(uint8_t aSystem) +{ + NS_ABORT_IF_FALSE(aSystem != NS_STYLE_COUNTER_SYSTEM_EXTENDS, + "Cannot check this for extending style"); + switch (aSystem) { + case NS_STYLE_COUNTER_SYSTEM_SYMBOLIC: + case NS_STYLE_COUNTER_SYSTEM_ALPHABETIC: + case NS_STYLE_COUNTER_SYSTEM_NUMERIC: + case NS_STYLE_COUNTER_SYSTEM_ADDITIVE: + return true; + default: + return false; + } +} + class BuiltinCounterStyle : public CounterStyle { public: @@ -576,10 +607,6 @@ public: virtual uint8_t GetSpeakAs() MOZ_OVERRIDE; virtual bool UseNegativeSign() MOZ_OVERRIDE; - virtual void CallFallbackStyle(CounterValue aOrdinal, - WritingMode aWritingMode, - nsSubstring& aResult, - bool& aIsRTL) MOZ_OVERRIDE; virtual bool GetInitialCounterText(CounterValue aOrdinal, WritingMode aWritingMode, nsSubstring& aResult, @@ -846,15 +873,6 @@ BuiltinCounterStyle::UseNegativeSign() } } -/* virtual */ void -BuiltinCounterStyle::CallFallbackStyle(CounterValue aOrdinal, - WritingMode aWritingMode, - nsSubstring& aResult, - bool& aIsRTL) -{ - GetFallback()->GetCounterText(aOrdinal, aWritingMode, aResult, aIsRTL); -} - /* virtual */ bool BuiltinCounterStyle::GetInitialCounterText(CounterValue aOrdinal, WritingMode aWritingMode, @@ -1355,17 +1373,10 @@ CustomCounterStyle::GetSpeakAs() /* virtual */ bool CustomCounterStyle::UseNegativeSign() { - switch (mSystem) { - case NS_STYLE_COUNTER_SYSTEM_SYMBOLIC: - case NS_STYLE_COUNTER_SYSTEM_ALPHABETIC: - case NS_STYLE_COUNTER_SYSTEM_NUMERIC: - case NS_STYLE_COUNTER_SYSTEM_ADDITIVE: - return true; - case NS_STYLE_COUNTER_SYSTEM_EXTENDS: - return GetExtendsRoot()->UseNegativeSign(); - default: - return false; + if (mSystem == NS_STYLE_COUNTER_SYSTEM_EXTENDS) { + return GetExtendsRoot()->UseNegativeSign(); } + return SystemUsesNegativeSign(mSystem); } /* virtual */ void @@ -1456,14 +1467,7 @@ CustomCounterStyle::GetSpeakAsAutoValue() } system = static_cast(root)->mSystem; } - switch (system) { - case NS_STYLE_COUNTER_SYSTEM_ALPHABETIC: - return NS_STYLE_COUNTER_SPEAKAS_SPELL_OUT; - case NS_STYLE_COUNTER_SYSTEM_CYCLIC: - return NS_STYLE_COUNTER_SPEAKAS_BULLETS; - default: - return NS_STYLE_COUNTER_SPEAKAS_NUMBERS; - } + return GetDefaultSpeakAsForSystem(system); } // This method corresponds to the first stage of computation of the @@ -1651,6 +1655,119 @@ CustomCounterStyle::GetExtendsRoot() return mExtendsRoot; } +AnonymousCounterStyle::AnonymousCounterStyle(const nsCSSValue::Array* aParams) + : CounterStyle(NS_STYLE_LIST_STYLE_CUSTOM) +{ + mSystem = aParams->Item(0).GetIntValue(); + for (const nsCSSValueList* item = aParams->Item(1).GetListValue(); + item; item = item->mNext) { + item->mValue.GetStringValue(*mSymbols.AppendElement()); + } + mSymbols.Compact(); +} + +/* virtual */ void +AnonymousCounterStyle::GetPrefix(nsAString& aResult) +{ + aResult.Truncate(); +} + +/* virtual */ void +AnonymousCounterStyle::GetSuffix(nsAString& aResult) +{ + aResult = ' '; +} + +/* virtual */ bool +AnonymousCounterStyle::IsBullet() +{ + switch (mSystem) { + case NS_STYLE_COUNTER_SYSTEM_CYCLIC: + // Only use ::-moz-list-bullet for cyclic system + return true; + default: + return false; + } +} + +/* virtual */ void +AnonymousCounterStyle::GetNegative(NegativeType& aResult) +{ + aResult.before.AssignLiteral(MOZ_UTF16("-")); + aResult.after.Truncate(); +} + +/* virtual */ bool +AnonymousCounterStyle::IsOrdinalInRange(CounterValue aOrdinal) +{ + switch (mSystem) { + case NS_STYLE_COUNTER_SYSTEM_CYCLIC: + case NS_STYLE_COUNTER_SYSTEM_NUMERIC: + case NS_STYLE_COUNTER_SYSTEM_FIXED: + return true; + case NS_STYLE_COUNTER_SYSTEM_ALPHABETIC: + case NS_STYLE_COUNTER_SYSTEM_SYMBOLIC: + return aOrdinal >= 1; + default: + NS_NOTREACHED("Invalid system."); + return false; + } +} + +/* virtual */ bool +AnonymousCounterStyle::IsOrdinalInAutoRange(CounterValue aOrdinal) +{ + return AnonymousCounterStyle::IsOrdinalInRange(aOrdinal); +} + +/* virtual */ void +AnonymousCounterStyle::GetPad(PadType& aResult) +{ + aResult.width = 0; + aResult.symbol.Truncate(); +} + +/* virtual */ CounterStyle* +AnonymousCounterStyle::GetFallback() +{ + return CounterStyleManager::GetDecimalStyle(); +} + +/* virtual */ uint8_t +AnonymousCounterStyle::GetSpeakAs() +{ + return GetDefaultSpeakAsForSystem(mSystem); +} + +/* virtual */ bool +AnonymousCounterStyle::UseNegativeSign() +{ + return SystemUsesNegativeSign(mSystem); +} + +/* virtual */ bool +AnonymousCounterStyle::GetInitialCounterText(CounterValue aOrdinal, + WritingMode aWritingMode, + nsAString& aResult, + bool& aIsRTL) +{ + switch (mSystem) { + case NS_STYLE_COUNTER_SYSTEM_CYCLIC: + return GetCyclicCounterText(aOrdinal, aResult, mSymbols); + case NS_STYLE_COUNTER_SYSTEM_FIXED: + return GetFixedCounterText(aOrdinal, aResult, 1, mSymbols); + case NS_STYLE_COUNTER_SYSTEM_SYMBOLIC: + return GetSymbolicCounterText(aOrdinal, aResult, mSymbols); + case NS_STYLE_COUNTER_SYSTEM_ALPHABETIC: + return GetAlphabeticCounterText(aOrdinal, aResult, mSymbols); + case NS_STYLE_COUNTER_SYSTEM_NUMERIC: + return GetNumericCounterText(aOrdinal, aResult, mSymbols); + default: + NS_NOTREACHED("Invalid system."); + return false; + } +} + bool CounterStyle::IsDependentStyle() const { @@ -1782,6 +1899,15 @@ CounterStyle::GetSpokenCounterText(CounterValue aOrdinal, } } +/* virtual */ void +CounterStyle::CallFallbackStyle(CounterValue aOrdinal, + WritingMode aWritingMode, + nsAString& aResult, + bool& aIsRTL) +{ + GetFallback()->GetCounterText(aOrdinal, aWritingMode, aResult, aIsRTL); +} + static BuiltinCounterStyle gBuiltinStyleTable[NS_STYLE_LIST_STYLE__MAX]; CounterStyleManager::CounterStyleManager(nsPresContext* aPresContext) @@ -1861,6 +1987,12 @@ CounterStyleManager::BuildCounterStyle(const nsSubstring& aName) return data; } +CounterStyle* +CounterStyleManager::BuildCounterStyle(const nsCSSValue::Array* aParams) +{ + return new AnonymousCounterStyle(aParams); +} + /* static */ CounterStyle* CounterStyleManager::GetBuiltinStyle(int32_t aStyle) { diff --git a/layout/style/CounterStyleManager.h b/layout/style/CounterStyleManager.h index a6530cf1ae86..53325203ff16 100644 --- a/layout/style/CounterStyleManager.h +++ b/layout/style/CounterStyleManager.h @@ -15,6 +15,8 @@ #include "mozilla/NullPtr.h" #include "mozilla/Attributes.h" +#include "nsCSSValue.h" + class nsPresContext; class nsCSSCounterStyleRule; @@ -25,6 +27,7 @@ class WritingMode; typedef int32_t CounterValue; class CounterStyleManager; +class AnonymousCounterStyle; struct NegativeType; struct PadType; @@ -86,12 +89,14 @@ public: virtual void CallFallbackStyle(CounterValue aOrdinal, WritingMode aWritingMode, nsSubstring& aResult, - bool& aIsRTL) = 0; + bool& aIsRTL); virtual bool GetInitialCounterText(CounterValue aOrdinal, WritingMode aWritingMode, nsSubstring& aResult, bool& aIsRTL) = 0; + virtual AnonymousCounterStyle* AsAnonymous() { return nullptr; } + NS_IMETHOD_(MozExternalRefCountType) AddRef() = 0; NS_IMETHOD_(MozExternalRefCountType) Release() = 0; @@ -99,6 +104,42 @@ protected: int32_t mStyle; }; +class AnonymousCounterStyle MOZ_FINAL : public CounterStyle +{ +public: + AnonymousCounterStyle(const nsCSSValue::Array* aValue); + + virtual void GetPrefix(nsAString& aResult) MOZ_OVERRIDE; + virtual void GetSuffix(nsAString& aResult) MOZ_OVERRIDE; + virtual bool IsBullet() MOZ_OVERRIDE; + + virtual void GetNegative(NegativeType& aResult) MOZ_OVERRIDE; + virtual bool IsOrdinalInRange(CounterValue aOrdinal) MOZ_OVERRIDE; + virtual bool IsOrdinalInAutoRange(CounterValue aOrdinal) MOZ_OVERRIDE; + virtual void GetPad(PadType& aResult) MOZ_OVERRIDE; + virtual CounterStyle* GetFallback() MOZ_OVERRIDE; + virtual uint8_t GetSpeakAs() MOZ_OVERRIDE; + virtual bool UseNegativeSign() MOZ_OVERRIDE; + + virtual bool GetInitialCounterText(CounterValue aOrdinal, + WritingMode aWritingMode, + nsSubstring& aResult, + bool& aIsRTL) MOZ_OVERRIDE; + + virtual AnonymousCounterStyle* AsAnonymous() MOZ_OVERRIDE { return this; } + + uint8_t GetSystem() const { return mSystem; } + const nsTArray& GetSymbols() const { return mSymbols; } + + NS_INLINE_DECL_REFCOUNTING(AnonymousCounterStyle) + +private: + ~AnonymousCounterStyle() {} + + uint8_t mSystem; + nsTArray mSymbols; +}; + class CounterStyleManager MOZ_FINAL { private: @@ -117,6 +158,7 @@ public: } CounterStyle* BuildCounterStyle(const nsSubstring& aName); + CounterStyle* BuildCounterStyle(const nsCSSValue::Array* aParams); static CounterStyle* GetBuiltinStyle(int32_t aStyle); static CounterStyle* GetNoneStyle() diff --git a/layout/style/nsCSSKeywordList.h b/layout/style/nsCSSKeywordList.h index f729ef4c6e7c..fc6cbf7d3462 100644 --- a/layout/style/nsCSSKeywordList.h +++ b/layout/style/nsCSSKeywordList.h @@ -257,6 +257,7 @@ CSS_KEY(fantasy, fantasy) CSS_KEY(farthest-side, farthest_side) CSS_KEY(farthest-corner, farthest_corner) CSS_KEY(fill, fill) +CSS_KEY(fill-box, fill_box) CSS_KEY(fixed, fixed) CSS_KEY(flat, flat) CSS_KEY(flex, flex) @@ -404,6 +405,7 @@ CSS_KEY(perspective, perspective) CSS_KEY(petite-caps, petite_caps) CSS_KEY(physical, physical) CSS_KEY(pointer, pointer) +CSS_KEY(polygon, polygon) CSS_KEY(portrait, portrait) CSS_KEY(pre, pre) CSS_KEY(pre-wrap, pre_wrap) @@ -503,6 +505,7 @@ CSS_KEY(stretch, stretch) CSS_KEY(stretch-to-fit, stretch_to_fit) CSS_KEY(stretched, stretched) CSS_KEY(stroke, stroke) +CSS_KEY(stroke-box, stroke_box) CSS_KEY(style, style) CSS_KEY(styleset, styleset) CSS_KEY(stylistic, stylistic) @@ -558,6 +561,7 @@ CSS_KEY(vertical, vertical) CSS_KEY(vertical-lr, vertical_lr) CSS_KEY(vertical-rl, vertical_rl) CSS_KEY(vertical-text, vertical_text) +CSS_KEY(view-box, view_box) CSS_KEY(visible, visible) CSS_KEY(visiblefill, visiblefill) CSS_KEY(visiblepainted, visiblepainted) @@ -723,6 +727,7 @@ CSS_KEY(reset-size, reset_size) //CSS_KEY(start, start) CSS_KEY(srgb, srgb) CSS_KEY(symbolic, symbolic) +CSS_KEY(symbols, symbols) CSS_KEY(text-after-edge, text_after_edge) CSS_KEY(text-before-edge, text_before_edge) CSS_KEY(use-script, use_script) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index c4b082b1e3c9..6197dc69d9df 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -513,6 +513,7 @@ protected: bool ParseCounterStyleRule(RuleAppendFunc aAppendFunc, void* aProcessData); bool ParseCounterStyleName(nsAString& aName, bool aForDefinition); + bool ParseCounterStyleNameValue(nsCSSValue& aValue); bool ParseCounterDescriptor(nsCSSCounterStyleRule *aRule); bool ParseCounterDescriptorValue(nsCSSCounterDesc aDescID, nsCSSValue& aValue); @@ -787,6 +788,7 @@ protected: bool ParseListStyleType(nsCSSValue& aValue); bool ParseMargin(); bool ParseMarks(nsCSSValue& aValue); + bool ParseClipPath(); bool ParseTransform(bool aIsPrefixed); bool ParseObjectPosition(); bool ParseOutline(); @@ -936,6 +938,7 @@ protected: const nsCSSProps::KTableValue aPropertyKTable[] = nullptr); bool ParseCounter(nsCSSValue& aValue); bool ParseAttr(nsCSSValue& aValue); + bool ParseSymbols(nsCSSValue& aValue); bool SetValueToURL(nsCSSValue& aValue, const nsString& aURL); bool TranslateDimension(nsCSSValue& aValue, int32_t aVariantMask, float aNumber, const nsString& aUnit); @@ -959,6 +962,10 @@ protected: return mParsingCompoundProperty; } + /* Functions for basic shapes */ + bool ParseBasicShape(nsCSSValue& aValue); + bool ParsePolygonFunction(nsCSSValue& aValue); + /* Functions for transform Parsing */ bool ParseSingleTransform(bool aIsPrefixed, nsCSSValue& aValue); bool ParseFunction(nsCSSKeyword aFunction, const int32_t aAllowedTypes[], @@ -4358,6 +4365,17 @@ CSSParserImpl::ParseCounterStyleName(nsAString& aName, bool aForDefinition) return true; } +bool +CSSParserImpl::ParseCounterStyleNameValue(nsCSSValue& aValue) +{ + nsString name; + if (ParseCounterStyleName(name, false)) { + aValue.SetStringValue(name, eCSSUnit_Ident); + return true; + } + return false; +} + bool CSSParserImpl::ParseCounterDescriptor(nsCSSCounterStyleRule* aRule) { @@ -4419,12 +4437,12 @@ CSSParserImpl::ParseCounterDescriptorValue(nsCSSCounterDesc aDescID, return true; } case NS_STYLE_COUNTER_SYSTEM_EXTENDS: { - nsString name; - if (!ParseCounterStyleName(name, false)) { + nsCSSValue name; + if (!ParseCounterStyleNameValue(name)) { REPORT_UNEXPECTED_TOKEN(PECounterExtendsNotIdent); return false; } - aValue.SetPairValue(system, nsCSSValue(name, eCSSUnit_Ident)); + aValue.SetPairValue(system, name); return true; } default: @@ -4482,14 +4500,8 @@ CSSParserImpl::ParseCounterDescriptorValue(nsCSSCounterDesc aDescID, return true; } - case eCSSCounterDesc_Fallback: { - nsString name; - if (!ParseCounterStyleName(name, false)) { - return false; - } - aValue.SetStringValue(name, eCSSUnit_Ident); - return true; - } + case eCSSCounterDesc_Fallback: + return ParseCounterStyleNameValue(aValue); case eCSSCounterDesc_Symbols: { nsCSSValueList* item = nullptr; @@ -4539,7 +4551,7 @@ CSSParserImpl::ParseCounterDescriptorValue(nsCSSCounterDesc aDescID, // should always return in the loop } - case eCSSCounterDesc_SpeakAs: { + case eCSSCounterDesc_SpeakAs: if (ParseVariant(aValue, VARIANT_AUTO | VARIANT_KEYWORD, nsCSSProps::kCounterSpeakAsKTable)) { if (aValue.GetUnit() == eCSSUnit_Enumerated && @@ -4551,13 +4563,7 @@ CSSParserImpl::ParseCounterDescriptorValue(nsCSSCounterDesc aDescID, } return true; } - nsString name; - if (ParseCounterStyleName(name, false)) { - aValue.SetStringValue(name, eCSSUnit_Ident); - return true; - } - return false; - } + return ParseCounterStyleNameValue(aValue); default: NS_NOTREACHED("unknown descriptor"); @@ -7206,16 +7212,16 @@ CSSParserImpl::ParseCounter(nsCSSValue& aValue) } // get optional type - nsString type = NS_LITERAL_STRING("decimal"); + int32_t typeItem = eCSSUnit_Counters == unit ? 2 : 1; + nsCSSValue& type = val->Item(typeItem); if (ExpectSymbol(',', true)) { - if (!ParseCounterStyleName(type, false)) { + if (!ParseCounterStyleNameValue(type) && !ParseSymbols(type)) { break; } + } else { + type.SetStringValue(NS_LITERAL_STRING("decimal"), eCSSUnit_Ident); } - int32_t typeItem = eCSSUnit_Counters == unit ? 2 : 1; - val->Item(typeItem).SetStringValue(type, eCSSUnit_Ident); - if (!ExpectSymbol(')', true)) { break; } @@ -7294,6 +7300,54 @@ CSSParserImpl::ParseAttr(nsCSSValue& aValue) return true; } +bool +CSSParserImpl::ParseSymbols(nsCSSValue& aValue) +{ + if (!GetToken(true)) { + return false; + } + if (mToken.mType != eCSSToken_Function && + !mToken.mIdent.LowerCaseEqualsLiteral("symbols")) { + UngetToken(); + return false; + } + + nsRefPtr params = nsCSSValue::Array::Create(2); + nsCSSValue& type = params->Item(0); + nsCSSValue& symbols = params->Item(1); + + if (!ParseEnum(type, nsCSSProps::kCounterSymbolsSystemKTable)) { + type.SetIntValue(NS_STYLE_COUNTER_SYSTEM_SYMBOLIC, eCSSUnit_Enumerated); + } + + bool first = true; + nsCSSValueList* item = symbols.SetListValue(); + for (;;) { + // FIXME Should also include VARIANT_IMAGE. See bug 1071436. + if (!ParseVariant(item->mValue, VARIANT_STRING, nullptr)) { + break; + } + if (ExpectSymbol(')', true)) { + if (first) { + switch (type.GetIntValue()) { + case NS_STYLE_COUNTER_SYSTEM_NUMERIC: + case NS_STYLE_COUNTER_SYSTEM_ALPHABETIC: + // require at least two symbols + return false; + } + } + aValue.SetArrayValue(params, eCSSUnit_Symbols); + return true; + } + item->mNext = new nsCSSValueList; + item = item->mNext; + first = false; + } + + SkipUntil(')'); + return false; +} + bool CSSParserImpl::SetValueToURL(nsCSSValue& aValue, const nsString& aURL) { @@ -9868,6 +9922,8 @@ CSSParserImpl::ParsePropertyByFunction(nsCSSProperty aPropID) return ParseMarker(); case eCSSProperty_paint_order: return ParsePaintOrder(); + case eCSSProperty_clip_path: + return ParseClipPath(); case eCSSProperty_all: return ParseAll(); default: @@ -12869,11 +12925,10 @@ CSSParserImpl::ParseListStyleType(nsCSSValue& aValue) return true; } - nsString name; - if (ParseCounterStyleName(name, false)) { - aValue.SetStringValue(name, eCSSUnit_Ident); + if (ParseCounterStyleNameValue(aValue) || ParseSymbols(aValue)) { return true; } + return false; } @@ -13732,6 +13787,125 @@ bool CSSParserImpl::ParseTransform(bool aIsPrefixed) return true; } +/* Reads a polygon function's argument list. + */ +bool +CSSParserImpl::ParsePolygonFunction(nsCSSValue& aValue) +{ + uint16_t numArgs = 1; + + nsCSSValue fillRuleValue; + if (ParseEnum(fillRuleValue, nsCSSProps::kFillRuleKTable)) { + numArgs++; + + // The fill-rule must be comma separated from the polygon points. + if (!ExpectSymbol(',', true)) { + REPORT_UNEXPECTED_TOKEN(PEExpectedComma); + SkipUntil(')'); + return false; + } + } + + nsCSSValue coordinates; + nsCSSValuePairList* item = coordinates.SetPairListValue(); + for (;;) { + nsCSSValue xValue, yValue; + if (!ParseVariant(xValue, VARIANT_LPCALC, nullptr) || + !ParseVariant(yValue, VARIANT_LPCALC, nullptr)) { + REPORT_UNEXPECTED_TOKEN(PECoordinatePair); + SkipUntil(')'); + return false; + } + item->mXValue = xValue; + item->mYValue = yValue; + + // See whether to continue or whether to look for end of function. + if (!ExpectSymbol(',', true)) { + // We need to read the closing parenthesis. + if (!ExpectSymbol(')', true)) { + REPORT_UNEXPECTED_TOKEN(PEExpectedCloseParen); + SkipUntil(')'); + return false; + } + break; + } + item->mNext = new nsCSSValuePairList; + item = item->mNext; + } + + nsRefPtr functionArray = + aValue.InitFunction(eCSSKeyword_polygon, numArgs); + functionArray->Item(numArgs) = coordinates; + if (numArgs > 1) { + functionArray->Item(1) = fillRuleValue; + } + + return true; +} + +bool +CSSParserImpl::ParseBasicShape(nsCSSValue& aValue) +{ + if (!GetToken(true)) { + return false; + } + + if (mToken.mType != eCSSToken_Function) { + UngetToken(); + return false; + } + + nsCSSKeyword keyword = nsCSSKeywords::LookupKeyword(mToken.mIdent); + switch (keyword) { + case eCSSKeyword_polygon: + return ParsePolygonFunction(aValue); + default: + return false; + } +} + +/* Parse a clip-path url to a element or a basic shape. */ +bool CSSParserImpl::ParseClipPath() +{ + nsCSSValue value; + if (!ParseVariant(value, VARIANT_HUO, nullptr)) { + if (!nsLayoutUtils::CSSClipPathShapesEnabled()) { + // With CSS Clip Path Shapes disabled, we should only accept + // SVG clipPath reference and none. + REPORT_UNEXPECTED_TOKEN(PEExpectedNoneOrURL); + return false; + } + + bool shape = false, box = false; + nsCSSValueList* cur = value.SetListValue(); + bool eof = false; + for (int i = 0; i < 2; ++i) { + if (ParseBasicShape(cur->mValue) && !shape) { + shape = true; + } else if (ParseEnum(cur->mValue, nsCSSProps::kClipShapeSizingKTable) && + !box) { + box = true; + } else { + break; + } + if (!GetToken(true)) { + eof = true; + break; + } + UngetToken(); + cur->mNext = new nsCSSValueList; + cur = cur->mNext; + } + if (!shape && !box && !eof) { + REPORT_UNEXPECTED_EOF(PEClipPathEOF); + return false; + } + } + + AppendValue(eCSSProperty_clip_path, value); + return true; +} + bool CSSParserImpl::ParseTransformOrigin(bool aPerspective) { nsCSSValuePair position; diff --git a/layout/style/nsCSSPropList.h b/layout/style/nsCSSPropList.h index bfcded70bb47..cf57c9e65ed6 100644 --- a/layout/style/nsCSSPropList.h +++ b/layout/style/nsCSSPropList.h @@ -3612,10 +3612,10 @@ CSS_PROP_SVGRESET( clip-path, clip_path, ClipPath, - CSS_PROPERTY_PARSE_VALUE | + CSS_PROPERTY_PARSE_FUNCTION | CSS_PROPERTY_CREATES_STACKING_CONTEXT, "", - VARIANT_HUO, + 0, nullptr, CSS_PROP_NO_OFFSET, eStyleAnimType_None) diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index ad230c318125..a21332dd5815 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -1880,6 +1880,17 @@ const KTableValue nsCSSProps::kFillRuleKTable[] = { eCSSKeyword_UNKNOWN, -1 }; +const KTableValue nsCSSProps::kClipShapeSizingKTable[] = { + eCSSKeyword_content_box, NS_STYLE_CLIP_SHAPE_SIZING_CONTENT, + eCSSKeyword_padding_box, NS_STYLE_CLIP_SHAPE_SIZING_PADDING, + eCSSKeyword_border_box, NS_STYLE_CLIP_SHAPE_SIZING_BORDER, + eCSSKeyword_margin_box, NS_STYLE_CLIP_SHAPE_SIZING_MARGIN, + eCSSKeyword_fill_box, NS_STYLE_CLIP_SHAPE_SIZING_FILL, + eCSSKeyword_stroke_box, NS_STYLE_CLIP_SHAPE_SIZING_STROKE, + eCSSKeyword_view_box, NS_STYLE_CLIP_SHAPE_SIZING_VIEW, + eCSSKeyword_UNKNOWN,-1 +}; + const KTableValue nsCSSProps::kFilterFunctionKTable[] = { eCSSKeyword_blur, NS_STYLE_FILTER_BLUR, eCSSKeyword_brightness, NS_STYLE_FILTER_BRIGHTNESS, @@ -1982,6 +1993,15 @@ const KTableValue nsCSSProps::kCounterSystemKTable[] = { eCSSKeyword_UNKNOWN, -1 }; +const KTableValue nsCSSProps::kCounterSymbolsSystemKTable[] = { + eCSSKeyword_cyclic, NS_STYLE_COUNTER_SYSTEM_CYCLIC, + eCSSKeyword_numeric, NS_STYLE_COUNTER_SYSTEM_NUMERIC, + eCSSKeyword_alphabetic, NS_STYLE_COUNTER_SYSTEM_ALPHABETIC, + eCSSKeyword_symbolic, NS_STYLE_COUNTER_SYSTEM_SYMBOLIC, + eCSSKeyword_fixed, NS_STYLE_COUNTER_SYSTEM_FIXED, + eCSSKeyword_UNKNOWN, -1 +}; + const KTableValue nsCSSProps::kCounterRangeKTable[] = { eCSSKeyword_infinite, NS_STYLE_COUNTER_RANGE_INFINITE, eCSSKeyword_UNKNOWN, -1 diff --git a/layout/style/nsCSSProps.h b/layout/style/nsCSSProps.h index d605fdf54949..16cd47546907 100644 --- a/layout/style/nsCSSProps.h +++ b/layout/style/nsCSSProps.h @@ -535,6 +535,7 @@ public: static const KTableValue kBoxDirectionKTable[]; static const KTableValue kBoxOrientKTable[]; static const KTableValue kBoxPackKTable[]; + static const KTableValue kClipShapeSizingKTable[]; static const KTableValue kDominantBaselineKTable[]; static const KTableValue kFillRuleKTable[]; static const KTableValue kFilterFunctionKTable[]; @@ -657,6 +658,7 @@ public: static const KTableValue kWritingModeKTable[]; static const KTableValue kHyphensKTable[]; static const KTableValue kCounterSystemKTable[]; + static const KTableValue kCounterSymbolsSystemKTable[]; static const KTableValue kCounterRangeKTable[]; static const KTableValue kCounterSpeakAsKTable[]; }; diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index db8a34cdf925..b2bcf98e595c 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -826,6 +826,32 @@ private: } // anonymous namespace +void +nsCSSValue::AppendPolygonToString(nsCSSProperty aProperty, nsAString& aResult, + Serialization aSerialization) const +{ + const nsCSSValue::Array* array = GetArrayValue(); + NS_ABORT_IF_FALSE(array->Count() > 1 && array->Count() <= 3, + "Polygons must have name and at least one more value."); + // When the array has 2 elements, the item on index 1 is the coordinate + // pair list. + // When the array has 3 elements, the item on index 1 is a fill-rule + // and item on index 2 is the coordinate pair list. + size_t index = 1; + if (array->Count() == 3) { + const nsCSSValue& fillRuleValue = array->Item(index); + NS_ABORT_IF_FALSE(fillRuleValue.GetUnit() == eCSSUnit_Enumerated, + "Expected polygon fill rule."); + int32_t fillRule = fillRuleValue.GetIntValue(); + AppendASCIItoUTF16(nsCSSProps::ValueToKeyword(fillRule, + nsCSSProps::kFillRuleKTable), + aResult); + aResult.AppendLiteral(", "); + ++index; + } + array->Item(index).AppendToString(aProperty, aResult, aSerialization); +} + void nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult, Serialization aSerialization) const @@ -853,12 +879,13 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult, nsStyleUtil::AppendEscapedCSSIdent(buffer, aResult); } } - else if (eCSSUnit_Array <= unit && unit <= eCSSUnit_Steps) { + else if (eCSSUnit_Array <= unit && unit <= eCSSUnit_Symbols) { switch (unit) { case eCSSUnit_Counter: aResult.AppendLiteral("counter("); break; case eCSSUnit_Counters: aResult.AppendLiteral("counters("); break; case eCSSUnit_Cubic_Bezier: aResult.AppendLiteral("cubic-bezier("); break; case eCSSUnit_Steps: aResult.AppendLiteral("steps("); break; + case eCSSUnit_Symbols: aResult.AppendLiteral("symbols("); break; default: break; } @@ -866,8 +893,9 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult, bool mark = false; for (size_t i = 0, i_end = array->Count(); i < i_end; ++i) { if (mark && array->Item(i).GetUnit() != eCSSUnit_Null) { - if (unit == eCSSUnit_Array && - eCSSProperty_transition_timing_function != aProperty) + if ((unit == eCSSUnit_Array && + eCSSProperty_transition_timing_function != aProperty) || + unit == eCSSUnit_Symbols) aResult.Append(' '); else aResult.AppendLiteral(", "); @@ -887,6 +915,17 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult, } continue; } + if (unit == eCSSUnit_Symbols && i == 0) { + NS_ABORT_IF_FALSE(array->Item(i).GetUnit() == eCSSUnit_Enumerated, + "unexpected value"); + int32_t system = array->Item(i).GetIntValue(); + if (system != NS_STYLE_COUNTER_SYSTEM_SYMBOLIC) { + AppendASCIItoUTF16(nsCSSProps::ValueToKeyword( + system, nsCSSProps::kCounterSystemKTable), aResult); + mark = true; + } + continue; + } nsCSSProperty prop = ((eCSSUnit_Counter <= unit && unit <= eCSSUnit_Counters) && i == array->Count() - 1) @@ -909,53 +948,61 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult, NS_ABORT_IF_FALSE(array->Count() >= 1, "Functions must have at least one element for the name."); - /* Append the function name. */ const nsCSSValue& functionName = array->Item(0); - if (functionName.GetUnit() == eCSSUnit_Enumerated) { - // We assume that the first argument is always of nsCSSKeyword type. - const nsCSSKeyword functionId = functionName.GetKeywordValue(); - NS_ConvertASCIItoUTF16 ident(nsCSSKeywords::GetStringValue(functionId)); - // Bug 721136: Normalize the identifier to lowercase, except that things - // like scaleX should have the last character capitalized. This matches - // what other browsers do. - switch (functionId) { - case eCSSKeyword_rotatex: - case eCSSKeyword_scalex: - case eCSSKeyword_skewx: - case eCSSKeyword_translatex: - ident.Replace(ident.Length() - 1, 1, char16_t('X')); - break; + NS_ABORT_IF_FALSE(functionName.GetUnit() == eCSSUnit_Enumerated, + "Functions must have an enumerated name."); - case eCSSKeyword_rotatey: - case eCSSKeyword_scaley: - case eCSSKeyword_skewy: - case eCSSKeyword_translatey: - ident.Replace(ident.Length() - 1, 1, char16_t('Y')); - break; + /* Append the function name. */ + // The first argument is always of nsCSSKeyword type. + const nsCSSKeyword functionId = functionName.GetKeywordValue(); + NS_ConvertASCIItoUTF16 ident(nsCSSKeywords::GetStringValue(functionId)); + // Bug 721136: Normalize the identifier to lowercase, except that things + // like scaleX should have the last character capitalized. This matches + // what other browsers do. + switch (functionId) { + case eCSSKeyword_rotatex: + case eCSSKeyword_scalex: + case eCSSKeyword_skewx: + case eCSSKeyword_translatex: + ident.Replace(ident.Length() - 1, 1, char16_t('X')); + break; - case eCSSKeyword_rotatez: - case eCSSKeyword_scalez: - case eCSSKeyword_translatez: - ident.Replace(ident.Length() - 1, 1, char16_t('Z')); - break; + case eCSSKeyword_rotatey: + case eCSSKeyword_scaley: + case eCSSKeyword_skewy: + case eCSSKeyword_translatey: + ident.Replace(ident.Length() - 1, 1, char16_t('Y')); + break; - default: - break; - } - nsStyleUtil::AppendEscapedCSSIdent(ident, aResult); - } else { - MOZ_ASSERT(false, "should no longer have non-enumerated functions"); + case eCSSKeyword_rotatez: + case eCSSKeyword_scalez: + case eCSSKeyword_translatez: + ident.Replace(ident.Length() - 1, 1, char16_t('Z')); + break; + + default: + break; } + nsStyleUtil::AppendEscapedCSSIdent(ident, aResult); aResult.Append('('); - /* Now, step through the function contents, writing each of them as we go. */ - for (size_t index = 1; index < array->Count(); ++index) { - array->Item(index).AppendToString(aProperty, aResult, - aSerialization); + switch (functionId) { + case eCSSKeyword_polygon: + AppendPolygonToString(aProperty, aResult, aSerialization); + break; - /* If we're not at the final element, append a comma. */ - if (index + 1 != array->Count()) - aResult.AppendLiteral(", "); + default: { + // Now, step through the function contents, writing each of + // them as we go. + for (size_t index = 1; index < array->Count(); ++index) { + array->Item(index).AppendToString(aProperty, aResult, + aSerialization); + + /* If we're not at the final element, append a comma. */ + if (index + 1 != array->Count()) + aResult.AppendLiteral(", "); + } + } } /* Finally, append the closing parenthesis. */ @@ -1073,6 +1120,12 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult, aResult); break; + case eCSSProperty_clip_path: + AppendASCIItoUTF16(nsCSSProps::ValueToKeyword(intValue, + nsCSSProps::kClipShapeSizingKTable), + aResult); + break; + default: const nsAFlatCString& name = nsCSSProps::LookupPropertyValue(aProperty, intValue); AppendASCIItoUTF16(name, aResult); @@ -1405,6 +1458,7 @@ nsCSSValue::AppendToString(nsCSSProperty aProperty, nsAString& aResult, case eCSSUnit_Attr: case eCSSUnit_Cubic_Bezier: case eCSSUnit_Steps: + case eCSSUnit_Symbols: case eCSSUnit_Counter: case eCSSUnit_Counters: aResult.Append(char16_t(')')); break; case eCSSUnit_Local_Font: break; @@ -1511,6 +1565,7 @@ nsCSSValue::SizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf) const case eCSSUnit_Counters: case eCSSUnit_Cubic_Bezier: case eCSSUnit_Steps: + case eCSSUnit_Symbols: case eCSSUnit_Function: case eCSSUnit_Calc: case eCSSUnit_Calc_Plus: @@ -2030,7 +2085,8 @@ nsCSSValuePairList::AppendToString(nsCSSProperty aProperty, break; if (nsCSSProps::PropHasFlags(aProperty, - CSS_PROPERTY_VALUE_LIST_USES_COMMAS)) + CSS_PROPERTY_VALUE_LIST_USES_COMMAS) || + aProperty == eCSSProperty_clip_path) aResult.Append(char16_t(',')); aResult.Append(char16_t(' ')); } diff --git a/layout/style/nsCSSValue.h b/layout/style/nsCSSValue.h index 006e20b11677..27ff8844b84f 100644 --- a/layout/style/nsCSSValue.h +++ b/layout/style/nsCSSValue.h @@ -265,7 +265,8 @@ enum nsCSSUnit { eCSSUnit_Counters = 22, // (nsCSSValue::Array*) a counters(string,string[,string]) value eCSSUnit_Cubic_Bezier = 23, // (nsCSSValue::Array*) a list of float values eCSSUnit_Steps = 24, // (nsCSSValue::Array*) a list of (integer, enumerated) - eCSSUnit_Function = 25, // (nsCSSValue::Array*) a function with + eCSSUnit_Symbols = 25, // (nsCSSValue::Array*) a symbols(enumerated, symbols) value + eCSSUnit_Function = 26, // (nsCSSValue::Array*) a function with // parameters. First elem of array is name, // an nsCSSKeyword as eCSSUnit_Enumerated, // the rest of the values are arguments. @@ -718,6 +719,9 @@ private: return static_cast(aBuffer->Data()); } + void AppendPolygonToString(nsCSSProperty aProperty, nsAString& aResult, + Serialization aValueSerialization) const; + protected: nsCSSUnit mUnit; union { diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 74c81c6bc8bc..459bea7368a8 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -1064,10 +1064,11 @@ nsComputedDOMStyle::DoGetContent() NS_ABORT_IF_FALSE(eCSSUnit_None != a->Item(typeItem).GetUnit(), "'none' should be handled as identifier value"); nsString type; - a->Item(typeItem).GetStringValue(type); + a->Item(typeItem).AppendToString(eCSSProperty_list_style_type, + type, nsCSSValue::eNormalized); if (!type.LowerCaseEqualsLiteral("decimal")) { str.AppendLiteral(", "); - nsStyleUtil::AppendEscapedCSSIdent(type, str); + str.Append(type); } str.Append(char16_t(')')); @@ -2977,12 +2978,42 @@ CSSValue* nsComputedDOMStyle::DoGetListStyleType() { nsROCSSPrimitiveValue *val = new nsROCSSPrimitiveValue; - // want SetIdent - nsString type; - StyleList()->GetListStyleType(type); - nsString value; - nsStyleUtil::AppendEscapedCSSIdent(type, value); - val->SetString(value); + CounterStyle* style = StyleList()->GetCounterStyle(); + AnonymousCounterStyle* anonymous = style->AsAnonymous(); + if (!anonymous) { + // want SetIdent + nsString type; + StyleList()->GetListStyleType(type); + nsString value; + nsStyleUtil::AppendEscapedCSSIdent(type, value); + val->SetString(value); + } else { + nsAutoString tmp; + tmp.AppendLiteral("symbols("); + + uint8_t system = anonymous->GetSystem(); + NS_ASSERTION(system == NS_STYLE_COUNTER_SYSTEM_CYCLIC || + system == NS_STYLE_COUNTER_SYSTEM_NUMERIC || + system == NS_STYLE_COUNTER_SYSTEM_ALPHABETIC || + system == NS_STYLE_COUNTER_SYSTEM_SYMBOLIC || + system == NS_STYLE_COUNTER_SYSTEM_FIXED, + "Invalid system for anonymous counter style."); + if (system != NS_STYLE_COUNTER_SYSTEM_SYMBOLIC) { + AppendASCIItoUTF16(nsCSSProps::ValueToKeyword( + system, nsCSSProps::kCounterSystemKTable), tmp); + tmp.Append(' '); + } + + const nsTArray& symbols = anonymous->GetSymbols(); + NS_ASSERTION(symbols.Length() > 0, + "No symbols in the anonymous counter style"); + for (size_t i = 0, iend = symbols.Length(); i < iend; i++) { + nsStyleUtil::AppendEscapedCSSString(symbols[i], tmp); + tmp.Append(' '); + } + tmp.Replace(tmp.Length() - 1, 1, char16_t(')')); + val->SetString(tmp); + } return val; } @@ -5145,18 +5176,84 @@ nsComputedDOMStyle::DoGetStopColor() } CSSValue* -nsComputedDOMStyle::DoGetClipPath() +nsComputedDOMStyle::CreatePrimitiveValueForClipPath( + const nsStyleBasicShape* aStyleBasicShape, uint8_t aSizingBox) { + nsDOMCSSValueList* valueList = GetROCSSValueList(false); + + if (aStyleBasicShape && + aStyleBasicShape->GetShapeType() == nsStyleBasicShape::Type::ePolygon) { + nsROCSSPrimitiveValue* val = new nsROCSSPrimitiveValue; + + // Shape function name and opening parenthesis. + nsAutoString shapeFunctionString; + AppendASCIItoUTF16(nsCSSKeywords::GetStringValue(eCSSKeyword_polygon), + shapeFunctionString); + shapeFunctionString.Append('('); + uint8_t fillRule = aStyleBasicShape->GetFillRule(); + if (fillRule == NS_STYLE_FILL_RULE_EVENODD) { + shapeFunctionString.AppendLiteral("evenodd"); + } + for (size_t i = 0; i < aStyleBasicShape->Coordinates().Length(); i += 2) { + nsAutoString coordString; + if (i > 0 || fillRule) { + shapeFunctionString.AppendLiteral(", "); + } + SetCssTextToCoord(coordString, + aStyleBasicShape->Coordinates()[i]); + shapeFunctionString.Append(coordString); + shapeFunctionString.Append(' '); + SetCssTextToCoord(coordString, + aStyleBasicShape->Coordinates()[i + 1]); + shapeFunctionString.Append(coordString); + } + shapeFunctionString.Append(')'); + val->SetString(shapeFunctionString); + valueList->AppendCSSValue(val); + } + nsROCSSPrimitiveValue* val = new nsROCSSPrimitiveValue; + if (aSizingBox == NS_STYLE_CLIP_SHAPE_SIZING_NOBOX) { + return valueList; + } + + nsAutoString boxString; + AppendASCIItoUTF16( + nsCSSProps::ValueToKeyword(aSizingBox, + nsCSSProps::kClipShapeSizingKTable), + boxString); + val->SetString(boxString); + valueList->AppendCSSValue(val); + + return valueList; +} + +CSSValue* +nsComputedDOMStyle::DoGetClipPath() +{ const nsStyleSVGReset* svg = StyleSVGReset(); - - if (svg->mClipPath) - val->SetURI(svg->mClipPath); - else - val->SetIdent(eCSSKeyword_none); - - return val; + switch (svg->mClipPath.GetType()) { + case NS_STYLE_CLIP_PATH_SHAPE: + return CreatePrimitiveValueForClipPath(svg->mClipPath.GetBasicShape(), + svg->mClipPath.GetSizingBox()); + case NS_STYLE_CLIP_PATH_BOX: + return CreatePrimitiveValueForClipPath(nullptr, + svg->mClipPath.GetSizingBox()); + case NS_STYLE_CLIP_PATH_URL: { + nsROCSSPrimitiveValue* val = new nsROCSSPrimitiveValue; + val->SetURI(svg->mClipPath.GetURL()); + return val; + } + case NS_STYLE_CLIP_PATH_NONE: { + nsROCSSPrimitiveValue* val = new nsROCSSPrimitiveValue; + val->SetIdent(eCSSKeyword_none); + return val; + } + default: + NS_NOTREACHED("unexpected type"); + } + return nullptr; } void diff --git a/layout/style/nsComputedDOMStyle.h b/layout/style/nsComputedDOMStyle.h index 955221940b98..955c8ef09ae2 100644 --- a/layout/style/nsComputedDOMStyle.h +++ b/layout/style/nsComputedDOMStyle.h @@ -586,6 +586,10 @@ private: mozilla::dom::CSSValue* CreatePrimitiveValueForStyleFilter( const nsStyleFilter& aStyleFilter); + // Helper function for computing basic shape styles. + mozilla::dom::CSSValue* CreatePrimitiveValueForClipPath( + const nsStyleBasicShape* aStyleBasicShape, uint8_t aSizingBox); + static nsComputedStyleMap* GetComputedStyleMap(); // We don't really have a good immutable representation of "presentation". diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index ab105170ef6f..675bb19b1ccb 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -7146,6 +7146,11 @@ nsRuleNode::ComputeListData(void* aStartStruct, list->SetListStyleType(name, mPresContext); break; } + case eCSSUnit_Symbols: + list->SetListStyleType(NS_LITERAL_STRING(""), + mPresContext->CounterStyleManager()-> + BuildCounterStyle(typeValue->GetArrayValue())); + break; case eCSSUnit_Null: break; default: @@ -8753,6 +8758,86 @@ nsRuleNode::ComputeSVGData(void* aStartStruct, COMPUTE_END_INHERITED(SVG, svg) } +void +nsRuleNode::SetStyleClipPathToCSSValue(nsStyleClipPath* aStyleClipPath, + const nsCSSValue* aValue, + nsStyleContext* aStyleContext, + nsPresContext* aPresContext, + bool& aCanStoreInRuleTree) +{ + NS_ABORT_IF_FALSE(aValue->GetUnit() != eCSSUnit_ListDep || + aValue->GetUnit() != eCSSUnit_List, + "expected a basic shape or reference box"); + + const nsCSSValueList* cur = aValue->GetListValue(); + + uint8_t sizingBox = NS_STYLE_CLIP_SHAPE_SIZING_NOBOX; + nsStyleBasicShape* basicShape = nullptr; + for (unsigned i = 0; i < 2; ++i) { + if (!cur) { + break; + } + if (cur->mValue.GetUnit() == eCSSUnit_Function) { + nsCSSValue::Array* shapeFunction = cur->mValue.GetArrayValue(); + nsCSSKeyword functionName = + (nsCSSKeyword)shapeFunction->Item(0).GetIntValue(); + if (functionName == eCSSKeyword_polygon) { + basicShape = new nsStyleBasicShape(nsStyleBasicShape::ePolygon); + NS_ABORT_IF_FALSE(shapeFunction->Count() > 1, + "polygon has wrong number of arguments"); + size_t j = 1; + if (shapeFunction->Item(j).GetUnit() == eCSSUnit_Enumerated) { + basicShape->SetFillRule(shapeFunction->Item(j).GetIntValue()); + ++j; + } + int32_t mask = SETCOORD_PERCENT | SETCOORD_LENGTH | + SETCOORD_STORE_CALC; + const nsCSSValuePairList* curPair = + shapeFunction->Item(j).GetPairListValue(); + nsTArray& coordinates = basicShape->Coordinates(); + while (curPair) { + nsStyleCoord xCoord, yCoord; + DebugOnly didSetCoordX = SetCoord(curPair->mXValue, xCoord, + nsStyleCoord(), mask, + aStyleContext, aPresContext, + aCanStoreInRuleTree); + coordinates.AppendElement(xCoord); + NS_ABORT_IF_FALSE(didSetCoordX, "unexpected x coordinate unit"); + DebugOnly didSetCoordY = SetCoord(curPair->mYValue, yCoord, + nsStyleCoord(), mask, + aStyleContext, aPresContext, + aCanStoreInRuleTree); + coordinates.AppendElement(yCoord); + NS_ABORT_IF_FALSE(didSetCoordY, "unexpected y coordinate unit"); + curPair = curPair->mNext; + } + } else { + // XXX Handle more basic shape functions later. + NS_NOTREACHED("unexpected basic shape function"); + return; + } + } else if (cur->mValue.GetUnit() == eCSSUnit_Enumerated) { + int32_t type = cur->mValue.GetIntValue(); + if (type > NS_STYLE_CLIP_SHAPE_SIZING_VIEW || + type < NS_STYLE_CLIP_SHAPE_SIZING_NOBOX) { + NS_NOTREACHED("unexpected reference box"); + return; + } + sizingBox = (uint8_t)type; + } else { + NS_NOTREACHED("unexpected value"); + return; + } + cur = cur->mNext; + } + + if (basicShape) { + aStyleClipPath->SetBasicShape(basicShape, sizingBox); + } else { + aStyleClipPath->SetSizingBox(sizingBox); + } +} + // Returns true if the nsStyleFilter was successfully set using the nsCSSValue. bool nsRuleNode::SetStyleFilterToCSSValue(nsStyleFilter* aStyleFilter, @@ -8857,17 +8942,37 @@ nsRuleNode::ComputeSVGResetData(void* aStartStruct, canStoreInRuleTree); } - // clip-path: url, none, inherit + // clip-path: url, || , none, inherit const nsCSSValue* clipPathValue = aRuleData->ValueForClipPath(); - if (eCSSUnit_URL == clipPathValue->GetUnit()) { - svgReset->mClipPath = clipPathValue->GetURLValue(); - } else if (eCSSUnit_None == clipPathValue->GetUnit() || - eCSSUnit_Initial == clipPathValue->GetUnit() || - eCSSUnit_Unset == clipPathValue->GetUnit()) { - svgReset->mClipPath = nullptr; - } else if (eCSSUnit_Inherit == clipPathValue->GetUnit()) { - canStoreInRuleTree = false; - svgReset->mClipPath = parentSVGReset->mClipPath; + switch (clipPathValue->GetUnit()) { + case eCSSUnit_Null: + break; + case eCSSUnit_None: + case eCSSUnit_Initial: + case eCSSUnit_Unset: + svgReset->mClipPath = nsStyleClipPath(); + break; + case eCSSUnit_Inherit: + canStoreInRuleTree = false; + svgReset->mClipPath = parentSVGReset->mClipPath; + break; + case eCSSUnit_URL: { + svgReset->mClipPath = nsStyleClipPath(); + nsIURI* url = clipPathValue->GetURLValue(); + if (url) { + svgReset->mClipPath.SetURL(url); + } + break; + } + case eCSSUnit_List: + case eCSSUnit_ListDep: { + svgReset->mClipPath = nsStyleClipPath(); + SetStyleClipPathToCSSValue(&svgReset->mClipPath, clipPathValue, aContext, + mPresContext, canStoreInRuleTree); + break; + } + default: + NS_NOTREACHED("unexpected unit"); } // stop-opacity: diff --git a/layout/style/nsRuleNode.h b/layout/style/nsRuleNode.h index 4b098ecc394d..3529e1be6ce6 100644 --- a/layout/style/nsRuleNode.h +++ b/layout/style/nsRuleNode.h @@ -665,6 +665,11 @@ protected: nsStyleContext* aStyleContext, nsPresContext* aPresContext, bool& aCanStoreInRuleTree); + void SetStyleClipPathToCSSValue(nsStyleClipPath* aStyleClipPath, + const nsCSSValue* aValue, + nsStyleContext* aStyleContext, + nsPresContext* aPresContext, + bool& aCanStoreInRuleTree); private: nsRuleNode(nsPresContext* aPresContext, nsRuleNode* aParent, diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index 3c34550aa624..39c7e0208c43 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -65,6 +65,22 @@ static inline mozilla::css::Side operator++(mozilla::css::Side& side, int) { #define NS_STYLE_BOX_SIZING_PADDING 1 #define NS_STYLE_BOX_SIZING_BORDER 2 +// clip-path sizing +#define NS_STYLE_CLIP_SHAPE_SIZING_NOBOX 0 +#define NS_STYLE_CLIP_SHAPE_SIZING_CONTENT 1 +#define NS_STYLE_CLIP_SHAPE_SIZING_PADDING 2 +#define NS_STYLE_CLIP_SHAPE_SIZING_BORDER 3 +#define NS_STYLE_CLIP_SHAPE_SIZING_MARGIN 4 +#define NS_STYLE_CLIP_SHAPE_SIZING_FILL 5 +#define NS_STYLE_CLIP_SHAPE_SIZING_STROKE 6 +#define NS_STYLE_CLIP_SHAPE_SIZING_VIEW 7 + +// Basic Shapes +#define NS_STYLE_BASIC_SHAPE_POLYGON 0 +//#define NS_STYLE_BASIC_SHAPE_CIRCLE 1 +//#define NS_STYLE_BASIC_SHAPE_ELLIPSE 2 +//#define NS_STYLE_BASIC_SHAPE_INSET 3 + // box-shadow #define NS_STYLE_BOX_SHADOW_INSET 0 @@ -478,6 +494,12 @@ static inline mozilla::css::Side operator++(mozilla::css::Side& side, int) { #define NS_STYLE_FLOAT_LEFT 1 #define NS_STYLE_FLOAT_RIGHT 2 +// See nsStyleClipPath +#define NS_STYLE_CLIP_PATH_NONE 0 +#define NS_STYLE_CLIP_PATH_URL 1 +#define NS_STYLE_CLIP_PATH_SHAPE 2 +#define NS_STYLE_CLIP_PATH_BOX 3 + // See nsStyleFilter #define NS_STYLE_FILTER_NONE 0 #define NS_STYLE_FILTER_URL 1 diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index f803c7bcca07..f5de0aba0d65 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -1030,6 +1030,119 @@ nsChangeHint nsStyleSVG::CalcDifference(const nsStyleSVG& aOther) const return hint; } +// -------------------- +// nsStyleClipPath +// +nsStyleClipPath::nsStyleClipPath() + : mType(NS_STYLE_CLIP_PATH_NONE) + , mURL(nullptr) + , mSizingBox(NS_STYLE_CLIP_SHAPE_SIZING_NOBOX) +{ +} + +nsStyleClipPath::nsStyleClipPath(const nsStyleClipPath& aSource) + : mType(NS_STYLE_CLIP_PATH_NONE) + , mURL(nullptr) + , mSizingBox(NS_STYLE_CLIP_SHAPE_SIZING_NOBOX) +{ + if (aSource.mType == NS_STYLE_CLIP_PATH_URL) { + SetURL(aSource.mURL); + } else if (aSource.mType == NS_STYLE_CLIP_PATH_SHAPE) { + SetBasicShape(aSource.mBasicShape, aSource.mSizingBox); + } else if (aSource.mType == NS_STYLE_CLIP_PATH_SHAPE) { + SetSizingBox(aSource.mSizingBox); + } +} + +nsStyleClipPath::~nsStyleClipPath() +{ + ReleaseRef(); +} + +nsStyleClipPath& +nsStyleClipPath::operator=(const nsStyleClipPath& aOther) +{ + if (this == &aOther) { + return *this; + } + + ReleaseRef(); + + if (aOther.mType == NS_STYLE_CLIP_PATH_URL) { + SetURL(aOther.mURL); + } else if (aOther.mType == NS_STYLE_CLIP_PATH_SHAPE) { + SetBasicShape(aOther.mBasicShape, aOther.mSizingBox); + } else if (aOther.mType == NS_STYLE_CLIP_PATH_BOX) { + SetSizingBox(aOther.mSizingBox); + } else { + mSizingBox = NS_STYLE_CLIP_SHAPE_SIZING_NOBOX; + mType = NS_STYLE_CLIP_PATH_NONE; + } + return *this; +} + + +bool +nsStyleClipPath::operator==(const nsStyleClipPath& aOther) const +{ + if (mType != aOther.mType) { + return false; + } + + if (mType == NS_STYLE_CLIP_PATH_URL) { + return EqualURIs(mURL, aOther.mURL); + } else if (mType == NS_STYLE_CLIP_PATH_SHAPE) { + return *mBasicShape == *aOther.mBasicShape && + mSizingBox == aOther.mSizingBox; + } else if (mType == NS_STYLE_CLIP_PATH_BOX) { + return mSizingBox == aOther.mSizingBox; + } + + return true; +} + +void +nsStyleClipPath::ReleaseRef() +{ + if (mType == NS_STYLE_CLIP_PATH_SHAPE) { + NS_ASSERTION(mBasicShape, "expected pointer"); + mBasicShape->Release(); + } else if (mType == NS_STYLE_CLIP_PATH_URL) { + NS_ASSERTION(mURL, "expected pointer"); + mURL->Release(); + } + mURL = nullptr; +} + +void +nsStyleClipPath::SetURL(nsIURI* aURL) +{ + NS_ASSERTION(aURL, "expected pointer"); + ReleaseRef(); + mURL = aURL; + mURL->AddRef(); + mType = NS_STYLE_CLIP_PATH_URL; +} + +void +nsStyleClipPath::SetBasicShape(nsStyleBasicShape* aBasicShape, uint8_t aSizingBox) +{ + NS_ASSERTION(aBasicShape, "expected pointer"); + ReleaseRef(); + mBasicShape = aBasicShape; + mBasicShape->AddRef(); + mSizingBox = aSizingBox; + mType = NS_STYLE_CLIP_PATH_SHAPE; +} + +void +nsStyleClipPath::SetSizingBox(uint8_t aSizingBox) +{ + ReleaseRef(); + mSizingBox = aSizingBox; + mType = NS_STYLE_CLIP_PATH_BOX; +} + // -------------------- // nsStyleFilter // @@ -1145,7 +1258,6 @@ nsStyleSVGReset::nsStyleSVGReset() mStopColor = NS_RGB(0,0,0); mFloodColor = NS_RGB(0,0,0); mLightingColor = NS_RGB(255,255,255); - mClipPath = nullptr; mMask = nullptr; mStopOpacity = 1.0f; mFloodOpacity = 1.0f; @@ -1179,7 +1291,7 @@ nsChangeHint nsStyleSVGReset::CalcDifference(const nsStyleSVGReset& aOther) cons { nsChangeHint hint = nsChangeHint(0); - if (!EqualURIs(mClipPath, aOther.mClipPath) || + if (mClipPath != aOther.mClipPath || !EqualURIs(mMask, aOther.mMask) || mFilters != aOther.mFilters) { NS_UpdateHint(hint, nsChangeHint_UpdateEffects); diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 59db408fd961..869c9aa3527a 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -2827,6 +2827,107 @@ struct nsStyleSVG { } }; +class nsStyleBasicShape MOZ_FINAL { +public: + enum Type { + // eInset, + // eCircle, + // eEllipse, + ePolygon + }; + + nsStyleBasicShape(Type type) + : mType(type) + { + } + + Type GetShapeType() const { return mType; } + + int32_t GetFillRule() const { return mFillRule; } + void SetFillRule(int32_t aFillRule) + { + NS_ASSERTION(mType == ePolygon, "expected polygon"); + mFillRule = aFillRule; + } + + nsTArray& Coordinates() + { + NS_ASSERTION(mType == ePolygon, "expected polygon"); + return mCoordinates; + } + + const nsTArray& Coordinates() const + { + NS_ASSERTION(mType == ePolygon, "expected polygon"); + return mCoordinates; + } + + bool operator==(const nsStyleBasicShape& aOther) const + { + return mType == aOther.mType && + mFillRule == aOther.mFillRule && + mCoordinates == aOther.mCoordinates; + } + bool operator!=(const nsStyleBasicShape& aOther) const { + return !(*this == aOther); + } + + NS_INLINE_DECL_REFCOUNTING(nsStyleBasicShape); + +private: + ~nsStyleBasicShape() {} + + Type mType; + int32_t mFillRule; + nsTArray mCoordinates; +}; + +struct nsStyleClipPath +{ + nsStyleClipPath(); + nsStyleClipPath(const nsStyleClipPath& aSource); + ~nsStyleClipPath(); + + nsStyleClipPath& operator=(const nsStyleClipPath& aOther); + + bool operator==(const nsStyleClipPath& aOther) const; + bool operator!=(const nsStyleClipPath& aOther) const { + return !(*this == aOther); + } + + int32_t GetType() const { + return mType; + } + + nsIURI* GetURL() const { + NS_ASSERTION(mType == NS_STYLE_CLIP_PATH_URL, "wrong clip-path type"); + return mURL; + } + void SetURL(nsIURI* aURL); + + nsStyleBasicShape* GetBasicShape() const { + NS_ASSERTION(mType == NS_STYLE_CLIP_PATH_SHAPE, "wrong clip-path type"); + return mBasicShape; + } + + void SetBasicShape(nsStyleBasicShape* mBasicShape, + uint8_t aSizingBox = NS_STYLE_CLIP_SHAPE_SIZING_NOBOX); + + uint8_t GetSizingBox() const { return mSizingBox; } + void SetSizingBox(uint8_t aSizingBox); + +private: + void ReleaseRef(); + void* operator new(size_t) MOZ_DELETE; + + int32_t mType; // see NS_STYLE_CLIP_PATH_* constants in nsStyleConsts.h + union { + nsStyleBasicShape* mBasicShape; + nsIURI* mURL; + }; + uint8_t mSizingBox; // see NS_STYLE_CLIP_SHAPE_SIZING_* constants in nsStyleConsts.h +}; + struct nsStyleFilter { nsStyleFilter(); nsStyleFilter(const nsStyleFilter& aSource); @@ -2911,7 +3012,7 @@ struct nsStyleSVGReset { return mFilters.Length() > 0; } - nsCOMPtr mClipPath; // [reset] + nsStyleClipPath mClipPath; // [reset] nsTArray mFilters; // [reset] nsCOMPtr mMask; // [reset] nscolor mStopColor; // [reset] diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index 5e97ffa343a7..2ebc61a48aff 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -2354,7 +2354,7 @@ var gCSSProperties = { type: CSS_TYPE_LONGHAND, /* XXX needs to be on pseudo-elements */ initial_values: [ "normal", "none" ], - other_values: [ '""', "''", '"hello"', "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")', 'counter(foo)', 'counter(bar, upper-roman)', 'counters(foo, ".")', "counters(bar, '-', lower-greek)", "'-' counter(foo) '.'", "attr(title)", "open-quote", "close-quote", "no-open-quote", "no-close-quote", "close-quote attr(title) counters(foo, '.', upper-alpha)", "counter(foo, none)", "counters(bar, '.', none)", "attr(\\32)", "attr(\\2)", "attr(-\\2)", "attr(-\\32)", "counter(\\2)", "counters(\\32, '.')", "counter(-\\32, upper-roman)", "counters(-\\2, '-', lower-greek)", "counter(\\()", "counters(a\\+b, '.')", "counter(\\}, upper-alpha)", "-moz-alt-content" ], + other_values: [ '""', "''", '"hello"', "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)", "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")', 'counter(foo)', 'counter(bar, upper-roman)', 'counters(foo, ".")', "counters(bar, '-', lower-greek)", "'-' counter(foo) '.'", "attr(title)", "open-quote", "close-quote", "no-open-quote", "no-close-quote", "close-quote attr(title) counters(foo, '.', upper-alpha)", "counter(foo, none)", "counters(bar, '.', none)", "attr(\\32)", "attr(\\2)", "attr(-\\2)", "attr(-\\32)", "counter(\\2)", "counters(\\32, '.')", "counter(-\\32, upper-roman)", "counters(-\\2, '-', lower-greek)", "counter(\\()", "counters(a\\+b, '.')", "counter(\\}, upper-alpha)", "-moz-alt-content", "counter(foo, symbols('*'))", "counter(foo, symbols(numeric '0' '1'))", "counters(foo, '.', symbols('*'))", "counters(foo, '.', symbols(numeric '0' '1'))" ], invalid_values: [ 'counters(foo)', 'counter(foo, ".")', 'attr("title")', "attr('title')", "attr(2)", "attr(-2)", "counter(2)", "counters(-2, '.')", "-moz-alt-content 'foo'", "'foo' -moz-alt-content" ] }, "counter-increment": { @@ -2716,6 +2716,12 @@ var gCSSProperties = { subproperties: [ "list-style-type", "list-style-position", "list-style-image" ], initial_values: [ "outside", "disc", "disc outside", "outside disc", "disc none", "none disc", "none disc outside", "none outside disc", "disc none outside", "disc outside none", "outside none disc", "outside disc none" ], other_values: [ "inside none", "none inside", "none none inside", "square", "none", "none none", "outside none none", "none outside none", "none none outside", "none outside", "outside none", "outside outside", "outside inside", "\\32 style", "\\32 style inside", + "symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")", + "symbols(cyclic \"*\" \"\\2020\" \"\\2021\" \"\\A7\")", + "inside symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")", + "symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\") outside", + "none symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")", + "inside none symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")", 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")', 'none url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")', 'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") none', @@ -2786,7 +2792,9 @@ var gCSSProperties = { "-moz-ethiopic-halehame", "-moz-ethiopic-numeric", "-moz-ethiopic-halehame-am", "-moz-ethiopic-halehame-ti-er", "-moz-ethiopic-halehame-ti-et", - "other-style", "inside", "outside", "\\32 style" + "other-style", "inside", "outside", "\\32 style", + "symbols(\"*\" \"\\2020\" \"\\2021\" \"\\A7\")", + "symbols(cyclic '*' '\\2020' '\\2021' '\\A7')" ], invalid_values: [] }, @@ -4576,6 +4584,54 @@ if (SpecialPowers.getBoolPref("svg.paint-order.enabled")) { }; } +if (SpecialPowers.getBoolPref("layout.css.clip-path-shapes.enabled")) { + gCSSProperties["clip-path"] = { + domProp: "clip-path", + inherited: false, + type: CSS_TYPE_LONGHAND, + initial_values: [ "none" ], + other_values: [ + // SVG reference clip-path + "url(#my-clip-path)", + + "polygon(20px 20px)", + "polygon(20px 20%)", + "polygon(20% 20%)", + "polygon(20rem 20em)", + "polygon(20cm 20mm)", + "polygon(20px 20px, 30px 30px)", + "polygon(20px 20px, 30% 30%, 30px 30px)", + "polygon(nonzero, 20px 20px, 30% 30%, 30px 30px)", + "polygon(evenodd, 20px 20px, 30% 30%, 30px 30px)", + + "content-box", + "padding-box", + "border-box", + "margin-box", + "fill-box", + "stroke-box", + "view-box", + + "polygon(0 0) conten-box", + "border-box polygon(0 0)", + "padding-box polygon( 0 20px , 30px 20% ) ", + ], + invalid_values: [ + "url(#test) url(#tes2)", + "polygon (0 0)", + "polygon(20px, 40px)", + "border-box content-box", + "polygon(0 0) polygon(0 0)", + "polygon(nonzero 0 0)", + "polygon(evenodd 20px 20px)", + "polygon(20px 20px, evenodd)", + "polygon(20px 20px, nonzero)", + "polygon(30% 30%", + ] + }; +} + + if (SpecialPowers.getBoolPref("layout.css.filters.enabled")) { gCSSProperties["filter"] = { domProp: "filter", diff --git a/layout/style/test/test_counter_descriptor_storage.html b/layout/style/test/test_counter_descriptor_storage.html index 287738dcb13d..8262d801724d 100644 --- a/layout/style/test/test_counter_descriptor_storage.html +++ b/layout/style/test/test_counter_descriptor_storage.html @@ -167,7 +167,7 @@ function test_system_dep_desc() { }, tests: { system: [ - [null, "extends", "fixed", "cyclic"], + [null, "extends", "fixed", "cyclic", "extends symbols('*')"], ["extends cjk-decimal", "ExTends cjk-decimal", "extends CJK-decimal"], ], symbols: [ @@ -235,13 +235,13 @@ function test_system_indep_desc() { [null, "0", "\"\"", "0 0", "a a", "0 a a"], ], fallback: [ - [null, "", "-", "0", "a b"], + [null, "", "-", "0", "a b", "symbols('*')"], ["a"], ["A"], ["decimal", "Decimal"], ], speakAs: [ - [null, "", "-", "0", "a b"], + [null, "", "-", "0", "a b", "symbols('*')"], ["auto", "AuTo"], ["bullets", "BULLETs"], ["numbers", "NumBers"], diff --git a/layout/style/ua.css b/layout/style/ua.css index 7ae492a54d1f..a540e44c995e 100644 --- a/layout/style/ua.css +++ b/layout/style/ua.css @@ -99,6 +99,11 @@ font-variant-numeric: tabular-nums; } +/* SVG documents don't always load this file but they do have links. + * If you change the link rules, consider carefully whether to make + * the same changes to svg.css. + */ + /* Links */ *|*:-moz-any-link { diff --git a/layout/svg/SVGTextFrame.cpp b/layout/svg/SVGTextFrame.cpp index 9e8f16e9be95..bb0fe219777f 100644 --- a/layout/svg/SVGTextFrame.cpp +++ b/layout/svg/SVGTextFrame.cpp @@ -14,6 +14,7 @@ #include "gfxTypes.h" #include "LookAndFeel.h" #include "mozilla/gfx/2D.h" +#include "mozilla/gfx/PatternHelpers.h" #include "nsAlgorithm.h" #include "nsBlockFrame.h" #include "nsCaret.h" @@ -2727,8 +2728,6 @@ public: void NotifySelectionDecorationLinePathEmitted() MOZ_OVERRIDE; private: - void FillWithOpacity(); - void SetupContext(); /** @@ -2741,7 +2740,7 @@ private: * Sets the gfxContext paint to the appropriate color or pattern * for filling text geometry. */ - bool SetFillColor(); + void MakeFillPattern(GeneralPattern* aOutPattern); /** * Fills and strokes a piece of text geometry, using group opacity @@ -2827,8 +2826,12 @@ SVGTextDrawPathCallbacks::NotifySelectionBackgroundPathEmitted() return; } - if (SetFillColor()) { - FillWithOpacity(); + GeneralPattern fillPattern; + MakeFillPattern(&fillPattern); + if (fillPattern.GetPattern()) { + gfx->SetFillRule(nsSVGUtils::ToFillRule(mFrame->StyleSVG()->mFillRule)); + gfx->FillWithOpacity(fillPattern, + mColor == NS_40PERCENT_FOREGROUND_COLOR ? 0.4 : 1.0); } gfx->Restore(); } @@ -2872,12 +2875,6 @@ SVGTextDrawPathCallbacks::NotifySelectionDecorationLinePathEmitted() gfx->Restore(); } -void -SVGTextDrawPathCallbacks::FillWithOpacity() -{ - gfx->FillWithOpacity(mColor == NS_40PERCENT_FOREGROUND_COLOR ? 0.4 : 1.0); -} - void SVGTextDrawPathCallbacks::SetupContext() { @@ -2899,12 +2896,9 @@ SVGTextDrawPathCallbacks::SetupContext() void SVGTextDrawPathCallbacks::HandleTextGeometry() { - if (mRenderMode != SVGAutoRenderState::NORMAL) { - // We're in a clip path. - if (mRenderMode == SVGAutoRenderState::CLIP_MASK) { - gfx->SetColor(gfxRGBA(1.0f, 1.0f, 1.0f, 1.0f)); - gfx->Fill(); - } + if (mRenderMode == SVGAutoRenderState::CLIP_MASK) { + gfx->SetColor(gfxRGBA(1.0f, 1.0f, 1.0f, 1.0f)); + gfx->Fill(); } else { // Normal painting. gfxContextMatrixAutoSaveRestore saveMatrix(gfx); @@ -2914,20 +2908,20 @@ SVGTextDrawPathCallbacks::HandleTextGeometry() } } -bool -SVGTextDrawPathCallbacks::SetFillColor() +void +SVGTextDrawPathCallbacks::MakeFillPattern(GeneralPattern* aOutPattern) { if (mColor == NS_SAME_AS_FOREGROUND_COLOR || mColor == NS_40PERCENT_FOREGROUND_COLOR) { - return nsSVGUtils::SetupCairoFillPaint(mFrame, gfx); + nsSVGUtils::MakeFillPatternFor(mFrame, gfx, aOutPattern); + return; } if (mColor == NS_TRANSPARENT) { - return false; + return; } - gfx->SetColor(gfxRGBA(mColor)); - return true; + aOutPattern->InitColorPattern(ToColor(gfxRGBA(mColor))); } void @@ -2968,19 +2962,27 @@ SVGTextDrawPathCallbacks::FillAndStrokeGeometry() void SVGTextDrawPathCallbacks::FillGeometry() { - if (SetFillColor()) { - gfx->Fill(); + GeneralPattern fillPattern; + MakeFillPattern(&fillPattern); + if (fillPattern.GetPattern()) { + gfx->SetFillRule(nsSVGUtils::ToFillRule(mFrame->StyleSVG()->mFillRule)); + gfx->Fill(fillPattern); } } void SVGTextDrawPathCallbacks::StrokeGeometry() { + // We don't paint the stroke when we are filling with a selection color. if (mColor == NS_SAME_AS_FOREGROUND_COLOR || mColor == NS_40PERCENT_FOREGROUND_COLOR) { - // Don't paint the stroke when we are filling with a selection color. - if (nsSVGUtils::SetupCairoStroke(mFrame, gfx)) { - gfx->Stroke(); + if (nsSVGUtils::HasStroke(mFrame, /*aContextPaint*/ nullptr)) { + GeneralPattern strokePattern; + nsSVGUtils::MakeStrokePatternFor(mFrame, gfx, &strokePattern, /*aContextPaint*/ nullptr); + if (strokePattern.GetPattern()) { + nsSVGUtils::SetupCairoStrokeGeometry(mFrame, gfx, /*aContextPaint*/ nullptr); + gfx->Stroke(strokePattern); + } } } } @@ -2989,21 +2991,24 @@ SVGTextDrawPathCallbacks::StrokeGeometry() // SVGTextContextPaint methods: already_AddRefed -SVGTextContextPaint::GetFillPattern(float aOpacity, +SVGTextContextPaint::GetFillPattern(const DrawTarget* aDrawTarget, + float aOpacity, const gfxMatrix& aCTM) { - return mFillPaint.GetPattern(aOpacity, &nsStyleSVG::mFill, aCTM); + return mFillPaint.GetPattern(aDrawTarget, aOpacity, &nsStyleSVG::mFill, aCTM); } already_AddRefed -SVGTextContextPaint::GetStrokePattern(float aOpacity, +SVGTextContextPaint::GetStrokePattern(const DrawTarget* aDrawTarget, + float aOpacity, const gfxMatrix& aCTM) { - return mStrokePaint.GetPattern(aOpacity, &nsStyleSVG::mStroke, aCTM); + return mStrokePaint.GetPattern(aDrawTarget, aOpacity, &nsStyleSVG::mStroke, aCTM); } already_AddRefed -SVGTextContextPaint::Paint::GetPattern(float aOpacity, +SVGTextContextPaint::Paint::GetPattern(const DrawTarget* aDrawTarget, + float aOpacity, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, const gfxMatrix& aCTM) { @@ -3030,6 +3035,7 @@ SVGTextContextPaint::Paint::GetPattern(float aOpacity, break; case eStyleSVGPaintType_Server: pattern = mPaintDefinition.mPaintServerFrame->GetPaintServerPattern(mFrame, + aDrawTarget, mContextMatrix, aFillOrStroke, aOpacity); @@ -3046,12 +3052,14 @@ SVGTextContextPaint::Paint::GetPattern(float aOpacity, pattern->SetMatrix(aCTM * mPatternMatrix); break; case eStyleSVGPaintType_ContextFill: - pattern = mPaintDefinition.mContextPaint->GetFillPattern(aOpacity, aCTM); + pattern = mPaintDefinition.mContextPaint->GetFillPattern(aDrawTarget, + aOpacity, aCTM); // Don't cache this. mContextPaint will have cached it anyway. If we // cache it, we'll have to compute mPatternMatrix, which is annoying. return pattern.forget(); case eStyleSVGPaintType_ContextStroke: - pattern = mPaintDefinition.mContextPaint->GetStrokePattern(aOpacity, aCTM); + pattern = mPaintDefinition.mContextPaint->GetStrokePattern(aDrawTarget, + aOpacity, aCTM); // Don't cache this. mContextPaint will have cached it anyway. If we // cache it, we'll have to compute mPatternMatrix, which is annoying. return pattern.forget(); @@ -3673,8 +3681,8 @@ SVGTextFrame::PaintSVG(nsRenderingContext* aContext, SVGTextContextPaint contextPaint; DrawMode drawMode = - SetupContextPaint(gfx->CurrentMatrix(), frame, outerContextPaint, - &contextPaint); + SetupContextPaint(gfx->GetDrawTarget(), gfx->CurrentMatrix(), + frame, outerContextPaint, &contextPaint); if (int(drawMode) & int(DrawMode::GLYPH_STROKE)) { // This may change the gfxContext's transform (for non-scaling stroke), @@ -5583,7 +5591,8 @@ SVGTextFrame::TransformFrameRectFromTextChild(const nsRect& aRect, * server frame */ static void -SetupInheritablePaint(const gfxMatrix& aContextMatrix, +SetupInheritablePaint(const DrawTarget* aDrawTarget, + const gfxMatrix& aContextMatrix, nsIFrame* aFrame, float& aOpacity, gfxTextContextPaint* aOuterContextPaint, @@ -5597,7 +5606,8 @@ SetupInheritablePaint(const gfxMatrix& aContextMatrix, if (ps) { nsRefPtr pattern = - ps->GetPaintServerPattern(aFrame, aContextMatrix, aFillOrStroke, aOpacity); + ps->GetPaintServerPattern(aFrame, aDrawTarget, aContextMatrix, + aFillOrStroke, aOpacity); if (pattern) { aTargetPaint.SetPaintServer(aFrame, aContextMatrix, ps); return; @@ -5607,10 +5617,12 @@ SetupInheritablePaint(const gfxMatrix& aContextMatrix, nsRefPtr pattern; switch ((style->*aFillOrStroke).mType) { case eStyleSVGPaintType_ContextFill: - pattern = aOuterContextPaint->GetFillPattern(aOpacity, aContextMatrix); + pattern = aOuterContextPaint->GetFillPattern(aDrawTarget, aOpacity, + aContextMatrix); break; case eStyleSVGPaintType_ContextStroke: - pattern = aOuterContextPaint->GetStrokePattern(aOpacity, aContextMatrix); + pattern = aOuterContextPaint->GetStrokePattern(aDrawTarget, aOpacity, + aContextMatrix); break; default: ; @@ -5626,7 +5638,8 @@ SetupInheritablePaint(const gfxMatrix& aContextMatrix, } DrawMode -SVGTextFrame::SetupContextPaint(const gfxMatrix& aContextMatrix, +SVGTextFrame::SetupContextPaint(const DrawTarget* aDrawTarget, + const gfxMatrix& aContextMatrix, nsIFrame* aFrame, gfxTextContextPaint* aOuterContextPaint, SVGTextContextPaint* aThisContextPaint) @@ -5643,7 +5656,8 @@ SVGTextFrame::SetupContextPaint(const gfxMatrix& aContextMatrix, style->mFillOpacity, aOuterContextPaint); - SetupInheritablePaint(aContextMatrix, aFrame, opacity, aOuterContextPaint, + SetupInheritablePaint(aDrawTarget, aContextMatrix, aFrame, + opacity, aOuterContextPaint, aThisContextPaint->mFillPaint, &nsStyleSVG::mFill, nsSVGEffects::FillProperty()); @@ -5660,7 +5674,8 @@ SVGTextFrame::SetupContextPaint(const gfxMatrix& aContextMatrix, style->mStrokeOpacity, aOuterContextPaint); - SetupInheritablePaint(aContextMatrix, aFrame, opacity, aOuterContextPaint, + SetupInheritablePaint(aDrawTarget, aContextMatrix, aFrame, + opacity, aOuterContextPaint, aThisContextPaint->mStrokePaint, &nsStyleSVG::mStroke, nsSVGEffects::StrokeProperty()); diff --git a/layout/svg/SVGTextFrame.h b/layout/svg/SVGTextFrame.h index 76ce11854a9a..0e49e4658abb 100644 --- a/layout/svg/SVGTextFrame.h +++ b/layout/svg/SVGTextFrame.h @@ -139,9 +139,14 @@ private: // Slightly horrible callback for deferring application of opacity struct SVGTextContextPaint : public gfxTextContextPaint { - already_AddRefed GetFillPattern(float aOpacity, +protected: + typedef mozilla::gfx::DrawTarget DrawTarget; +public: + already_AddRefed GetFillPattern(const DrawTarget* aDrawTarget, + float aOpacity, const gfxMatrix& aCTM) MOZ_OVERRIDE; - already_AddRefed GetStrokePattern(float aOpacity, + already_AddRefed GetStrokePattern(const DrawTarget* aDrawTarget, + float aOpacity, const gfxMatrix& aCTM) MOZ_OVERRIDE; void SetFillOpacity(float aOpacity) { mFillOpacity = aOpacity; } @@ -190,7 +195,8 @@ struct SVGTextContextPaint : public gfxTextContextPaint { gfxMatrix mPatternMatrix; nsRefPtrHashtable mPatternCache; - already_AddRefed GetPattern(float aOpacity, + already_AddRefed GetPattern(const DrawTarget* aDrawTarget, + float aOpacity, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, const gfxMatrix& aCTM); }; @@ -252,6 +258,7 @@ class SVGTextFrame MOZ_FINAL : public SVGTextFrameBase friend class MutationObserver; friend class nsDisplaySVGText; + typedef mozilla::gfx::DrawTarget DrawTarget; typedef mozilla::gfx::Path Path; typedef mozilla::gfx::Point Point; typedef mozilla::SVGTextContextPaint SVGTextContextPaint; @@ -594,7 +601,8 @@ private: gfxFloat GetOffsetScale(nsIFrame* aTextPathFrame); gfxFloat GetStartOffset(nsIFrame* aTextPathFrame); - DrawMode SetupContextPaint(const gfxMatrix& aContextMatrix, + DrawMode SetupContextPaint(const DrawTarget* aDrawTarget, + const gfxMatrix& aContextMatrix, nsIFrame* aFrame, gfxTextContextPaint* aOuterContextPaint, SVGTextContextPaint* aThisContextPaint); diff --git a/layout/svg/nsFilterInstance.cpp b/layout/svg/nsFilterInstance.cpp index 18e276252554..bc08c7f87738 100644 --- a/layout/svg/nsFilterInstance.cpp +++ b/layout/svg/nsFilterInstance.cpp @@ -10,9 +10,11 @@ #include "mozilla/UniquePtr.h" // Keep others in (case-insensitive) order: +#include "gfx2DGlue.h" #include "gfxPlatform.h" #include "gfxUtils.h" #include "mozilla/gfx/Helpers.h" +#include "mozilla/gfx/PatternHelpers.h" #include "nsISVGChildFrame.h" #include "nsRenderingContext.h" #include "nsCSSFilterInstance.h" @@ -367,17 +369,19 @@ nsFilterInstance::BuildSourcePaint(SourceInfo *aSource, gfx->Multiply(mPaintTransform * deviceToFilterSpace * gfxMatrix::Translation(-neededRect.TopLeft())); - gfx->Rectangle(FilterSpaceToUserSpace(neededRect)); - if ((aSource == &mFillPaint && - nsSVGUtils::SetupCairoFillPaint(mTargetFrame, gfx)) || - (aSource == &mStrokePaint && - nsSVGUtils::SetupCairoStrokePaint(mTargetFrame, gfx))) { - gfx->Fill(); + GeneralPattern pattern; + if (aSource == &mFillPaint) { + nsSVGUtils::MakeFillPatternFor(mTargetFrame, gfx, &pattern); + } else if (aSource == &mStrokePaint) { + nsSVGUtils::MakeStrokePatternFor(mTargetFrame, gfx, &pattern); + } + if (pattern.GetPattern()) { + offscreenDT->FillRect(ToRect(FilterSpaceToUserSpace(neededRect)), + pattern); } gfx->Restore(); } - aSource->mSourceSurface = offscreenDT->Snapshot(); aSource->mSurfaceRect = ToIntRect(neededRect); diff --git a/layout/svg/nsSVGClipPathFrame.cpp b/layout/svg/nsSVGClipPathFrame.cpp index 780a8030fe39..0aabee2a8d9d 100644 --- a/layout/svg/nsSVGClipPathFrame.cpp +++ b/layout/svg/nsSVGClipPathFrame.cpp @@ -12,6 +12,8 @@ #include "nsGkAtoms.h" #include "nsRenderingContext.h" #include "nsSVGEffects.h" +#include "nsSVGPathGeometryElement.h" +#include "nsSVGPathGeometryFrame.h" #include "nsSVGUtils.h" using namespace mozilla; @@ -45,34 +47,45 @@ nsSVGClipPathFrame::ApplyClipOrPaintClipMask(nsRenderingContext* aContext, mMatrixForChildren = GetClipPathTransform(aClippedFrame) * aMatrix; - gfxContext *gfx = aContext->ThebesContext(); + gfxContext* gfx = aContext->ThebesContext(); - nsISVGChildFrame *singleClipPathChild = nullptr; + nsISVGChildFrame* singleClipPathChild = nullptr; if (IsTrivial(&singleClipPathChild)) { - // Notify our child that it's painting as part of a clipPath, and that - // we only require it to draw its path (it should skip filling, etc.): - SVGAutoRenderState mode(aContext, SVGAutoRenderState::CLIP); - - if (!singleClipPathChild) { - // We have no children - the spec says clip away everything: - gfx->Rectangle(gfxRect()); - } else { - nsIFrame* child = do_QueryFrame(singleClipPathChild); - nsIContent* childContent = child->GetContent(); - if (childContent->IsSVG()) { - singleClipPathChild->NotifySVGChanged( - nsISVGChildFrame::TRANSFORM_CHANGED); - gfxMatrix toChildsUserSpace = - static_cast(childContent)-> - PrependLocalTransformsTo(mMatrixForChildren, - nsSVGElement::eUserSpaceToParent); - singleClipPathChild->PaintSVG(aContext, toChildsUserSpace); - } else { - // else, again, clip everything away - gfx->Rectangle(gfxRect()); + gfxContextMatrixAutoSaveRestore autoRestore(gfx); + RefPtr clipPath; + if (singleClipPathChild) { + nsSVGPathGeometryFrame* pathFrame = do_QueryFrame(singleClipPathChild); + if (pathFrame) { + nsSVGPathGeometryElement* pathElement = + static_cast(pathFrame->GetContent()); + gfxMatrix toChildsUserSpace = pathElement-> + PrependLocalTransformsTo(mMatrixForChildren, + nsSVGElement::eUserSpaceToParent); + gfxMatrix newMatrix = + gfx->CurrentMatrix().PreMultiply(toChildsUserSpace).NudgeToIntegers(); + if (!newMatrix.IsSingular()) { + gfx->SetMatrix(newMatrix); + RefPtr builder = + gfx->GetDrawTarget()->CreatePathBuilder( + nsSVGUtils::ToFillRule(pathFrame->StyleSVG()->mClipRule)); + clipPath = pathElement->BuildPath(builder); + } } } + gfx->NewPath(); + if (clipPath) { + gfx->SetPath(clipPath); + // gfxContext::Clip() resets the FillRule on any Path set by + // gfxContext::SetPath() call to the contexts own current FillRule. + // So as long as we're doing the clipping via the gfxContext we need to + // set the FillRule on the context (even though that's a Path state): + gfx->SetFillRule(clipPath->GetFillRule()); + } else { + // The spec says clip away everything if we have no children or the + // clipping path otherwise can't be resolved: + gfx->Rectangle(gfxRect()); + } gfx->Clip(); gfx->NewPath(); return NS_OK; diff --git a/layout/svg/nsSVGEffects.cpp b/layout/svg/nsSVGEffects.cpp index f79203b55c1e..009860a43b5e 100644 --- a/layout/svg/nsSVGEffects.cpp +++ b/layout/svg/nsSVGEffects.cpp @@ -551,8 +551,12 @@ nsSVGEffects::GetEffectProperties(nsIFrame *aFrame) EffectProperties result; const nsStyleSVGReset *style = aFrame->StyleSVGReset(); result.mFilter = GetOrCreateFilterProperty(aFrame); - result.mClipPath = - GetPaintingProperty(style->mClipPath, aFrame, ClipPathProperty()); + if (style->mClipPath.GetType() == NS_STYLE_CLIP_PATH_URL) { + result.mClipPath = + GetPaintingProperty(style->mClipPath.GetURL(), aFrame, ClipPathProperty()); + } else { + result.mClipPath = nullptr; + } result.mMask = GetPaintingProperty(style->mMask, aFrame, MaskProperty()); return result; diff --git a/layout/svg/nsSVGGradientFrame.cpp b/layout/svg/nsSVGGradientFrame.cpp index 0919eafa4090..912c7308d350 100644 --- a/layout/svg/nsSVGGradientFrame.cpp +++ b/layout/svg/nsSVGGradientFrame.cpp @@ -209,11 +209,12 @@ static void GetStopInformation(nsIFrame* aStopFrame, } already_AddRefed -nsSVGGradientFrame::GetPaintServerPattern(nsIFrame *aSource, +nsSVGGradientFrame::GetPaintServerPattern(nsIFrame* aSource, + const DrawTarget* aDrawTarget, const gfxMatrix& aContextMatrix, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, float aGraphicOpacity, - const gfxRect *aOverrideBounds) + const gfxRect* aOverrideBounds) { uint16_t gradientUnits = GetGradientUnits(); MOZ_ASSERT(gradientUnits == SVG_UNIT_TYPE_OBJECTBOUNDINGBOX || diff --git a/layout/svg/nsSVGGradientFrame.h b/layout/svg/nsSVGGradientFrame.h index a9921d58ff10..ccb4cc0808c7 100644 --- a/layout/svg/nsSVGGradientFrame.h +++ b/layout/svg/nsSVGGradientFrame.h @@ -47,11 +47,12 @@ public: // nsSVGPaintServerFrame methods: virtual already_AddRefed - GetPaintServerPattern(nsIFrame *aSource, + GetPaintServerPattern(nsIFrame* aSource, + const DrawTarget* aDrawTarget, const gfxMatrix& aContextMatrix, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, float aGraphicOpacity, - const gfxRect *aOverrideBounds) MOZ_OVERRIDE; + const gfxRect* aOverrideBounds) MOZ_OVERRIDE; // nsIFrame interface: virtual nsresult AttributeChanged(int32_t aNameSpaceID, diff --git a/layout/svg/nsSVGIntegrationUtils.cpp b/layout/svg/nsSVGIntegrationUtils.cpp index 94982c972ff1..b0e523adbc14 100644 --- a/layout/svg/nsSVGIntegrationUtils.cpp +++ b/layout/svg/nsSVGIntegrationUtils.cpp @@ -152,7 +152,8 @@ nsSVGIntegrationUtils::UsingEffectsForFrame(const nsIFrame* aFrame) // checking the SDL prefs here, since we don't know if we're being called for // painting or hit-testing anyway. const nsStyleSVGReset *style = aFrame->StyleSVGReset(); - return (style->HasFilters() || style->mClipPath || style->mMask); + return (style->HasFilters() || + style->mClipPath.GetType() != NS_STYLE_CLIP_PATH_NONE || style->mMask); } // For non-SVG frames, this gives the offset to the frame's "user space". @@ -694,6 +695,7 @@ nsSVGIntegrationUtils::DrawableFromPaintServer(nsIFrame* aFrame, nsIFrame* aTarget, const nsSize& aPaintServerSize, const gfxIntSize& aRenderSize, + const DrawTarget* aDrawTarget, const gfxMatrix& aContextMatrix, uint32_t aFlags) { @@ -714,8 +716,9 @@ nsSVGIntegrationUtils::DrawableFromPaintServer(nsIFrame* aFrame, aPaintServerSize.width, aPaintServerSize.height); overrideBounds.ScaleInverse(aFrame->PresContext()->AppUnitsPerDevPixel()); nsRefPtr pattern = - server->GetPaintServerPattern(aTarget, aContextMatrix, - &nsStyleSVG::mFill, 1.0, &overrideBounds); + server->GetPaintServerPattern(aTarget, aDrawTarget, + aContextMatrix, &nsStyleSVG::mFill, 1.0, + &overrideBounds); if (!pattern) return nullptr; diff --git a/layout/svg/nsSVGIntegrationUtils.h b/layout/svg/nsSVGIntegrationUtils.h index bb5b89ac81a1..f05ab1ce30d9 100644 --- a/layout/svg/nsSVGIntegrationUtils.h +++ b/layout/svg/nsSVGIntegrationUtils.h @@ -22,6 +22,9 @@ struct nsRect; struct nsIntRect; namespace mozilla { +namespace gfx { +class DrawTarget; +} namespace layers { class LayerManager; } @@ -36,6 +39,8 @@ struct nsSize; */ class nsSVGIntegrationUtils MOZ_FINAL { + typedef mozilla::gfx::DrawTarget DrawTarget; + public: /** * Returns true if SVG effects are currently applied to this frame. @@ -166,6 +171,7 @@ public: nsIFrame* aTarget, const nsSize& aPaintServerSize, const gfxIntSize& aRenderSize, + const DrawTarget* aDrawTarget, const gfxMatrix& aContextMatrix, uint32_t aFlags); }; diff --git a/layout/svg/nsSVGPaintServerFrame.cpp b/layout/svg/nsSVGPaintServerFrame.cpp index 1e7b60c0b5c0..b065c2864bf1 100644 --- a/layout/svg/nsSVGPaintServerFrame.cpp +++ b/layout/svg/nsSVGPaintServerFrame.cpp @@ -11,21 +11,3 @@ #include "nsSVGElement.h" NS_IMPL_FRAMEARENA_HELPERS(nsSVGPaintServerFrame) - -bool -nsSVGPaintServerFrame::SetupPaintServer(gfxContext *aContext, - nsIFrame *aSource, - nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, - float aOpacity) -{ - nsRefPtr pattern = - GetPaintServerPattern(aSource, aContext->CurrentMatrix(), aFillOrStroke, - aOpacity); - if (!pattern) - return false; - - pattern->CacheColorStops(aContext->GetDrawTarget()); - - aContext->SetPattern(pattern); - return true; -} diff --git a/layout/svg/nsSVGPaintServerFrame.h b/layout/svg/nsSVGPaintServerFrame.h index 21cb02904217..44abe008bb15 100644 --- a/layout/svg/nsSVGPaintServerFrame.h +++ b/layout/svg/nsSVGPaintServerFrame.h @@ -14,6 +14,12 @@ #include "nsSVGContainerFrame.h" #include "nsSVGUtils.h" +namespace mozilla { +namespace gfx { +class DrawTarget; +} +} + class gfxContext; class gfxPattern; class nsStyleContext; @@ -25,6 +31,8 @@ typedef nsSVGContainerFrame nsSVGPaintServerFrameBase; class nsSVGPaintServerFrame : public nsSVGPaintServerFrameBase { protected: + typedef mozilla::gfx::DrawTarget DrawTarget; + explicit nsSVGPaintServerFrame(nsStyleContext* aContext) : nsSVGPaintServerFrameBase(aContext) { @@ -44,20 +52,12 @@ public: */ virtual already_AddRefed GetPaintServerPattern(nsIFrame *aSource, + const DrawTarget* aDrawTarget, const gfxMatrix& aContextMatrix, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, float aOpacity, const gfxRect *aOverrideBounds = nullptr) = 0; - /** - * Configure paint server prior to rendering - * @return false to skip rendering - */ - virtual bool SetupPaintServer(gfxContext *aContext, - nsIFrame *aSource, - nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, - float aOpacity); - // nsIFrame methods: virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, diff --git a/layout/svg/nsSVGPathGeometryFrame.cpp b/layout/svg/nsSVGPathGeometryFrame.cpp index 5e27ccdd9dd5..418cae1e0590 100644 --- a/layout/svg/nsSVGPathGeometryFrame.cpp +++ b/layout/svg/nsSVGPathGeometryFrame.cpp @@ -503,7 +503,6 @@ nsSVGPathGeometryFrame::GetBBoxContribution(const Matrix &aToBBoxUserspace, // though, because if pathExtents is empty, its position will not have // been set. Happily we can use tmpCtx->GetUserStrokeExtent() to find // the center point of the extents even though it gets the extents wrong. - nsSVGUtils::SetupCairoStrokeBBoxGeometry(this, tmpCtx); pathExtents.MoveTo(tmpCtx->GetUserStrokeExtent().Center()); pathExtents.SizeTo(0, 0); } @@ -615,7 +614,28 @@ nsSVGPathGeometryFrame::Render(nsRenderingContext *aContext, { gfxContext *gfx = aContext->ThebesContext(); + gfxMatrix newMatrix = + gfx->CurrentMatrix().PreMultiply(aTransform).NudgeToIntegers(); + if (newMatrix.IsSingular()) { + return; + } + uint16_t renderMode = SVGAutoRenderState::GetRenderMode(aContext); + FillRule fillRule = + nsSVGUtils::ToFillRule(renderMode == SVGAutoRenderState::CLIP_MASK ? + StyleSVG()->mClipRule : StyleSVG()->mFillRule); + + RefPtr builder = + aContext->GetDrawTarget()->CreatePathBuilder(fillRule); + if (!builder) { + return; + } + + RefPtr path = + static_cast(mContent)->BuildPath(builder); + if (!path) { + return; + } switch (StyleSVG()->mShapeRendering) { case NS_STYLE_SHAPE_RENDERING_OPTIMIZESPEED: @@ -627,72 +647,49 @@ nsSVGPathGeometryFrame::Render(nsRenderingContext *aContext, break; } - if (renderMode != SVGAutoRenderState::NORMAL) { - NS_ABORT_IF_FALSE(renderMode == SVGAutoRenderState::CLIP || - renderMode == SVGAutoRenderState::CLIP_MASK, - "Unknown render mode"); + if (renderMode == SVGAutoRenderState::CLIP_MASK) { + FillRule oldFillRule = gfx->CurrentFillRule(); + gfxContextMatrixAutoSaveRestore autoSaveRestore(gfx); - // In the case that |renderMode == SVGAutoRenderState::CLIP| then we don't - // use the path we generate here until further up the call stack when - // nsSVGClipPathFrame::Clip calls gfxContext::Clip. That's a problem for - // Moz2D which emits paths in user space (unlike cairo which emits paths in - // device space). gfxContext has hacks to deal with code changing the - // transform then using the current path when it is backed by Moz2D, but - // Moz2D itself does not since that would fundamentally go against its API. - // Therefore we do not want to Save()/Restore() the gfxContext here in the - // SVGAutoRenderState::CLIP case since that would block us from killing off - // gfxContext and using Moz2D directly. Not bothering to Save()/Restore() - // is actually okay, since we know that doesn't matter in the - // SVGAutoRenderState::CLIP case (at least for the current implementation). - gfxContextMatrixAutoSaveRestore autoSaveRestore; - // For now revent back to doing the save even for CLIP to fix bug 959128. - // Undo in bug 987193. - //if (renderMode != SVGAutoRenderState::CLIP) { - autoSaveRestore.SetContext(gfx); - //} - - GeneratePath(gfx, ToMatrix(aTransform)); - - // We used to call gfx->Restore() here, since for the - // SVGAutoRenderState::CLIP case it is important to leave the fill rule - // that we set below untouched so that the value is still set when return - // to gfxContext::Clip() further up the call stack. Since we no longer - // call gfx->Save() in the SVGAutoRenderState::CLIP case we don't need to - // worry that autoSaveRestore will delay the Restore() call for the - // CLIP_MASK case until we exit this function. - - gfxContext::FillRule oldFillRull = gfx->CurrentFillRule(); - - if (StyleSVG()->mClipRule == NS_STYLE_FILL_RULE_EVENODD) - gfx->SetFillRule(gfxContext::FILL_RULE_EVEN_ODD); - else - gfx->SetFillRule(gfxContext::FILL_RULE_WINDING); - - if (renderMode == SVGAutoRenderState::CLIP_MASK) { - gfx->SetColor(gfxRGBA(1.0f, 1.0f, 1.0f, 1.0f)); - gfx->Fill(); - gfx->SetFillRule(oldFillRull); // restore, but only for CLIP_MASK - gfx->NewPath(); - } + gfx->SetMatrix(newMatrix); + gfx->SetFillRule(fillRule); + gfx->SetColor(gfxRGBA(1.0f, 1.0f, 1.0f, 1.0f)); + gfx->SetPath(path); + gfx->Fill(); + gfx->SetFillRule(oldFillRule); + gfx->NewPath(); return; } - gfxContextAutoSaveRestore autoSaveRestore(gfx); + NS_ABORT_IF_FALSE(renderMode == SVGAutoRenderState::NORMAL, + "Unknown render mode"); - GeneratePath(gfx, ToMatrix(aTransform)); + gfxContextAutoSaveRestore autoSaveRestore(gfx); + gfx->SetMatrix(newMatrix); gfxTextContextPaint *contextPaint = (gfxTextContextPaint*)aContext->GetDrawTarget()->GetUserData(&gfxTextContextPaint::sUserDataKey); - if ((aRenderComponents & eRenderFill) && - nsSVGUtils::SetupCairoFillPaint(this, gfx, contextPaint)) { - gfx->Fill(); + if ((aRenderComponents & eRenderFill)) { + GeneralPattern fillPattern; + nsSVGUtils::MakeFillPatternFor(this, gfx, &fillPattern, contextPaint); + if (fillPattern.GetPattern()) { + gfx->SetPath(path); + gfx->SetFillRule(fillRule); + gfx->Fill(fillPattern); + } } if ((aRenderComponents & eRenderStroke) && - nsSVGUtils::SetupCairoStroke(this, gfx, contextPaint)) { - gfx->Stroke(); + nsSVGUtils::HasStroke(this, contextPaint)) { + GeneralPattern strokePattern; + nsSVGUtils::MakeStrokePatternFor(this, gfx, &strokePattern, contextPaint); + if (strokePattern.GetPattern()) { + gfx->SetPath(path); + nsSVGUtils::SetupCairoStrokeGeometry(this, gfx, contextPaint); + gfx->Stroke(strokePattern); + } } gfx->NewPath(); diff --git a/layout/svg/nsSVGPatternFrame.cpp b/layout/svg/nsSVGPatternFrame.cpp index 8aad7675542d..12ed1faf2cd9 100644 --- a/layout/svg/nsSVGPatternFrame.cpp +++ b/layout/svg/nsSVGPatternFrame.cpp @@ -231,7 +231,8 @@ GetTargetGeometry(gfxRect *aBBox, } TemporaryRef -nsSVGPatternFrame::PaintPattern(Matrix* patternMatrix, +nsSVGPatternFrame::PaintPattern(const DrawTarget* aDrawTarget, + Matrix* patternMatrix, const Matrix &aContextMatrix, nsIFrame *aSource, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, @@ -373,8 +374,7 @@ nsSVGPatternFrame::PaintPattern(Matrix* patternMatrix, } RefPtr dt = - gfxPlatform::GetPlatform()-> - CreateOffscreenContentDrawTarget(surfaceSize, SurfaceFormat::B8G8R8A8); + aDrawTarget->CreateSimilarDrawTarget(surfaceSize, SurfaceFormat::B8G8R8A8); if (!dt) { return nullptr; } @@ -707,6 +707,7 @@ nsSVGPatternFrame::ConstructCTM(const nsSVGViewBox& aViewBox, already_AddRefed nsSVGPatternFrame::GetPaintServerPattern(nsIFrame *aSource, + const DrawTarget* aDrawTarget, const gfxMatrix& aContextMatrix, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, float aGraphicOpacity, @@ -720,8 +721,8 @@ nsSVGPatternFrame::GetPaintServerPattern(nsIFrame *aSource, // Paint it! Matrix pMatrix; RefPtr surface = - PaintPattern(&pMatrix, ToMatrix(aContextMatrix), aSource, aFillOrStroke, - aGraphicOpacity, aOverrideBounds); + PaintPattern(aDrawTarget, &pMatrix, ToMatrix(aContextMatrix), aSource, + aFillOrStroke, aGraphicOpacity, aOverrideBounds); if (!surface) { return nullptr; diff --git a/layout/svg/nsSVGPatternFrame.h b/layout/svg/nsSVGPatternFrame.h index 8cc7325eec35..37fab695055c 100644 --- a/layout/svg/nsSVGPatternFrame.h +++ b/layout/svg/nsSVGPatternFrame.h @@ -46,6 +46,7 @@ public: // nsSVGPaintServerFrame methods: virtual already_AddRefed GetPaintServerPattern(nsIFrame *aSource, + const DrawTarget* aDrawTarget, const gfxMatrix& aContextMatrix, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, float aOpacity, @@ -112,7 +113,8 @@ protected: } mozilla::TemporaryRef - PaintPattern(Matrix *patternMatrix, + PaintPattern(const DrawTarget* aDrawTarget, + Matrix *patternMatrix, const Matrix &aContextMatrix, nsIFrame *aSource, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, diff --git a/layout/svg/nsSVGUtils.cpp b/layout/svg/nsSVGUtils.cpp index 53a705bae7f6..307036e953e9 100644 --- a/layout/svg/nsSVGUtils.cpp +++ b/layout/svg/nsSVGUtils.cpp @@ -16,6 +16,7 @@ #include "gfxRect.h" #include "gfxUtils.h" #include "mozilla/gfx/2D.h" +#include "mozilla/gfx/PatternHelpers.h" #include "mozilla/Preferences.h" #include "nsCSSFrameConstructor.h" #include "nsDisplayList.h" @@ -1233,20 +1234,6 @@ nsSVGUtils::GetFallbackOrPaintColor(nsStyleContext *aStyleContext, return color; } -static void -SetupFallbackOrPaintColor(gfxContext *aContext, nsStyleContext *aStyleContext, - nsStyleSVGPaint nsStyleSVG::*aFillOrStroke, - float aOpacity) -{ - nscolor color = - nsSVGUtils::GetFallbackOrPaintColor(aStyleContext, aFillOrStroke); - - aContext->SetColor(gfxRGBA(NS_GET_R(color)/255.0, - NS_GET_G(color)/255.0, - NS_GET_B(color)/255.0, - NS_GET_A(color)/255.0 * aOpacity)); -} - static float MaybeOptimizeOpacity(nsIFrame *aFrame, float aFillOrStrokeOpacity) { @@ -1257,102 +1244,129 @@ MaybeOptimizeOpacity(nsIFrame *aFrame, float aFillOrStrokeOpacity) return aFillOrStrokeOpacity; } -/* static */ bool -nsSVGUtils::SetupContextPaint(gfxContext *aContext, - gfxTextContextPaint *aContextPaint, - const nsStyleSVGPaint &aPaint, - float aOpacity) -{ - nsRefPtr pattern; - - if (!aContextPaint) { - return false; - } - - switch (aPaint.mType) { - case eStyleSVGPaintType_ContextFill: - pattern = aContextPaint->GetFillPattern(aOpacity, aContext->CurrentMatrix()); - break; - case eStyleSVGPaintType_ContextStroke: - pattern = aContextPaint->GetStrokePattern(aOpacity, aContext->CurrentMatrix()); - break; - default: - return false; - } - - if (!pattern) { - return false; - } - - aContext->SetPattern(pattern); - - return true; -} - -bool -nsSVGUtils::SetupCairoFillPaint(nsIFrame *aFrame, gfxContext* aContext, - gfxTextContextPaint *aContextPaint) +/* static */ void +nsSVGUtils::MakeFillPatternFor(nsIFrame* aFrame, + gfxContext* aContext, + GeneralPattern* aOutPattern, + gfxTextContextPaint* aContextPaint) { const nsStyleSVG* style = aFrame->StyleSVG(); - if (style->mFill.mType == eStyleSVGPaintType_None) - return false; - - if (style->mFillRule == NS_STYLE_FILL_RULE_EVENODD) - aContext->SetFillRule(gfxContext::FILL_RULE_EVEN_ODD); - else - aContext->SetFillRule(gfxContext::FILL_RULE_WINDING); + if (style->mFill.mType == eStyleSVGPaintType_None) { + return; + } float opacity = MaybeOptimizeOpacity(aFrame, GetOpacity(style->mFillOpacitySource, style->mFillOpacity, aContextPaint)); - nsSVGPaintServerFrame *ps = - nsSVGEffects::GetPaintServer(aFrame, &style->mFill, nsSVGEffects::FillProperty()); - if (ps && ps->SetupPaintServer(aContext, aFrame, &nsStyleSVG::mFill, opacity)) - return true; + const DrawTarget* dt = aContext->GetDrawTarget(); - if (SetupContextPaint(aContext, aContextPaint, style->mFill, opacity)) { - return true; + nsSVGPaintServerFrame *ps = + nsSVGEffects::GetPaintServer(aFrame, &style->mFill, + nsSVGEffects::FillProperty()); + if (ps) { + nsRefPtr pattern = + ps->GetPaintServerPattern(aFrame, dt, aContext->CurrentMatrix(), + &nsStyleSVG::mFill, opacity); + if (pattern) { + pattern->CacheColorStops(dt); + aOutPattern->Init(*pattern->GetPattern(dt)); + return; + } + } + + if (aContextPaint) { + nsRefPtr pattern; + switch (style->mFill.mType) { + case eStyleSVGPaintType_ContextFill: + pattern = aContextPaint->GetFillPattern(dt, opacity, + aContext->CurrentMatrix()); + break; + case eStyleSVGPaintType_ContextStroke: + pattern = aContextPaint->GetStrokePattern(dt, opacity, + aContext->CurrentMatrix()); + break; + default: + ; + } + if (pattern) { + aOutPattern->Init(*pattern->GetPattern(dt)); + return; + } } // On failure, use the fallback colour in case we have an // objectBoundingBox where the width or height of the object is zero. // See http://www.w3.org/TR/SVG11/coords.html#ObjectBoundingBox - SetupFallbackOrPaintColor(aContext, aFrame->StyleContext(), - &nsStyleSVG::mFill, opacity); - - return true; + nscolor color = GetFallbackOrPaintColor(aFrame->StyleContext(), + &nsStyleSVG::mFill); + aOutPattern->InitColorPattern(Color(NS_GET_R(color)/255.0, + NS_GET_G(color)/255.0, + NS_GET_B(color)/255.0, + NS_GET_A(color)/255.0 * opacity)); } -bool -nsSVGUtils::SetupCairoStrokePaint(nsIFrame *aFrame, gfxContext* aContext, - gfxTextContextPaint *aContextPaint) +/* static */ void +nsSVGUtils::MakeStrokePatternFor(nsIFrame* aFrame, + gfxContext* aContext, + GeneralPattern* aOutPattern, + gfxTextContextPaint* aContextPaint) { const nsStyleSVG* style = aFrame->StyleSVG(); - if (style->mStroke.mType == eStyleSVGPaintType_None) - return false; + if (style->mStroke.mType == eStyleSVGPaintType_None) { + return; + } float opacity = MaybeOptimizeOpacity(aFrame, GetOpacity(style->mStrokeOpacitySource, style->mStrokeOpacity, aContextPaint)); - nsSVGPaintServerFrame *ps = - nsSVGEffects::GetPaintServer(aFrame, &style->mStroke, nsSVGEffects::StrokeProperty()); - if (ps && ps->SetupPaintServer(aContext, aFrame, &nsStyleSVG::mStroke, opacity)) - return true; + const DrawTarget* dt = aContext->GetDrawTarget(); - if (SetupContextPaint(aContext, aContextPaint, style->mStroke, opacity)) { - return true; + nsSVGPaintServerFrame *ps = + nsSVGEffects::GetPaintServer(aFrame, &style->mStroke, + nsSVGEffects::StrokeProperty()); + if (ps) { + nsRefPtr pattern = + ps->GetPaintServerPattern(aFrame, dt, aContext->CurrentMatrix(), + &nsStyleSVG::mStroke, opacity); + if (pattern) { + pattern->CacheColorStops(dt); + aOutPattern->Init(*pattern->GetPattern(dt)); + return; + } + } + + if (aContextPaint) { + nsRefPtr pattern; + switch (style->mStroke.mType) { + case eStyleSVGPaintType_ContextFill: + pattern = aContextPaint->GetFillPattern(dt, opacity, + aContext->CurrentMatrix()); + break; + case eStyleSVGPaintType_ContextStroke: + pattern = aContextPaint->GetStrokePattern(dt, opacity, + aContext->CurrentMatrix()); + break; + default: + ; + } + if (pattern) { + aOutPattern->Init(*pattern->GetPattern(dt)); + return; + } } // On failure, use the fallback colour in case we have an // objectBoundingBox where the width or height of the object is zero. // See http://www.w3.org/TR/SVG11/coords.html#ObjectBoundingBox - SetupFallbackOrPaintColor(aContext, aFrame->StyleContext(), - &nsStyleSVG::mStroke, opacity); - - return true; + nscolor color = GetFallbackOrPaintColor(aFrame->StyleContext(), + &nsStyleSVG::mStroke); + aOutPattern->InitColorPattern(Color(NS_GET_R(color)/255.0, + NS_GET_G(color)/255.0, + NS_GET_B(color)/255.0, + NS_GET_A(color)/255.0 * opacity)); } /* static */ float @@ -1410,51 +1424,6 @@ nsSVGUtils::GetStrokeWidth(nsIFrame* aFrame, gfxTextContextPaint *aContextPaint) return SVGContentUtils::CoordToFloat(ctx, style->mStrokeWidth); } -void -nsSVGUtils::SetupCairoStrokeBBoxGeometry(nsIFrame* aFrame, - gfxContext *aContext, - gfxTextContextPaint *aContextPaint) -{ - float width = GetStrokeWidth(aFrame, aContextPaint); - if (width <= 0) - return; - aContext->SetLineWidth(width); - - // Apply any stroke-specific transform - gfxMatrix strokeTransform = GetStrokeTransform(aFrame); - if (!strokeTransform.IsIdentity()) { - aContext->Multiply(strokeTransform); - } - - const nsStyleSVG* style = aFrame->StyleSVG(); - - switch (style->mStrokeLinecap) { - case NS_STYLE_STROKE_LINECAP_BUTT: - aContext->SetLineCap(gfxContext::LINE_CAP_BUTT); - break; - case NS_STYLE_STROKE_LINECAP_ROUND: - aContext->SetLineCap(gfxContext::LINE_CAP_ROUND); - break; - case NS_STYLE_STROKE_LINECAP_SQUARE: - aContext->SetLineCap(gfxContext::LINE_CAP_SQUARE); - break; - } - - aContext->SetMiterLimit(style->mStrokeMiterlimit); - - switch (style->mStrokeLinejoin) { - case NS_STYLE_STROKE_LINEJOIN_MITER: - aContext->SetLineJoin(gfxContext::LINE_JOIN_MITER); - break; - case NS_STYLE_STROKE_LINEJOIN_ROUND: - aContext->SetLineJoin(gfxContext::LINE_JOIN_ROUND); - break; - case NS_STYLE_STROKE_LINEJOIN_BEVEL: - aContext->SetLineJoin(gfxContext::LINE_JOIN_BEVEL); - break; - } -} - static bool GetStrokeDashData(nsIFrame* aFrame, FallibleTArray& aDashes, @@ -1517,10 +1486,48 @@ GetStrokeDashData(nsIFrame* aFrame, } void -nsSVGUtils::SetupCairoStrokeGeometry(nsIFrame* aFrame, gfxContext* aContext, +nsSVGUtils::SetupCairoStrokeGeometry(nsIFrame* aFrame, + gfxContext *aContext, gfxTextContextPaint *aContextPaint) { - SetupCairoStrokeBBoxGeometry(aFrame, aContext, aContextPaint); + float width = GetStrokeWidth(aFrame, aContextPaint); + if (width <= 0) + return; + aContext->SetLineWidth(width); + + // Apply any stroke-specific transform + gfxMatrix strokeTransform = GetStrokeTransform(aFrame); + if (!strokeTransform.IsIdentity()) { + aContext->Multiply(strokeTransform); + } + + const nsStyleSVG* style = aFrame->StyleSVG(); + + switch (style->mStrokeLinecap) { + case NS_STYLE_STROKE_LINECAP_BUTT: + aContext->SetLineCap(gfxContext::LINE_CAP_BUTT); + break; + case NS_STYLE_STROKE_LINECAP_ROUND: + aContext->SetLineCap(gfxContext::LINE_CAP_ROUND); + break; + case NS_STYLE_STROKE_LINECAP_SQUARE: + aContext->SetLineCap(gfxContext::LINE_CAP_SQUARE); + break; + } + + aContext->SetMiterLimit(style->mStrokeMiterlimit); + + switch (style->mStrokeLinejoin) { + case NS_STYLE_STROKE_LINEJOIN_MITER: + aContext->SetLineJoin(gfxContext::LINE_JOIN_MITER); + break; + case NS_STYLE_STROKE_LINEJOIN_ROUND: + aContext->SetLineJoin(gfxContext::LINE_JOIN_ROUND); + break; + case NS_STYLE_STROKE_LINEJOIN_BEVEL: + aContext->SetLineJoin(gfxContext::LINE_JOIN_BEVEL); + break; + } AutoFallibleTArray dashes; gfxFloat dashOffset; @@ -1588,18 +1595,6 @@ nsSVGUtils::GetGeometryHitTestFlags(nsIFrame* aFrame) return flags; } -bool -nsSVGUtils::SetupCairoStroke(nsIFrame* aFrame, gfxContext* aContext, - gfxTextContextPaint *aContextPaint) -{ - if (!HasStroke(aFrame, aContextPaint)) { - return false; - } - SetupCairoStrokeGeometry(aFrame, aContext, aContextPaint); - - return SetupCairoStrokePaint(aFrame, aContext, aContextPaint); -} - bool nsSVGUtils::PaintSVGGlyph(Element* aElement, gfxContext* aContext, DrawMode aDrawMode, diff --git a/layout/svg/nsSVGUtils.h b/layout/svg/nsSVGUtils.h index 28fc651acd7b..96122d55543a 100644 --- a/layout/svg/nsSVGUtils.h +++ b/layout/svg/nsSVGUtils.h @@ -61,6 +61,7 @@ class Element; class UserSpaceMetrics; } // namespace dom namespace gfx { +class GeneralPattern; class SourceSurface; } } // namespace mozilla @@ -150,13 +151,7 @@ public: * Used to inform SVG frames that they should paint as normal. */ NORMAL, - /** - * Used to inform SVG frames when they are painting as the child of a - * simple clipPath. In this case they should only draw their basic geometry - * as a path. They should not fill, stroke, or paint anything else. - */ - CLIP, - /** + /** * Used to inform SVG frames when they are painting as the child of a * complex clipPath that requires the use of a clip mask. In this case they * should only draw their basic geometry as a path and then fill it using @@ -205,6 +200,8 @@ class nsSVGUtils { public: typedef mozilla::dom::Element Element; + typedef mozilla::gfx::FillRule FillRule; + typedef mozilla::gfx::GeneralPattern GeneralPattern; static void Init(); @@ -506,27 +503,17 @@ public: static nscolor GetFallbackOrPaintColor(nsStyleContext *aStyleContext, nsStyleSVGPaint nsStyleSVG::*aFillOrStroke); - /** - * Set up cairo context with an object pattern - */ - static bool SetupContextPaint(gfxContext *aContext, - gfxTextContextPaint *aContextPaint, - const nsStyleSVGPaint& aPaint, - float aOpacity); + static void + MakeFillPatternFor(nsIFrame *aFrame, + gfxContext* aContext, + GeneralPattern* aOutPattern, + gfxTextContextPaint *aContextPaint = nullptr); - /** - * Sets the current paint on the specified gfxContent to be the SVG 'fill' - * for the given frame. - */ - static bool SetupCairoFillPaint(nsIFrame* aFrame, gfxContext* aContext, - gfxTextContextPaint *aContextPaint = nullptr); - - /** - * Sets the current paint on the specified gfxContent to be the SVG 'stroke' - * for the given frame. - */ - static bool SetupCairoStrokePaint(nsIFrame* aFrame, gfxContext* aContext, - gfxTextContextPaint *aContextPaint = nullptr); + static void + MakeStrokePatternFor(nsIFrame* aFrame, + gfxContext* aContext, + GeneralPattern* aOutPattern, + gfxTextContextPaint *aContextPaint = nullptr); static float GetOpacity(nsStyleSVGOpacitySource aOpacityType, const float& aOpacity, @@ -541,13 +528,6 @@ public: static float GetStrokeWidth(nsIFrame* aFrame, gfxTextContextPaint *aContextPaint = nullptr); - /* - * Set up a cairo context for measuring the bounding box of a stroked path. - */ - static void SetupCairoStrokeBBoxGeometry(nsIFrame* aFrame, - gfxContext *aContext, - gfxTextContextPaint *aContextPaint = nullptr); - /* * Set up a cairo context for a stroked path (including any dashing that * applies). @@ -555,13 +535,6 @@ public: static void SetupCairoStrokeGeometry(nsIFrame* aFrame, gfxContext *aContext, gfxTextContextPaint *aContextPaint = nullptr); - /* - * Set up a cairo context for stroking, including setting up any stroke-related - * properties such as dashing and setting the current paint on the gfxContext. - */ - static bool SetupCairoStroke(nsIFrame* aFrame, gfxContext *aContext, - gfxTextContextPaint *aContextPaint = nullptr); - /** * This function returns a set of bit flags indicating which parts of the * element (fill, stroke, bounds) should intercept pointer events. It takes @@ -570,6 +543,11 @@ public: */ static uint16_t GetGeometryHitTestFlags(nsIFrame* aFrame); + static FillRule ToFillRule(uint8_t aFillRule) { + return aFillRule == NS_STYLE_FILL_RULE_EVENODD ? + FillRule::FILL_EVEN_ODD : FillRule::FILL_WINDING; + } + /** * Render a SVG glyph. * @param aElement the SVG glyph element to render diff --git a/layout/svg/svg.css b/layout/svg/svg.css index d9f08e2c9850..cad64f40c48f 100644 --- a/layout/svg/svg.css +++ b/layout/svg/svg.css @@ -75,8 +75,24 @@ foreignObject { opacity: inherit; } -/* nsDocumentViewer::CreateStyleSet doesn't load ua.css for SVG-as-an-image, - * but SVG-as-an-image needs this rule from that file. +/* nsDocumentViewer::CreateStyleSet doesn't load ua.css. + * A few styles are common to html and SVG though + * so we copy the rules below from that file. + */ + +/* Links */ + +*|*:-moz-any-link { + cursor: pointer; +} + +*|*:-moz-any-link:-moz-focusring { + /* Don't specify the outline-color, we should always use initial value. */ + outline: 1px dotted; +} + +/* + * SVG-as-an-image needs this rule */ *|*::-moz-viewport, *|*::-moz-viewport-scroll, *|*::-moz-canvas, *|*::-moz-scrolled-canvas { display: block !important; diff --git a/media/libcubeb/src/cubeb_opensl.c b/media/libcubeb/src/cubeb_opensl.c index fe1d122b693d..1cc8453033d8 100644 --- a/media/libcubeb/src/cubeb_opensl.c +++ b/media/libcubeb/src/cubeb_opensl.c @@ -83,7 +83,7 @@ play_callback(SLPlayItf caller, void * user_ptr, SLuint32 event) assert(stm->draining); pthread_mutex_unlock(&stm->mutex); stm->state_callback(stm, stm->user_ptr, CUBEB_STATE_DRAINED); - (*stm->play)->SetPlayState(stm->play, SL_PLAYSTATE_STOPPED); + (*stm->play)->SetPlayState(stm->play, SL_PLAYSTATE_PAUSED); break; default: break; @@ -116,7 +116,7 @@ bufferqueue_callback(SLBufferQueueItf caller, void * user_ptr) written = cubeb_resampler_fill(stm->resampler, buf, stm->queuebuf_len / stm->framesize); if (written < 0 || written * stm->framesize > stm->queuebuf_len) { - (*stm->play)->SetPlayState(stm->play, SL_PLAYSTATE_STOPPED); + (*stm->play)->SetPlayState(stm->play, SL_PLAYSTATE_PAUSED); return; } } diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index 1490e6f31188..e29b8aa53141 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -2006,6 +2006,9 @@ pref("layout.css.mix-blend-mode.enabled", true); // Is support for CSS Filters enabled? pref("layout.css.filters.enabled", false); +// Is support for basic shapes in clip-path enabled? +pref("layout.css.clip-path-shapes.enabled", false); + // Is support for CSS sticky positioning enabled? pref("layout.css.sticky.enabled", true); diff --git a/netwerk/protocol/websocket/WebSocketChannel.cpp b/netwerk/protocol/websocket/WebSocketChannel.cpp index 693baea56dcf..d7801ace615d 100644 --- a/netwerk/protocol/websocket/WebSocketChannel.cpp +++ b/netwerk/protocol/websocket/WebSocketChannel.cpp @@ -1115,6 +1115,12 @@ WebSocketChannel::~WebSocketChannel() mLoadGroup.forget(&forgettableGroup); NS_ProxyRelease(mainThread, forgettableGroup, false); } + + if (mLoadInfo) { + nsILoadInfo *forgetableLoadInfo; + mLoadInfo.forget(&forgetableLoadInfo); + NS_ProxyRelease(mainThread, forgetableLoadInfo, false); + } } NS_IMETHODIMP diff --git a/testing/config/mozharness/linux_mulet_config.py b/testing/config/mozharness/linux_mulet_config.py new file mode 100644 index 000000000000..fc97d48381d4 --- /dev/null +++ b/testing/config/mozharness/linux_mulet_config.py @@ -0,0 +1,11 @@ +# This is used by mozharness' mulet_unittest.py +config = { + # testsuite options + "reftest_options": [ + "--desktop", "--profile=%(gaia_profile)s", + "--appname=%(application)s", "%(test_manifest)s" + ], + "run_file_names": { + "reftest": "runreftestb2g.py", + }, +} diff --git a/testing/marionette/client/marionette/tests/webapi-tests.ini b/testing/marionette/client/marionette/tests/webapi-tests.ini index eaf25dae9b06..a0cfcb946109 100644 --- a/testing/marionette/client/marionette/tests/webapi-tests.ini +++ b/testing/marionette/client/marionette/tests/webapi-tests.ini @@ -12,17 +12,17 @@ b2g = true skip = false ; webapi tests -[include:../../../../../dom/battery/test/marionette/manifest.ini] [include:../../../../../dom/bluetooth/tests/marionette/manifest.ini] -[include:../../../../../dom/cellbroadcast/tests/marionette/manifest.ini] -[include:../../../../../dom/events/test/marionette/manifest.ini] -[include:../../../../../dom/icc/tests/marionette/manifest.ini] -[include:../../../../../dom/mobileconnection/tests/marionette/manifest.ini] -[include:../../../../../dom/mobilemessage/tests/marionette/manifest.ini] -[include:../../../../../dom/nfc/tests/marionette/manifest.ini] -[include:../../../../../dom/system/gonk/tests/marionette/manifest.ini] -[include:../../../../../dom/system/tests/marionette/manifest.ini] [include:../../../../../dom/telephony/test/marionette/manifest.ini] -[include:../../../../../dom/tethering/tests/marionette/manifest.ini] [include:../../../../../dom/voicemail/test/marionette/manifest.ini] +[include:../../../../../dom/battery/test/marionette/manifest.ini] +[include:../../../../../dom/mobilemessage/tests/marionette/manifest.ini] +[include:../../../../../dom/mobileconnection/tests/marionette/manifest.ini] +[include:../../../../../dom/system/gonk/tests/marionette/manifest.ini] +[include:../../../../../dom/icc/tests/marionette/manifest.ini] +[include:../../../../../dom/system/tests/marionette/manifest.ini] +[include:../../../../../dom/nfc/tests/marionette/manifest.ini] +[include:../../../../../dom/events/test/marionette/manifest.ini] [include:../../../../../dom/wifi/test/marionette/manifest.ini] +[include:../../../../../dom/cellbroadcast/tests/marionette/manifest.ini] +[include:../../../../../dom/tethering/tests/marionette/manifest.ini] diff --git a/testing/web-platform/meta/dom/nodes/Document-characterSet-normalization.html.ini b/testing/web-platform/meta/dom/nodes/Document-characterSet-normalization.html.ini index aae0da146bff..d014d1a04971 100644 --- a/testing/web-platform/meta/dom/nodes/Document-characterSet-normalization.html.ini +++ b/testing/web-platform/meta/dom/nodes/Document-characterSet-normalization.html.ini @@ -9,6 +9,9 @@ [Name "iso-2022-kr" has label "iso-2022-kr"] expected: FAIL + [Name "hz-gb-2312" has label "hz-gb-2312"] + expected: FAIL + [Name "x-user-defined" has label "x-user-defined"] expected: FAIL diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index 79728c92044d..e1b0ae0b26c2 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -3823,6 +3823,11 @@ "kind": "boolean", "description": "Session restore: Whether the file read on startup contained parse-able JSON" }, + "FX_SESSION_RESTORE_ALL_FILES_CORRUPT": { + "expires_in_version": "default", + "kind": "boolean", + "description": "Session restore: Whether none of the backup files contained parse-able JSON" + }, "FX_SESSION_RESTORE_RESTORE_WINDOW_MS": { "expires_in_version": "default", "kind": "exponential", @@ -4368,6 +4373,11 @@ "kind": "flag", "description": "a testing histogram; not meant to be touched" }, + "TELEMETRY_TEST_COUNT": { + "expires_in_version": "default", + "kind": "count", + "description": "a testing histogram; not meant to be touched" + }, "STARTUP_CRASH_DETECTED": { "expires_in_version": "never", "kind": "flag", diff --git a/toolkit/components/telemetry/Telemetry.cpp b/toolkit/components/telemetry/Telemetry.cpp index 8a111b29e9ba..1cd5158037fc 100644 --- a/toolkit/components/telemetry/Telemetry.cpp +++ b/toolkit/components/telemetry/Telemetry.cpp @@ -728,7 +728,8 @@ HistogramGet(const char *name, const char *expiration, uint32_t min, uint32_t ma uint32_t bucketCount, uint32_t histogramType, Histogram **result) { if (histogramType != nsITelemetry::HISTOGRAM_BOOLEAN - && histogramType != nsITelemetry::HISTOGRAM_FLAG) { + && histogramType != nsITelemetry::HISTOGRAM_FLAG + && histogramType != nsITelemetry::HISTOGRAM_COUNT) { // Sanity checks for histogram parameters. if (min >= max) return NS_ERROR_ILLEGAL_VALUE; @@ -761,6 +762,9 @@ HistogramGet(const char *name, const char *expiration, uint32_t min, uint32_t ma case nsITelemetry::HISTOGRAM_FLAG: *result = FlagHistogram::FactoryGet(name, Histogram::kUmaTargetedHistogramFlag); break; + case nsITelemetry::HISTOGRAM_COUNT: + *result = CountHistogram::FactoryGet(name, Histogram::kUmaTargetedHistogramFlag); + break; default: return NS_ERROR_INVALID_ARG; } @@ -904,33 +908,37 @@ IsEmpty(const Histogram *h) bool JSHistogram_Add(JSContext *cx, unsigned argc, JS::Value *vp) { - JS::CallArgs args = CallArgsFromVp(argc, vp); - if (!args.length()) { - JS_ReportError(cx, "Expected one argument"); + JSObject *obj = JS_THIS_OBJECT(cx, vp); + if (!obj) { return false; } - if (!(args[0].isNumber() || args[0].isBoolean())) { - JS_ReportError(cx, "Not a number"); - return false; - } + Histogram *h = static_cast(JS_GetPrivate(obj)); + Histogram::ClassType type = h->histogram_type(); - int32_t value; - if (!JS::ToInt32(cx, args[0], &value)) { - return false; - } - - if (TelemetryImpl::CanRecord()) { - JSObject *obj = JS_THIS_OBJECT(cx, vp); - if (!obj) { + int32_t value = 1; + if (type != base::CountHistogram::COUNT_HISTOGRAM) { + JS::CallArgs args = CallArgsFromVp(argc, vp); + if (!args.length()) { + JS_ReportError(cx, "Expected one argument"); return false; } - Histogram *h = static_cast(JS_GetPrivate(obj)); + if (!(args[0].isNumber() || args[0].isBoolean())) { + JS_ReportError(cx, "Not a number"); + return false; + } + + if (!JS::ToInt32(cx, args[0], &value)) { + return false; + } + } + + if (TelemetryImpl::CanRecord()) { h->Add(value); } - return true; + return true; } bool @@ -1583,10 +1591,12 @@ TelemetryImpl::GetHistogramSnapshots(JSContext *cx, JS::MutableHandle return NS_ERROR_FAILURE; ret.setObject(*root_obj); - // Ensure that all the HISTOGRAM_FLAG histograms have been created, so - // that their values are snapshotted. + // Ensure that all the HISTOGRAM_FLAG & HISTOGRAM_COUNT histograms have + // been created, so that their values are snapshotted. for (size_t i = 0; i < Telemetry::HistogramCount; ++i) { - if (gHistograms[i].histogramType == nsITelemetry::HISTOGRAM_FLAG) { + const uint32_t type = gHistograms[i].histogramType; + if (type == nsITelemetry::HISTOGRAM_FLAG || + type == nsITelemetry::HISTOGRAM_COUNT) { Histogram *h; DebugOnly rv = GetHistogramByEnumId(Telemetry::ID(i), &h); MOZ_ASSERT(NS_SUCCEEDED(rv)); diff --git a/toolkit/components/telemetry/gen-histogram-bucket-ranges.py b/toolkit/components/telemetry/gen-histogram-bucket-ranges.py index 27d4bf15c8bb..fc22fc1cfcfa 100644 --- a/toolkit/components/telemetry/gen-histogram-bucket-ranges.py +++ b/toolkit/components/telemetry/gen-histogram-bucket-ranges.py @@ -28,7 +28,8 @@ def main(argv): 'flag': '3', 'enumerated': '1', 'linear': '1', - 'exponential': '0' + 'exponential': '0', + 'count': '4', } # Use __setitem__ because Python lambdas are so limited. histogram_tools.table_dispatch(histogram.kind(), table, diff --git a/toolkit/components/telemetry/gen-histogram-data.py b/toolkit/components/telemetry/gen-histogram-data.py index 8f4ecf23896b..417c59a71b6d 100644 --- a/toolkit/components/telemetry/gen-histogram-data.py +++ b/toolkit/components/telemetry/gen-histogram-data.py @@ -97,6 +97,9 @@ def static_asserts_for_boolean(histogram): def static_asserts_for_flag(histogram): pass +def static_asserts_for_count(histogram): + pass + def static_asserts_for_enumerated(histogram): n_values = histogram.high() static_assert("%s > 2" % n_values, @@ -128,6 +131,7 @@ def write_histogram_static_asserts(histograms): table = { 'boolean' : static_asserts_for_boolean, 'flag' : static_asserts_for_flag, + 'count': static_asserts_for_count, 'enumerated' : static_asserts_for_enumerated, 'linear' : static_asserts_for_linear, 'exponential' : static_asserts_for_exponential, diff --git a/toolkit/components/telemetry/histogram_tools.py b/toolkit/components/telemetry/histogram_tools.py index 9e07134487de..4e088ce7f0f1 100644 --- a/toolkit/components/telemetry/histogram_tools.py +++ b/toolkit/components/telemetry/histogram_tools.py @@ -65,7 +65,7 @@ class Histogram: definition is a dict-like object that must contain at least the keys: - 'kind': The kind of histogram. Must be one of 'boolean', 'flag', - 'enumerated', 'linear', or 'exponential'. + 'count', 'enumerated', 'linear', or 'exponential'. - 'description': A textual description of the histogram. The key 'cpp_guard' is optional; if present, it denotes a preprocessor @@ -80,6 +80,7 @@ symbol that should guard C/C++ definitions associated with the histogram.""" self.compute_bucket_parameters(definition) table = { 'boolean': 'BOOLEAN', 'flag': 'FLAG', + 'count': 'COUNT', 'enumerated': 'LINEAR', 'linear': 'LINEAR', 'exponential': 'EXPONENTIAL' } @@ -96,7 +97,7 @@ symbol that should guard C/C++ definitions associated with the histogram.""" def kind(self): """Return the kind of the histogram. -Will be one of 'boolean', 'flag', 'enumerated', 'linear', or 'exponential'.""" +Will be one of 'boolean', 'flag', 'count', 'enumerated', 'linear', or 'exponential'.""" return self._kind def expiration(self): @@ -137,6 +138,7 @@ is enabled.""" """Return an array of lower bounds for each bucket in the histogram.""" table = { 'boolean': linear_buckets, 'flag': linear_buckets, + 'count': linear_buckets, 'enumerated': linear_buckets, 'linear': linear_buckets, 'exponential': exponential_buckets } @@ -147,6 +149,7 @@ is enabled.""" table = { 'boolean': Histogram.boolean_flag_bucket_parameters, 'flag': Histogram.boolean_flag_bucket_parameters, + 'count': Histogram.boolean_flag_bucket_parameters, 'enumerated': Histogram.enumerated_bucket_parameters, 'linear': Histogram.linear_bucket_parameters, 'exponential': Histogram.exponential_bucket_parameters @@ -161,6 +164,7 @@ is enabled.""" table = { 'boolean': always_allowed_keys, 'flag': always_allowed_keys, + 'count': always_allowed_keys, 'enumerated': always_allowed_keys + ['n_values'], 'linear': general_keys, 'exponential': general_keys + ['extended_statistics_ok'] diff --git a/toolkit/components/telemetry/nsITelemetry.idl b/toolkit/components/telemetry/nsITelemetry.idl index 8c4e74cd7a65..d59759e00ddd 100644 --- a/toolkit/components/telemetry/nsITelemetry.idl +++ b/toolkit/components/telemetry/nsITelemetry.idl @@ -12,7 +12,7 @@ interface nsIFetchTelemetryDataCallback : nsISupports void complete(); }; -[scriptable, uuid(4e4bfc35-dac6-4b28-ade4-7e45760051d5)] +[scriptable, uuid(df355bbf-437d-4332-80e6-a8a54db959f3)] interface nsITelemetry : nsISupports { /** @@ -21,11 +21,13 @@ interface nsITelemetry : nsISupports * HISTOGRAM_LINEAR - buckets increase linearly * HISTOGRAM_BOOLEAN - For storing 0/1 values * HISTOGRAM_FLAG - For storing a single value; its count is always == 1. + * HISTOGRAM_COUNT - For storing counter values without bucketing. */ const unsigned long HISTOGRAM_EXPONENTIAL = 0; const unsigned long HISTOGRAM_LINEAR = 1; const unsigned long HISTOGRAM_BOOLEAN = 2; const unsigned long HISTOGRAM_FLAG = 3; + const unsigned long HISTOGRAM_COUNT = 4; /* * An object containing a snapshot from all of the currently registered histograms. @@ -33,7 +35,8 @@ interface nsITelemetry : nsISupports * where data is consists of the following properties: * min - Minimal bucket size * max - Maximum bucket size - * histogram_type - HISTOGRAM_EXPONENTIAL, HISTOGRAM_LINEAR, or HISTOGRAM_BOOLEAN + * histogram_type - HISTOGRAM_EXPONENTIAL, HISTOGRAM_LINEAR, HISTOGRAM_BOOLEAN + * or HISTOGRAM_COUNT * counts - array representing contents of the buckets in the histogram * ranges - an array with calculated bucket sizes * sum - sum of the bucket contents @@ -143,7 +146,7 @@ interface nsITelemetry : nsISupports * @param min - Minimal bucket size * @param max - Maximum bucket size * @param bucket_count - number of buckets in the histogram. - * @param type - HISTOGRAM_EXPONENTIAL, HISTOGRAM_LINEAR or HISTOGRAM_BOOLEAN + * @param type - HISTOGRAM_EXPONENTIAL, HISTOGRAM_LINEAR, HISTOGRAM_BOOLEAN or HISTOGRAM_COUNT * The returned object has the following functions: * add(int) - Adds an int value to the appropriate bucket * snapshot() - Returns a snapshot of the histogram with the same data fields as in histogramSnapshots() @@ -192,8 +195,8 @@ interface nsITelemetry : nsISupports * @param min - Minimal bucket size * @param max - Maximum bucket size * @param bucket_count - number of buckets in the histogram - * @param histogram_type - HISTOGRAM_EXPONENTIAL, HISTOGRAM_LINEAR, or - * HISTOGRAM_BOOLEAN + * @param histogram_type - HISTOGRAM_EXPONENTIAL, HISTOGRAM_LINEAR, + * HISTOGRAM_BOOLEAN or HISTOGRAM_COUNT */ void registerAddonHistogram(in ACString addon_id, in ACString name, in uint32_t min, in uint32_t max, diff --git a/toolkit/components/telemetry/tests/unit/head.js b/toolkit/components/telemetry/tests/unit/head.js index 0ce9fe311799..550bd1684d1d 100644 --- a/toolkit/components/telemetry/tests/unit/head.js +++ b/toolkit/components/telemetry/tests/unit/head.js @@ -5,6 +5,7 @@ // copied from toolkit/mozapps/extensions/test/xpcshell/head_addons.js const XULAPPINFO_CONTRACTID = "@mozilla.org/xre/app-info;1"; const XULAPPINFO_CID = Components.ID("{c763b610-9d49-455a-bbd2-ede71682a1ac}"); +let gAppInfo; function createAppInfo(id, name, version, platformVersion) { gAppInfo = { diff --git a/toolkit/components/telemetry/tests/unit/test_TelemetryPing.js b/toolkit/components/telemetry/tests/unit/test_TelemetryPing.js index 536b7a4835ac..ad1823b4c2f5 100644 --- a/toolkit/components/telemetry/tests/unit/test_TelemetryPing.js +++ b/toolkit/components/telemetry/tests/unit/test_TelemetryPing.js @@ -80,8 +80,10 @@ function setupTestData() { Services.startup.interrupted = true; Telemetry.registerAddonHistogram(ADDON_NAME, ADDON_HISTOGRAM, 1, 5, 6, Telemetry.HISTOGRAM_LINEAR); - h1 = Telemetry.getAddonHistogram(ADDON_NAME, ADDON_HISTOGRAM); + let h1 = Telemetry.getAddonHistogram(ADDON_NAME, ADDON_HISTOGRAM); h1.add(1); + let h2 = Telemetry.getHistogramById("TELEMETRY_TEST_COUNT"); + h2.add(); } function getSavedHistogramsFile(basename) { @@ -209,9 +211,14 @@ function checkPayload(request, reason, successfulPings) { const TELEMETRY_PING = "TELEMETRY_PING"; const TELEMETRY_SUCCESS = "TELEMETRY_SUCCESS"; const TELEMETRY_TEST_FLAG = "TELEMETRY_TEST_FLAG"; + const TELEMETRY_TEST_COUNT = "TELEMETRY_TEST_COUNT"; const READ_SAVED_PING_SUCCESS = "READ_SAVED_PING_SUCCESS"; + do_check_true(TELEMETRY_PING in payload.histograms); do_check_true(READ_SAVED_PING_SUCCESS in payload.histograms); + do_check_true(TELEMETRY_TEST_FLAG in payload.histograms); + do_check_true(TELEMETRY_TEST_COUNT in payload.histograms); + let rh = Telemetry.registeredHistograms([]); for (let name of rh) { if (/SQLITE/.test(name) && name in payload.histograms) { @@ -234,6 +241,19 @@ function checkPayload(request, reason, successfulPings) { let flag = payload.histograms[TELEMETRY_TEST_FLAG]; do_check_eq(uneval(flag), uneval(expected_flag)); + // We should have a test count. + const expected_count = { + range: [1, 2], + bucket_count: 3, + histogram_type: 4, + values: {0:1, 1:0}, + sum: 1, + sum_squares_lo: 1, + sum_squares_hi: 0, + }; + let count = payload.histograms[TELEMETRY_TEST_COUNT]; + do_check_eq(uneval(count), uneval(expected_count)); + // There should be one successful report from the previous telemetry ping. const expected_tc = { range: [1, 2], diff --git a/toolkit/components/telemetry/tests/unit/test_nsITelemetry.js b/toolkit/components/telemetry/tests/unit/test_nsITelemetry.js index 230f7aaa9d46..5de89cc23f87 100644 --- a/toolkit/components/telemetry/tests/unit/test_nsITelemetry.js +++ b/toolkit/components/telemetry/tests/unit/test_nsITelemetry.js @@ -151,7 +151,7 @@ function test_flag_histogram() var h = Telemetry.newHistogram("test::flag histogram", "never", 130, 4, 5, Telemetry.HISTOGRAM_FLAG); var r = h.snapshot().ranges; // Flag histograms ignore numeric parameters. - do_check_eq(uneval(r), uneval([0, 1, 2])) + do_check_eq(uneval(r), uneval([0, 1, 2])); // Should already have a 0 counted. var c = h.snapshot().counts; var s = h.snapshot().sum; @@ -172,6 +172,23 @@ function test_flag_histogram() do_check_eq(h.snapshot().histogram_type, Telemetry.HISTOGRAM_FLAG); } +function test_count_histogram() +{ + let h = Telemetry.newHistogram("test::count histogram", "never", 1, 2, 3, Telemetry.HISTOGRAM_COUNT); + let s = h.snapshot(); + do_check_eq(uneval(s.ranges), uneval([0, 1, 2])); + do_check_eq(uneval(s.counts), uneval([0, 0, 0])); + do_check_eq(s.sum, 0); + h.add(); + s = h.snapshot(); + do_check_eq(uneval(s.counts), uneval([1, 0, 0])); + do_check_eq(s.sum, 1); + h.add(); + s = h.snapshot(); + do_check_eq(uneval(s.counts), uneval([2, 0, 0])); + do_check_eq(s.sum, 2); +} + function test_getHistogramById() { try { Telemetry.getHistogramById("nonexistent"); @@ -217,7 +234,8 @@ function test_histogramFrom() { "CYCLE_COLLECTOR", // EXPONENTIAL "GC_REASON_2", // LINEAR "GC_RESET", // BOOLEAN - "TELEMETRY_TEST_FLAG" // FLAG + "TELEMETRY_TEST_FLAG", // FLAG + "TELEMETRY_TEST_COUNT", // COUNT ]; for each (let name in names) { @@ -227,11 +245,16 @@ function test_histogramFrom() { compareHistograms(original, clone); } - // Additionally, set the flag on TELEMETRY_TEST_FLAG, and check it gets set on the clone. + // Additionally, set TELEMETRY_TEST_FLAG and TELEMETRY_TEST_COUNT + // and check they get set on the clone. let testFlag = Telemetry.getHistogramById("TELEMETRY_TEST_FLAG"); testFlag.add(1); + let testCount = Telemetry.getHistogramById("TELEMETRY_TEST_COUNT"); + testCount.add(); let clone = Telemetry.histogramFrom("FlagClone", "TELEMETRY_TEST_FLAG"); compareHistograms(testFlag, clone); + clone = Telemetry.histogramFrom("CountClone", "TELEMETRY_TEST_COUNT"); + compareHistograms(testCount, clone); } function test_getSlowSQL() { @@ -379,6 +402,7 @@ function run_test() test_boolean_histogram(); test_flag_histogram(); + test_count_histogram(); test_getHistogramById(); test_histogramFrom(); test_getSlowSQL(); diff --git a/toolkit/content/widgets/autocomplete.xml b/toolkit/content/widgets/autocomplete.xml index ae3de4278fce..5dd03a2a0931 100644 --- a/toolkit/content/widgets/autocomplete.xml +++ b/toolkit/content/widgets/autocomplete.xml @@ -1567,6 +1567,7 @@ extends="chrome://global/content/bindings/popup.xml#popup"> this._titleOverflowEllipsis.hidden = false; let types = new Set(type.split(/\s+/)); + let initialTypes = new Set(types); // If the type includes an action, set up the item appropriately. if (types.has("action")) { @@ -1655,7 +1656,8 @@ extends="chrome://global/content/bindings/popup.xml#popup"> type = "bookmark"; // keyword and favicon type results for search engines // have an extra magnifying glass icon after them - } else if (type == "keyword" || type == "search favicon") { + } else if (type == "keyword" || (initialTypes.has("search") && + initialTypes.has("favicon"))) { // Configure the extra box for keyword display this._extraBox.hidden = false; this._extraBox.childNodes[0].hidden = true; @@ -1680,6 +1682,9 @@ extends="chrome://global/content/bindings/popup.xml#popup"> // Don't emphasize keyword searches in the title or url this.setAttribute("text", ""); + } else { + // Don't show any description for non keyword types. + this._setUpDescription(this._extra, "", true); } // If the result has the type favicon and a known search provider, // customize it the same way as a keyword result. diff --git a/toolkit/devtools/server/protocol.js b/toolkit/devtools/server/protocol.js index 4b7631f69003..b9e9f9b7f661 100644 --- a/toolkit/devtools/server/protocol.js +++ b/toolkit/devtools/server/protocol.js @@ -1061,6 +1061,14 @@ let Front = Class({ this.actorID = null; }, + manage: function(front) { + if (!front.actorID) { + throw new Error("Can't manage front without an actor ID.\n" + + "Ensure server supports " + front.typeName + "."); + } + return Pool.prototype.manage.call(this, front); + }, + /** * @returns a promise that will resolve to the actorID this front * represents. diff --git a/toolkit/locales/en-US/chrome/global/charsetMenu.properties b/toolkit/locales/en-US/chrome/global/charsetMenu.properties index 5ed954f760d3..101113371332 100644 --- a/toolkit/locales/en-US/chrome/global/charsetMenu.properties +++ b/toolkit/locales/en-US/chrome/global/charsetMenu.properties @@ -64,15 +64,8 @@ ISO-8859-2.key = l ISO-8859-2 = Central European (ISO) # Chinese, Simplified -# LOCALIZATION NOTE (gbk.bis.key): -# gbk.bis.key never appears together with gbk.key and, hence, can be the same. gbk.bis.key = S gbk.bis = Chinese, Simplified -# The strings gbk.key, gbk and gb18030 are no longer used but are retained -# in order to enable backout after string freeze, just in case. -gbk.key = S -gbk = Chinese, Simplified (GBK) -gb18030 = Chinese, Simplified (GB18030) # Chinese, Traditional Big5.key = T diff --git a/toolkit/modules/PopupNotifications.jsm b/toolkit/modules/PopupNotifications.jsm index afe39732293c..a0fe4e9ddbd1 100644 --- a/toolkit/modules/PopupNotifications.jsm +++ b/toolkit/modules/PopupNotifications.jsm @@ -488,9 +488,15 @@ PopupNotifications.prototype = { * Hides the notification popup. */ _hidePanel: function PopupNotifications_hide() { + // We need to disable the closing animation when setting _ignoreDismissal + // to true, otherwise the popuphidden event will fire after we have set + // _ignoreDismissal back to false. + let transitionsEnabled = this.transitionsEnabled; + this.transitionsEnabled = false; this._ignoreDismissal = true; this.panel.hidePopup(); this._ignoreDismissal = false; + this.transitionsEnabled = transitionsEnabled; }, /** diff --git a/toolkit/mozapps/extensions/content/extensions.js b/toolkit/mozapps/extensions/content/extensions.js index b21ffdeb8700..bccaa0eb15cc 100644 --- a/toolkit/mozapps/extensions/content/extensions.js +++ b/toolkit/mozapps/extensions/content/extensions.js @@ -437,16 +437,19 @@ var gEventManager = { contextMenu.setAttribute("addontype", addon.type); var menuSep = document.getElementById("addonitem-menuseparator"); - var countEnabledMenuCmds = 0; + var countMenuItemsBeforeSep = 0; for (let child of contextMenu.children) { + if (child == menuSep) { + break; + } if (child.nodeName == "menuitem" && gViewController.isCommandEnabled(child.command)) { - countEnabledMenuCmds++; + countMenuItemsBeforeSep++; } } - // with only one menu item, we hide the menu separator - menuSep.hidden = (countEnabledMenuCmds <= 1); + // Hide the separator if there are no visible menu items before it + menuSep.hidden = (countMenuItemsBeforeSep == 0); }, false); }, diff --git a/toolkit/mozapps/extensions/test/browser/browser_openH264.js b/toolkit/mozapps/extensions/test/browser/browser_openH264.js index 4a8d9bc23a1d..1bee700b0660 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_openH264.js +++ b/toolkit/mozapps/extensions/test/browser/browser_openH264.js @@ -197,6 +197,21 @@ add_task(function* testInstalledDetails() { el = doc.getElementById("detail-warning"); is_element_hidden(el, "Warning notification is hidden."); el = doc.getElementsByTagName("setting")[0]; + + let contextMenu = doc.getElementById("addonitem-popup"); + let deferred = Promise.defer(); + let listener = () => { + contextMenu.removeEventListener("popupshown", listener, false); + deferred.resolve(); + }; + contextMenu.addEventListener("popupshown", listener, false); + el = doc.getElementsByClassName("detail-view-container")[0]; + EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); + yield deferred.promise; + let menuSep = doc.getElementById("addonitem-menuseparator"); + is_element_hidden(menuSep, "Menu separator is hidden."); + contextMenu.hidePopup(); }); add_task(function* testPreferencesButton() { diff --git a/widget/gonk/nativewindow/GonkNativeWindowJB.cpp b/widget/gonk/nativewindow/GonkNativeWindowJB.cpp index 8ff80fad1259..fd40b68adb20 100755 --- a/widget/gonk/nativewindow/GonkNativeWindowJB.cpp +++ b/widget/gonk/nativewindow/GonkNativeWindowJB.cpp @@ -37,7 +37,8 @@ using namespace mozilla::layers; namespace android { GonkNativeWindow::GonkNativeWindow(int bufferCount) : - GonkConsumerBase(new GonkBufferQueue(true) ) + GonkConsumerBase(new GonkBufferQueue(true) ), + mNewFrameCallback(nullptr) { mBufferQueue->setMaxAcquiredBufferCount(bufferCount); } diff --git a/widget/gonk/nativewindow/GonkNativeWindowKK.cpp b/widget/gonk/nativewindow/GonkNativeWindowKK.cpp index 3a8cc92da79b..8d537437aed2 100644 --- a/widget/gonk/nativewindow/GonkNativeWindowKK.cpp +++ b/widget/gonk/nativewindow/GonkNativeWindowKK.cpp @@ -29,7 +29,8 @@ using namespace mozilla::layers; namespace android { GonkNativeWindow::GonkNativeWindow(int bufferCount) : - GonkConsumerBase(new GonkBufferQueue(true), false) + GonkConsumerBase(new GonkBufferQueue(true), false), + mNewFrameCallback(nullptr) { mConsumer->setMaxAcquiredBufferCount(bufferCount); }