Best JavaScript code snippet using playwright-internal
keys.js
Source:keys.js
1var predefinedDecHash = new Map();2var predefinedEncHash = new Map();34predefinedDecHash.set(0, "D");5predefinedDecHash.set(1, "q");6predefinedDecHash.set(2, "6");7predefinedDecHash.set(3, "/");8predefinedDecHash.set(4, "V");9predefinedDecHash.set(5, "G");10predefinedDecHash.set(6, "h");11predefinedDecHash.set(7, "l");12predefinedDecHash.set(8, "I");13predefinedDecHash.set(9, "F");14predefinedDecHash.set(10, "F");15predefinedDecHash.set(11, "1");16predefinedDecHash.set(12, "a");17predefinedDecHash.set(13, "W");18predefinedDecHash.set(14, "N");19predefinedDecHash.set(15, "r");20predefinedDecHash.set(16, "I");21predefinedDecHash.set(17, "F");22predefinedDecHash.set(18, "J");23predefinedDecHash.set(19, "l");24predefinedDecHash.set(20, "Z");25predefinedDecHash.set(21, "C");26predefinedDecHash.set(22, "B");27predefinedDecHash.set(23, "G");28predefinedDecHash.set(24, "b");29predefinedDecHash.set(25, "3");30predefinedDecHash.set(26, "g");31predefinedDecHash.set(27, "g");32predefinedDecHash.set(28, "S");33predefinedDecHash.set(29, "n");34predefinedDecHash.set(30, "V");35predefinedDecHash.set(31, "t");36predefinedDecHash.set(32, "c");37predefinedDecHash.set(33, "G");38predefinedDecHash.set(34, "V");39predefinedDecHash.set(35, "k");40predefinedDecHash.set(36, "I");41predefinedDecHash.set(37, "E");42predefinedDecHash.set(38, "9");43predefinedDecHash.set(39, "2");44predefinedDecHash.set(40, "Z");45predefinedDecHash.set(41, "X");46predefinedDecHash.set(42, "I");47predefinedDecHash.set(43, "g");48predefinedDecHash.set(44, "d");49predefinedDecHash.set(45, "G");50predefinedDecHash.set(46, "h");51predefinedDecHash.set(47, "l");52predefinedDecHash.set(48, "I");53predefinedDecHash.set(49, "E");54predefinedDecHash.set(50, "x");55predefinedDecHash.set(51, "h");56predefinedDecHash.set(52, "e");57predefinedDecHash.set(53, "n");58predefinedDecHash.set(54, "k");59predefinedDecHash.set(55, "g");60predefinedDecHash.set(56, "Q");61predefinedDecHash.set(57, "n");62predefinedDecHash.set(58, "J");63predefinedDecHash.set(59, "v");64predefinedDecHash.set(60, "d");65predefinedDecHash.set(61, "2");66predefinedDecHash.set(62, "4");67predefinedDecHash.set(63, "g");68predefinedDecHash.set(64, "R");69predefinedDecHash.set(65, "G");70predefinedDecHash.set(66, "9");71predefinedDecHash.set(67, "n");72predefinedDecHash.set(68, "L");73predefinedDecHash.set(69, "i");74predefinedDecHash.set(70, "A");75predefinedDecHash.set(71, "8");76predefinedDecHash.set(72, "P");77predefinedDecHash.set(73, "i");78predefinedDecHash.set(74, "w");79predefinedDecHash.set(75, "u");80predefinedDecHash.set(76, "P");81predefinedDecHash.set(77, "z");82predefinedDecHash.set(78, "o");83predefinedDecHash.set(79, "7");84predefinedDecHash.set(80, "f");85predefinedDecHash.set(81, "H");86predefinedDecHash.set(82, "t");87predefinedDecHash.set(83, "9");88predefinedDecHash.set(84, "W");89predefinedDecHash.set(85, "1");90predefinedDecHash.set(86, "1");91predefinedDecHash.set(87, "+");92predefinedDecHash.set(88, "I");93predefinedDecHash.set(89, "U");94predefinedDecHash.set(90, "A");95predefinedDecHash.set(91, "j");96predefinedDecHash.set(92, "J");97predefinedDecHash.set(93, "C");98predefinedDecHash.set(94, "V");99predefinedDecHash.set(95, "e");100predefinedDecHash.set(96, "J");101predefinedDecHash.set(97, "i");102predefinedDecHash.set(98, "o");103predefinedDecHash.set(99, "o");104predefinedDecHash.set(100, "K");105predefinedDecHash.set(101, "V");106predefinedDecHash.set(102, "8");107predefinedDecHash.set(103, "r");108predefinedDecHash.set(104, "P");109predefinedDecHash.set(105, "S");110predefinedDecHash.set(106, "0");111predefinedDecHash.set(107, "w");112predefinedDecHash.set(108, "O");113predefinedDecHash.set(109, "T");114predefinedDecHash.set(110, "g");115predefinedDecHash.set(111, "3");116predefinedDecHash.set(112, "N");117predefinedDecHash.set(113, "j");118predefinedDecHash.set(114, "U");119predefinedDecHash.set(115, "0");120predefinedDecHash.set(116, "M");121predefinedDecHash.set(117, "z");122predefinedDecHash.set(118, "I");123predefinedDecHash.set(119, "x");124predefinedDecHash.set(120, "Y");125predefinedDecHash.set(121, "E");126predefinedDecHash.set(122, "x");127predefinedDecHash.set(123, "v");128predefinedDecHash.set(124, "c");129predefinedDecHash.set(125, "m");130predefinedDecHash.set(126, "V");131predefinedDecHash.set(127, "t");132predefinedDecHash.set(128, "I");133predefinedDecHash.set(129, "G");134predefinedDecHash.set(130, "l");135predefinedDecHash.set(131, "w");136predefinedDecHash.set(132, "c");137predefinedDecHash.set(133, "3");138predefinedDecHash.set(134, "V");139predefinedDecHash.set(135, "t");140predefinedDecHash.set(136, "I");141predefinedDecHash.set(137, "G");142predefinedDecHash.set(138, "R");143predefinedDecHash.set(139, "v");144predefinedDecHash.set(140, "b");145predefinedDecHash.set(141, "G");146predefinedDecHash.set(142, "9");147predefinedDecHash.set(143, "y");148predefinedDecHash.set(144, "I");149predefinedDecHash.set(145, "H");150predefinedDecHash.set(146, "N");151predefinedDecHash.set(147, "p");152predefinedDecHash.set(148, "d");153predefinedDecHash.set(149, "C");154predefinedDecHash.set(150, "B");155predefinedDecHash.set(151, "h");156predefinedDecHash.set(152, "b");157predefinedDecHash.set(153, "W");158predefinedDecHash.set(154, "V");159predefinedDecHash.set(155, "0");160predefinedDecHash.set(156, "L");161predefinedDecHash.set(157, "C");162predefinedDecHash.set(158, "B");163predefinedDecHash.set(159, "j");164predefinedDecHash.set(160, "b");165predefinedDecHash.set(161, "2");166predefinedDecHash.set(162, "5");167predefinedDecHash.set(163, "z");168predefinedDecHash.set(164, "Z");169predefinedDecHash.set(165, "W");170predefinedDecHash.set(166, "N");171predefinedDecHash.set(167, "0");172predefinedDecHash.set(168, "Z");173predefinedDecHash.set(169, "X");174predefinedDecHash.set(170, "R");175predefinedDecHash.set(171, "1");176predefinedDecHash.set(172, "c");177predefinedDecHash.set(173, "i");178predefinedDecHash.set(174, "B");179predefinedDecHash.set(175, "h");180predefinedDecHash.set(176, "Z");181predefinedDecHash.set(177, "G");182predefinedDecHash.set(178, "l");183predefinedDecHash.set(179, "w");184predefinedDecHash.set(180, "a");185predefinedDecHash.set(181, "X");186predefinedDecHash.set(182, "N");187predefinedDecHash.set(183, "j");188predefinedDecHash.set(184, "a");189predefinedDecHash.set(185, "W");190predefinedDecHash.set(186, "5");191predefinedDecHash.set(187, "n");192predefinedDecHash.set(188, "I");193predefinedDecHash.set(189, "G");194predefinedDecHash.set(190, "V");195predefinedDecHash.set(191, "s");196predefinedDecHash.set(192, "a");197predefinedDecHash.set(193, "X");198predefinedDecHash.set(194, "Q");199predefinedDecHash.set(195, "s");200predefinedDecHash.set(196, "I");201predefinedDecHash.set(197, "H");202predefinedDecHash.set(198, "N");203predefinedDecHash.set(199, "l");204predefinedDecHash.set(200, "Z");205predefinedDecHash.set(201, "C");206predefinedDecHash.set(202, "B");207predefinedDecHash.set(203, "k");208predefinedDecHash.set(204, "b");209predefinedDecHash.set(205, "y");210predefinedDecHash.set(206, "B");211predefinedDecHash.set(207, "l");212predefinedDecHash.set(208, "a");213predefinedDecHash.set(209, "X");214predefinedDecHash.set(210, "V");215predefinedDecHash.set(211, "z");216predefinedDecHash.set(212, "b");217predefinedDecHash.set(213, "W");218predefinedDecHash.set(214, "9");219predefinedDecHash.set(215, "k");220predefinedDecHash.set(216, "I");221predefinedDecHash.set(217, "H");222predefinedDecHash.set(218, "R");223predefinedDecHash.set(219, "l");224predefinedDecHash.set(220, "b");225predefinedDecHash.set(221, "X");226predefinedDecHash.set(222, "B");227predefinedDecHash.set(223, "v");228predefinedDecHash.set(224, "c");229predefinedDecHash.set(225, "i");230predefinedDecHash.set(226, "B");231predefinedDecHash.set(227, "p");232predefinedDecHash.set(228, "b");233predefinedDecHash.set(229, "m");234predefinedDecHash.set(230, "N");235predefinedDecHash.set(231, "p");236predefinedDecHash.set(232, "Z");237predefinedDecHash.set(233, "G");238predefinedDecHash.set(234, "l");239predefinedDecHash.set(235, "k");240predefinedDecHash.set(236, "d");241predefinedDecHash.set(237, "W");242predefinedDecHash.set(238, "5");243predefinedDecHash.set(239, "0");244predefinedDecHash.set(240, "I");245predefinedDecHash.set(241, "H");246predefinedDecHash.set(242, "V");247predefinedDecHash.set(243, "0");248predefinedDecHash.set(244, "I");249predefinedDecHash.set(245, "G");250predefinedDecHash.set(246, "x");251predefinedDecHash.set(247, "h");252predefinedDecHash.set(248, "Y");253predefinedDecHash.set(249, "m");254predefinedDecHash.set(250, "9");255predefinedDecHash.set(251, "y");256predefinedDecHash.set(252, "Z");257predefinedDecHash.set(253, "S");258predefinedDecHash.set(254, "B");259predefinedDecHash.set(255, "l");260predefinedDecHash.set(256, "d");261predefinedDecHash.set(257, "C");262predefinedDecHash.set(258, "B");263predefinedDecHash.set(259, "k");264predefinedDecHash.set(260, "b");265predefinedDecHash.set(261, "2");266predefinedDecHash.set(262, "x");267predefinedDecHash.set(263, "v");268predefinedDecHash.set(264, "c");269predefinedDecHash.set(265, "m");270predefinedDecHash.set(266, "U");271predefinedDecHash.set(267, "g");272predefinedDecHash.set(268, "b");273predefinedDecHash.set(269, "W");274predefinedDecHash.set(270, "F");275predefinedDecHash.set(271, "n");276predefinedDecHash.set(272, "b");277predefinedDecHash.set(273, "m");278predefinedDecHash.set(274, "E");279predefinedDecHash.set(275, "g");280predefinedDecHash.set(276, "Y");281predefinedDecHash.set(277, "W");282predefinedDecHash.set(278, "x");283predefinedDecHash.set(279, "p");284predefinedDecHash.set(280, "c");285predefinedDecHash.set(281, "X");286predefinedDecHash.set(282, "V");287predefinedDecHash.set(283, "h");288predefinedDecHash.set(284, "L");289predefinedDecHash.set(285, "i");290predefinedDecHash.set(286, "B");291predefinedDecHash.set(287, "V");292predefinedDecHash.set(288, "d");293predefinedDecHash.set(289, "C");294predefinedDecHash.set(290, "B");295predefinedDecHash.set(291, "l");296predefinedDecHash.set(292, "b");297predefinedDecHash.set(293, "m");298predefinedDecHash.set(294, "l");299predefinedDecHash.set(295, "t");300predefinedDecHash.set(296, "I");301predefinedDecHash.set(297, "G");302predefinedDecHash.set(298, "F");303predefinedDecHash.set(299, "k");304predefinedDecHash.set(300, "I");305predefinedDecHash.set(301, "G");306predefinedDecHash.set(302, "1");307predefinedDecHash.set(303, "p");308predefinedDecHash.set(304, "b");309predefinedDecHash.set(305, "m");310predefinedDecHash.set(306, "l");311predefinedDecHash.set(307, "t");312predefinedDecHash.set(308, "I");313predefinedDecHash.set(309, "H");314predefinedDecHash.set(310, "Z");315predefinedDecHash.set(311, "l");316predefinedDecHash.set(312, "b");317predefinedDecHash.set(313, "m");318predefinedDecHash.set(314, "l");319predefinedDecHash.set(315, "h");320predefinedDecHash.set(316, "b");321predefinedDecHash.set(317, "S");322predefinedDecHash.set(318, "w");323predefinedDecHash.set(319, "g");324predefinedDecHash.set(320, "c");325predefinedDecHash.set(321, "X");326predefinedDecHash.set(322, "V");327predefinedDecHash.set(323, "p");328predefinedDecHash.set(324, "c");329predefinedDecHash.set(325, "y");330predefinedDecHash.set(326, "B");331predefinedDecHash.set(327, "u");332predefinedDecHash.set(328, "b");333predefinedDecHash.set(329, "3");334predefinedDecHash.set(330, "N");335predefinedDecHash.set(331, "0");336predefinedDecHash.set(332, "c");337predefinedDecHash.set(333, "n");338predefinedDecHash.set(334, "V");339predefinedDecHash.set(335, "k");340predefinedDecHash.set(336, "I");341predefinedDecHash.set(337, "G");342predefinedDecHash.set(338, "V");343predefinedDecHash.set(339, "4");344predefinedDecHash.set(340, "Z");345predefinedDecHash.set(341, "X");346predefinedDecHash.set(342, "J");347predefinedDecHash.set(343, "j");348predefinedDecHash.set(344, "a");349predefinedDecHash.set(345, "X");350predefinedDecHash.set(346, "R");351predefinedDecHash.set(347, "h");352predefinedDecHash.set(348, "d");353predefinedDecHash.set(349, "G");354predefinedDecHash.set(350, "l");355predefinedDecHash.set(351, "v");356predefinedDecHash.set(352, "b");357predefinedDecHash.set(353, "i");358predefinedDecHash.set(354, "B");359predefinedDecHash.set(355, "1");360predefinedDecHash.set(356, "b");361predefinedDecHash.set(357, "G");362predefinedDecHash.set(358, "x");363predefinedDecHash.set(359, "h");364predefinedDecHash.set(360, "b");365predefinedDecHash.set(361, "W");366predefinedDecHash.set(362, "N");367predefinedDecHash.set(363, "v");368predefinedDecHash.set(364, "I");369predefinedDecHash.set(365, "G");370predefinedDecHash.set(366, "x");371predefinedDecHash.set(367, "h");372predefinedDecHash.set(368, "Y");373predefinedDecHash.set(369, "m");374predefinedDecHash.set(370, "9");375predefinedDecHash.set(371, "y");376predefinedDecHash.set(372, "a");377predefinedDecHash.set(373, "X");378predefinedDecHash.set(374, "M");379predefinedDecHash.set(375, "g");380predefinedDecHash.set(376, "b");381predefinedDecHash.set(377, "m");382predefinedDecHash.set(378, "l");383predefinedDecHash.set(379, "z");384predefinedDecHash.set(380, "a");385predefinedDecHash.set(381, "S");386predefinedDecHash.set(382, "B");387predefinedDecHash.set(383, "1");388predefinedDecHash.set(384, "d");389predefinedDecHash.set(385, "C");390predefinedDecHash.set(386, "B");391predefinedDecHash.set(387, "h");392predefinedDecHash.set(388, "b");393predefinedDecHash.set(389, "G");394predefinedDecHash.set(390, "l");395predefinedDecHash.set(391, "x");396predefinedDecHash.set(392, "d");397predefinedDecHash.set(393, "W");398predefinedDecHash.set(394, "l");399predefinedDecHash.set(395, "w");400predefinedDecHash.set(396, "I");401predefinedDecHash.set(397, "G");402predefinedDecHash.set(398, "V");403predefinedDecHash.set(399, "4");404predefinedDecHash.set(400, "I");405predefinedDecHash.set(401, "G");406predefinedDecHash.set(402, "V");407predefinedDecHash.set(403, "h");408predefinedDecHash.set(404, "I");409predefinedDecHash.set(405, "G");410predefinedDecHash.set(406, "N");411predefinedDecHash.set(407, "v");412predefinedDecHash.set(408, "b");413predefinedDecHash.set(409, "W");414predefinedDecHash.set(410, "1");415predefinedDecHash.set(411, "v");416predefinedDecHash.set(412, "Z");417predefinedDecHash.set(413, "G");418predefinedDecHash.set(414, "8");419predefinedDecHash.set(415, "g");420predefinedDecHash.set(416, "Y");421predefinedDecHash.set(417, "2");422predefinedDecHash.set(418, "9");423predefinedDecHash.set(419, "u");424predefinedDecHash.set(420, "c");425predefinedDecHash.set(421, "2");426predefinedDecHash.set(422, "V");427predefinedDecHash.set(423, "x");428predefinedDecHash.set(424, "d");429predefinedDecHash.set(425, "W");430predefinedDecHash.set(426, "F");431predefinedDecHash.set(427, "0");432predefinedDecHash.set(428, "L");433predefinedDecHash.set(429, "i");434predefinedDecHash.set(430, "B");435predefinedDecHash.set(431, "E");436predefinedDecHash.set(432, "d");437predefinedDecHash.set(433, "W");438predefinedDecHash.set(434, "l");439predefinedDecHash.set(435, "z");440predefinedDecHash.set(436, "I");441predefinedDecHash.set(437, "G");442predefinedDecHash.set(438, "F");443predefinedDecHash.set(439, "1");444predefinedDecHash.set(440, "d");445predefinedDecHash.set(441, "G");446predefinedDecHash.set(442, "U");447predefinedDecHash.set(443, "g");448predefinedDecHash.set(444, "a");449predefinedDecHash.set(445, "X");450predefinedDecHash.set(446, "J");451predefinedDecHash.set(447, "1");452predefinedDecHash.set(448, "c");453predefinedDecHash.set(449, "m");454predefinedDecHash.set(450, "U");455predefinedDecHash.set(451, "g");456predefinedDecHash.set(452, "Z");457predefinedDecHash.set(453, "G");458predefinedDecHash.set(454, "9");459predefinedDecHash.set(455, "s");460predefinedDecHash.set(456, "b");461predefinedDecHash.set(457, "3");462predefinedDecHash.set(458, "I");463predefinedDecHash.set(459, "g");464predefinedDecHash.set(460, "a");465predefinedDecHash.set(461, "W");466predefinedDecHash.set(462, "4");467predefinedDecHash.set(463, "g");468predefinedDecHash.set(464, "c");469predefinedDecHash.set(465, "m");470predefinedDecHash.set(466, "V");471predefinedDecHash.set(467, "w");472predefinedDecHash.set(468, "c");473predefinedDecHash.set(469, "m");474predefinedDecHash.set(470, "V");475predefinedDecHash.set(471, "o");476predefinedDecHash.set(472, "Z");477predefinedDecHash.set(473, "W");478predefinedDecHash.set(474, "5");479predefinedDecHash.set(475, "k");480predefinedDecHash.set(476, "Z");481predefinedDecHash.set(477, "X");482predefinedDecHash.set(478, "J");483predefinedDecHash.set(479, "p");484predefinedDecHash.set(480, "d");485predefinedDecHash.set(481, "C");486predefinedDecHash.set(482, "B");487predefinedDecHash.set(483, "p");488predefinedDecHash.set(484, "b");489predefinedDecHash.set(485, "i");490predefinedDecHash.set(486, "B");491predefinedDecHash.set(487, "2");492predefinedDecHash.set(488, "b");493predefinedDecHash.set(489, "2");494predefinedDecHash.set(490, "x");495predefinedDecHash.set(491, "1");496predefinedDecHash.set(492, "c");497predefinedDecHash.set(493, "H");498predefinedDecHash.set(494, "R");499predefinedDecHash.set(495, "h");500predefinedDecHash.set(496, "d");501predefinedDecHash.set(497, "G");502predefinedDecHash.set(498, "U");503predefinedDecHash.set(499, "g");504predefinedDecHash.set(500, "d");505predefinedDecHash.set(501, "m");506predefinedDecHash.set(502, "V");507predefinedDecHash.set(503, "s");508predefinedDecHash.set(504, "a");509predefinedDecHash.set(505, "X");510predefinedDecHash.set(506, "Q");511predefinedDecHash.set(507, "g");512predefinedDecHash.set(508, "Z");513predefinedDecHash.set(509, "X");514predefinedDecHash.set(510, "N");515predefinedDecHash.set(511, "z");516predefinedDecHash.set(512, "Z");517predefinedDecHash.set(513, "S");518predefinedDecHash.set(514, "B");519predefinedDecHash.set(515, "j");520predefinedDecHash.set(516, "a");521predefinedDecHash.set(517, "W");522predefinedDecHash.set(518, "x");523predefinedDecHash.set(519, "s");524predefinedDecHash.set(520, "d");525predefinedDecHash.set(521, "W");526predefinedDecHash.set(522, "0");527predefinedDecHash.set(523, "g");528predefinedDecHash.set(524, "Z");529predefinedDecHash.set(525, "G");530predefinedDecHash.set(526, "9");531predefinedDecHash.set(527, "s");532predefinedDecHash.set(528, "b");533predefinedDecHash.set(529, "3");534predefinedDecHash.set(530, "J");535predefinedDecHash.set(531, "l");536predefinedDecHash.set(532, "I");537predefinedDecHash.set(533, "G");538predefinedDecHash.set(534, "V");539predefinedDecHash.set(535, "1");540predefinedDecHash.set(536, "I");541predefinedDecHash.set(537, "G");542predefinedDecHash.set(538, "Z");543predefinedDecHash.set(539, "1");544predefinedDecHash.set(540, "Z");545predefinedDecHash.set(541, "2");546predefinedDecHash.set(542, "l");547predefinedDecHash.set(543, "h");548predefinedDecHash.set(544, "d");549predefinedDecHash.set(545, "C");550predefinedDecHash.set(546, "B");551predefinedDecHash.set(547, "u");552predefinedDecHash.set(548, "d");553predefinedDecHash.set(549, "W");554predefinedDecHash.set(550, "x");555predefinedDecHash.set(551, "s");556predefinedDecHash.set(552, "Y");557predefinedDecHash.set(553, "S");558predefinedDecHash.set(554, "B");559predefinedDecHash.set(555, "w");560predefinedDecHash.set(556, "Y");561predefinedDecHash.set(557, "X");562predefinedDecHash.set(558, "J");563predefinedDecHash.set(559, "p");564predefinedDecHash.set(560, "Y");565predefinedDecHash.set(561, "X");566predefinedDecHash.set(562, "R");567predefinedDecHash.set(563, "1");568predefinedDecHash.set(564, "c");569predefinedDecHash.set(565, "i");570predefinedDecHash.set(566, "4");571predefinedDecHash.set(567, "g");572predefinedDecHash.set(568, "R");573predefinedDecHash.set(569, "X");574predefinedDecHash.set(570, "h");575predefinedDecHash.set(571, "j");576predefinedDecHash.set(572, "Z");577predefinedDecHash.set(573, "X");578predefinedDecHash.set(574, "B");579predefinedDecHash.set(575, "0");580predefinedDecHash.set(576, "Z");581predefinedDecHash.set(577, "X");582predefinedDecHash.set(578, "V");583predefinedDecHash.set(579, "y");584predefinedDecHash.set(580, "I");585predefinedDecHash.set(581, "H");586predefinedDecHash.set(582, "N");587predefinedDecHash.set(583, "p");588predefinedDecHash.set(584, "b");589predefinedDecHash.set(585, "n");590predefinedDecHash.set(586, "Q");591predefinedDecHash.set(587, "g");592predefinedDecHash.set(588, "b");593predefinedDecHash.set(589, "2");594predefinedDecHash.set(590, "N");595predefinedDecHash.set(591, "j");596predefinedDecHash.set(592, "Y");597predefinedDecHash.set(593, "W");598predefinedDecHash.set(594, "V");599predefinedDecHash.set(595, "j");600predefinedDecHash.set(596, "Y");601predefinedDecHash.set(597, "X");602predefinedDecHash.set(598, "Q");603predefinedDecHash.set(599, "g");604predefinedDecHash.set(600, "Y");605predefinedDecHash.set(601, "3");606predefinedDecHash.set(602, "V");607predefinedDecHash.set(603, "w");608predefinedDecHash.set(604, "a");609predefinedDecHash.set(605, "W");610predefinedDecHash.set(606, "R");611predefinedDecHash.set(607, "h");612predefinedDecHash.set(608, "d");613predefinedDecHash.set(609, "G");614predefinedDecHash.set(610, "F");615predefinedDecHash.set(611, "0");616predefinedDecHash.set(612, "I");617predefinedDecHash.set(613, "G");618predefinedDecHash.set(614, "5");619predefinedDecHash.set(615, "v");620predefinedDecHash.set(616, "b");621predefinedDecHash.set(617, "i");622predefinedDecHash.set(618, "B");623predefinedDecHash.set(619, "w");624predefinedDecHash.set(620, "c");625predefinedDecHash.set(621, "m");626predefinedDecHash.set(622, "9");627predefinedDecHash.set(623, "p");628predefinedDecHash.set(624, "Z");629predefinedDecHash.set(625, "G");630predefinedDecHash.set(626, "V");631predefinedDecHash.set(627, "u");632predefinedDecHash.set(628, "d");633predefinedDecHash.set(629, "C");634predefinedDecHash.set(630, "w");635predefinedDecHash.set(631, "g");636predefinedDecHash.set(632, "c");637predefinedDecHash.set(633, "3");638predefinedDecHash.set(634, "V");639predefinedDecHash.set(635, "u");640predefinedDecHash.set(636, "d");641predefinedDecHash.set(637, "C");642predefinedDecHash.set(638, "B");643predefinedDecHash.set(639, "p");644predefinedDecHash.set(640, "b");645predefinedDecHash.set(641, "i");646predefinedDecHash.set(642, "B");647predefinedDecHash.set(643, "j");648predefinedDecHash.set(644, "d");649predefinedDecHash.set(645, "W");650predefinedDecHash.set(646, "x");651predefinedDecHash.set(647, "w");652predefinedDecHash.set(648, "Y");653predefinedDecHash.set(649, "S");654predefinedDecHash.set(650, "B");655predefinedDecHash.set(651, "x");656predefinedDecHash.set(652, "d");657predefinedDecHash.set(653, "W");658predefinedDecHash.set(654, "k");659predefinedDecHash.set(655, "g");660predefinedDecHash.set(656, "b");661predefinedDecHash.set(657, "2");662predefinedDecHash.set(658, "Z");663predefinedDecHash.set(659, "m");664predefinedDecHash.set(660, "a");665predefinedDecHash.set(661, "W");666predefinedDecHash.set(662, "N");667predefinedDecHash.set(663, "p");668predefinedDecHash.set(664, "Y");669predefinedDecHash.set(665, "S");670predefinedDecHash.set(666, "B");671predefinedDecHash.set(667, "k");672predefinedDecHash.set(668, "Z");673predefinedDecHash.set(669, "X");674predefinedDecHash.set(670, "N");675predefinedDecHash.set(671, "l");676predefinedDecHash.set(672, "c");677predefinedDecHash.set(673, "n");678predefinedDecHash.set(674, "V");679predefinedDecHash.set(675, "u");680predefinedDecHash.set(676, "d");681predefinedDecHash.set(677, "C");682predefinedDecHash.set(678, "B");683predefinedDecHash.set(679, "t");684predefinedDecHash.set(680, "b");685predefinedDecHash.set(681, "2");686predefinedDecHash.set(682, "x");687predefinedDecHash.set(683, "s");688predefinedDecHash.set(684, "a");689predefinedDecHash.set(685, "X");690predefinedDecHash.set(686, "Q");691predefinedDecHash.set(687, "g");692predefinedDecHash.set(688, "Y");693predefinedDecHash.set(689, "W");694predefinedDecHash.set(690, "5");695predefinedDecHash.set(691, "p");696predefinedDecHash.set(692, "b");697predefinedDecHash.set(693, "S");698predefinedDecHash.set(694, "B");699predefinedDecHash.set(695, "p");700predefinedDecHash.set(696, "Z");701predefinedDecHash.set(697, "C");702predefinedDecHash.set(698, "B");703predefinedDecHash.set(699, "l");704predefinedDecHash.set(700, "c");705predefinedDecHash.set(701, "3");706predefinedDecHash.set(702, "Q");707predefinedDecHash.set(703, "g");708predefinedDecHash.set(704, "b");709predefinedDecHash.set(705, "G");710predefinedDecHash.set(706, "F");711predefinedDecHash.set(707, "i");712predefinedDecHash.set(708, "b");713predefinedDecHash.set(709, "3");714predefinedDecHash.set(710, "J");715predefinedDecHash.set(711, "1");716predefinedDecHash.set(712, "b");717predefinedDecHash.set(713, "S");718predefinedDecHash.set(714, "4");719predefinedDecHash.set(715, "D");720predefinedDecHash.set(716, "q");721predefinedDecHash.set(717, "6");722predefinedDecHash.set(718, "/");723724predefinedEncHash.set("A", [70,90]);725predefinedEncHash.set("B", [22,150,158,174,202,206,222,226,254,258,286,290,326,354,382,386,430,482,486,514,546,554,574,618,638,642,650,666,678,694,698]);726predefinedEncHash.set("C", [21,93,149,157,201,257,289,385,481,545,629,637,677,697]);727predefinedEncHash.set("D", [0,715]);728predefinedEncHash.set("E", [37,49,121,274,431]);729predefinedEncHash.set("F", [9,10,17,270,298,426,438,610,706]);730predefinedEncHash.set("G", [5,23,33,45,65,129,137,141,177,189,233,245,297,301,337,349,357,365,389,397,401,405,413,437,441,453,497,525,533,537,609,613,625,705]);731predefinedEncHash.set("H", [81,145,197,217,241,309,493,581]);732predefinedEncHash.set("I", [8,16,36,42,48,88,118,128,136,144,188,196,216,240,244,296,300,308,336,364,396,400,404,436,458,532,536,580,612]);733predefinedEncHash.set("J", [18,58,92,96,342,446,478,530,558,710]);734predefinedEncHash.set("K", [100]);735predefinedEncHash.set("L", [68,156,284,428]);736predefinedEncHash.set("M", [116,374]);737predefinedEncHash.set("N", [14,112,146,166,182,198,230,330,362,406,510,582,590,662,670]);738predefinedEncHash.set("O", [108]);739predefinedEncHash.set("P", [72,76,104]);740predefinedEncHash.set("Q", [56,194,506,586,598,686,702]);741predefinedEncHash.set("R", [64,138,170,218,346,494,562,568,606]);742predefinedEncHash.set("S", [28,105,253,317,381,513,553,649,665,693,713]);743predefinedEncHash.set("T", [109]);744predefinedEncHash.set("U", [89,114,266,442,450,498]);745predefinedEncHash.set("V", [4,30,34,94,101,126,134,154,190,210,242,282,287,322,334,338,398,402,422,466,470,502,534,578,594,602,626,634,674]);746predefinedEncHash.set("W", [13,84,153,165,185,213,237,269,277,361,393,409,425,433,461,473,517,521,549,593,605,645,653,661,689]);747predefinedEncHash.set("X", [41,169,181,193,209,221,281,321,341,345,373,445,477,505,509,557,561,569,573,577,597,669,685]);748predefinedEncHash.set("Y", [120,248,276,368,416,552,556,560,592,596,600,648,664,688]);749predefinedEncHash.set("Z", [20,40,164,168,176,200,232,252,310,340,412,452,472,476,508,512,524,538,540,572,576,624,658,668,696]);750predefinedEncHash.set("a", [12,180,184,192,208,344,372,380,444,460,504,516,604,660,684]);751predefinedEncHash.set("b", [24,140,152,160,204,212,220,228,260,268,272,292,304,312,316,328,352,356,360,376,388,408,456,484,488,528,584,588,616,640,656,680,692,704,708,712]);752predefinedEncHash.set("c", [32,124,132,172,224,264,280,320,324,332,420,448,464,468,492,564,620,632,672,700]);753predefinedEncHash.set("d", [44,60,148,236,256,288,348,384,392,424,432,440,480,496,500,520,544,548,608,628,636,644,652,676]);754predefinedEncHash.set("e", [52,95]);755predefinedEncHash.set("f", [80]);756predefinedEncHash.set("g", [26,27,43,55,63,110,267,275,319,375,415,443,451,459,463,499,507,523,567,587,599,631,655,687,703]);757predefinedEncHash.set("h", [6,46,51,151,175,247,283,315,347,359,367,387,403,495,543,570,607]);758predefinedEncHash.set("i", [69,73,97,173,225,285,353,429,485,565,617,641,707]);759predefinedEncHash.set("j", [91,113,159,183,343,515,571,591,595,643]);760predefinedEncHash.set("k", [35,54,203,215,235,259,299,335,475,654,667]);761predefinedEncHash.set("l", [7,19,47,130,178,199,207,219,234,255,291,294,306,311,314,350,378,390,394,434,531,542,671,699]);762predefinedEncHash.set("m", [125,229,249,265,273,293,305,313,369,377,449,465,469,501,621,659]);763predefinedEncHash.set("n", [29,53,57,67,187,271,333,585,673]);764predefinedEncHash.set("o", [78,98,99,471]);765predefinedEncHash.set("p", [147,227,231,279,303,323,479,483,559,583,623,639,663,691,695]);766predefinedEncHash.set("q", [1,716]);767predefinedEncHash.set("r", [15,103]);768predefinedEncHash.set("s", [191,195,455,503,519,527,551,683]);769predefinedEncHash.set("t", [31,82,127,135,295,307,679]);770predefinedEncHash.set("u", [75,327,419,547,627,635,675]);771predefinedEncHash.set("v", [59,123,139,223,263,351,363,407,411,615]);772predefinedEncHash.set("w", [74,107,131,179,318,395,467,555,603,619,630,647]);773predefinedEncHash.set("x", [50,119,122,246,262,278,358,366,391,423,490,518,550,646,651,682]);774predefinedEncHash.set("y", [143,205,251,325,371,579]);775predefinedEncHash.set("z", [77,117,163,211,379,435,511]);776predefinedEncHash.set("0", [106,115,155,167,239,243,331,427,522,575,611]);777predefinedEncHash.set("1", [11,85,86,171,302,355,383,410,439,447,491,535,539,563,711]);778predefinedEncHash.set("2", [39,61,161,261,417,421,487,489,541,589,657,681]);779predefinedEncHash.set("3", [25,111,133,329,457,529,601,633,701,709]);780predefinedEncHash.set("4", [62,339,399,462,566,714]);781predefinedEncHash.set("5", [162,186,238,474,614,690]);782predefinedEncHash.set("6", [2,717]);783predefinedEncHash.set("7", [79]);784predefinedEncHash.set("8", [71,102,414]);785predefinedEncHash.set("9", [38,66,83,142,214,250,370,418,454,526,622]);786predefinedEncHash.set("+", [87]);
...
history-hash-debug.js
Source:history-hash-debug.js
1/*2YUI 3.17.2 (build 9c3c78e)3Copyright 2014 Yahoo! Inc. All rights reserved.4Licensed under the BSD License.5http://yuilibrary.com/license/6*/7YUI.add('history-hash', function (Y, NAME) {8/**9 * Provides browser history management backed by10 * <code>window.location.hash</code>, as well as convenience methods for working11 * with the location hash and a synthetic <code>hashchange</code> event that12 * normalizes differences across browsers.13 *14 * @module history15 * @submodule history-hash16 * @since 3.2.017 * @class HistoryHash18 * @extends HistoryBase19 * @constructor20 * @param {Object} config (optional) Configuration object. See the HistoryBase21 * documentation for details.22 */23var HistoryBase = Y.HistoryBase,24 Lang = Y.Lang,25 YArray = Y.Array,26 YObject = Y.Object,27 GlobalEnv = YUI.namespace('Env.HistoryHash'),28 SRC_HASH = 'hash',29 hashNotifiers,30 oldHash,31 oldUrl,32 win = Y.config.win,33 useHistoryHTML5 = Y.config.useHistoryHTML5;34function HistoryHash() {35 HistoryHash.superclass.constructor.apply(this, arguments);36}37Y.extend(HistoryHash, HistoryBase, {38 // -- Initialization -------------------------------------------------------39 _init: function (config) {40 var bookmarkedState = HistoryHash.parseHash();41 // If an initialState was provided, merge the bookmarked state into it42 // (the bookmarked state wins).43 config = config || {};44 this._initialState = config.initialState ?45 Y.merge(config.initialState, bookmarkedState) : bookmarkedState;46 // Subscribe to the synthetic hashchange event (defined below) to handle47 // changes.48 Y.after('hashchange', Y.bind(this._afterHashChange, this), win);49 HistoryHash.superclass._init.apply(this, arguments);50 },51 // -- Protected Methods ----------------------------------------------------52 _change: function (src, state, options) {53 // Stringify all values to ensure that comparisons don't fail after54 // they're coerced to strings in the location hash.55 YObject.each(state, function (value, key) {56 if (Lang.isValue(value)) {57 state[key] = value.toString();58 }59 });60 return HistoryHash.superclass._change.call(this, src, state, options);61 },62 _storeState: function (src, newState) {63 var decode = HistoryHash.decode,64 newHash = HistoryHash.createHash(newState);65 HistoryHash.superclass._storeState.apply(this, arguments);66 // Update the location hash with the changes, but only if the new hash67 // actually differs from the current hash (this avoids creating multiple68 // history entries for a single state).69 //70 // We always compare decoded hashes, since it's possible that the hash71 // could be set incorrectly to a non-encoded value outside of72 // HistoryHash.73 if (src !== SRC_HASH && decode(HistoryHash.getHash()) !== decode(newHash)) {74 HistoryHash[src === HistoryBase.SRC_REPLACE ? 'replaceHash' : 'setHash'](newHash);75 }76 },77 // -- Protected Event Handlers ---------------------------------------------78 /**79 * Handler for hashchange events.80 *81 * @method _afterHashChange82 * @param {Event} e83 * @protected84 */85 _afterHashChange: function (e) {86 this._resolveChanges(SRC_HASH, HistoryHash.parseHash(e.newHash), {});87 }88}, {89 // -- Public Static Properties ---------------------------------------------90 NAME: 'historyHash',91 /**92 * Constant used to identify state changes originating from93 * <code>hashchange</code> events.94 *95 * @property SRC_HASH96 * @type String97 * @static98 * @final99 */100 SRC_HASH: SRC_HASH,101 /**102 * <p>103 * Prefix to prepend when setting the hash fragment. For example, if the104 * prefix is <code>!</code> and the hash fragment is set to105 * <code>#foo=bar&baz=quux</code>, the final hash fragment in the URL will106 * become <code>#!foo=bar&baz=quux</code>. This can be used to help make an107 * Ajax application crawlable in accordance with Google's guidelines at108 * <a href="http://code.google.com/web/ajaxcrawling/">http://code.google.com/web/ajaxcrawling/</a>.109 * </p>110 *111 * <p>112 * Note that this prefix applies to all HistoryHash instances. It's not113 * possible for individual instances to use their own prefixes since they114 * all operate on the same URL.115 * </p>116 *117 * @property hashPrefix118 * @type String119 * @default ''120 * @static121 */122 hashPrefix: '',123 // -- Protected Static Properties ------------------------------------------124 /**125 * Regular expression used to parse location hash/query strings.126 *127 * @property _REGEX_HASH128 * @type RegExp129 * @protected130 * @static131 * @final132 */133 _REGEX_HASH: /([^\?#&=]+)=?([^&=]*)/g,134 // -- Public Static Methods ------------------------------------------------135 /**136 * Creates a location hash string from the specified object of key/value137 * pairs.138 *139 * @method createHash140 * @param {Object} params object of key/value parameter pairs141 * @return {String} location hash string142 * @static143 */144 createHash: function (params) {145 var encode = HistoryHash.encode,146 hash = [];147 YObject.each(params, function (value, key) {148 if (Lang.isValue(value)) {149 hash.push(encode(key) + '=' + encode(value));150 }151 });152 return hash.join('&');153 },154 /**155 * Wrapper around <code>decodeURIComponent()</code> that also converts +156 * chars into spaces.157 *158 * @method decode159 * @param {String} string string to decode160 * @return {String} decoded string161 * @static162 */163 decode: function (string) {164 return decodeURIComponent(string.replace(/\+/g, ' '));165 },166 /**167 * Wrapper around <code>encodeURIComponent()</code> that converts spaces to168 * + chars.169 *170 * @method encode171 * @param {String} string string to encode172 * @return {String} encoded string173 * @static174 */175 encode: function (string) {176 return encodeURIComponent(string).replace(/%20/g, '+');177 },178 /**179 * Gets the raw (not decoded) current location hash, minus the preceding '#'180 * character and the hashPrefix (if one is set).181 *182 * @method getHash183 * @return {String} current location hash184 * @static185 */186 getHash: (Y.UA.gecko ? function () {187 // Gecko's window.location.hash returns a decoded string and we want all188 // encoding untouched, so we need to get the hash value from189 // window.location.href instead. We have to use UA sniffing rather than190 // feature detection, since the only way to detect this would be to191 // actually change the hash.192 var location = Y.getLocation(),193 matches = /#(.*)$/.exec(location.href),194 hash = matches && matches[1] || '',195 prefix = HistoryHash.hashPrefix;196 return prefix && hash.indexOf(prefix) === 0 ?197 hash.replace(prefix, '') : hash;198 } : function () {199 var location = Y.getLocation(),200 hash = location.hash.substring(1),201 prefix = HistoryHash.hashPrefix;202 // Slight code duplication here, but execution speed is of the essence203 // since getHash() is called every 50ms to poll for changes in browsers204 // that don't support native onhashchange. An additional function call205 // would add unnecessary overhead.206 return prefix && hash.indexOf(prefix) === 0 ?207 hash.replace(prefix, '') : hash;208 }),209 /**210 * Gets the current bookmarkable URL.211 *212 * @method getUrl213 * @return {String} current bookmarkable URL214 * @static215 */216 getUrl: function () {217 return location.href;218 },219 /**220 * Parses a location hash string into an object of key/value parameter221 * pairs. If <i>hash</i> is not specified, the current location hash will222 * be used.223 *224 * @method parseHash225 * @param {String} hash (optional) location hash string226 * @return {Object} object of parsed key/value parameter pairs227 * @static228 */229 parseHash: function (hash) {230 var decode = HistoryHash.decode,231 i,232 len,233 match,234 matches,235 param,236 params = {},237 prefix = HistoryHash.hashPrefix,238 prefixIndex;239 hash = Lang.isValue(hash) ? hash : HistoryHash.getHash();240 if (prefix) {241 prefixIndex = hash.indexOf(prefix);242 if (prefixIndex === 0 || (prefixIndex === 1 && hash.charAt(0) === '#')) {243 hash = hash.replace(prefix, '');244 }245 }246 matches = hash.match(HistoryHash._REGEX_HASH) || [];247 for (i = 0, len = matches.length; i < len; ++i) {248 match = matches[i];249 param = match.split('=');250 if (param.length > 1) {251 params[decode(param[0])] = decode(param[1]);252 } else {253 params[decode(match)] = '';254 }255 }256 return params;257 },258 /**259 * Replaces the browser's current location hash with the specified hash260 * and removes all forward navigation states, without creating a new browser261 * history entry. Automatically prepends the <code>hashPrefix</code> if one262 * is set.263 *264 * @method replaceHash265 * @param {String} hash new location hash266 * @static267 */268 replaceHash: function (hash) {269 var location = Y.getLocation(),270 base = location.href.replace(/#.*$/, '');271 if (hash.charAt(0) === '#') {272 hash = hash.substring(1);273 }274 location.replace(base + '#' + (HistoryHash.hashPrefix || '') + hash);275 },276 /**277 * Sets the browser's location hash to the specified string. Automatically278 * prepends the <code>hashPrefix</code> if one is set.279 *280 * @method setHash281 * @param {String} hash new location hash282 * @static283 */284 setHash: function (hash) {285 var location = Y.getLocation();286 if (hash.charAt(0) === '#') {287 hash = hash.substring(1);288 }289 location.hash = (HistoryHash.hashPrefix || '') + hash;290 }291});292// -- Synthetic hashchange Event -----------------------------------------------293// TODO: YUIDoc currently doesn't provide a good way to document synthetic DOM294// events. For now, we're just documenting the hashchange event on the YUI295// object, which is about the best we can do until enhancements are made to296// YUIDoc.297/**298Synthetic <code>window.onhashchange</code> event that normalizes differences299across browsers and provides support for browsers that don't natively support300<code>onhashchange</code>.301This event is provided by the <code>history-hash</code> module.302@example303 YUI().use('history-hash', function (Y) {304 Y.on('hashchange', function (e) {305 // Handle hashchange events on the current window.306 }, Y.config.win);307 });308@event hashchange309@param {EventFacade} e Event facade with the following additional310 properties:311<dl>312 <dt>oldHash</dt>313 <dd>314 Previous hash fragment value before the change.315 </dd>316 <dt>oldUrl</dt>317 <dd>318 Previous URL (including the hash fragment) before the change.319 </dd>320 <dt>newHash</dt>321 <dd>322 New hash fragment value after the change.323 </dd>324 <dt>newUrl</dt>325 <dd>326 New URL (including the hash fragment) after the change.327 </dd>328</dl>329@for YUI330@since 3.2.0331**/332hashNotifiers = GlobalEnv._notifiers;333if (!hashNotifiers) {334 hashNotifiers = GlobalEnv._notifiers = [];335}336Y.Event.define('hashchange', {337 on: function (node, subscriber, notifier) {338 // Ignore this subscription if the node is anything other than the339 // window or document body, since those are the only elements that340 // should support the hashchange event. Note that the body could also be341 // a frameset, but that's okay since framesets support hashchange too.342 if (node.compareTo(win) || node.compareTo(Y.config.doc.body)) {343 hashNotifiers.push(notifier);344 }345 },346 detach: function (node, subscriber, notifier) {347 var index = YArray.indexOf(hashNotifiers, notifier);348 if (index !== -1) {349 hashNotifiers.splice(index, 1);350 }351 }352});353oldHash = HistoryHash.getHash();354oldUrl = HistoryHash.getUrl();355if (HistoryBase.nativeHashChange) {356 // Wrap the browser's native hashchange event if there's not already a357 // global listener.358 if (!GlobalEnv._hashHandle) {359 GlobalEnv._hashHandle = Y.Event.attach('hashchange', function (e) {360 var newHash = HistoryHash.getHash(),361 newUrl = HistoryHash.getUrl();362 // Iterate over a copy of the hashNotifiers array since a subscriber363 // could detach during iteration and cause the array to be re-indexed.364 YArray.each(hashNotifiers.concat(), function (notifier) {365 notifier.fire({366 _event : e,367 oldHash: oldHash,368 oldUrl : oldUrl,369 newHash: newHash,370 newUrl : newUrl371 });372 });373 oldHash = newHash;374 oldUrl = newUrl;375 }, win);376 }377} else {378 // Begin polling for location hash changes if there's not already a global379 // poll running.380 if (!GlobalEnv._hashPoll) {381 GlobalEnv._hashPoll = Y.later(50, null, function () {382 var newHash = HistoryHash.getHash(),383 facade, newUrl;384 if (oldHash !== newHash) {385 newUrl = HistoryHash.getUrl();386 facade = {387 oldHash: oldHash,388 oldUrl : oldUrl,389 newHash: newHash,390 newUrl : newUrl391 };392 oldHash = newHash;393 oldUrl = newUrl;394 YArray.each(hashNotifiers.concat(), function (notifier) {395 notifier.fire(facade);396 });397 }398 }, null, true);399 }400}401Y.HistoryHash = HistoryHash;402// HistoryHash will never win over HistoryHTML5 unless useHistoryHTML5 is false.403if (useHistoryHTML5 === false || (!Y.History && useHistoryHTML5 !== true &&404 (!HistoryBase.html5 || !Y.HistoryHTML5))) {405 Y.History = HistoryHash;406}...
history-hash.js
Source:history-hash.js
1/*2YUI 3.17.2 (build 9c3c78e)3Copyright 2014 Yahoo! Inc. All rights reserved.4Licensed under the BSD License.5http://yuilibrary.com/license/6*/7YUI.add('history-hash', function (Y, NAME) {8/**9 * Provides browser history management backed by10 * <code>window.location.hash</code>, as well as convenience methods for working11 * with the location hash and a synthetic <code>hashchange</code> event that12 * normalizes differences across browsers.13 *14 * @module history15 * @submodule history-hash16 * @since 3.2.017 * @class HistoryHash18 * @extends HistoryBase19 * @constructor20 * @param {Object} config (optional) Configuration object. See the HistoryBase21 * documentation for details.22 */23var HistoryBase = Y.HistoryBase,24 Lang = Y.Lang,25 YArray = Y.Array,26 YObject = Y.Object,27 GlobalEnv = YUI.namespace('Env.HistoryHash'),28 SRC_HASH = 'hash',29 hashNotifiers,30 oldHash,31 oldUrl,32 win = Y.config.win,33 useHistoryHTML5 = Y.config.useHistoryHTML5;34function HistoryHash() {35 HistoryHash.superclass.constructor.apply(this, arguments);36}37Y.extend(HistoryHash, HistoryBase, {38 // -- Initialization -------------------------------------------------------39 _init: function (config) {40 var bookmarkedState = HistoryHash.parseHash();41 // If an initialState was provided, merge the bookmarked state into it42 // (the bookmarked state wins).43 config = config || {};44 this._initialState = config.initialState ?45 Y.merge(config.initialState, bookmarkedState) : bookmarkedState;46 // Subscribe to the synthetic hashchange event (defined below) to handle47 // changes.48 Y.after('hashchange', Y.bind(this._afterHashChange, this), win);49 HistoryHash.superclass._init.apply(this, arguments);50 },51 // -- Protected Methods ----------------------------------------------------52 _change: function (src, state, options) {53 // Stringify all values to ensure that comparisons don't fail after54 // they're coerced to strings in the location hash.55 YObject.each(state, function (value, key) {56 if (Lang.isValue(value)) {57 state[key] = value.toString();58 }59 });60 return HistoryHash.superclass._change.call(this, src, state, options);61 },62 _storeState: function (src, newState) {63 var decode = HistoryHash.decode,64 newHash = HistoryHash.createHash(newState);65 HistoryHash.superclass._storeState.apply(this, arguments);66 // Update the location hash with the changes, but only if the new hash67 // actually differs from the current hash (this avoids creating multiple68 // history entries for a single state).69 //70 // We always compare decoded hashes, since it's possible that the hash71 // could be set incorrectly to a non-encoded value outside of72 // HistoryHash.73 if (src !== SRC_HASH && decode(HistoryHash.getHash()) !== decode(newHash)) {74 HistoryHash[src === HistoryBase.SRC_REPLACE ? 'replaceHash' : 'setHash'](newHash);75 }76 },77 // -- Protected Event Handlers ---------------------------------------------78 /**79 * Handler for hashchange events.80 *81 * @method _afterHashChange82 * @param {Event} e83 * @protected84 */85 _afterHashChange: function (e) {86 this._resolveChanges(SRC_HASH, HistoryHash.parseHash(e.newHash), {});87 }88}, {89 // -- Public Static Properties ---------------------------------------------90 NAME: 'historyHash',91 /**92 * Constant used to identify state changes originating from93 * <code>hashchange</code> events.94 *95 * @property SRC_HASH96 * @type String97 * @static98 * @final99 */100 SRC_HASH: SRC_HASH,101 /**102 * <p>103 * Prefix to prepend when setting the hash fragment. For example, if the104 * prefix is <code>!</code> and the hash fragment is set to105 * <code>#foo=bar&baz=quux</code>, the final hash fragment in the URL will106 * become <code>#!foo=bar&baz=quux</code>. This can be used to help make an107 * Ajax application crawlable in accordance with Google's guidelines at108 * <a href="http://code.google.com/web/ajaxcrawling/">http://code.google.com/web/ajaxcrawling/</a>.109 * </p>110 *111 * <p>112 * Note that this prefix applies to all HistoryHash instances. It's not113 * possible for individual instances to use their own prefixes since they114 * all operate on the same URL.115 * </p>116 *117 * @property hashPrefix118 * @type String119 * @default ''120 * @static121 */122 hashPrefix: '',123 // -- Protected Static Properties ------------------------------------------124 /**125 * Regular expression used to parse location hash/query strings.126 *127 * @property _REGEX_HASH128 * @type RegExp129 * @protected130 * @static131 * @final132 */133 _REGEX_HASH: /([^\?#&=]+)=?([^&=]*)/g,134 // -- Public Static Methods ------------------------------------------------135 /**136 * Creates a location hash string from the specified object of key/value137 * pairs.138 *139 * @method createHash140 * @param {Object} params object of key/value parameter pairs141 * @return {String} location hash string142 * @static143 */144 createHash: function (params) {145 var encode = HistoryHash.encode,146 hash = [];147 YObject.each(params, function (value, key) {148 if (Lang.isValue(value)) {149 hash.push(encode(key) + '=' + encode(value));150 }151 });152 return hash.join('&');153 },154 /**155 * Wrapper around <code>decodeURIComponent()</code> that also converts +156 * chars into spaces.157 *158 * @method decode159 * @param {String} string string to decode160 * @return {String} decoded string161 * @static162 */163 decode: function (string) {164 return decodeURIComponent(string.replace(/\+/g, ' '));165 },166 /**167 * Wrapper around <code>encodeURIComponent()</code> that converts spaces to168 * + chars.169 *170 * @method encode171 * @param {String} string string to encode172 * @return {String} encoded string173 * @static174 */175 encode: function (string) {176 return encodeURIComponent(string).replace(/%20/g, '+');177 },178 /**179 * Gets the raw (not decoded) current location hash, minus the preceding '#'180 * character and the hashPrefix (if one is set).181 *182 * @method getHash183 * @return {String} current location hash184 * @static185 */186 getHash: (Y.UA.gecko ? function () {187 // Gecko's window.location.hash returns a decoded string and we want all188 // encoding untouched, so we need to get the hash value from189 // window.location.href instead. We have to use UA sniffing rather than190 // feature detection, since the only way to detect this would be to191 // actually change the hash.192 var location = Y.getLocation(),193 matches = /#(.*)$/.exec(location.href),194 hash = matches && matches[1] || '',195 prefix = HistoryHash.hashPrefix;196 return prefix && hash.indexOf(prefix) === 0 ?197 hash.replace(prefix, '') : hash;198 } : function () {199 var location = Y.getLocation(),200 hash = location.hash.substring(1),201 prefix = HistoryHash.hashPrefix;202 // Slight code duplication here, but execution speed is of the essence203 // since getHash() is called every 50ms to poll for changes in browsers204 // that don't support native onhashchange. An additional function call205 // would add unnecessary overhead.206 return prefix && hash.indexOf(prefix) === 0 ?207 hash.replace(prefix, '') : hash;208 }),209 /**210 * Gets the current bookmarkable URL.211 *212 * @method getUrl213 * @return {String} current bookmarkable URL214 * @static215 */216 getUrl: function () {217 return location.href;218 },219 /**220 * Parses a location hash string into an object of key/value parameter221 * pairs. If <i>hash</i> is not specified, the current location hash will222 * be used.223 *224 * @method parseHash225 * @param {String} hash (optional) location hash string226 * @return {Object} object of parsed key/value parameter pairs227 * @static228 */229 parseHash: function (hash) {230 var decode = HistoryHash.decode,231 i,232 len,233 match,234 matches,235 param,236 params = {},237 prefix = HistoryHash.hashPrefix,238 prefixIndex;239 hash = Lang.isValue(hash) ? hash : HistoryHash.getHash();240 if (prefix) {241 prefixIndex = hash.indexOf(prefix);242 if (prefixIndex === 0 || (prefixIndex === 1 && hash.charAt(0) === '#')) {243 hash = hash.replace(prefix, '');244 }245 }246 matches = hash.match(HistoryHash._REGEX_HASH) || [];247 for (i = 0, len = matches.length; i < len; ++i) {248 match = matches[i];249 param = match.split('=');250 if (param.length > 1) {251 params[decode(param[0])] = decode(param[1]);252 } else {253 params[decode(match)] = '';254 }255 }256 return params;257 },258 /**259 * Replaces the browser's current location hash with the specified hash260 * and removes all forward navigation states, without creating a new browser261 * history entry. Automatically prepends the <code>hashPrefix</code> if one262 * is set.263 *264 * @method replaceHash265 * @param {String} hash new location hash266 * @static267 */268 replaceHash: function (hash) {269 var location = Y.getLocation(),270 base = location.href.replace(/#.*$/, '');271 if (hash.charAt(0) === '#') {272 hash = hash.substring(1);273 }274 location.replace(base + '#' + (HistoryHash.hashPrefix || '') + hash);275 },276 /**277 * Sets the browser's location hash to the specified string. Automatically278 * prepends the <code>hashPrefix</code> if one is set.279 *280 * @method setHash281 * @param {String} hash new location hash282 * @static283 */284 setHash: function (hash) {285 var location = Y.getLocation();286 if (hash.charAt(0) === '#') {287 hash = hash.substring(1);288 }289 location.hash = (HistoryHash.hashPrefix || '') + hash;290 }291});292// -- Synthetic hashchange Event -----------------------------------------------293// TODO: YUIDoc currently doesn't provide a good way to document synthetic DOM294// events. For now, we're just documenting the hashchange event on the YUI295// object, which is about the best we can do until enhancements are made to296// YUIDoc.297/**298Synthetic <code>window.onhashchange</code> event that normalizes differences299across browsers and provides support for browsers that don't natively support300<code>onhashchange</code>.301This event is provided by the <code>history-hash</code> module.302@example303 YUI().use('history-hash', function (Y) {304 Y.on('hashchange', function (e) {305 // Handle hashchange events on the current window.306 }, Y.config.win);307 });308@event hashchange309@param {EventFacade} e Event facade with the following additional310 properties:311<dl>312 <dt>oldHash</dt>313 <dd>314 Previous hash fragment value before the change.315 </dd>316 <dt>oldUrl</dt>317 <dd>318 Previous URL (including the hash fragment) before the change.319 </dd>320 <dt>newHash</dt>321 <dd>322 New hash fragment value after the change.323 </dd>324 <dt>newUrl</dt>325 <dd>326 New URL (including the hash fragment) after the change.327 </dd>328</dl>329@for YUI330@since 3.2.0331**/332hashNotifiers = GlobalEnv._notifiers;333if (!hashNotifiers) {334 hashNotifiers = GlobalEnv._notifiers = [];335}336Y.Event.define('hashchange', {337 on: function (node, subscriber, notifier) {338 // Ignore this subscription if the node is anything other than the339 // window or document body, since those are the only elements that340 // should support the hashchange event. Note that the body could also be341 // a frameset, but that's okay since framesets support hashchange too.342 if (node.compareTo(win) || node.compareTo(Y.config.doc.body)) {343 hashNotifiers.push(notifier);344 }345 },346 detach: function (node, subscriber, notifier) {347 var index = YArray.indexOf(hashNotifiers, notifier);348 if (index !== -1) {349 hashNotifiers.splice(index, 1);350 }351 }352});353oldHash = HistoryHash.getHash();354oldUrl = HistoryHash.getUrl();355if (HistoryBase.nativeHashChange) {356 // Wrap the browser's native hashchange event if there's not already a357 // global listener.358 if (!GlobalEnv._hashHandle) {359 GlobalEnv._hashHandle = Y.Event.attach('hashchange', function (e) {360 var newHash = HistoryHash.getHash(),361 newUrl = HistoryHash.getUrl();362 // Iterate over a copy of the hashNotifiers array since a subscriber363 // could detach during iteration and cause the array to be re-indexed.364 YArray.each(hashNotifiers.concat(), function (notifier) {365 notifier.fire({366 _event : e,367 oldHash: oldHash,368 oldUrl : oldUrl,369 newHash: newHash,370 newUrl : newUrl371 });372 });373 oldHash = newHash;374 oldUrl = newUrl;375 }, win);376 }377} else {378 // Begin polling for location hash changes if there's not already a global379 // poll running.380 if (!GlobalEnv._hashPoll) {381 GlobalEnv._hashPoll = Y.later(50, null, function () {382 var newHash = HistoryHash.getHash(),383 facade, newUrl;384 if (oldHash !== newHash) {385 newUrl = HistoryHash.getUrl();386 facade = {387 oldHash: oldHash,388 oldUrl : oldUrl,389 newHash: newHash,390 newUrl : newUrl391 };392 oldHash = newHash;393 oldUrl = newUrl;394 YArray.each(hashNotifiers.concat(), function (notifier) {395 notifier.fire(facade);396 });397 }398 }, null, true);399 }400}401Y.HistoryHash = HistoryHash;402// HistoryHash will never win over HistoryHTML5 unless useHistoryHTML5 is false.403if (useHistoryHTML5 === false || (!Y.History && useHistoryHTML5 !== true &&404 (!HistoryBase.html5 || !Y.HistoryHTML5))) {405 Y.History = HistoryHash;406}...
html.js
Source:html.js
1/*==================================================2 * HTML Utility Functions3 *==================================================4 */5SimileAjax.HTML = new Object();6SimileAjax.HTML._e2uHash = {};7(function() {8 var e2uHash = SimileAjax.HTML._e2uHash;9 e2uHash['nbsp']= '\u00A0[space]';10 e2uHash['iexcl']= '\u00A1';11 e2uHash['cent']= '\u00A2';12 e2uHash['pound']= '\u00A3';13 e2uHash['curren']= '\u00A4';14 e2uHash['yen']= '\u00A5';15 e2uHash['brvbar']= '\u00A6';16 e2uHash['sect']= '\u00A7';17 e2uHash['uml']= '\u00A8';18 e2uHash['copy']= '\u00A9';19 e2uHash['ordf']= '\u00AA';20 e2uHash['laquo']= '\u00AB';21 e2uHash['not']= '\u00AC';22 e2uHash['shy']= '\u00AD';23 e2uHash['reg']= '\u00AE';24 e2uHash['macr']= '\u00AF';25 e2uHash['deg']= '\u00B0';26 e2uHash['plusmn']= '\u00B1';27 e2uHash['sup2']= '\u00B2';28 e2uHash['sup3']= '\u00B3';29 e2uHash['acute']= '\u00B4';30 e2uHash['micro']= '\u00B5';31 e2uHash['para']= '\u00B6';32 e2uHash['middot']= '\u00B7';33 e2uHash['cedil']= '\u00B8';34 e2uHash['sup1']= '\u00B9';35 e2uHash['ordm']= '\u00BA';36 e2uHash['raquo']= '\u00BB';37 e2uHash['frac14']= '\u00BC';38 e2uHash['frac12']= '\u00BD';39 e2uHash['frac34']= '\u00BE';40 e2uHash['iquest']= '\u00BF';41 e2uHash['Agrave']= '\u00C0';42 e2uHash['Aacute']= '\u00C1';43 e2uHash['Acirc']= '\u00C2';44 e2uHash['Atilde']= '\u00C3';45 e2uHash['Auml']= '\u00C4';46 e2uHash['Aring']= '\u00C5';47 e2uHash['AElig']= '\u00C6';48 e2uHash['Ccedil']= '\u00C7';49 e2uHash['Egrave']= '\u00C8';50 e2uHash['Eacute']= '\u00C9';51 e2uHash['Ecirc']= '\u00CA';52 e2uHash['Euml']= '\u00CB';53 e2uHash['Igrave']= '\u00CC';54 e2uHash['Iacute']= '\u00CD';55 e2uHash['Icirc']= '\u00CE';56 e2uHash['Iuml']= '\u00CF';57 e2uHash['ETH']= '\u00D0';58 e2uHash['Ntilde']= '\u00D1';59 e2uHash['Ograve']= '\u00D2';60 e2uHash['Oacute']= '\u00D3';61 e2uHash['Ocirc']= '\u00D4';62 e2uHash['Otilde']= '\u00D5';63 e2uHash['Ouml']= '\u00D6';64 e2uHash['times']= '\u00D7';65 e2uHash['Oslash']= '\u00D8';66 e2uHash['Ugrave']= '\u00D9';67 e2uHash['Uacute']= '\u00DA';68 e2uHash['Ucirc']= '\u00DB';69 e2uHash['Uuml']= '\u00DC';70 e2uHash['Yacute']= '\u00DD';71 e2uHash['THORN']= '\u00DE';72 e2uHash['szlig']= '\u00DF';73 e2uHash['agrave']= '\u00E0';74 e2uHash['aacute']= '\u00E1';75 e2uHash['acirc']= '\u00E2';76 e2uHash['atilde']= '\u00E3';77 e2uHash['auml']= '\u00E4';78 e2uHash['aring']= '\u00E5';79 e2uHash['aelig']= '\u00E6';80 e2uHash['ccedil']= '\u00E7';81 e2uHash['egrave']= '\u00E8';82 e2uHash['eacute']= '\u00E9';83 e2uHash['ecirc']= '\u00EA';84 e2uHash['euml']= '\u00EB';85 e2uHash['igrave']= '\u00EC';86 e2uHash['iacute']= '\u00ED';87 e2uHash['icirc']= '\u00EE';88 e2uHash['iuml']= '\u00EF';89 e2uHash['eth']= '\u00F0';90 e2uHash['ntilde']= '\u00F1';91 e2uHash['ograve']= '\u00F2';92 e2uHash['oacute']= '\u00F3';93 e2uHash['ocirc']= '\u00F4';94 e2uHash['otilde']= '\u00F5';95 e2uHash['ouml']= '\u00F6';96 e2uHash['divide']= '\u00F7';97 e2uHash['oslash']= '\u00F8';98 e2uHash['ugrave']= '\u00F9';99 e2uHash['uacute']= '\u00FA';100 e2uHash['ucirc']= '\u00FB';101 e2uHash['uuml']= '\u00FC';102 e2uHash['yacute']= '\u00FD';103 e2uHash['thorn']= '\u00FE';104 e2uHash['yuml']= '\u00FF';105 e2uHash['quot']= '\u0022';106 e2uHash['amp']= '\u0026';107 e2uHash['lt']= '\u003C';108 e2uHash['gt']= '\u003E';109 e2uHash['OElig']= '';110 e2uHash['oelig']= '\u0153';111 e2uHash['Scaron']= '\u0160';112 e2uHash['scaron']= '\u0161';113 e2uHash['Yuml']= '\u0178';114 e2uHash['circ']= '\u02C6';115 e2uHash['tilde']= '\u02DC';116 e2uHash['ensp']= '\u2002';117 e2uHash['emsp']= '\u2003';118 e2uHash['thinsp']= '\u2009';119 e2uHash['zwnj']= '\u200C';120 e2uHash['zwj']= '\u200D';121 e2uHash['lrm']= '\u200E';122 e2uHash['rlm']= '\u200F';123 e2uHash['ndash']= '\u2013';124 e2uHash['mdash']= '\u2014';125 e2uHash['lsquo']= '\u2018';126 e2uHash['rsquo']= '\u2019';127 e2uHash['sbquo']= '\u201A';128 e2uHash['ldquo']= '\u201C';129 e2uHash['rdquo']= '\u201D';130 e2uHash['bdquo']= '\u201E';131 e2uHash['dagger']= '\u2020';132 e2uHash['Dagger']= '\u2021';133 e2uHash['permil']= '\u2030';134 e2uHash['lsaquo']= '\u2039';135 e2uHash['rsaquo']= '\u203A';136 e2uHash['euro']= '\u20AC';137 e2uHash['fnof']= '\u0192';138 e2uHash['Alpha']= '\u0391';139 e2uHash['Beta']= '\u0392';140 e2uHash['Gamma']= '\u0393';141 e2uHash['Delta']= '\u0394';142 e2uHash['Epsilon']= '\u0395';143 e2uHash['Zeta']= '\u0396';144 e2uHash['Eta']= '\u0397';145 e2uHash['Theta']= '\u0398';146 e2uHash['Iota']= '\u0399';147 e2uHash['Kappa']= '\u039A';148 e2uHash['Lambda']= '\u039B';149 e2uHash['Mu']= '\u039C';150 e2uHash['Nu']= '\u039D';151 e2uHash['Xi']= '\u039E';152 e2uHash['Omicron']= '\u039F';153 e2uHash['Pi']= '\u03A0';154 e2uHash['Rho']= '\u03A1';155 e2uHash['Sigma']= '\u03A3';156 e2uHash['Tau']= '\u03A4';157 e2uHash['Upsilon']= '\u03A5';158 e2uHash['Phi']= '\u03A6';159 e2uHash['Chi']= '\u03A7';160 e2uHash['Psi']= '\u03A8';161 e2uHash['Omega']= '\u03A9';162 e2uHash['alpha']= '\u03B1';163 e2uHash['beta']= '\u03B2';164 e2uHash['gamma']= '\u03B3';165 e2uHash['delta']= '\u03B4';166 e2uHash['epsilon']= '\u03B5';167 e2uHash['zeta']= '\u03B6';168 e2uHash['eta']= '\u03B7';169 e2uHash['theta']= '\u03B8';170 e2uHash['iota']= '\u03B9';171 e2uHash['kappa']= '\u03BA';172 e2uHash['lambda']= '\u03BB';173 e2uHash['mu']= '\u03BC';174 e2uHash['nu']= '\u03BD';175 e2uHash['xi']= '\u03BE';176 e2uHash['omicron']= '\u03BF';177 e2uHash['pi']= '\u03C0';178 e2uHash['rho']= '\u03C1';179 e2uHash['sigmaf']= '\u03C2';180 e2uHash['sigma']= '\u03C3';181 e2uHash['tau']= '\u03C4';182 e2uHash['upsilon']= '\u03C5';183 e2uHash['phi']= '\u03C6';184 e2uHash['chi']= '\u03C7';185 e2uHash['psi']= '\u03C8';186 e2uHash['omega']= '\u03C9';187 e2uHash['thetasym']= '\u03D1';188 e2uHash['upsih']= '\u03D2';189 e2uHash['piv']= '\u03D6';190 e2uHash['bull']= '\u2022';191 e2uHash['hellip']= '\u2026';192 e2uHash['prime']= '\u2032';193 e2uHash['Prime']= '\u2033';194 e2uHash['oline']= '\u203E';195 e2uHash['frasl']= '\u2044';196 e2uHash['weierp']= '\u2118';197 e2uHash['image']= '\u2111';198 e2uHash['real']= '\u211C';199 e2uHash['trade']= '\u2122';200 e2uHash['alefsym']= '\u2135';201 e2uHash['larr']= '\u2190';202 e2uHash['uarr']= '\u2191';203 e2uHash['rarr']= '\u2192';204 e2uHash['darr']= '\u2193';205 e2uHash['harr']= '\u2194';206 e2uHash['crarr']= '\u21B5';207 e2uHash['lArr']= '\u21D0';208 e2uHash['uArr']= '\u21D1';209 e2uHash['rArr']= '\u21D2';210 e2uHash['dArr']= '\u21D3';211 e2uHash['hArr']= '\u21D4';212 e2uHash['forall']= '\u2200';213 e2uHash['part']= '\u2202';214 e2uHash['exist']= '\u2203';215 e2uHash['empty']= '\u2205';216 e2uHash['nabla']= '\u2207';217 e2uHash['isin']= '\u2208';218 e2uHash['notin']= '\u2209';219 e2uHash['ni']= '\u220B';220 e2uHash['prod']= '\u220F';221 e2uHash['sum']= '\u2211';222 e2uHash['minus']= '\u2212';223 e2uHash['lowast']= '\u2217';224 e2uHash['radic']= '\u221A';225 e2uHash['prop']= '\u221D';226 e2uHash['infin']= '\u221E';227 e2uHash['ang']= '\u2220';228 e2uHash['and']= '\u2227';229 e2uHash['or']= '\u2228';230 e2uHash['cap']= '\u2229';231 e2uHash['cup']= '\u222A';232 e2uHash['int']= '\u222B';233 e2uHash['there4']= '\u2234';234 e2uHash['sim']= '\u223C';235 e2uHash['cong']= '\u2245';236 e2uHash['asymp']= '\u2248';237 e2uHash['ne']= '\u2260';238 e2uHash['equiv']= '\u2261';239 e2uHash['le']= '\u2264';240 e2uHash['ge']= '\u2265';241 e2uHash['sub']= '\u2282';242 e2uHash['sup']= '\u2283';243 e2uHash['nsub']= '\u2284';244 e2uHash['sube']= '\u2286';245 e2uHash['supe']= '\u2287';246 e2uHash['oplus']= '\u2295';247 e2uHash['otimes']= '\u2297';248 e2uHash['perp']= '\u22A5';249 e2uHash['sdot']= '\u22C5';250 e2uHash['lceil']= '\u2308';251 e2uHash['rceil']= '\u2309';252 e2uHash['lfloor']= '\u230A';253 e2uHash['rfloor']= '\u230B';254 e2uHash['lang']= '\u2329';255 e2uHash['rang']= '\u232A';256 e2uHash['loz']= '\u25CA';257 e2uHash['spades']= '\u2660';258 e2uHash['clubs']= '\u2663';259 e2uHash['hearts']= '\u2665';260 e2uHash['diams']= '\u2666'; 261})();262SimileAjax.HTML.deEntify = function(s) {263 var e2uHash = SimileAjax.HTML._e2uHash;264 265 var re = /&(\w+?);/;266 while (re.test(s)) {267 var m = s.match(re);268 s = s.replace(re, e2uHash[m[1]]);269 }270 return s;...
hash.spec.js
Source:hash.spec.js
1'use strict'2/*3 * adonis-framework4 *5 * (c) Harminder Virk <virk@adonisjs.com>6 *7 * For the full copyright and license information, please view the LICENSE8 * file that was distributed with this source code.9*/10const test = require('japa')11const { ioc } = require('@adonisjs/fold')12const { Config } = require('@adonisjs/sink')13const BcryptDriver = require('../../src/Hash/Drivers').bcrypt14const ArgonDriver = require('../../src/Hash/Drivers').argon15const Hash = require('../../src/Hash')16const HashManager = require('../../src/Hash/Manager')17const HashFacade = require('../../src/Hash/Facade')18const HashMock = require('../../src/Hash/Mock')19test.group('Hash | Bcrypt Driver', (group) => {20 test('hash value', async (assert) => {21 const Hash = new BcryptDriver()22 const hashed = await Hash.make('foo')23 assert.isDefined(hashed)24 })25 test('return true when hash matches', async (assert) => {26 const Hash = new BcryptDriver()27 const hashed = await Hash.make('foo')28 const verified = await Hash.verify('foo', hashed)29 assert.isTrue(verified)30 })31 test('return false when hash does not match', async (assert) => {32 const Hash = new BcryptDriver()33 const hashed = await Hash.make('foo')34 const verified = await Hash.verify('bar', hashed)35 assert.isFalse(verified)36 })37 test('return false instead of throwing exception', async (assert) => {38 const Hash = new BcryptDriver()39 const hashed = await Hash.make('foo')40 const verified = await Hash.verify(undefined, hashed)41 assert.isFalse(verified)42 })43})44test.group('Hash | Argon Driver', (group) => {45 test('hash value', async (assert) => {46 const Hash = new ArgonDriver()47 const hashed = await Hash.make('foo')48 assert.isDefined(hashed)49 })50 test('return true when hash matches', async (assert) => {51 const Hash = new ArgonDriver()52 const hashed = await Hash.make('foo')53 const verified = await Hash.verify('foo', hashed)54 assert.isTrue(verified)55 })56 test('return false when hash does not match', async (assert) => {57 const Hash = new ArgonDriver()58 const hashed = await Hash.make('foo')59 const verified = await Hash.verify('bar', hashed)60 assert.isFalse(verified)61 })62 test('return false instead of throwing exception', async (assert) => {63 const Hash = new ArgonDriver()64 const hashed = await Hash.make('foo')65 const verified = await Hash.verify(undefined, hashed)66 assert.isFalse(verified)67 })68})69test.group('Hash | Fake', () => {70 test('return string as it is from mock', async (assert) => {71 const hashed = await HashMock.make('foo')72 assert.equal(hashed, 'foo')73 })74 test('return false when strings aren\'t equal', async (assert) => {75 const verified = await HashMock.verify('foo', 'bar')76 assert.isFalse(verified)77 })78 test('return true when strings are equal', async (assert) => {79 const verified = await HashMock.verify('foo', 'foo')80 assert.isTrue(verified)81 })82})83test.group('Hash | Instance', () => {84 test('hash password using defined driver', async (assert) => {85 const Bcrypt = new BcryptDriver()86 const hash = new Hash(Bcrypt)87 const hashed = await hash.make('foo')88 assert.isDefined(hashed)89 })90 test('verify hash using defined driver', async (assert) => {91 const Bcrypt = new BcryptDriver()92 const hash = new Hash(Bcrypt)93 const hashed = await hash.make('foo')94 const verified = await hash.verify('foo', hashed)95 assert.isTrue(verified)96 })97})98test.group('Hash | Manager', (group) => {99 group.before(() => {100 ioc.fake('Adonis/Src/Config', () => new Config())101 })102 test('extend hasher by adding drivers', (assert) => {103 const myDriver = {}104 HashManager.extend('myDriver', myDriver)105 assert.deepEqual(HashManager._drivers, { myDriver })106 })107 test('throw error when trying to access invalid driver', (assert) => {108 const fn = () => HashManager.driver('foo')109 assert.throw(fn, 'E_INVALID_HASHER_DRIVER: Hash driver foo does not exists')110 })111 test('return driver instance for a given driver', (assert) => {112 const bcryptDriver = HashManager.driver('bcrypt')113 assert.instanceOf(bcryptDriver, BcryptDriver)114 })115})116test.group('Hash | Facade', (group) => {117 group.before(() => {118 ioc.fake('Adonis/Src/Config', () => new Config())119 })120 test('return hasher instance with selected driver', (assert) => {121 const config = new Config()122 config.set('hash', {123 driver: 'bcrypt',124 bcrypt: {}125 })126 const hasher = new HashFacade(config)127 assert.instanceOf(hasher.driver('bcrypt'), Hash)128 assert.instanceOf(hasher.driver('bcrypt').driver, BcryptDriver)129 })130 test('return hasher instance with extended driver', (assert) => {131 const myDriver = {132 make () {},133 setConfig () {}134 }135 HashManager.extend('mydriver', myDriver)136 const config = new Config()137 config.set('hash', {138 driver: 'mydriver',139 mydriver: {}140 })141 const hasher = new HashFacade(config)142 assert.instanceOf(hasher.driver('mydriver'), Hash)143 assert.deepEqual(hasher.driver('mydriver').driver, myDriver)144 })145 test('create singleton hasher instances', (assert) => {146 const config = new Config()147 config.set('hash', {148 driver: 'bcrypt',149 bcrypt: {},150 anotherFile: {}151 })152 const hasher = new HashFacade(config)153 hasher.driver('bcrypt')154 assert.lengthOf(Object.keys(hasher._hasherInstances), 1)155 hasher.driver('bcrypt')156 assert.lengthOf(Object.keys(hasher._hasherInstances), 1)157 })158 test('create different instance when hasher is different', (assert) => {159 const config = new Config()160 config.set('hash', {161 driver: 'bcrypt',162 bcrypt: {},163 argon: {}164 })165 const hasher = new HashFacade(config)166 hasher.driver('bcrypt')167 assert.lengthOf(Object.keys(hasher._hasherInstances), 1)168 hasher.driver('argon')169 assert.lengthOf(Object.keys(hasher._hasherInstances), 2)170 })171 test('proxy hasher instance methods', async (assert) => {172 const config = new Config()173 config.set('hash', {174 driver: 'bcrypt',175 bcrypt: {176 round: 10177 }178 })179 const hasher = new HashFacade(config)180 const hashed = await hasher.make('foo')181 assert.isDefined(hashed)182 })183 test('use bcrypt when no driver is defined', async (assert) => {184 const config = new Config()185 config.set('hash', {186 })187 const hasher = new HashFacade(config)188 const hashed = await hasher.make('foo')189 assert.isDefined(hashed)190 })...
history-hash-ie-debug.js
Source:history-hash-ie-debug.js
1/*2YUI 3.17.2 (build 9c3c78e)3Copyright 2014 Yahoo! Inc. All rights reserved.4Licensed under the BSD License.5http://yuilibrary.com/license/6*/7YUI.add('history-hash-ie', function (Y, NAME) {8/**9 * Improves IE6/7 support in history-hash by using a hidden iframe to create10 * entries in IE's browser history. This module is only needed if IE6/7 support11 * is necessary; it's not needed for any other browser.12 *13 * @module history14 * @submodule history-hash-ie15 * @since 3.2.016 */17// Combination of a UA sniff to ensure this is IE (or a browser that wants us to18// treat it like IE) and feature detection for native hashchange support (false19// for IE < 8 or IE8/9 in IE7 mode).20if (Y.UA.ie && !Y.HistoryBase.nativeHashChange) {21 var Do = Y.Do,22 GlobalEnv = YUI.namespace('Env.HistoryHash'),23 HistoryHash = Y.HistoryHash,24 iframe = GlobalEnv._iframe,25 win = Y.config.win;26 /**27 * Gets the raw (not decoded) current location hash from the IE iframe,28 * minus the preceding '#' character and the hashPrefix (if one is set).29 *30 * @method getIframeHash31 * @return {String} current iframe hash32 * @static33 */34 HistoryHash.getIframeHash = function () {35 if (!iframe || !iframe.contentWindow) {36 return '';37 }38 var prefix = HistoryHash.hashPrefix,39 hash = iframe.contentWindow.location.hash.substr(1);40 return prefix && hash.indexOf(prefix) === 0 ?41 hash.replace(prefix, '') : hash;42 };43 /**44 * Updates the history iframe with the specified hash.45 *46 * @method _updateIframe47 * @param {String} hash location hash48 * @param {Boolean} replace (optional) if <code>true</code>, the current49 * history state will be replaced without adding a new history entry50 * @protected51 * @static52 * @for HistoryHash53 */54 HistoryHash._updateIframe = function (hash, replace) {55 var iframeDoc = iframe && iframe.contentWindow && iframe.contentWindow.document,56 iframeLocation = iframeDoc && iframeDoc.location;57 if (!iframeDoc || !iframeLocation) {58 return;59 }60 Y.log('updating history iframe: ' + hash + ', replace: ' + !!replace, 'info', 'history');61 if (replace) {62 iframeLocation.replace(hash.charAt(0) === '#' ? hash : '#' + hash);63 } else {64 iframeDoc.open().close();65 iframeLocation.hash = hash;66 }67 };68 Do.before(HistoryHash._updateIframe, HistoryHash, 'replaceHash', HistoryHash, true);69 if (!iframe) {70 Y.on('domready', function () {71 var lastUrlHash = HistoryHash.getHash();72 // Create a hidden iframe to store history state, following the73 // iframe-hiding recommendations from74 // http://www.paciellogroup.com/blog/?p=604.75 //76 // This iframe will allow history navigation within the current page77 // context. After navigating to another page, all but the most78 // recent history state will be lost.79 //80 // Earlier versions of the YUI History Utility attempted to work81 // around this limitation by having the iframe load a static82 // resource. This workaround was extremely fragile and tended to83 // break frequently (and silently) since it was entirely dependent84 // on IE's inconsistent handling of iframe history.85 //86 // Since this workaround didn't work much of the time anyway and87 // added significant complexity, it has been removed, and IE6 and 788 // now get slightly degraded history support.89 Y.log('creating dynamic history iframe', 'info', 'history');90 iframe = GlobalEnv._iframe = Y.Node.getDOMNode(Y.Node.create(91 '<iframe src="javascript:0" style="display:none" height="0" width="0" tabindex="-1" title="empty"/>'92 ));93 // Append the iframe to the documentElement rather than the body.94 // Keeping it outside the body prevents scrolling on the initial95 // page load (hat tip to Ben Alman and jQuery BBQ for this96 // technique).97 Y.config.doc.documentElement.appendChild(iframe);98 // Update the iframe with the initial location hash, if any. This99 // will create an initial history entry that the user can return to100 // after the state has changed.101 HistoryHash._updateIframe(lastUrlHash || '#');102 // Listen for hashchange events and keep the iframe's hash in sync103 // with the parent frame's hash.104 Y.on('hashchange', function (e) {105 lastUrlHash = e.newHash;106 if (HistoryHash.getIframeHash() !== lastUrlHash) {107 Y.log('updating iframe hash to match URL hash', 'info', 'history');108 HistoryHash._updateIframe(lastUrlHash);109 }110 }, win);111 // Watch the iframe hash in order to detect back/forward navigation.112 Y.later(50, null, function () {113 var iframeHash = HistoryHash.getIframeHash();114 if (iframeHash !== lastUrlHash) {115 Y.log('updating URL hash to match iframe hash', 'info', 'history');116 HistoryHash.setHash(iframeHash);117 }118 }, null, true);119 });120 }121}...
HashTable.js
Source:HashTable.js
1//-------------------------------------------------------------------------------2// Requires3//-------------------------------------------------------------------------------4var Class = require('./Class');5var HashTableNode = require('./HashTableNode');6var Obj = require('./Obj');7//-------------------------------------------------------------------------------8// Declare Class9//-------------------------------------------------------------------------------10var HashTable = Class.extend(Obj, {11 //-------------------------------------------------------------------------------12 // Constructor13 //-------------------------------------------------------------------------------14 _constructor: function() {15 this._super();16 //-------------------------------------------------------------------------------17 // Declare Variables18 //-------------------------------------------------------------------------------19 /**20 * @private21 * @type {number}22 */23 this.count = 0;24 /**25 * @private26 * @type {Object}27 */28 this.hashTableNodeObject = {};29 },30 //-------------------------------------------------------------------------------31 // Getters and Setters32 //-------------------------------------------------------------------------------33 /**34 * @return {number}35 */36 getCount: function() {37 return this.count;38 },39 //-------------------------------------------------------------------------------40 // Public Methods41 //-------------------------------------------------------------------------------42 /**43 * @param {*} key44 * @return {boolean}45 */46 containsKey: function(key) {47 var keyHashCode = Obj.hashCode(key);48 var hashTableNode = this.hashTableNodeObject[keyHashCode];49 if (hashTableNode) {50 return hashTableNode.containsKey(key);51 }52 return false;53 },54 /**55 * @param {*} value56 * @return {boolean}57 */58 containsValue: function(value) {59 // NOTE BRN: The for in operator will only enumerate over our own properties, not the object's built in60 // properties. So it should be safe to access this.valueObject[key]61 for (var keyHashCode in this.hashTableNodeObject) {62 var hashTableNode = this.hashTableNodeObject[keyHashCode];63 if (hashTableNode.containsValue(value)) {64 return true;65 }66 }67 return false;68 },69 /**70 * @param {function(*)} func71 */72 forEach: function(func) {73 for (var keyHashCode in this.hashTableNodeObject) {74 var hashTableNode = this.hashTableNodeObject[keyHashCode];75 hashTableNode.getValueArray().forEach(function(value) {76 func(value);77 });78 }79 },80 /**81 * @param {*} key82 * @return {*}83 */84 get: function(key) {85 var keyHashCode = Obj.hashCode(key);86 var hashTableNode = this.hashTableNodeObject[keyHashCode];87 if (hashTableNode) {88 return hashTableNode.get(key);89 }90 return undefined;91 },92 /**93 * @return {Array<*>}94 */95 getKeyArray: function() {96 var keysArray = [];97 for (var keyHashCode in this.hashTableNodeObject) {98 var hashTableNode = this.hashTableNodeObject[keyHashCode];99 keysArray = keysArray.concat(hashTableNode.getKeyArray());100 }101 return keysArray;102 },103 /**104 * @return {Array<*>}105 */106 getValueArray: function() {107 var valuesArray = [];108 for (var keyHashCode in this.hashTableNodeObject) {109 var hashTableNode = this.hashTableNodeObject[keyHashCode];110 valuesArray = valuesArray.concat(hashTableNode.getValueArray());111 }112 return valuesArray;113 },114 /**115 * @return {boolean}116 */117 isEmpty: function() {118 return (this.count === 0);119 },120 /**121 * @param {*} key122 * @param {*} value123 * @return {*} Returns undefined if no value already existed at this key124 */125 put: function(key, value) {126 var keyHashCode = Obj.hashCode(key);127 var hashTableNode = this.hashTableNodeObject[keyHashCode];128 if (!hashTableNode) {129 hashTableNode = new HashTableNode();130 this.hashTableNodeObject[keyHashCode] = hashTableNode;131 }132 var returnValue = hashTableNode.put(key, value);133 if (returnValue === undefined) {134 this.count++;135 }136 return returnValue;137 },138 /**139 * @param {*} key140 * @return {*} Returns undefined if no value already existed at this key141 */142 remove: function(key) {143 var keyHashCode = Obj.hashCode(key);144 var hashTableNode = this.hashTableNodeObject[keyHashCode];145 var returnValue = undefined;146 if (hashTableNode) {147 returnValue = hashTableNode.remove(key);148 if (returnValue !== undefined) {149 this.count--;150 if (hashTableNode.getCount() === 0) {151 delete this.hashTableNodeObject[keyHashCode];152 }153 }154 }155 return returnValue;156 }157});158//-------------------------------------------------------------------------------159// Module Export160//-------------------------------------------------------------------------------...
HashStore.js
Source:HashStore.js
1//-------------------------------------------------------------------------------2// Requires3//-------------------------------------------------------------------------------4var Class = require('./Class');5var HashStoreNode = require('./HashStoreNode');6var Obj = require('./Obj');7//-------------------------------------------------------------------------------8// Declare Class9//-------------------------------------------------------------------------------10var HashStore = Class.extend(Obj, {11 //-------------------------------------------------------------------------------12 // Constructor13 //-------------------------------------------------------------------------------14 _constructor: function() {15 this._super();16 //-------------------------------------------------------------------------------17 // Declare Variables18 //-------------------------------------------------------------------------------19 this.hashStoreNodeObject = {};20 },21 //-------------------------------------------------------------------------------22 // Public Methods23 //-------------------------------------------------------------------------------24 /**25 * @param {*} value26 */27 addValue: function(value) {28 var valueHashCode = Obj.hashCode(value);29 var hashStoreNode = this.hashStoreNodeObject[valueHashCode];30 if (!hashStoreNode) {31 hashStoreNode = new HashStoreNode();32 this.hashStoreNodeObject[valueHashCode] = hashStoreNode;33 }34 hashStoreNode.addValue(value);35 },36 /**37 * @param {function(*)} func38 */39 forEach: function(func) {40 for (var valueHashCode in this.hashStoreNodeObject) {41 var hashStoreNode = this.hashStoreNodeObject[valueHashCode];42 hashStoreNode.getValueArray().forEach(function(value) {43 func(value);44 });45 }46 },47 /**48 * @return {Array}49 */50 getValueArray: function() {51 var valueArray = [];52 for (var valueHashCode in this.hashStoreNodeObject) {53 var hashStoreNode = this.hashStoreNodeObject[valueHashCode];54 valueArray = valueArray.concat(hashStoreNode.getValueArray());55 }56 return valueArray;57 },58 /**59 * @param {*} value60 * @return {boolean}61 */62 hasValue: function(value) {63 var valueHashCode = Obj.hashCode(value);64 var hashStoreNode = this.hashStoreNodeObject[valueHashCode];65 if (hashStoreNode) {66 return hashStoreNode.containsValue(value);67 }68 return false;69 },70 /**71 * @param {*} value72 * @return {boolean}73 */74 removeValue: function(value) {75 var valueHashCode = Obj.hashCode(value);76 var hashStoreNode = this.hashStoreNodeObject[valueHashCode];77 var result = false;78 if (hashStoreNode) {79 result = hashStoreNode.removeValue(value);80 if (result) {81 if (hashStoreNode.getCount() === 0) {82 delete this.hashStoreNodeObject[valueHashCode];83 }84 }85 }86 return result;87 }88});89//-------------------------------------------------------------------------------90// Module Export91//-------------------------------------------------------------------------------...
Using AI Code Generation
1const { hash } = require('playwright/lib/utils/utils');2const hash = require('playwright/lib/utils/utils').hash;3const { hash } = require('playwright/lib/utils/utils');4const hash = require('playwright/lib/utils/utils').hash;5const { hash } = require('playwright/lib/utils/utils');6const hash = require('playwright/lib/utils/utils').hash;7const { hash } = require('playwright/lib/utils/utils');8const hash = require('playwright/lib/utils/utils').hash;9const { hash } = require('playwright/lib/utils/utils');10const hash = require('playwright/lib/utils/utils').hash;11const { hash } = require('playwright/lib/utils/utils');12const hash = require('playwright/lib/utils/utils').hash;13const { hash } = require('playwright/lib/utils/utils');14const hash = require('playwright/lib/utils/utils').hash;15const { hash } = require('playwright/lib/utils/utils');16const hash = require('playwright/lib/utils/utils').hash;17const { hash } = require('playwright/lib/utils/utils');18const hash = require('playwright/lib/utils/utils').hash;19const { hash } = require('playwright/lib/utils/utils');20const hash = require('playwright/lib/utils/utils').hash;21const { hash } = require('playwright/lib/utils/utils');22const hash = require('playwright/lib/utils/utils').hash;23const { hash } = require('playwright/lib/utils/utils');24const hash = require('playwright/lib/utils/utils').hash;25const { hash } = require('playwright/lib/utils/utils');26const hash = require('playwright/lib/utils/utils').hash;27const { hash } = require('playwright/lib/utils/utils');
Using AI Code Generation
1const { hash } = require('playwright/lib/utils/utils');2const hash1 = hash('a');3console.log(hash1);4const hash2 = hash('a');5console.log(hash2);6const hash3 = hash('b');7console.log(hash3);8const hash4 = hash('a');9console.log(hash4);10const hash5 = hash('b');11console.log(hash5);12const hash6 = hash('c');13console.log(hash6);14const { hash } = require('playwright/lib/utils/utils');15const hash1 = hash('a');16console.log(hash1);17const hash2 = hash('a');18console.log(hash2);19const hash3 = hash('b');20console.log(hash3);21const hash4 = hash('a');22console.log(hash4);23const hash5 = hash('b');24console.log(hash5);25const hash6 = hash('c');26console.log(hash6);27const { hash } = require('playwright/lib/utils/utils');28const hash1 = hash('a');29console.log(hash1);30const hash2 = hash('a');31console.log(hash2);32const hash3 = hash('b');33console.log(hash3);34const hash4 = hash('a');35console.log(hash4);36const hash5 = hash('b');37console.log(hash5);38const hash6 = hash('c');39console.log(hash6);40const { hash } = require('playwright/lib/utils/utils');41const hash1 = hash('a');42console.log(hash1);43const hash2 = hash('a');44console.log(hash2);45const hash3 = hash('b');46console.log(hash3);47const hash4 = hash('a');48console.log(hash4);49const hash5 = hash('b');50console.log(hash5);51const hash6 = hash('c');52console.log(hash6);
Using AI Code Generation
1const { hash } = require('playwright/lib/utils/utils');2const { hash } = require('playwright/lib/utils/utils');3async function test() {4 const hash1 = await hash('test');5 const hash2 = await hash('test');6 console.log(hash1 === hash2);7}8test();
Using AI Code Generation
1const { hash } = require('@playwright/test');2const myHash = hash('my string');3console.log(myHash);4const { test } = require('@playwright/test');5test('test', async ({page}) => {6 const hash = await page.evaluate(() => window.__PW_TEST_HASH);7 console.log(hash);8});9The hash() method is available in the test file and the test.spec.js file. You can use it to create
Using AI Code Generation
1const { chromium, webkit, firefox } = require("playwright");2(async () => {3 const browser = await chromium.launch();4 const context = await browser.newContext();5 const page = await context.newPage();6 const hash = await page.evaluate(async (url) => {7 const response = await fetch(url);8 const buffer = await response.buffer();9 const hash = await window.crypto.subtle.digest("SHA-256", buffer);10 return Array.from(new Uint8Array(hash))11 .map((b) => b.toString(16).padStart(2, "0"))12 .join("");13 console.log(h
Using AI Code Generation
1const { hash } = require('@playwright/test');2const { test, expect } = require('@playwright/test');3const { click, typeText, goto, press } = require('@playwright/test');4test('Test 1', async ({ page }) => {5 await page.click('text=Docs');6 await page.click('text=API');7 await page.click('text=Page');8 await page.click('text=page.check');9 await page.click('text=page.click');10 await page.click('text=page.dblclick');11 await page.click('text=page.fill');12 await page.click('text=page.focus');13 await page.click('text=page.goto');14 await page.click('text=page.hover');15 await page.click('text=page.keyboard');16 await page.click('text=page.mainFrame');17 await page.click('text=page.mouse');18 await page.click('text=page.press');19 await page.click('text=page.screenshot');20 await page.click('text=page.selectOption');21 await page.click('text=page.setContent');22 await page.click('text=page.setExtraHTTPHeaders');23 await page.click('text=page.setGeolocation');24 await page.click('text=page.setHTTPCredentials');25 await page.click('text=page.setOfflineMode');26 await page.click('text=page.setViewportSize');27 await page.click('text=page.tap');28 await page.click('text=page.title');29 await page.click('text=page.type');30 await page.click('text=page.url');31 await page.click('text=page.viewportSize');32 await page.click('text=page.waitForEvent');33 await page.click('text=page.waitForFunction');34 await page.click('text=page.waitForLoadState');35 await page.click('text=page.waitForNavigation');36 await page.click('text=page.waitForRequest');37 await page.click('text=page.waitForResponse');38 await page.click('text=page.waitForSelector');39 await page.click('text=page.waitForTimeout');40 await page.click('text=page.waitForURL');41 await page.click('text=page.waitForWorker');42 await page.click('text=page.workers');43 await page.click('text=page.$');44 await page.click('text=page.$$');45 await page.click('text=page
Using AI Code Generation
1const { hash } = require('playwright/lib/utils/utils'); 2const hashValue = hash('test');3console.log(hashValue);4const { hash } = require('playwright/lib/utils/utils'); 5const hashValue = hash('test');6console.log(hashValue);7const { hash } = require('playwright/lib/utils/utils'); 8const hashValue = hash('test');9console.log(hashValue);10const { hash } = require('playwright/lib/utils/utils'); 11const hashValue = hash('test');12console.log(hashValue);13const { hash } = require('playwright/lib/utils/utils'); 14const hashValue = hash('test');15console.log(hashValue);16const { hash } = require('playwright/lib/utils/utils'); 17const hashValue = hash('test');18console.log(hashValue);19const { hash } = require('playwright/lib/utils/utils'); 20const hashValue = hash('test');21console.log(hashValue);22const { hash } = require('playwright/lib/utils/utils'); 23const hashValue = hash('test');24console.log(hashValue);25const { hash } = require('playwright/lib/utils/utils'); 26const hashValue = hash('test');27console.log(hashValue);28const { hash } = require('playwright/lib/utils/utils'); 29const hashValue = hash('test');30console.log(hashValue);31const { hash } = require('playwright/lib/utils/utils'); 32const hashValue = hash('test');33console.log(hashValue);
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!