From b05d4792a077c69a9597e535d233af7f18ffdec7 Mon Sep 17 00:00:00 2001 From: Olivier Yiptong Date: Sat, 29 Mar 2014 09:00:10 -0700 Subject: [PATCH 01/19] Bug 975228 - Create logic to merge frecency-pages and Tiles (Tile equiv 1000 frecency) [r=adw] Use DirectoryLinksProvider for Firefox and make PlacesProvider match in expected Links format. Make sure there's at least 2 of each type so Telemetry doesn't know for sure which links were used. --- browser/base/content/test/newtab/head.js | 4 ++ browser/components/nsBrowserGlue.js | 5 ++ toolkit/content/directoryLinks.json | 92 ++++++++++++------------ toolkit/modules/NewTabUtils.jsm | 3 + 4 files changed, 58 insertions(+), 46 deletions(-) diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js index fa298d506873..8f823cf9738d 100644 --- a/browser/base/content/test/newtab/head.js +++ b/browser/base/content/test/newtab/head.js @@ -2,8 +2,11 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ const PREF_NEWTAB_ENABLED = "browser.newtabpage.enabled"; +const PREF_NEWTAB_DIRECTORYSOURCE = "browser.newtabpage.directorySource"; Services.prefs.setBoolPref(PREF_NEWTAB_ENABLED, true); +// start with no directory links by default +Services.prefs.setCharPref(PREF_NEWTAB_DIRECTORYSOURCE, "data:application/json,{}"); let tmp = {}; Cu.import("resource://gre/modules/Promise.jsm", tmp); @@ -26,6 +29,7 @@ registerCleanupFunction(function () { gWindow.gBrowser.removeTab(gWindow.gBrowser.tabs[1]); Services.prefs.clearUserPref(PREF_NEWTAB_ENABLED); + Services.prefs.clearUserPref(PREF_NEWTAB_DIRECTORYSOURCE); }); /** diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js index bca11c903050..65353e3279aa 100644 --- a/browser/components/nsBrowserGlue.js +++ b/browser/components/nsBrowserGlue.js @@ -22,6 +22,9 @@ XPCOMUtils.defineLazyModuleGetter(this, "AddonManager", XPCOMUtils.defineLazyModuleGetter(this, "ContentClick", "resource:///modules/ContentClick.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "DirectoryLinksProvider", + "resource://gre/modules/DirectoryLinksProvider.jsm"); + XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm"); @@ -475,6 +478,8 @@ BrowserGlue.prototype = { WebappManager.init(); PageThumbs.init(); NewTabUtils.init(); + DirectoryLinksProvider.init(); + NewTabUtils.links.addProvider(DirectoryLinksProvider); BrowserNewTabPreloader.init(); #ifdef NIGHTLY_BUILD if (Services.prefs.getBoolPref("dom.identity.enabled")) { diff --git a/toolkit/content/directoryLinks.json b/toolkit/content/directoryLinks.json index 72ea6a101165..ae1f8d3e9282 100644 --- a/toolkit/content/directoryLinks.json +++ b/toolkit/content/directoryLinks.json @@ -3,52 +3,10 @@ { "url": "https://www.facebook.com/", "bgColor": "#3a5898", - "type": "sponsored", + "type": "organic", "imageURISpec": "data:image/jpg;base64,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\n", "title": "Facebook" }, - { - "url": "https://www.youtube.com/", - "bgColor": "#e5523f", - "type": "sponsored", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "YouTube" - }, - { - "url": "https://twitter.com/", - "bgColor": "#00b5f0", - "type": "sponsored", - "imageURISpec": "data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////4QDIRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAPAAAAcgEyAAIAAAAUAAAAgodpAAQAAAABAAAAlgAAAAAAAABIAAAAAQAAAEgAAAABUGl4ZWxtYXRvciAzLjEAADIwMTQ6MDI6MjggMTY6MDI6NTMAAAOgAQADAAAAAQABAACgAgAEAAAAAQAAALSgAwAEAAAAAQAAAJYAAAAA/+EBqWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPlBpeGVsbWF0b3IgMy4xPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE0LTAyLTI4VDE2OjAyOjUzPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cv/bAEMAAgEBAQEBAgEBAQICAgICBAMCAgICBQMEAwQGBQYGBgUFBQYHCQgGBwgHBQUICwgICQkKCgoGBwsMCwoMCQoKCv/bAEMBAgICAgICBQMDBQoGBQYKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCv/AABEIAJYAtAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP38ooooAKKKKACio7q6tbG2kvb25jhhhQvLNK4RUUDJZieAAO5rwT42/t7+AvAJm0jwLHHq19GSrXMuVt0bPYDDP/EOqjoQWFbUcPWxEuWmrnJjMfhMBT568lFfi/RHvlzc21lbvd3lwkUUSlpJZXCqijqSTwB715t44/a3+Cfgh3tpPET6lOjbWi0uLzQOM53khGHurGvhf4rftd+PPiFdl/EfiqeVA37uBX2RocYysa4UHHGQAT3rzTUPiVLdMc3ROfevdw+QuWtR/cfDZjxzGm+XDxt5y3+7/hz7a8Vf8FFLoHZ4S8E2kQUnL6hctPuHbATZj9a4HWP26/jVqMkhtvE9vaRv0jt7CLC/Ripb9a+WR4zllYAzdferUGuSzchya9SGU4WmvgX5nzVXirMsS9arXpp+Vj3e8/aq+Md3IZG+JerqfSK9eMfkCKiT9p/4wK3/ACVDXP8AgWpSf414vHfXD92P4U97qdRwD+VbfUqH8q+45HnGLbv7SX3s990j9s343aQnlwfECaQf9PdvHcH83Umux8Nf8FCPiPZLHDrmmaTqKhgZJHhaCRh6AoQo/wC+a+SZdVmQnMhqrL4olgfAlPHvWcssw1TeC+43p8SZjQ1jVl97f4M/Q7wZ+3x8MdckWDxTod9pDu4HmxsLuJR/eYjaw+gU1654O+Ingf4g2n23wZ4os9QQKGdIJf3iA9N8Zwyf8CAr8jx8Sbq0n4kfaO/aux+GvxQ8Ual4gt7bwe9y+phw1mljKVnZx0EQBDM/oFy3pXnYnI6Si5RfL+R9Bl3G2KlJRqxVS/bR/hp+B+rNFfGnwm/b48deDr1fDPxT06XUYoGEcy3iG3voOnVmA3kDJw43E/xCvqX4Z/F7wB8XNJ/tXwTrsdwVUG4tH+SeAkdHQ89eNwypIOCcV4WIwVfDayV13Wx9xl+c4HMfdpytP+V6P/g/I6aiiiuQ9UKKKKACiiigArhLv9oTwJb/AB6tP2eop2m1q402S6naN1KW7BRIsL853tGGkx2Xaedwxp/Gr4q6F8EvhZrfxS8RANb6PZNKsBk2faJThYoQ2DtLyMiZwcbsngV+W/gL9rS98MftUad+0P4quVVpPEr3mrrErSiO2uCyXCRKxydsMsioCeMKO1fEcWcWQyDFYXDwa5qk4uf92ne0n6vZejPseGOFqufYbEV7Plpxaj51LXS9F19UfrhXMfFb4v8Agb4NeG28S+N9WWCMg+RApBknI6hF9sjJPAyB1IB5n4zftV/Cr4SfCqD4o/8ACRWmpW+p2om0IWdwJFvgwyrqw6pyOfw+n5c/tN/th+Lfi/4pufEHiLV2YMcQW6vhIUGdqqvYDJ/M9ySf0nLcvljrTv8Au+/f0/zPy/PM7jladKCvW7P7Pr5+R7Z+07+3z4s+J9zLptlfHT9KSRvIsbeQgYzwXP8AG2AOT74C5Ir5j8SfF24u5mC3J5PUtXluv/EW4vZWzcH86xR4inu5fKhbcxPAzX2uGwdOjFRirI/KMfjq+IqOpVlzSfc9Qk8aRS5la+yR1Jb+VSQeI4iQ7TlywBCKeT+dedWqTSELPc4J/hXn8BXp3wp+Bnjbx68d/aWwsrIoALy8yoZfVF6t9eB71GbZzk3DuBeLzOvGhSXWTtd9kt2+ySbfY+boZbmufY9YbLaU69V9Iq9l3b2S820vM1dI1iMtuwCT2POK6bStW3DCHHqMV0UX7NHhvwd4auPE/jb4gSpBbIWZre1SME9lXe3zMew4ya4K31Wwju5P7MllaDeRC06BXK9twBIB+hNePw5xfw9xjGrUyipKrTpuzlyTjG/ZOUVd97HpZxw7n3Ck6dPNIKnOorqPNGUrd2ot2XqdlbXx4yfrirH2wEctXOWuuJgbjU0mux4yGr6J0zgjiI2vc1rm8jA5OaxdQls5c+ZEv/ATtqlf6+wyyuPxrC1DxIEzub8auFFnLXxkEi5qViJATZ3hB7LIMj8xXM6zqXiHw/MLqMFCCCkmSVyP9odDU83iZWb/AFox65ph137VF5TIro4OcHIPtWkoyjGzObC11OtzRdj6K/Zv/wCCkfgHWktvhB+274Wg1rSSoh0/xTeQGe708Hj551/eNH/tqQ6853dB4Z/wVa/4KE+Nv2FtP/4XT/wS78DX3xN8K6FceV4v+JsF8ur+H/C96ZjF/Z8s9jKJGl4w6zGJUE1vlpPOAHx18eP2mfgL8W/idqX7HPgv4t33hrxFfx/Y18SWEKPbR328B9PhnY/JcMuV7AMdgYSACvlb9l/9qT9qD/gif+1Bqmg694dt/FHgXxTbtYePPAusJ5mj+NNHbcjhkcMqzKruFcqzRlmVg8buj/DZz7TDJ1sBrHVSjdct+391+ez+9n7fw3CGNjGlmUf3qSlBtNSce/NpzJdtWvSx/RR/wQ+/4Lg6N/wU5/Z8g1/4zeFbTwl4007WJNF1NrWU/YL+6jiikEkJbmLzEnQhGJAYOoP3N33B8KfjP8NfjXok+vfDfxTBqMdpdyWuoQLlJrO4RirxTxNho2BB4I5HIJBBr+UXx3+wF+194V+CHw//AGxP+CSf7QPjX4yfDO51SeeLQ/AWhXNpqvgrWZJA8tlf6HBPclzt8pGm/eB1RA/7owtJ+jv7LPh7/gqL+w98MPDn7Xv7Q/hi80nxr4qurvVfEvhkwrHHJZTTvKlrNEmRHOkZ3GJ8yICM5ZXB+MzDMcQ8OsTl9P2qhf2kNp2W7je3vLVuLWq2a3P0fK8Jh51pYfG1fZudvZTfw3e0aj6KWijO9k7KS1ufuLRXk/7KX7X3ws/as+Fem/ETwlrVvDLdhI7iwmmVHjnYH5ACeTlHGBkgqw5xk+sV14HH4XMsLHEYeXNCX9NNbpp6NPVNNMzxeExGBxEqFeLjOLs0wooorsOc+Ff+C3nxffw34H8GfCy0vIP+JlqNxqd9Fn96ohQRwn/dYzz/AFMY9K/MTxR4+X54ln4B9a+p/wDg4H+Ilnp/7Uvh3R7a6/eWfgiGOdM/ddrm4f8AVXSvhHwboPi74sag/wDZA8ixR8XOoTD5EPcL/eb2HtkivwTiqksXxBiMTWdoRfKvJRSX53fqz+n+A8FDDcLYfT4k5P5tv8rL5HoenftI+JYvD9v4E1fXrifT7MuNLhkmLJa73LMqg/dVmZm4/iZj3NR3GjfEPxIxntdCmw56zusP6OQcV0ng34Y+EvBKJJZWf2i8x819cgPJnvt7IPp+Oa6mI5IPX616WV+LecZDlqwWEpwqRh8Mql3ZdrRkrrtd6bbWS+R4p8GuF+Js7lmNSc6LqfGocqUpfze9GVm/taavXR3v5lF8C/itqnzWsFkSf4DfqD9PT9a0tP8A2ffjroNm+q3vgKWWAH53spUvHA9dsTMQPcjjvXqGkblmBBx7iu68O39+1v8AZGuG8tsbhnqPQ0v+I98aYWd5UqE49U4zTt5NVPzTPjc1+j/wfUp8tKtWg/8AFF/nD9UZHwO+Bdr4Xuo9e8QeVd6mQPIyNyWgIGdoPVs5G704GOc+86Gthptm97eTpDa28ReWSQ7VCqCSzHsABXI+HlUAY79SK5D9sLx9c+G/hZb+DdMnaK48RXRgldTgrbRgNLj6kxr7hjX5HOpxB4pcbUMPi6zlWxE1G/SEVq+WOyUYpuy3s+rbPaxtDI/DvhOq8HSUKNCLlbrKX957tydld7eiSPMPjX8b9V+O3jIzxzyQ+G9OmK6XZnK+bjgzOP7zf+Ojgdyamm6ykKLHHhVUYAUYAFcXZTxwxrDH8qqMACr0N+y8h6/0SyPI8s4eymll2BgoUaSsl+bb6tvVvdttn+fGf5xmmeZtVx+KlzTqO7/RLsktEui0O7h8QHb/AKzvUjeISf8Alp+tcTHqrgffpzau5H3/ANa9T2aPKWKqpWsdPea9nPz1i6hq5fI3VmTaiz9WqpPe9SWqlFRM261d2E1rVJ4LZpIZirEgAivnr9vH4h/tNaR8F7+1/Z20kgz20h17U7S5xe2tsMbhaRjkuwLEup3IqnaMkFeM/ao/4KE/C3w/8Sh8AtF8X6jpxaT7N4g8aaKsdx/Ysu9fkSKRWWYgBlkI5j3fLudSo+cPiR8R/wBr79i74o2+tXfxd1Dxl4a1gfadI1PUb6S/0/WLZsN8oZ28qTBBIRgRkEFlIz8/meaYdwlTi24rSUo292/9b7dL3P1DhXhjFUZUqtWMVOXvQhNO00vPbzSevVrl37X9n39v74r/ABD+E9p8DNN1DTrb4jWGuWl54Z1nUTFDb6+VmUyW98zjDTspYiQlWkIHzCQAyfZX7R3wz/Zy/bF0T4V/AL4gznwh49+Kml3aaDp/ia+tB/ZniS1mSE6amoROY2NwJ7d7aWRYopll8pyko8uvgT9pX9n3wl8V/hTZ/tn/ALPdt9kttSZG8Q+HUwr2920oiZoQv8XmkAqAN2Q6jkivsH/gnlqnxP8AgV8Rfhl+1r8cNLsfEfjnwBuOkadqyC4jt7aTAZpQwYC8MZK+evzJhCPnUsfEhDHyUqV+ZpJp/YlHpfzf399rn3ko5QpQxEVyLmaaV1UhPraztZPdNNa6b2PZf+DfL9kP/h3n+2VfeGP2z/DetaB8RdYt2svCmm395JbWul3LB0/ewg+XPNcRM6RzZZV3bE3eduH72mHwn8ZfBt98NfiHpsV9DcQbZIpusijo6nqrqcEMOQQCK888afCn9l7/AIKkfs46B8QZIHaO9tReeGPE+nOINV0C7B+YRzDJV45UKvGcoWTocKwmsNI+JXwx07SoPHmo291rNrAqz6pZReXDfSJ8pmWP/ln5mA5iydm/blgAx/HONMZV4cx1LOcOpKGkK0bt2ttJduva0rfzM/Rsnoyx1GeFrtTUveg7bp7xa/4e69D4B/an/Zy+J/7AvjPxFD4F1u8Xwb4oxqei39qShs9Qt5UnwdowjN5KMRwC0SEDDlV/QX/gn1+11Z/tZfAfSvFepSxrrkMTW+rxpwDcRYWTHXH3kfBJO2WMkkk42fi34C8AftM/CK88FeNNOWfTtWtirgcvbTAEB4z2dDnB7jg8Eivgj/gnVpPxH/Y8/au+I37KHiq4JnsbWHxJ4buWJEd3bxyCB3TpkSx3EW4df3JHY18zmGaU8lxEuIcA+ak0pVoLaUHa84rvb3ktPf0vao0vssLKOa5HLLMX/vFHWlN7uOilCT6uKSae7gu8W3+q9FUvD2u2PibRLXXtOfMN1CHUZBKnupx3ByD7g0V+u0K9HFUIVqMlKE0mmtmmrpryaPhJRlCTjJWaPxu/4LW/BPWPid/wULkm1C7e20WHw7ZTXcqNh5F8pVWNPQsUk56DB74z5XYafpegadDoeh2Udta26bIoIhgKP8e5J6nk12Hxl+Kfir4t+PtV+InjPUPtOp6tdme5cZ2r2WNASSqIoVFGThVA7VxjS5OWPOa/lvO82lnGYVKsbqk5ScV6tu789flsf15keCq5dlGHw1V3lThGLttdItIxJHOat2/JyOfeqEJI6nmr1sTxXiyO2robGkghxkV2mgOBgVxenNtIIPeuq0OflTmvNxUbo8XFe8jvdAlGF5714R+2frk158WtE8P+dmK10HzNvo00zg/pDHXtug3HIGa+Xf24vEy+Hv2h7ATvgXHhq3kQk4z++nX/ANlrbhOpisLxFDEYaXLVppyi10a6njxyvBZvOpg8ZBVKVSMoyi9mmrNf8FardalBPDviQYNtpU9yrfda2jMufwHI/GtG08D/ABDuebfwLrUnGfk0uVv5LUHgH4pQRxJ5N1h8DaQa721/aT8QaPbeXHq4hwOuFr+i6fjnxPQgqdXB05yW7vKN/lqfheZfRdyKtiJSweMqQg3omoyt5X0v933nm0uofZbx9Oum8u4jbEkEnyup9Cp5B+tON+epNZH7UXiHxd8YPAsXj23sLi7TR9etbJdc8vAinnEhS3WXHLMEd9g7Rlu1Rm+GPvZr9p4D4xxPF+XTxFbD+xlBpb3Tvfa6Xb8T+f8AxO8LsP4f5jRw1LE+3dRNtWScbcu9m976bbGs+of7deJXH7dPwhuP2lbb9nHTNYtpbhoZUvNXe6CQR3wKhLKM4IkkOXzyoBAQFmJUZ3x2/bv+BvwJ8RL4N8aw67czyriV9O0ovCgIBI812RXwGBPlliMjPPFfJ37Q/wCzV8Ivi94Ok/aJ/You47m0sVH/AAkHhe0DrPalR/ro4W+dGwCSn8WCyE8ivoMwzKpTVsM1KUXeSvrZb2X59jwMh4Yw9V82YRlCFRWhK3u8z2bf5LZ9z6Y/bW/Yf8HftE+Gn8Q+C7Cz0nxhYxs1ndxRCGO/BJYw3G0c5JJEnVSTnIJr4/8Agf8AGKTwat7+x5+1R4Wvrzwrd332YWssLNe+H70thZrbALY3Nnauc7iyhgzK/qH7OP7c3/C1PhLq/wCz/wDGrULt9cm0K5t9C1qCQifUD5LeXEWBz9pyFCMOZDgff+/63+z38Hr3XR4d+Nn7ROn2d58QrHRxaQyfKWiiDM0cs4A+a6CuVL5IAAwA24nzJwo5jiIV8J7ra97TS3VSXf8AP8T63CrF5Ngp4PMPfjF+5Z+8nupQfa+/8u2t2je/Y7+CuufAT4GReA/F8qPeTalc3c0KyCQRK7AIuRwTsRGOOAWI5xmvUrDVYdNby1jRFPZVAz9ap3l8q8saxdS1Pqd/6171KlCjSVOOyVjx5SqV60q1T4pO7+Z+if8AwQ0/a8b4cfGq9/ZV8U6oRoPjTfeeHPNf5bbVI0y8Y9BNEhHu0UQHLHP6meO9H07xRo0mlXwA7wyAcxv2Yf56V/NH4Q+JviDwP4o0zxv4V1FrbV9B1KDUNLuVPMU8LiRGH4qK/om+D/xp0X46fBvwx8YvDxC2nibQrbUYot+4xGWMM0ZP95GLIfdTX5V4iYahRo/vIp0qyakuj/4dflc/TeDsZUr0vZ39+m7r0/4Bl+DLm88OandeFdR+XcdyYPG4DqPqv8hXMfEz4N+FPFvxT8O/GeTMGt+G7O+sknjH/H1Z3MRV4JPUCRYpFPOCjAfeNdh41UPLHrdv/rrdhuI/iXPT/PqareKibayh1BDmG5t/Mjb3x8w/P+Yr+X69Wrl2AxGEUr06adn/ANO53Vn6O6fqj9SilWqwqbSf5r/gfqZfgT40a74D0Q6Fa6dFdRee0iGeVhsyBlVA6DIJ+rGiuOor8Ny7xU49ynAU8HhcbKNKklGKtF2S2V3FvQ9irk+W1qjqTppye+/+Z+X2o3nzl2NVLWczTAnoP51W1O864YcnFNsZh5ec9Tjmv11U7QP6DtaJswSFmB3dOTV61cFhWXBIRHyeSavWknQg1lJaHHVNuzk966LRLnpzXLWkvStnSrnY4GetcFaN0ebWjeJ6Dol3jac14Z+3P8A7/wCK3jTwf4ptdVFlbLBPYX11jJU5EkKr7tmbk9Nueelev6Jechd1bWs6Dp/jfwzceG9RbaJk/dTAZMMg5SQcjlSAcZ5GQeCa4sDjamVZjDEx6Xv6NWf5nmU6jwuJVTp+j0OY/Za/4J3fA3+wynj7xDqGuahcgeXPJcvbw24wPuxwsjMeerN6cdc+j6j/AMEzf2FPgaknxS/aO+N2uT6Ha7podBnv0s/tTHkRM0f7yReMKEMbEnljkCvlHxR+0d4j/Z91e58JTTz3XiC0coIPtLiOP+7IzcEhgQwAwSDnjINeSePPjB4/+Lms/wBv/EfxRcX8q58iBpCIoB6Ig4XoORycZJJr+muDOC8dxJQhjcRBU6EtVJ7yXeK7Po3p1SZ+Q+IHiJLh3F1MNhMZKrW6xi7Rj6y6Pyjr3cWe8/teftY+AfjRoui/BX4H/Dew8M/D/wAK6rJf6bZWtqIPtV4yNGLl0H8QSR1DN8xDHIXO2vm28+Iek+LrLxP4Y+H3iSC41vRrd7e4WElha3TxMY1Zum4EDIBJHQ4NeMfGn9rrwBYePoP2eNI8cnRr/VFe21LxRbOpTRHKnYvIIMrNhSSVEe8MTkYHyq2pfGz9gD48yTf2gb+3vD5kpaRvs+t2hY/M3JKyA55OWRs/eU/N+34Z5fw/hY4XCQ/dRdpNO7Ta3fn57aWW1l/O+LweYcS4yeMxtT9/JXhF7NX8+m/W7b5nvd9d+zX8e/h98RPh0/7H/wC0/pyrYPcSf8I/rcuIprK6aRmKyOw+Rw7uVc9dxR8g1m+AvBXxX/Ym/a80Pw2b+SXT9c1GOxivrZT5Op2csir8y9nQsjFScqQOSpBbvfHf7M3wi/bQsf8Ahe/wJ8XR6LqWouW1vTruHfH9px8wkVTmKTPJIDK+dwHJJ9L+EPwA8caLpOkQ/Hb4g2viWfw5Kr+HRDbNmyIRky0zYabCvgb1+XapByOJoYPE1ZQUteSzjUVtY9n122+7Y66+MwdGNRx0VS/PSaekn1jpbffo99x3h/8AZk+FnhX4z6p8arfSoGvLyRZNPsltwkFhIVAklRckF3bc2cALuOBnmvQP+Ell01nltmAdl27iM4+n5Vn6+1xp0py+6M/dkH8jWDd6rn+Ln1r6WnSpUU1CNru/zZ8zOdbENSqScrJJX7I7u38TjUrLzyQGB2uue9ZepasOea4r/hIriwlMsEuP7ynofrSz+MrS5cRbmVm7Hpn0q00J0pLVGlq3idNL/wBMkkwFPQdz6V+zf/BBb46y/Ej9htvB97cZl8HeKbywhRmyVtptt3Gc+m+4mUf7lfm7+y3/AME69c/bu/ZG+KfxF+DF/e3PxE+Gmo2V3B4aTa8Ws6dPDMWhjXG4XINtK0eCQ+DHtyysv0D/AMG13j+6hufi38PLuVx+70m9hibjYym6jk49TviH/Aa/LfFatSqcI4ipH4sPKDfzaj91pH3XBWHqUc0pt7VU0vlr+aP1h1XUVkRoychgQfer0+nSa98F3eMbp9PeQqR/dDEsP++WJ/AVy99PLHIY5QVYdQa9C+EPlXPgm5ilXcj3sgYHoQUQEV/K+Q0/7dzDEYKq7KtRqQ9L2s/VNJo/XsZ/suHhUj9mSZ4pRUeu276Jrd3pDvzbXLx5PcBiAfxor+Wa2CrYetKlNWlFtP1Tsz6qNpxUlsz8m7643sGB4AH51LbT7VjXPqc5rNuLjMQJPVj/AIVLBP8AIG9AB9K/p7k90/c3sdLHNmNDntV60lzxmsaC4Jhj57f0q/aTYwc1xziclRXN2zl45NalnPjBz0rm5tWsdJspdU1K7SC3gjLzTSttVFAySTXjHjH9rLxVrl8+lfCfT0tbVWK/2reQ+ZJJ7xxn5VH+8GJ9B0qsNlmKx8mqS0W7eiX9fecvsZVHZH1bo190Jaus0bUMYO6vz38cfFn4v+EvC8nibUPiNrRuJZVhtUiv3gQytk/dQgYADHGO2K5Hwj+19+0V4R1oa5B8Rry7LqFuLW/IuIZgBj50PfGBvUhsAc8Cvscn8H884mwFTFYWrBRi7K/N7zVrpNJ6a799O7X5lxnxvkvCeZU8FiU5zkuZ8tvdT0V7tXbtt216o9i/bnaz0n9o/Uri2cbryxtZpQDna3lBce2dgP418w/FP42/EqG4TQPgH4StPEWoWtz/AMTmeW/iSCzCbWaB8yKRK4OOcYBJ5IO3E/aD/bE8PfEn4qXnh/V/HM+m6prkXktqcFyt1/ZbqqRpCZGHBwGAZssuAXJYlj8xXLfFP9kX4pnU7W8a6trpifOcnyNUgzkrJ1w4zz1Kk5GQef6kyNYjIuF8FgKru6NOEJyi0+VqKVuvpf7tT+Xsxw9HNs/xWLgkvaTnOEZJ2km3r0+779D2L9oT9lbSvil4Ltvi18KPCI0bXJLUXGo+H0dGF1n5mKFCVMuSSCpw4x0PXzv4PfGT4deLPDl58F/2mNLUxS26W+m+KGti15YmLd5UTuAXwhdwpwcZKMCp47X4efEO4+H/AMAtW8Z/Dr4jjUbG1kils9G1WyAk0+UzrvtiVf7rq20AAcncuM4rtPDfwt8C+LPHdn+0BrfhJ7HU7qwikOj3USgQXWSTPIB96TBUDIGNu4jd09L6p7evGph7KUknJOzi07q+mnTbT5O5y/XHh6E6WJbcYtqDV1JSVnbXXrvr81Yzv2V/2aNS+Cd3efEbxZq0r3vmPHpenwzlIhFlkWedVbDOysSEJIQNz8x+X2S68datJyLhUwc4VR/Ws7VdbMljKobPy1zEusZH3817uHw1LBUlTpqyPErV62YVnVq6s7m98Vrc6I0tztZmBVlHGD2P8jXKXWr8H5vxrKu7+WPbv4LLnB7CqE9+Tyz/AK1pKaClh+xoXeqFs7TVS2vh/aEW5gfnHJrNuNQz0aqM9+ynerkEHINYyq2O+nhXJWP2d/4NW/EkMPjf41eHXlANzpehXO3PP7qS+XP/AJHr6P8ACv7Dem/sw/8ABVXxz8Vvh9psdr4O+L/hNNRFpAoRLTV476Jb2NQOiv58c46fNPIoGEr4J/4NdvHVzZftV/EqxmuDtuvAEcrHoCY72FR/6NNfs54v8Q2upLBNJIpe2uFljY9sdf0/kK/n3xR4iw2HnjMDUkl7RQvftaEv0P0vhfL5Rw1Cpb4L/fd/5nOfFDFpq5vYBhJlAOOzDj+QH612fwgn8n4fRzE48+5lce+Dt/8AZa8s8c+KUvwyb8qOp969K8MP/YvhDT9Mk4eO1UyD0Y/M36k1+BcGZ/gsdxLjMTR+GEXr0bk1t9zPt8woTjgKdOW7f4Jf8MeWfGnbZ/EO8ZOBOscg/FQD+oNFVvjrdibxlFIr9bBM/Xe9Ffk/EeDjVz7E1ILSU5P73f8AU+lwMb4Onfsj8gbu4xBH9T/OnW92WgJB5BFUL2b9yMnoxBqO0uswyKD2Br9rVO8T9zOq0u9EiKhb/wCtWxaT9s1x2l32HHPQ10lpcb1Dg1xVqfKzGcThP2k9cv8AUoLD4f2ErLFc/wCk3wU43oDhFPtuDH6qtZHgP4fRqqfuB78Vv+LtIbV/H73Mi5228aKfQYJ/mTXWaHpsVnCqKnPevS+tfVsDClT66v1YRXLA82/aT+Gl9rHwgln0K2aSbSrpL1441yXjVXR8fRZC30U18c/FTX9X0j4aa5qWiSOt1DpkrRPH95Pl5Ye4GT+FfZ/7cGn/AB1n/Zq1sfs/eJNO0rVFTOpXl7dC0dbHa3m/Z7hiEhk+787lVVd53KQGH5deH/jf8SfhNrFx8O/jJ4evZ0tz5N5Z6nCUu4FI6Hf99SDnDdQRhsV+6eEefOOR1cHWmrczcbP3ldK912vqnru79D+YfGXJVX4ipY2lBuThFSuvddm7Wfe2jWmyt1PQvgD8TvBPxR8GReAPFOl2kmoWdqsc9teRiUXiKoXzRuzubAG7uDz06dn8RLDwV4ptrD4XeKNId7fVo5VsZogALaSFAw2nqrbdxHBGFIPBwfnqb4SX2qaqnjf4Ba9FeW6ziWGBboW9zYv12NvI4HYk5I9ep9q8F6d401ifT/E/xRitYdR02ORLO3sJCU/eKqvJKOQXwpA2nADN68fruCxFerR9jVhd6LmteMo3119D8axuDo063tqUrLV2vqpenqZX7Pv7Pk/w51G/13xVfGZ5ZTHaWPDRmNJNyTSLkgvlQyjnZnrnp7Ab0f3/ANKu/DT4SfFP4w6j/Zfw18EahqrhtsksEW2GI/8ATSZsIn/AmFfRPgb/AIJOfGnxDbpceLviH4f0YuufIj829kT2bCqv5Ma8zMuMOD+EYexxuLhSa+y3zS9XGN5fgbUOG+I+IpuvRoSmu9rR+Tdl+J8zG97F6zY4MXbySqgjB+RRzn619c+NP+CPHx+0vTX1HwF478PeIJEXP2J3k0+aT2QyAx5/3nUe9fLPxG8B+PvhL4puPBPxK8J32i6rbf62yv4TG2OzKejKccMpIPYmujI+NeF+KLrLMXCtKO8U7SXnyytK3naxzY/hrOMm/wB7oygn13X3q6v8zldY1KVr6UO/IbAxxx2rOmvx3al8TzMJVuY1OCMOwHGaw5L7JxuJNezUqe8Xh8NeC0NCe/8AQ1SuL7uz5qlPqBORnFaHw78Ha38VPiNoHwx8NMn9o+I9btdLsDKTt8+4mWJM4BONzr0Brlq1404OUnZLU9OjhG2kfoj/AMG3V1cWP7QXxF8TxylUt/B0Fqx95btXH/og1+xw1SXVvAereIRMWOnXdvvOf4H3qf8Ax7ZX5If8ETfhJ47/AGfdb+NWneP7FbPVNL8WQ+GL+AHd5V5p5uPtKhv4huuIsEdcZ71+rHwOlfxF8EfFEcrEtfyyQQk/3lhBUj6M4/Kv4T8VKEM+8Usdz1b0FS5VrpzewVn8pv8AA/Y8iwjwfDtGo1ZuX4c/+RkeG7//AIS3xjaaQDuiEnm3PoI15OfrwPxFev6l4lUKcyAD614p8GrSbSNFfxFdqVudQA2Buqxdv++uv0211N3rbvkvMfxNfi+F4jjkOHnhcHG8m9X6afhqe7jcIq+IXaOn+Zw/x/8Aij4e0XxpBaanrlrbyHTkYJNOqEgySc4J6cGivAv2v/2ePgT8efi8fFHxN8J3Oo39jpkNjDNFrl5ZhYVLyhdkEyKfmnc5IJ5xnAABX12XYfIsXgadbGV6yrTSclGlBq77N1Yt/NI9ajhMwjSiqdODjbS8mn93K/zPiTV5DHLJGTwTuGf8+/6VRtrzy5sE8MCpqxrbEruLfMjFG/oaw5pyp61+sUYc0D9hOg0zUP3nLfhXUaPqAOFLV53ZaiVmzu+ldLpOpdPmrLE0NCWrnST2aNrH23Gd0Q5x3GR/hXzh8bf+CnHwy+Enx/0X4P6ZcQXWnW+qeV4211YmuE09drL5USow3yK+0yN8wQBlCs2Qs37VH7cnir4O+HZdZ+DfwvXxdZabcGHXvESXgksdMmDlPs8giJfzAwG4NsC7k5O8Y8fHgn4bf8FUfg7qXjPwT4RsfCPxR8KuEu4rfC22oLLvdBIwAJWQrLtdgWRgwJZTk+9k2SUoQWMzSm/qz93mTXuN6KUlukrq11o2m01v8BxFxDXqTeAyiqvrcfe5XF+/GOrjCWkW2k72eqTSae36FaXqvhXxX4X/ALQjvbLUNI1Cx3mXestvcW7p1zyrIynr0INfIHxC/Zz+FXxj8U6F+yp8afiHoWj6b4dJn8FeI3lhXWNf0a5GzTrOyu5SVcQSNLFIm12cRWrKP3pYfPv7EX7Z/wAQf2TPHcv7Nnx40jUG8PnUDZyWFzA0txotwzYOyMZLxOWy0a5zu3pnJD/UH7Gv7Lknw7Gn+O/jZcRahqehXt7/AMIJolxci7j8MWc0m7y0fJDyYVSCMiPJCnJOKq5RX4Vq1qkq1k7Ok42bldSSlHomr2lfRKV1d8t/Mp5hS4zp0Y0qF2m1VjK6ULOLcZd1LeNtW42aS57SfsR/8El/h/8ABW91Pxn8eEtfE2ry3M0Gi2oZhBZWu4qsrYIzPImCeyBsDJya+l/Dv7Jn7M+h3i3lv8ItNkdWyBePLdp+KSuyn8RUg+ICQjP2iM/UiqeofGRLFCVvYx9FBr5zFZ/xXjq05fWqkefdRnKMf/AYtL+tT3sPwZkWGoxpxwsJcuzlFSl/4E02e0eHJdN0Wxi0zRrGC1tYVCxW9tEIkjHoqqAAPpWy/jHSdHhFxq2r29pH/wA9LidYh+bEV8jeMf2k9Ut42W112RMf8832fyrw/wCKPxtutRWbWfEGuusecNcXMpdmPZVHJY+wzxk9Aa8/BcG47NKyTbvJ9m22/wA2epWy7D4ei6laahTitXskl5uySP0u0L4+fDOW9Fnp/wATfD8txnHlRaxAz59MB81wf/BRHwv8Lfi1+y9r+v8AxAgtIL/w5pU19oGtFlWWK4VcpCr/AMSzMFjKnOSynqFx+TfiX4t63rc7xeHvMsrbccTMcTSc8EkZ2dBwp9fmNY174o8T6pAlnq/iW9uoI33pBcXTyIreoVjgHnrX6tw74KZhl2ZYfMYY10Z05KVlG8rJ6q6kkrrR7qz1vsfivFHGfD9enVweGpOvGSa5n7sbvqlq2lvrZ327lye6WZGik5Vhgg96yv7Oht79Ly3m2opJKHn8jTXvSf46hkvV5y2a/pGVRPc/F6WGlHRdTH1G4U3kpibK+Y20596+k/8Agjd8LF+L3/BSf4WadeWsslloWvjxDfSRjiIaejXUTP8A7JnigT3Lgd6+YL0iG5eMcANxX6nf8G4nwJfSE8b/ALVmu2JX7Si+HPD0r5G5AyT3jgHgqWW0UMO6Sjsa/NvFHiV8McDY3Gwf71xcIf45+6rel3L0TPqcjy943MKdO2i1fotfx2+Z9wftF6F4V+H3xx8Sa14XsUtf+EtvI9b1ARDAlumgjt5JPq32VSfU5r2v4HalcaP8HtLtiSrXSvdSHpkSMSp/742V4H+1DJceLfjN4c8O6a58+/sUhLDnavnPlj7KCxPsK9nfXbTTdPi02zISG3iWOJAfuqowB+Qr/P7OcwzHHYOlUcmqtZNyfktLej/Q/csThqUMsw9JLz+7T8S7c6+IZnhWQAIxAHoBVG68SAA5k/WuJ1XxaBezAS/8tW/nWB4s8f8A9k6Hdal52DFAxTnq2OP1xXDh8mTaVtWTTwk5ySS3OP8AGfi46r4s1C+WUFXu3CH1UHA/QCivOP7fB5ZySepNFffQwSpwUUttD7SODUYqK6HzPrUm798Okic/UVzt9KQ1dFeoZbRk64+YVzGok7jX6lhux9P0IUvTHKOe9J430TV/Hnge/wDCGh+Nbzw/PfxeV/a2norTQqSN2zd90lcjcMEZyCCARQnm2Nn0q3p2olSPmrvcJRanHda/0noZVacK9KVOe0lZ6taPzWq+R8E6TrPxp/4J4/Gq78P+JNMj1XQ9VjMWp6dcLusPEFgcqSAwIDgMw5BKElSCrEN9sf8ABN74d/Bbwn4C1/4k/B7xEl/D4v1uSd4FQxtpcEbuYLCRCzMHiWVtxJO4sCCV2sbnxj+DvgP9oXwHN4E8dWe5Tl7C+iA86ymxgSRMf1B4YcH28/8A2BP2Mbv9n95fiJ8RdReTxBcF0tNOhucwWMZBXcwViskrKSM5IVWIBJJNe7m2aYTN8kqSqz9liPdUklpVtrG66W6vptroj8zyzhnMeH+JaVOjT9vg/ecJSetG9lJX1vdOyX2tXo1Jn0nqv7OXwf8AE/xttP2gPEXhaG98QWOlCwtHuI0aKIBmYTbNuWlw5UOxO1QNoB5Or4o+Fkd3YXF14Nv5La9EbG3t5pz5DvjhWbDMgJ7jOPQ1e07VwwAdvzNa1tdqw3I9fnUsVjIyi5SbUUkk9VZdLdj9ChhaWHc3RioubbbSWrfV936nx54t/ai1LwRrl14R8d+Gta0zVbJ9l1atDG4U9ir+YN6kYIYDBByK53Uf2r9DvlODq4OOAbWMfr5p/lX1h8dv2dPh1+0Joi2nim1NrqUCYsNZtVAmg77Tn76ZzlD6nBU818s+N/8AgnL8XPCtvcarp3jPw5eWEALGe5vWsGVR/E4kXYv/AH8NfrfDmO4BzKhFYpewr9Ytvlb7xeuj7N3Xnufm2e4vxEyutL6q1Wo9JKEeZL+8u67pWflscNrf7QuraghXStFWNyCDNdzmc+zKoChSPfcK4zWNf1bxDenUNdvnuZeg3YCqM5wqjAUZJ4AAp3i/wF4h8E3Hk6vNp86k4E+l6vb6jHn0LwO4U+zYPB4rE3H1NfsWWYDKMJTVTBQjZ9Vr+Or/ABPx3Os7z/Np8mYVpSt9l+6l/wBupJfOxpfbSOhx9KY16e7frWHJqd0rFSgXnoe1S2N1Jcs/mY4xjFev7Rnz6owRpvejn58/Sq15qotwMoST09KW2trm9uY7Ozt3mmmcJFFEhdnYnAVQOSSSBgV9QeEf+CZPjjU/gtrPifxepTxbcW8f/CN6Ct4kUduS6F3uXPBcpvAQHC45JJ+XxM54iyrIYQljaqhztJLq7tK/or3k9kj18ryPH5vOUcJTcuRNvstL29XayW7Z8v8Aw/8AA3i34r+O9K+HfgvTXvNW1q+jtbK3X+KRzjLH+FRyzMeFUEngGv6CP2SfhZoHwC+DHhr4DeC5gbPw7pW25u9m3z5eZJ7hhngyStI+M8FwK+Hf+CeX7DWn/s3ag3j/AMZXNtq/ja9iMFr9kBeHTIW+8sRYDdI4xukwMDKrwWZ/u221mLwV4LvZJJwbia3KzSg92+UKPYFq/lzxj4vo8UYyll+DlzYak736Tm9L+kVdRfW8ntY/UeGOFcRlmFdbExtWqdP5Y+fm938utySd4734n/8ACwL9wTZ6StnYKedrM7tJJ7HDKo+rVf1HxvuU/vv1rzGTxsCOJ/1rO1PxuUhaTzeQpPXrX5Gssc5K62VkfZrATqNc3RWR1N74zWS5lcT9ZGPX3rhvi548I0yLSIpeZ5N8nP8ACv8A9fH5VjN4onP8Z/E18lftx/tL3994hX4C/DzU9uraoqxaxfxNk6faEZKLjo7qSx7hDxywI+w4c4Xr5vmcaFJWSu5N7Rit5PyX4uyWrOvETw2UUfrFZXtZRit5TekYrzb+7VvRHpUfxl1fxvcXOq+B/FENtpcNy9tazm0W4W8MZ2vMhJGF370HUER7gcMKK4T4eeFxZ+DrCztro2dtDbrHaQtHuPlKoCk8jrj8eveivqq2GwVKrKFJLlTsrxTdvN237+e2h79DDc1GLrXc2tbOSV+tlfbt5bnQkAjBrm/EVusFwyqeDzRRV4d/vD1o7nOX3ykketV7W6dH2gmiivbgrxJZsaffycEE1vabqcmRgUUVw4iKsM39P1OT0Nbmn6rKMYzRRXi1YxJeqNi01JpOq1ejnEiFJFDKwwysMgj0oorzKiSehhJI8w+I37FP7PfxMklvp/CJ0e9lyWvNCk+ykn1MWDGTnqdmT61494n/AOCW988jP4K+LkZQ/ci1PTSpX6yRuc/98iiivq8k4x4mwVaNClipcm1pWl93Mnb5Hxuc8KcO4ulKtUw0efurx+/lav8AM5n/AIdWfGS4m3T/ABI8N4zywNwSB7Dy/wCtdx4A/wCCUmh2Eq3HxA+LNzdqWBkttI09bfj0EsjP/wCgUUV9LxDxvxRhqCVLEON97Rhf7+W6+R81kvCPDteq3UoXt3lL8uY9v+G37I3wb+GXi+z8WaD4bt9+lQGPSI3iLtC7Y8y4lkYs0szYwG4VFGFUHJPrFktxrGpR6ZAyqztgMxwP0oor8rx+YY7MantcVUdSaVk5O/n+d2+7bb1Z9/hMFhMDTdPDwUI72Str/wANp6aHpng7SdN8MQ74I2kuHGJLhhyfYDsKz/i14ruEsrbSIdwErmSRs4yF4A/M5/AUUV8th/3mMi5av/gExXNVuzgbrW54YGmLMdozjNVJdTmktIi5JLoGYk0UV9BGMbbHZGKueb/tQ/Gu++CPwd1HxrplgJ71itrYBj8iTSZCu/qq8nA64A4zkfNX7KnwN/4SCzb45+P9WGpXGrzSSxQsS7OfMO952PUs4J2jIOBk9RRRX6fk/wDsXAFbEUPdqVayhJrdxUU1HyV3fSx8jVSxXHtGjV96FKi5xXRScrOXm7aa3t0Pe5ZDI+4/hRRRXyx+iH//2Q==\n", - "title": "Twitter" - }, - { - "url": "https://www.wikipedia.org/", - "bgColor": "#ffffff", - "type": "sponsored", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Wikipedia" - }, - { - "url": "https://www.mozilla.org/", - "bgColor": "#4d4e54", - "type": "sponsored", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Mozilla Foundation" - }, - { - "url": "https://www.eff.org/", - "bgColor": "#000000", - "type": "sponsored", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Electronic Frontier Foundation" - }, - { - "url": "http://www.lonelyplanet.com/", - "bgColor": "#002f74", - "type": "sponsored", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Lonely Planet" - }, { "url": "http://www.bbc.co.uk/", "bgColor": "#990000", @@ -57,11 +15,53 @@ "title": "BBC" }, { - "url": "http://www.nytimes.com/", - "bgColor": "#0093b9", + "url": "https://www.youtube.com/", + "bgColor": "#e5523f", + "type": "organic", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "YouTube" + }, + { + "url": "http://www.wired.com/", + "bgColor": "#000000", "type": "sponsored", "imageURISpec": "data:image/jpg;base64,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\n", - "title": "The New York Times" + "title": "WIRED" + }, + { + "url": "https://www.wikipedia.org/", + "bgColor": "#ffffff", + "type": "affiliate", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Wikipedia" + }, + { + "url": "https://twitter.com/", + "bgColor": "#00b5f0", + "type": "organic", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Twitter" + }, + { + "url": "https://www.yahoo.com/", + "bgColor": "#500095", + "type": "organic", + "imageURISpec": "data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////4QDIRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAPAAAAcgEyAAIAAAAUAAAAgodpAAQAAAABAAAAlgAAAAAAAABIAAAAAQAAAEgAAAABUGl4ZWxtYXRvciAzLjEAADIwMTQ6MDI6MjggMTY6MDI6NTMAAAOgAQADAAAAAQABAACgAgAEAAAAAQAAALSgAwAEAAAAAQAAAJYAAAAA/+EBqWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eG1wOkNyZWF0b3JUb29sPlBpeGVsbWF0b3IgMy4xPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE0LTAyLTI4VDE2OjAyOjUzPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+Cv/bAEMAAgEBAQEBAgEBAQICAgICBAMCAgICBQMEAwQGBQYGBgUFBQYHCQgGBwgHBQUICwgICQkKCgoGBwsMCwoMCQoKCv/bAEMBAgICAgICBQMDBQoGBQYKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCv/AABEIAJYAtAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AP38ooooAKKKKACio7q6tbG2kvb25jhhhQvLNK4RUUDJZieAAO5rwT42/t7+AvAJm0jwLHHq19GSrXMuVt0bPYDDP/EOqjoQWFbUcPWxEuWmrnJjMfhMBT568lFfi/RHvlzc21lbvd3lwkUUSlpJZXCqijqSTwB715t44/a3+Cfgh3tpPET6lOjbWi0uLzQOM53khGHurGvhf4rftd+PPiFdl/EfiqeVA37uBX2RocYysa4UHHGQAT3rzTUPiVLdMc3ROfevdw+QuWtR/cfDZjxzGm+XDxt5y3+7/hz7a8Vf8FFLoHZ4S8E2kQUnL6hctPuHbATZj9a4HWP26/jVqMkhtvE9vaRv0jt7CLC/Ripb9a+WR4zllYAzdferUGuSzchya9SGU4WmvgX5nzVXirMsS9arXpp+Vj3e8/aq+Md3IZG+JerqfSK9eMfkCKiT9p/4wK3/ACVDXP8AgWpSf414vHfXD92P4U97qdRwD+VbfUqH8q+45HnGLbv7SX3s990j9s343aQnlwfECaQf9PdvHcH83Umux8Nf8FCPiPZLHDrmmaTqKhgZJHhaCRh6AoQo/wC+a+SZdVmQnMhqrL4olgfAlPHvWcssw1TeC+43p8SZjQ1jVl97f4M/Q7wZ+3x8MdckWDxTod9pDu4HmxsLuJR/eYjaw+gU1654O+Ingf4g2n23wZ4os9QQKGdIJf3iA9N8Zwyf8CAr8jx8Sbq0n4kfaO/aux+GvxQ8Ual4gt7bwe9y+phw1mljKVnZx0EQBDM/oFy3pXnYnI6Si5RfL+R9Bl3G2KlJRqxVS/bR/hp+B+rNFfGnwm/b48deDr1fDPxT06XUYoGEcy3iG3voOnVmA3kDJw43E/xCvqX4Z/F7wB8XNJ/tXwTrsdwVUG4tH+SeAkdHQ89eNwypIOCcV4WIwVfDayV13Wx9xl+c4HMfdpytP+V6P/g/I6aiiiuQ9UKKKKACiiigArhLv9oTwJb/AB6tP2eop2m1q402S6naN1KW7BRIsL853tGGkx2Xaedwxp/Gr4q6F8EvhZrfxS8RANb6PZNKsBk2faJThYoQ2DtLyMiZwcbsngV+W/gL9rS98MftUad+0P4quVVpPEr3mrrErSiO2uCyXCRKxydsMsioCeMKO1fEcWcWQyDFYXDwa5qk4uf92ne0n6vZejPseGOFqufYbEV7Plpxaj51LXS9F19UfrhXMfFb4v8Agb4NeG28S+N9WWCMg+RApBknI6hF9sjJPAyB1IB5n4zftV/Cr4SfCqD4o/8ACRWmpW+p2om0IWdwJFvgwyrqw6pyOfw+n5c/tN/th+Lfi/4pufEHiLV2YMcQW6vhIUGdqqvYDJ/M9ySf0nLcvljrTv8Au+/f0/zPy/PM7jladKCvW7P7Pr5+R7Z+07+3z4s+J9zLptlfHT9KSRvIsbeQgYzwXP8AG2AOT74C5Ir5j8SfF24u5mC3J5PUtXluv/EW4vZWzcH86xR4inu5fKhbcxPAzX2uGwdOjFRirI/KMfjq+IqOpVlzSfc9Qk8aRS5la+yR1Jb+VSQeI4iQ7TlywBCKeT+dedWqTSELPc4J/hXn8BXp3wp+Bnjbx68d/aWwsrIoALy8yoZfVF6t9eB71GbZzk3DuBeLzOvGhSXWTtd9kt2+ySbfY+boZbmufY9YbLaU69V9Iq9l3b2S820vM1dI1iMtuwCT2POK6bStW3DCHHqMV0UX7NHhvwd4auPE/jb4gSpBbIWZre1SME9lXe3zMew4ya4K31Wwju5P7MllaDeRC06BXK9twBIB+hNePw5xfw9xjGrUyipKrTpuzlyTjG/ZOUVd97HpZxw7n3Ck6dPNIKnOorqPNGUrd2ot2XqdlbXx4yfrirH2wEctXOWuuJgbjU0mux4yGr6J0zgjiI2vc1rm8jA5OaxdQls5c+ZEv/ATtqlf6+wyyuPxrC1DxIEzub8auFFnLXxkEi5qViJATZ3hB7LIMj8xXM6zqXiHw/MLqMFCCCkmSVyP9odDU83iZWb/AFox65ph137VF5TIro4OcHIPtWkoyjGzObC11OtzRdj6K/Zv/wCCkfgHWktvhB+274Wg1rSSoh0/xTeQGe708Hj551/eNH/tqQ6853dB4Z/wVa/4KE+Nv2FtP/4XT/wS78DX3xN8K6FceV4v+JsF8ur+H/C96ZjF/Z8s9jKJGl4w6zGJUE1vlpPOAHx18eP2mfgL8W/idqX7HPgv4t33hrxFfx/Y18SWEKPbR328B9PhnY/JcMuV7AMdgYSACvlb9l/9qT9qD/gif+1Bqmg694dt/FHgXxTbtYePPAusJ5mj+NNHbcjhkcMqzKruFcqzRlmVg8buj/DZz7TDJ1sBrHVSjdct+391+ez+9n7fw3CGNjGlmUf3qSlBtNSce/NpzJdtWvSx/RR/wQ+/4Lg6N/wU5/Z8g1/4zeFbTwl4007WJNF1NrWU/YL+6jiikEkJbmLzEnQhGJAYOoP3N33B8KfjP8NfjXok+vfDfxTBqMdpdyWuoQLlJrO4RirxTxNho2BB4I5HIJBBr+UXx3+wF+194V+CHw//AGxP+CSf7QPjX4yfDO51SeeLQ/AWhXNpqvgrWZJA8tlf6HBPclzt8pGm/eB1RA/7owtJ+jv7LPh7/gqL+w98MPDn7Xv7Q/hi80nxr4qurvVfEvhkwrHHJZTTvKlrNEmRHOkZ3GJ8yICM5ZXB+MzDMcQ8OsTl9P2qhf2kNp2W7je3vLVuLWq2a3P0fK8Jh51pYfG1fZudvZTfw3e0aj6KWijO9k7KS1ufuLRXk/7KX7X3ws/as+Fem/ETwlrVvDLdhI7iwmmVHjnYH5ACeTlHGBkgqw5xk+sV14HH4XMsLHEYeXNCX9NNbpp6NPVNNMzxeExGBxEqFeLjOLs0wooorsOc+Ff+C3nxffw34H8GfCy0vIP+JlqNxqd9Fn96ohQRwn/dYzz/AFMY9K/MTxR4+X54ln4B9a+p/wDg4H+Ilnp/7Uvh3R7a6/eWfgiGOdM/ddrm4f8AVXSvhHwboPi74sag/wDZA8ixR8XOoTD5EPcL/eb2HtkivwTiqksXxBiMTWdoRfKvJRSX53fqz+n+A8FDDcLYfT4k5P5tv8rL5HoenftI+JYvD9v4E1fXrifT7MuNLhkmLJa73LMqg/dVmZm4/iZj3NR3GjfEPxIxntdCmw56zusP6OQcV0ng34Y+EvBKJJZWf2i8x819cgPJnvt7IPp+Oa6mI5IPX616WV+LecZDlqwWEpwqRh8Mql3ZdrRkrrtd6bbWS+R4p8GuF+Js7lmNSc6LqfGocqUpfze9GVm/taavXR3v5lF8C/itqnzWsFkSf4DfqD9PT9a0tP8A2ffjroNm+q3vgKWWAH53spUvHA9dsTMQPcjjvXqGkblmBBx7iu68O39+1v8AZGuG8tsbhnqPQ0v+I98aYWd5UqE49U4zTt5NVPzTPjc1+j/wfUp8tKtWg/8AFF/nD9UZHwO+Bdr4Xuo9e8QeVd6mQPIyNyWgIGdoPVs5G704GOc+86Gthptm97eTpDa28ReWSQ7VCqCSzHsABXI+HlUAY79SK5D9sLx9c+G/hZb+DdMnaK48RXRgldTgrbRgNLj6kxr7hjX5HOpxB4pcbUMPi6zlWxE1G/SEVq+WOyUYpuy3s+rbPaxtDI/DvhOq8HSUKNCLlbrKX957tydld7eiSPMPjX8b9V+O3jIzxzyQ+G9OmK6XZnK+bjgzOP7zf+Ojgdyamm6ykKLHHhVUYAUYAFcXZTxwxrDH8qqMACr0N+y8h6/0SyPI8s4eymll2BgoUaSsl+bb6tvVvdttn+fGf5xmmeZtVx+KlzTqO7/RLsktEui0O7h8QHb/AKzvUjeISf8Alp+tcTHqrgffpzau5H3/ANa9T2aPKWKqpWsdPea9nPz1i6hq5fI3VmTaiz9WqpPe9SWqlFRM261d2E1rVJ4LZpIZirEgAivnr9vH4h/tNaR8F7+1/Z20kgz20h17U7S5xe2tsMbhaRjkuwLEup3IqnaMkFeM/ao/4KE/C3w/8Sh8AtF8X6jpxaT7N4g8aaKsdx/Ysu9fkSKRWWYgBlkI5j3fLudSo+cPiR8R/wBr79i74o2+tXfxd1Dxl4a1gfadI1PUb6S/0/WLZsN8oZ28qTBBIRgRkEFlIz8/meaYdwlTi24rSUo292/9b7dL3P1DhXhjFUZUqtWMVOXvQhNO00vPbzSevVrl37X9n39v74r/ABD+E9p8DNN1DTrb4jWGuWl54Z1nUTFDb6+VmUyW98zjDTspYiQlWkIHzCQAyfZX7R3wz/Zy/bF0T4V/AL4gznwh49+Kml3aaDp/ia+tB/ZniS1mSE6amoROY2NwJ7d7aWRYopll8pyko8uvgT9pX9n3wl8V/hTZ/tn/ALPdt9kttSZG8Q+HUwr2920oiZoQv8XmkAqAN2Q6jkivsH/gnlqnxP8AgV8Rfhl+1r8cNLsfEfjnwBuOkadqyC4jt7aTAZpQwYC8MZK+evzJhCPnUsfEhDHyUqV+ZpJp/YlHpfzf399rn3ko5QpQxEVyLmaaV1UhPraztZPdNNa6b2PZf+DfL9kP/h3n+2VfeGP2z/DetaB8RdYt2svCmm395JbWul3LB0/ewg+XPNcRM6RzZZV3bE3eduH72mHwn8ZfBt98NfiHpsV9DcQbZIpusijo6nqrqcEMOQQCK888afCn9l7/AIKkfs46B8QZIHaO9tReeGPE+nOINV0C7B+YRzDJV45UKvGcoWTocKwmsNI+JXwx07SoPHmo291rNrAqz6pZReXDfSJ8pmWP/ln5mA5iydm/blgAx/HONMZV4cx1LOcOpKGkK0bt2ttJduva0rfzM/Rsnoyx1GeFrtTUveg7bp7xa/4e69D4B/an/Zy+J/7AvjPxFD4F1u8Xwb4oxqei39qShs9Qt5UnwdowjN5KMRwC0SEDDlV/QX/gn1+11Z/tZfAfSvFepSxrrkMTW+rxpwDcRYWTHXH3kfBJO2WMkkk42fi34C8AftM/CK88FeNNOWfTtWtirgcvbTAEB4z2dDnB7jg8Eivgj/gnVpPxH/Y8/au+I37KHiq4JnsbWHxJ4buWJEd3bxyCB3TpkSx3EW4df3JHY18zmGaU8lxEuIcA+ak0pVoLaUHa84rvb3ktPf0vao0vssLKOa5HLLMX/vFHWlN7uOilCT6uKSae7gu8W3+q9FUvD2u2PibRLXXtOfMN1CHUZBKnupx3ByD7g0V+u0K9HFUIVqMlKE0mmtmmrpryaPhJRlCTjJWaPxu/4LW/BPWPid/wULkm1C7e20WHw7ZTXcqNh5F8pVWNPQsUk56DB74z5XYafpegadDoeh2Udta26bIoIhgKP8e5J6nk12Hxl+Kfir4t+PtV+InjPUPtOp6tdme5cZ2r2WNASSqIoVFGThVA7VxjS5OWPOa/lvO82lnGYVKsbqk5ScV6tu789flsf15keCq5dlGHw1V3lThGLttdItIxJHOat2/JyOfeqEJI6nmr1sTxXiyO2robGkghxkV2mgOBgVxenNtIIPeuq0OflTmvNxUbo8XFe8jvdAlGF5714R+2frk158WtE8P+dmK10HzNvo00zg/pDHXtug3HIGa+Xf24vEy+Hv2h7ATvgXHhq3kQk4z++nX/ANlrbhOpisLxFDEYaXLVppyi10a6njxyvBZvOpg8ZBVKVSMoyi9mmrNf8FardalBPDviQYNtpU9yrfda2jMufwHI/GtG08D/ABDuebfwLrUnGfk0uVv5LUHgH4pQRxJ5N1h8DaQa721/aT8QaPbeXHq4hwOuFr+i6fjnxPQgqdXB05yW7vKN/lqfheZfRdyKtiJSweMqQg3omoyt5X0v933nm0uofZbx9Oum8u4jbEkEnyup9Cp5B+tON+epNZH7UXiHxd8YPAsXj23sLi7TR9etbJdc8vAinnEhS3WXHLMEd9g7Rlu1Rm+GPvZr9p4D4xxPF+XTxFbD+xlBpb3Tvfa6Xb8T+f8AxO8LsP4f5jRw1LE+3dRNtWScbcu9m976bbGs+of7deJXH7dPwhuP2lbb9nHTNYtpbhoZUvNXe6CQR3wKhLKM4IkkOXzyoBAQFmJUZ3x2/bv+BvwJ8RL4N8aw67czyriV9O0ovCgIBI812RXwGBPlliMjPPFfJ37Q/wCzV8Ivi94Ok/aJ/You47m0sVH/AAkHhe0DrPalR/ro4W+dGwCSn8WCyE8ivoMwzKpTVsM1KUXeSvrZb2X59jwMh4Yw9V82YRlCFRWhK3u8z2bf5LZ9z6Y/bW/Yf8HftE+Gn8Q+C7Cz0nxhYxs1ndxRCGO/BJYw3G0c5JJEnVSTnIJr4/8Agf8AGKTwat7+x5+1R4Wvrzwrd332YWssLNe+H70thZrbALY3Nnauc7iyhgzK/qH7OP7c3/C1PhLq/wCz/wDGrULt9cm0K5t9C1qCQifUD5LeXEWBz9pyFCMOZDgff+/63+z38Hr3XR4d+Nn7ROn2d58QrHRxaQyfKWiiDM0cs4A+a6CuVL5IAAwA24nzJwo5jiIV8J7ra97TS3VSXf8AP8T63CrF5Ngp4PMPfjF+5Z+8nupQfa+/8u2t2je/Y7+CuufAT4GReA/F8qPeTalc3c0KyCQRK7AIuRwTsRGOOAWI5xmvUrDVYdNby1jRFPZVAz9ap3l8q8saxdS1Pqd/6171KlCjSVOOyVjx5SqV60q1T4pO7+Z+if8AwQ0/a8b4cfGq9/ZV8U6oRoPjTfeeHPNf5bbVI0y8Y9BNEhHu0UQHLHP6meO9H07xRo0mlXwA7wyAcxv2Yf56V/NH4Q+JviDwP4o0zxv4V1FrbV9B1KDUNLuVPMU8LiRGH4qK/om+D/xp0X46fBvwx8YvDxC2nibQrbUYot+4xGWMM0ZP95GLIfdTX5V4iYahRo/vIp0qyakuj/4dflc/TeDsZUr0vZ39+m7r0/4Bl+DLm88OandeFdR+XcdyYPG4DqPqv8hXMfEz4N+FPFvxT8O/GeTMGt+G7O+sknjH/H1Z3MRV4JPUCRYpFPOCjAfeNdh41UPLHrdv/rrdhuI/iXPT/PqareKibayh1BDmG5t/Mjb3x8w/P+Yr+X69Wrl2AxGEUr06adn/ANO53Vn6O6fqj9SilWqwqbSf5r/gfqZfgT40a74D0Q6Fa6dFdRee0iGeVhsyBlVA6DIJ+rGiuOor8Ny7xU49ynAU8HhcbKNKklGKtF2S2V3FvQ9irk+W1qjqTppye+/+Z+X2o3nzl2NVLWczTAnoP51W1O864YcnFNsZh5ec9Tjmv11U7QP6DtaJswSFmB3dOTV61cFhWXBIRHyeSavWknQg1lJaHHVNuzk966LRLnpzXLWkvStnSrnY4GetcFaN0ebWjeJ6Dol3jac14Z+3P8A7/wCK3jTwf4ptdVFlbLBPYX11jJU5EkKr7tmbk9Nueelev6Jechd1bWs6Dp/jfwzceG9RbaJk/dTAZMMg5SQcjlSAcZ5GQeCa4sDjamVZjDEx6Xv6NWf5nmU6jwuJVTp+j0OY/Za/4J3fA3+wynj7xDqGuahcgeXPJcvbw24wPuxwsjMeerN6cdc+j6j/AMEzf2FPgaknxS/aO+N2uT6Ha7podBnv0s/tTHkRM0f7yReMKEMbEnljkCvlHxR+0d4j/Z91e58JTTz3XiC0coIPtLiOP+7IzcEhgQwAwSDnjINeSePPjB4/+Lms/wBv/EfxRcX8q58iBpCIoB6Ig4XoORycZJJr+muDOC8dxJQhjcRBU6EtVJ7yXeK7Po3p1SZ+Q+IHiJLh3F1MNhMZKrW6xi7Rj6y6Pyjr3cWe8/teftY+AfjRoui/BX4H/Dew8M/D/wAK6rJf6bZWtqIPtV4yNGLl0H8QSR1DN8xDHIXO2vm28+Iek+LrLxP4Y+H3iSC41vRrd7e4WElha3TxMY1Zum4EDIBJHQ4NeMfGn9rrwBYePoP2eNI8cnRr/VFe21LxRbOpTRHKnYvIIMrNhSSVEe8MTkYHyq2pfGz9gD48yTf2gb+3vD5kpaRvs+t2hY/M3JKyA55OWRs/eU/N+34Z5fw/hY4XCQ/dRdpNO7Ta3fn57aWW1l/O+LweYcS4yeMxtT9/JXhF7NX8+m/W7b5nvd9d+zX8e/h98RPh0/7H/wC0/pyrYPcSf8I/rcuIprK6aRmKyOw+Rw7uVc9dxR8g1m+AvBXxX/Ym/a80Pw2b+SXT9c1GOxivrZT5Op2csir8y9nQsjFScqQOSpBbvfHf7M3wi/bQsf8Ahe/wJ8XR6LqWouW1vTruHfH9px8wkVTmKTPJIDK+dwHJJ9L+EPwA8caLpOkQ/Hb4g2viWfw5Kr+HRDbNmyIRky0zYabCvgb1+XapByOJoYPE1ZQUteSzjUVtY9n122+7Y66+MwdGNRx0VS/PSaekn1jpbffo99x3h/8AZk+FnhX4z6p8arfSoGvLyRZNPsltwkFhIVAklRckF3bc2cALuOBnmvQP+Ell01nltmAdl27iM4+n5Vn6+1xp0py+6M/dkH8jWDd6rn+Ln1r6WnSpUU1CNru/zZ8zOdbENSqScrJJX7I7u38TjUrLzyQGB2uue9ZepasOea4r/hIriwlMsEuP7ynofrSz+MrS5cRbmVm7Hpn0q00J0pLVGlq3idNL/wBMkkwFPQdz6V+zf/BBb46y/Ej9htvB97cZl8HeKbywhRmyVtptt3Gc+m+4mUf7lfm7+y3/AME69c/bu/ZG+KfxF+DF/e3PxE+Gmo2V3B4aTa8Ws6dPDMWhjXG4XINtK0eCQ+DHtyysv0D/AMG13j+6hufi38PLuVx+70m9hibjYym6jk49TviH/Aa/LfFatSqcI4ipH4sPKDfzaj91pH3XBWHqUc0pt7VU0vlr+aP1h1XUVkRoychgQfer0+nSa98F3eMbp9PeQqR/dDEsP++WJ/AVy99PLHIY5QVYdQa9C+EPlXPgm5ilXcj3sgYHoQUQEV/K+Q0/7dzDEYKq7KtRqQ9L2s/VNJo/XsZ/suHhUj9mSZ4pRUeu276Jrd3pDvzbXLx5PcBiAfxor+Wa2CrYetKlNWlFtP1Tsz6qNpxUlsz8m7643sGB4AH51LbT7VjXPqc5rNuLjMQJPVj/AIVLBP8AIG9AB9K/p7k90/c3sdLHNmNDntV60lzxmsaC4Jhj57f0q/aTYwc1xziclRXN2zl45NalnPjBz0rm5tWsdJspdU1K7SC3gjLzTSttVFAySTXjHjH9rLxVrl8+lfCfT0tbVWK/2reQ+ZJJ7xxn5VH+8GJ9B0qsNlmKx8mqS0W7eiX9fecvsZVHZH1bo190Jaus0bUMYO6vz38cfFn4v+EvC8nibUPiNrRuJZVhtUiv3gQytk/dQgYADHGO2K5Hwj+19+0V4R1oa5B8Rry7LqFuLW/IuIZgBj50PfGBvUhsAc8Cvscn8H884mwFTFYWrBRi7K/N7zVrpNJ6a799O7X5lxnxvkvCeZU8FiU5zkuZ8tvdT0V7tXbtt216o9i/bnaz0n9o/Uri2cbryxtZpQDna3lBce2dgP418w/FP42/EqG4TQPgH4StPEWoWtz/AMTmeW/iSCzCbWaB8yKRK4OOcYBJ5IO3E/aD/bE8PfEn4qXnh/V/HM+m6prkXktqcFyt1/ZbqqRpCZGHBwGAZssuAXJYlj8xXLfFP9kX4pnU7W8a6trpifOcnyNUgzkrJ1w4zz1Kk5GQef6kyNYjIuF8FgKru6NOEJyi0+VqKVuvpf7tT+Xsxw9HNs/xWLgkvaTnOEZJ2km3r0+779D2L9oT9lbSvil4Ltvi18KPCI0bXJLUXGo+H0dGF1n5mKFCVMuSSCpw4x0PXzv4PfGT4deLPDl58F/2mNLUxS26W+m+KGti15YmLd5UTuAXwhdwpwcZKMCp47X4efEO4+H/AMAtW8Z/Dr4jjUbG1kils9G1WyAk0+UzrvtiVf7rq20AAcncuM4rtPDfwt8C+LPHdn+0BrfhJ7HU7qwikOj3USgQXWSTPIB96TBUDIGNu4jd09L6p7evGph7KUknJOzi07q+mnTbT5O5y/XHh6E6WJbcYtqDV1JSVnbXXrvr81Yzv2V/2aNS+Cd3efEbxZq0r3vmPHpenwzlIhFlkWedVbDOysSEJIQNz8x+X2S68datJyLhUwc4VR/Ws7VdbMljKobPy1zEusZH3817uHw1LBUlTpqyPErV62YVnVq6s7m98Vrc6I0tztZmBVlHGD2P8jXKXWr8H5vxrKu7+WPbv4LLnB7CqE9+Tyz/AK1pKaClh+xoXeqFs7TVS2vh/aEW5gfnHJrNuNQz0aqM9+ynerkEHINYyq2O+nhXJWP2d/4NW/EkMPjf41eHXlANzpehXO3PP7qS+XP/AJHr6P8ACv7Dem/sw/8ABVXxz8Vvh9psdr4O+L/hNNRFpAoRLTV476Jb2NQOiv58c46fNPIoGEr4J/4NdvHVzZftV/EqxmuDtuvAEcrHoCY72FR/6NNfs54v8Q2upLBNJIpe2uFljY9sdf0/kK/n3xR4iw2HnjMDUkl7RQvftaEv0P0vhfL5Rw1Cpb4L/fd/5nOfFDFpq5vYBhJlAOOzDj+QH612fwgn8n4fRzE48+5lce+Dt/8AZa8s8c+KUvwyb8qOp969K8MP/YvhDT9Mk4eO1UyD0Y/M36k1+BcGZ/gsdxLjMTR+GEXr0bk1t9zPt8woTjgKdOW7f4Jf8MeWfGnbZ/EO8ZOBOscg/FQD+oNFVvjrdibxlFIr9bBM/Xe9Ffk/EeDjVz7E1ILSU5P73f8AU+lwMb4Onfsj8gbu4xBH9T/OnW92WgJB5BFUL2b9yMnoxBqO0uswyKD2Br9rVO8T9zOq0u9EiKhb/wCtWxaT9s1x2l32HHPQ10lpcb1Dg1xVqfKzGcThP2k9cv8AUoLD4f2ErLFc/wCk3wU43oDhFPtuDH6qtZHgP4fRqqfuB78Vv+LtIbV/H73Mi5228aKfQYJ/mTXWaHpsVnCqKnPevS+tfVsDClT66v1YRXLA82/aT+Gl9rHwgln0K2aSbSrpL1441yXjVXR8fRZC30U18c/FTX9X0j4aa5qWiSOt1DpkrRPH95Pl5Ye4GT+FfZ/7cGn/AB1n/Zq1sfs/eJNO0rVFTOpXl7dC0dbHa3m/Z7hiEhk+787lVVd53KQGH5deH/jf8SfhNrFx8O/jJ4evZ0tz5N5Z6nCUu4FI6Hf99SDnDdQRhsV+6eEefOOR1cHWmrczcbP3ldK912vqnru79D+YfGXJVX4ipY2lBuThFSuvddm7Wfe2jWmyt1PQvgD8TvBPxR8GReAPFOl2kmoWdqsc9teRiUXiKoXzRuzubAG7uDz06dn8RLDwV4ptrD4XeKNId7fVo5VsZogALaSFAw2nqrbdxHBGFIPBwfnqb4SX2qaqnjf4Ba9FeW6ziWGBboW9zYv12NvI4HYk5I9ep9q8F6d401ifT/E/xRitYdR02ORLO3sJCU/eKqvJKOQXwpA2nADN68fruCxFerR9jVhd6LmteMo3119D8axuDo063tqUrLV2vqpenqZX7Pv7Pk/w51G/13xVfGZ5ZTHaWPDRmNJNyTSLkgvlQyjnZnrnp7Ab0f3/ANKu/DT4SfFP4w6j/Zfw18EahqrhtsksEW2GI/8ATSZsIn/AmFfRPgb/AIJOfGnxDbpceLviH4f0YuufIj829kT2bCqv5Ma8zMuMOD+EYexxuLhSa+y3zS9XGN5fgbUOG+I+IpuvRoSmu9rR+Tdl+J8zG97F6zY4MXbySqgjB+RRzn619c+NP+CPHx+0vTX1HwF478PeIJEXP2J3k0+aT2QyAx5/3nUe9fLPxG8B+PvhL4puPBPxK8J32i6rbf62yv4TG2OzKejKccMpIPYmujI+NeF+KLrLMXCtKO8U7SXnyytK3naxzY/hrOMm/wB7oygn13X3q6v8zldY1KVr6UO/IbAxxx2rOmvx3al8TzMJVuY1OCMOwHGaw5L7JxuJNezUqe8Xh8NeC0NCe/8AQ1SuL7uz5qlPqBORnFaHw78Ha38VPiNoHwx8NMn9o+I9btdLsDKTt8+4mWJM4BONzr0Brlq1404OUnZLU9OjhG2kfoj/AMG3V1cWP7QXxF8TxylUt/B0Fqx95btXH/og1+xw1SXVvAereIRMWOnXdvvOf4H3qf8Ax7ZX5If8ETfhJ47/AGfdb+NWneP7FbPVNL8WQ+GL+AHd5V5p5uPtKhv4huuIsEdcZ71+rHwOlfxF8EfFEcrEtfyyQQk/3lhBUj6M4/Kv4T8VKEM+8Usdz1b0FS5VrpzewVn8pv8AA/Y8iwjwfDtGo1ZuX4c/+RkeG7//AIS3xjaaQDuiEnm3PoI15OfrwPxFev6l4lUKcyAD614p8GrSbSNFfxFdqVudQA2Buqxdv++uv0211N3rbvkvMfxNfi+F4jjkOHnhcHG8m9X6afhqe7jcIq+IXaOn+Zw/x/8Aij4e0XxpBaanrlrbyHTkYJNOqEgySc4J6cGivAv2v/2ePgT8efi8fFHxN8J3Oo39jpkNjDNFrl5ZhYVLyhdkEyKfmnc5IJ5xnAABX12XYfIsXgadbGV6yrTSclGlBq77N1Yt/NI9ajhMwjSiqdODjbS8mn93K/zPiTV5DHLJGTwTuGf8+/6VRtrzy5sE8MCpqxrbEruLfMjFG/oaw5pyp61+sUYc0D9hOg0zUP3nLfhXUaPqAOFLV53ZaiVmzu+ldLpOpdPmrLE0NCWrnST2aNrH23Gd0Q5x3GR/hXzh8bf+CnHwy+Enx/0X4P6ZcQXWnW+qeV4211YmuE09drL5USow3yK+0yN8wQBlCs2Qs37VH7cnir4O+HZdZ+DfwvXxdZabcGHXvESXgksdMmDlPs8giJfzAwG4NsC7k5O8Y8fHgn4bf8FUfg7qXjPwT4RsfCPxR8KuEu4rfC22oLLvdBIwAJWQrLtdgWRgwJZTk+9k2SUoQWMzSm/qz93mTXuN6KUlukrq11o2m01v8BxFxDXqTeAyiqvrcfe5XF+/GOrjCWkW2k72eqTSae36FaXqvhXxX4X/ALQjvbLUNI1Cx3mXestvcW7p1zyrIynr0INfIHxC/Zz+FXxj8U6F+yp8afiHoWj6b4dJn8FeI3lhXWNf0a5GzTrOyu5SVcQSNLFIm12cRWrKP3pYfPv7EX7Z/wAQf2TPHcv7Nnx40jUG8PnUDZyWFzA0txotwzYOyMZLxOWy0a5zu3pnJD/UH7Gv7Lknw7Gn+O/jZcRahqehXt7/AMIJolxci7j8MWc0m7y0fJDyYVSCMiPJCnJOKq5RX4Vq1qkq1k7Ok42bldSSlHomr2lfRKV1d8t/Mp5hS4zp0Y0qF2m1VjK6ULOLcZd1LeNtW42aS57SfsR/8El/h/8ABW91Pxn8eEtfE2ry3M0Gi2oZhBZWu4qsrYIzPImCeyBsDJya+l/Dv7Jn7M+h3i3lv8ItNkdWyBePLdp+KSuyn8RUg+ICQjP2iM/UiqeofGRLFCVvYx9FBr5zFZ/xXjq05fWqkefdRnKMf/AYtL+tT3sPwZkWGoxpxwsJcuzlFSl/4E02e0eHJdN0Wxi0zRrGC1tYVCxW9tEIkjHoqqAAPpWy/jHSdHhFxq2r29pH/wA9LidYh+bEV8jeMf2k9Ut42W112RMf8832fyrw/wCKPxtutRWbWfEGuusecNcXMpdmPZVHJY+wzxk9Aa8/BcG47NKyTbvJ9m22/wA2epWy7D4ei6laahTitXskl5uySP0u0L4+fDOW9Fnp/wATfD8txnHlRaxAz59MB81wf/BRHwv8Lfi1+y9r+v8AxAgtIL/w5pU19oGtFlWWK4VcpCr/AMSzMFjKnOSynqFx+TfiX4t63rc7xeHvMsrbccTMcTSc8EkZ2dBwp9fmNY174o8T6pAlnq/iW9uoI33pBcXTyIreoVjgHnrX6tw74KZhl2ZYfMYY10Z05KVlG8rJ6q6kkrrR7qz1vsfivFHGfD9enVweGpOvGSa5n7sbvqlq2lvrZ327lye6WZGik5Vhgg96yv7Oht79Ly3m2opJKHn8jTXvSf46hkvV5y2a/pGVRPc/F6WGlHRdTH1G4U3kpibK+Y20596+k/8Agjd8LF+L3/BSf4WadeWsslloWvjxDfSRjiIaejXUTP8A7JnigT3Lgd6+YL0iG5eMcANxX6nf8G4nwJfSE8b/ALVmu2JX7Si+HPD0r5G5AyT3jgHgqWW0UMO6Sjsa/NvFHiV8McDY3Gwf71xcIf45+6rel3L0TPqcjy943MKdO2i1fotfx2+Z9wftF6F4V+H3xx8Sa14XsUtf+EtvI9b1ARDAlumgjt5JPq32VSfU5r2v4HalcaP8HtLtiSrXSvdSHpkSMSp/742V4H+1DJceLfjN4c8O6a58+/sUhLDnavnPlj7KCxPsK9nfXbTTdPi02zISG3iWOJAfuqowB+Qr/P7OcwzHHYOlUcmqtZNyfktLej/Q/csThqUMsw9JLz+7T8S7c6+IZnhWQAIxAHoBVG68SAA5k/WuJ1XxaBezAS/8tW/nWB4s8f8A9k6Hdal52DFAxTnq2OP1xXDh8mTaVtWTTwk5ySS3OP8AGfi46r4s1C+WUFXu3CH1UHA/QCivOP7fB5ZySepNFffQwSpwUUttD7SODUYqK6HzPrUm798Okic/UVzt9KQ1dFeoZbRk64+YVzGok7jX6lhux9P0IUvTHKOe9J430TV/Hnge/wDCGh+Nbzw/PfxeV/a2norTQqSN2zd90lcjcMEZyCCARQnm2Nn0q3p2olSPmrvcJRanHda/0noZVacK9KVOe0lZ6taPzWq+R8E6TrPxp/4J4/Gq78P+JNMj1XQ9VjMWp6dcLusPEFgcqSAwIDgMw5BKElSCrEN9sf8ABN74d/Bbwn4C1/4k/B7xEl/D4v1uSd4FQxtpcEbuYLCRCzMHiWVtxJO4sCCV2sbnxj+DvgP9oXwHN4E8dWe5Tl7C+iA86ymxgSRMf1B4YcH28/8A2BP2Mbv9n95fiJ8RdReTxBcF0tNOhucwWMZBXcwViskrKSM5IVWIBJJNe7m2aYTN8kqSqz9liPdUklpVtrG66W6vptroj8zyzhnMeH+JaVOjT9vg/ecJSetG9lJX1vdOyX2tXo1Jn0nqv7OXwf8AE/xttP2gPEXhaG98QWOlCwtHuI0aKIBmYTbNuWlw5UOxO1QNoB5Or4o+Fkd3YXF14Nv5La9EbG3t5pz5DvjhWbDMgJ7jOPQ1e07VwwAdvzNa1tdqw3I9fnUsVjIyi5SbUUkk9VZdLdj9ChhaWHc3RioubbbSWrfV936nx54t/ai1LwRrl14R8d+Gta0zVbJ9l1atDG4U9ir+YN6kYIYDBByK53Uf2r9DvlODq4OOAbWMfr5p/lX1h8dv2dPh1+0Joi2nim1NrqUCYsNZtVAmg77Tn76ZzlD6nBU818s+N/8AgnL8XPCtvcarp3jPw5eWEALGe5vWsGVR/E4kXYv/AH8NfrfDmO4BzKhFYpewr9Ytvlb7xeuj7N3Xnufm2e4vxEyutL6q1Wo9JKEeZL+8u67pWflscNrf7QuraghXStFWNyCDNdzmc+zKoChSPfcK4zWNf1bxDenUNdvnuZeg3YCqM5wqjAUZJ4AAp3i/wF4h8E3Hk6vNp86k4E+l6vb6jHn0LwO4U+zYPB4rE3H1NfsWWYDKMJTVTBQjZ9Vr+Or/ABPx3Os7z/Np8mYVpSt9l+6l/wBupJfOxpfbSOhx9KY16e7frWHJqd0rFSgXnoe1S2N1Jcs/mY4xjFev7Rnz6owRpvejn58/Sq15qotwMoST09KW2trm9uY7Ozt3mmmcJFFEhdnYnAVQOSSSBgV9QeEf+CZPjjU/gtrPifxepTxbcW8f/CN6Ct4kUduS6F3uXPBcpvAQHC45JJ+XxM54iyrIYQljaqhztJLq7tK/or3k9kj18ryPH5vOUcJTcuRNvstL29XayW7Z8v8Aw/8AA3i34r+O9K+HfgvTXvNW1q+jtbK3X+KRzjLH+FRyzMeFUEngGv6CP2SfhZoHwC+DHhr4DeC5gbPw7pW25u9m3z5eZJ7hhngyStI+M8FwK+Hf+CeX7DWn/s3ag3j/AMZXNtq/ja9iMFr9kBeHTIW+8sRYDdI4xukwMDKrwWZ/u221mLwV4LvZJJwbia3KzSg92+UKPYFq/lzxj4vo8UYyll+DlzYak736Tm9L+kVdRfW8ntY/UeGOFcRlmFdbExtWqdP5Y+fm938utySd4734n/8ACwL9wTZ6StnYKedrM7tJJ7HDKo+rVf1HxvuU/vv1rzGTxsCOJ/1rO1PxuUhaTzeQpPXrX5Gssc5K62VkfZrATqNc3RWR1N74zWS5lcT9ZGPX3rhvi548I0yLSIpeZ5N8nP8ACv8A9fH5VjN4onP8Z/E18lftx/tL3994hX4C/DzU9uraoqxaxfxNk6faEZKLjo7qSx7hDxywI+w4c4Xr5vmcaFJWSu5N7Rit5PyX4uyWrOvETw2UUfrFZXtZRit5TekYrzb+7VvRHpUfxl1fxvcXOq+B/FENtpcNy9tazm0W4W8MZ2vMhJGF370HUER7gcMKK4T4eeFxZ+DrCztro2dtDbrHaQtHuPlKoCk8jrj8eveivqq2GwVKrKFJLlTsrxTdvN237+e2h79DDc1GLrXc2tbOSV+tlfbt5bnQkAjBrm/EVusFwyqeDzRRV4d/vD1o7nOX3ykketV7W6dH2gmiivbgrxJZsaffycEE1vabqcmRgUUVw4iKsM39P1OT0Nbmn6rKMYzRRXi1YxJeqNi01JpOq1ejnEiFJFDKwwysMgj0oorzKiSehhJI8w+I37FP7PfxMklvp/CJ0e9lyWvNCk+ykn1MWDGTnqdmT61494n/AOCW988jP4K+LkZQ/ci1PTSpX6yRuc/98iiivq8k4x4mwVaNClipcm1pWl93Mnb5Hxuc8KcO4ulKtUw0efurx+/lav8AM5n/AIdWfGS4m3T/ABI8N4zywNwSB7Dy/wCtdx4A/wCCUmh2Eq3HxA+LNzdqWBkttI09bfj0EsjP/wCgUUV9LxDxvxRhqCVLEON97Rhf7+W6+R81kvCPDteq3UoXt3lL8uY9v+G37I3wb+GXi+z8WaD4bt9+lQGPSI3iLtC7Y8y4lkYs0szYwG4VFGFUHJPrFktxrGpR6ZAyqztgMxwP0oor8rx+YY7MantcVUdSaVk5O/n+d2+7bb1Z9/hMFhMDTdPDwUI72Str/wANp6aHpng7SdN8MQ74I2kuHGJLhhyfYDsKz/i14ruEsrbSIdwErmSRs4yF4A/M5/AUUV8th/3mMi5av/gExXNVuzgbrW54YGmLMdozjNVJdTmktIi5JLoGYk0UV9BGMbbHZGKueb/tQ/Gu++CPwd1HxrplgJ71itrYBj8iTSZCu/qq8nA64A4zkfNX7KnwN/4SCzb45+P9WGpXGrzSSxQsS7OfMO952PUs4J2jIOBk9RRRX6fk/wDsXAFbEUPdqVayhJrdxUU1HyV3fSx8jVSxXHtGjV96FKi5xXRScrOXm7aa3t0Pe5ZDI+4/hRRRXyx+iH//2Q==\n", + "title": "Yahoo" + }, + { + "url": "http://www.amazon.com/", + "bgColor": "#ffffff", + "type": "organic", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Amazon.com" + }, + { + "url": "https://www.mozilla.org/", + "bgColor": "#4d4e54", + "type": "affiliate", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Mozilla Foundation" } ] } diff --git a/toolkit/modules/NewTabUtils.jsm b/toolkit/modules/NewTabUtils.jsm index 5fbc3119aa92..44d6e09d5183 100644 --- a/toolkit/modules/NewTabUtils.jsm +++ b/toolkit/modules/NewTabUtils.jsm @@ -577,6 +577,9 @@ let PlacesProvider = { title: title, frecency: frecency, lastVisitDate: lastVisitDate, + bgColor: "transparent", + type: "history", + imageURISpec: null, }); } } From a6786df79e019c99bc6f192b6459e1c2a2155b93 Mon Sep 17 00:00:00 2001 From: Ed Lee Date: Sat, 29 Mar 2014 09:00:11 -0700 Subject: [PATCH 02/19] Bug 972930 - Clicks (raw number) for tiles [r=adw] Provide an array of expected directory link types to count how many were clicked. --- browser/base/content/newtab/newTab.js | 1 + browser/base/content/newtab/sites.js | 7 +++++++ toolkit/components/telemetry/Histograms.json | 6 ++++++ toolkit/modules/DirectoryLinksProvider.jsm | 8 ++++++++ 4 files changed, 22 insertions(+) diff --git a/browser/base/content/newtab/newTab.js b/browser/base/content/newtab/newTab.js index 2ca2ff433c01..af2f6a52ffb4 100644 --- a/browser/base/content/newtab/newTab.js +++ b/browser/base/content/newtab/newTab.js @@ -11,6 +11,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/PageThumbs.jsm"); Cu.import("resource://gre/modules/BackgroundPageThumbs.jsm"); +Cu.import("resource://gre/modules/DirectoryLinksProvider.jsm"); Cu.import("resource://gre/modules/NewTabUtils.jsm"); Cu.import("resource://gre/modules/commonjs/sdk/core/promise.js"); diff --git a/browser/base/content/newtab/sites.js b/browser/base/content/newtab/sites.js index e91706fd0e8c..73eb82c98b98 100644 --- a/browser/base/content/newtab/sites.js +++ b/browser/base/content/newtab/sites.js @@ -189,6 +189,13 @@ Site.prototype = { } Services.telemetry.getHistogramById("NEWTAB_PAGE_SITE_CLICKED") .add(aIndex); + + // Specially count clicks on directory tiles + let typeIndex = DirectoryLinksProvider.linkTypes.indexOf(this.link.type); + if (typeIndex != -1) { + Services.telemetry.getHistogramById("NEWTAB_PAGE_DIRECTORY_TYPE_CLICKED") + .add(typeIndex); + } }, /** diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index 8eca5ef9480d..bed8a1c393ff 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -4041,6 +4041,12 @@ "n_values": 10, "description": "Track click count on about:newtab tiles per index (0-8). For non-default row or column configurations all clicks into the '9' bucket." }, + "NEWTAB_PAGE_DIRECTORY_TYPE_CLICKED": { + "expires_in_version": "35", + "kind": "enumerated", + "n_values": 3, + "description": "Track click count on about:newtab directory links per type (sponsored, affiliate, organic)." + }, "PANORAMA_INITIALIZATION_TIME_MS": { "expires_in_version": "never", "kind": "exponential", diff --git a/toolkit/modules/DirectoryLinksProvider.jsm b/toolkit/modules/DirectoryLinksProvider.jsm index d90530f34381..2be6eba75596 100644 --- a/toolkit/modules/DirectoryLinksProvider.jsm +++ b/toolkit/modules/DirectoryLinksProvider.jsm @@ -60,6 +60,12 @@ const PREF_DIRECTORY_SOURCE = "browser.newtabpage.directorySource"; // The frecency of a directory link const DIRECTORY_FRECENCY = 1000; +const LINK_TYPES = Object.freeze([ + "sponsored", + "affiliate", + "organic", +]); + /** * Singleton that serves as the provider of directory links. * Directory links are a hard-coded set of links shown if a user's link @@ -89,6 +95,8 @@ let DirectoryLinksProvider = { return this.__linksURL; }, + get linkTypes() LINK_TYPES, + observe: function DirectoryLinksProvider_observe(aSubject, aTopic, aData) { if (aTopic == "nsPref:changed") { if (aData == this._prefs["linksURL"]) { From ee1fb602e6f872f7be86439500f04bcbe3932cf4 Mon Sep 17 00:00:00 2001 From: Ed Lee Date: Sat, 29 Mar 2014 09:00:11 -0700 Subject: [PATCH 03/19] Bug 972936 - Overall impressions metrics for New Tab [r=adw] Add a histogram for each of the 3 directory link types and count how many were shown. --- browser/base/content/newtab/page.js | 18 ++++++++++++++++++ toolkit/components/telemetry/Histograms.json | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/browser/base/content/newtab/page.js b/browser/base/content/newtab/page.js index e66d6e530de0..00ff17937041 100644 --- a/browser/base/content/newtab/page.js +++ b/browser/base/content/newtab/page.js @@ -90,11 +90,29 @@ let gPage = { if (this.allowBackgroundCaptures) { Services.telemetry.getHistogramById("NEWTAB_PAGE_SHOWN").add(true); + // Initialize type counting with the types we want to count + let directoryCount = {}; + for (let type of DirectoryLinksProvider.linkTypes) { + directoryCount[type] = 0; + } + for (let site of gGrid.sites) { if (site) { site.captureIfMissing(); + let {type} = site.link; + if (type in directoryCount) { + directoryCount[type]++; + } } } + + // Record how many directory sites were shown, but place counts over the + // default 9 in the same bucket + for (let [type, count] of Iterator(directoryCount)) { + let shownId = "NEWTAB_PAGE_DIRECTORY_" + type.toUpperCase() + "_SHOWN"; + let shownCount = Math.min(10, count); + Services.telemetry.getHistogramById(shownId).add(shownCount); + } } }); this._mutationObserver.observe(document.documentElement, { diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index bed8a1c393ff..a9a9d92ff06f 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -4041,6 +4041,24 @@ "n_values": 10, "description": "Track click count on about:newtab tiles per index (0-8). For non-default row or column configurations all clicks into the '9' bucket." }, + "NEWTAB_PAGE_DIRECTORY_AFFILIATE_SHOWN": { + "expires_in_version": "35", + "kind": "enumerated", + "n_values": 11, + "description": "Number of affiliate directory links shown on about:newtab. For non-default row or column configurations, extra links fall into the '10' bucket." + }, + "NEWTAB_PAGE_DIRECTORY_ORGANIC_SHOWN": { + "expires_in_version": "35", + "kind": "enumerated", + "n_values": 11, + "description": "Number of organic directory links shown on about:newtab. For non-default row or column configurations, extra links fall into the '10' bucket." + }, + "NEWTAB_PAGE_DIRECTORY_SPONSORED_SHOWN": { + "expires_in_version": "35", + "kind": "enumerated", + "n_values": 11, + "description": "Number of sponsored directory links shown on about:newtab. For non-default row or column configurations, extra links fall into the '10' bucket." + }, "NEWTAB_PAGE_DIRECTORY_TYPE_CLICKED": { "expires_in_version": "35", "kind": "enumerated", From ff126b4eb1cbe581e411b0885c26da1045c66d84 Mon Sep 17 00:00:00 2001 From: Maxim Zhilyaev Date: Sat, 29 Mar 2014 09:31:08 -0700 Subject: [PATCH 04/19] Bug 974736 - Add icon to title bar of Sponsored Tiles [r=adw] Also fixes bug 976638 by moving controls.png to the shared directory. Add an always visible sponsored icon for tiles that are type=sponsored. Also add ignorehover to the cell to prevent styling when pointing at the sponsored icon that happens to be a child of the cell. --- browser/base/content/newtab/grid.js | 4 ++- browser/base/content/newtab/newTab.css | 23 +++++++++++++++--- browser/base/content/newtab/sites.js | 10 ++++++++ .../en-US/chrome/browser/newTab.properties | 1 + browser/themes/linux/jar.mn | 2 +- browser/themes/linux/newtab/controls.png | Bin 4180 -> 0 bytes browser/themes/linux/newtab/newTab.css | 16 ++++++++++-- browser/themes/osx/jar.mn | 2 +- browser/themes/osx/newtab/controls.png | Bin 4671 -> 0 bytes browser/themes/osx/newtab/controls@2x.png | Bin 15928 -> 22029 bytes browser/themes/osx/newtab/newTab.css | 20 ++++++++++++--- browser/themes/shared/newtab/controls.png | Bin 0 -> 7329 bytes browser/themes/windows/jar.mn | 4 +-- browser/themes/windows/newtab/controls.png | Bin 4180 -> 0 bytes browser/themes/windows/newtab/newTab.css | 16 ++++++++++-- 15 files changed, 81 insertions(+), 17 deletions(-) delete mode 100644 browser/themes/linux/newtab/controls.png delete mode 100644 browser/themes/osx/newtab/controls.png create mode 100644 browser/themes/shared/newtab/controls.png delete mode 100644 browser/themes/windows/newtab/controls.png diff --git a/browser/base/content/newtab/grid.js b/browser/base/content/newtab/grid.js index ec1235f4bf38..514432af122f 100644 --- a/browser/base/content/newtab/grid.js +++ b/browser/base/content/newtab/grid.js @@ -162,7 +162,9 @@ let gGrid = { '' + ''; + ' class="newtab-control newtab-control-block"/>' + + ''; this._siteFragment = document.createDocumentFragment(); this._siteFragment.appendChild(site); diff --git a/browser/base/content/newtab/newTab.css b/browser/base/content/newtab/newTab.css index fe13d67fb107..e30483c8f2e3 100644 --- a/browser/base/content/newtab/newTab.css +++ b/browser/base/content/newtab/newTab.css @@ -129,16 +129,16 @@ input[type=button] { .newtab-thumbnail[dragged], .newtab-link:-moz-focusring > .newtab-thumbnail, -.newtab-site:hover > .newtab-link > .newtab-thumbnail { +.newtab-cell:not([ignorehover]) > .newtab-site:hover > .newtab-link > .newtab-thumbnail { opacity: 1; } /* TITLES */ .newtab-title { - bottom: -20px; + bottom: -21px; position: absolute; left: 0; - line-height: 20px; + line-height: 21px; right: 0; text-align: start; white-space: nowrap; @@ -155,7 +155,7 @@ input[type=button] { } .newtab-control:-moz-focusring, -.newtab-site:hover > .newtab-control { +.newtab-cell:not([ignorehover]) > .newtab-site:hover > .newtab-control { opacity: 1; } @@ -169,16 +169,31 @@ input[type=button] { } } +.newtab-control-sponsored:-moz-locale-dir(rtl), .newtab-control-pin:-moz-locale-dir(ltr), .newtab-control-block:-moz-locale-dir(rtl) { left: 4px; } +.newtab-control-sponsored:-moz-locale-dir(ltr), .newtab-control-block:-moz-locale-dir(ltr), .newtab-control-pin:-moz-locale-dir(rtl) { right: 4px; } +.newtab-control.newtab-control-sponsored { + bottom: -20px; + height: 14px; + -moz-margin-end: -5px; + opacity: 1; + top: auto; + width: 14px; +} + +.newtab-site:not([type=sponsored]) .newtab-control-sponsored { + display: none; +} + /* DRAG & DROP */ /* diff --git a/browser/base/content/newtab/sites.js b/browser/base/content/newtab/sites.js index 73eb82c98b98..6fb99cb92865 100644 --- a/browser/base/content/newtab/sites.js +++ b/browser/base/content/newtab/sites.js @@ -128,6 +128,7 @@ Site.prototype = { link.setAttribute("title", tooltip); link.setAttribute("href", url); this._querySelector(".newtab-title").textContent = title; + this.node.setAttribute("type", this.link.type); if (this.isPinned()) this._updateAttributes(true); @@ -165,6 +166,15 @@ Site.prototype = { this._node.addEventListener("dragend", this, false); this._node.addEventListener("mouseover", this, false); this._node.addEventListener("click", this, false); + + // Specially treat the sponsored icon to prevent regular hover effects + let sponsored = this._querySelector(".newtab-control-sponsored"); + sponsored.addEventListener("mouseover", () => { + this.cell.node.setAttribute("ignorehover", "true"); + }); + sponsored.addEventListener("mouseout", () => { + this.cell.node.removeAttribute("ignorehover"); + }); }, /** diff --git a/browser/locales/en-US/chrome/browser/newTab.properties b/browser/locales/en-US/chrome/browser/newTab.properties index a249356f54f9..0ec4df801f9b 100644 --- a/browser/locales/en-US/chrome/browser/newTab.properties +++ b/browser/locales/en-US/chrome/browser/newTab.properties @@ -7,3 +7,4 @@ newtab.unpin=Unpin this site newtab.block=Remove this site newtab.show=Show the new tab page newtab.hide=Hide the new tab page +newtab.sponsored=Show information on sponsored tiles diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index 100012e93ab0..96d4d4e135c7 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -107,7 +107,7 @@ browser.jar: skin/classic/browser/feeds/subscribe-ui.css (feeds/subscribe-ui.css) skin/classic/browser/fonts/ClearSans-Regular.ttf (../shared/ClearSans-Regular.ttf) skin/classic/browser/newtab/newTab.css (newtab/newTab.css) - skin/classic/browser/newtab/controls.png (newtab/controls.png) + skin/classic/browser/newtab/controls.png (../shared/newtab/controls.png) skin/classic/browser/places/bookmarksMenu.png (places/bookmarksMenu.png) skin/classic/browser/places/bookmarksToolbar.png (places/bookmarksToolbar.png) skin/classic/browser/places/bookmarksToolbar-menuPanel.png (places/bookmarksToolbar-menuPanel.png) diff --git a/browser/themes/linux/newtab/controls.png b/browser/themes/linux/newtab/controls.png deleted file mode 100644 index 14f382fbdd18a1209f3dcd63831014b5ad2fc428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4180 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 .newtab-site:hover, .newtab-site[dragged] { box-shadow: 0 0 10px rgba(8,22,37,.3); } @@ -124,6 +124,10 @@ font-size: 13px; } +.newtab-site[type=sponsored] .newtab-title { + -moz-padding-end: 24px; +} + /* CONTROLS */ .newtab-control { width: 24px; @@ -164,3 +168,11 @@ .newtab-control-block:active { background-position: -192px 0; } + +.newtab-control-sponsored { + background-position: -249px -1px; +} + +.newtab-control-sponsored:hover { + background-position: -265px -1px; +} diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index 6f6dd1a49d01..3ef24806c59b 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -170,7 +170,7 @@ browser.jar: skin/classic/browser/feeds/audioFeedIcon16.png (feeds/feedIcon16.png) skin/classic/browser/fonts/ClearSans-Regular.ttf (../shared/ClearSans-Regular.ttf) skin/classic/browser/newtab/newTab.css (newtab/newTab.css) - skin/classic/browser/newtab/controls.png (newtab/controls.png) + skin/classic/browser/newtab/controls.png (../shared/newtab/controls.png) skin/classic/browser/newtab/controls@2x.png (newtab/controls@2x.png) skin/classic/browser/setDesktopBackground.css skin/classic/browser/monitor.png diff --git a/browser/themes/osx/newtab/controls.png b/browser/themes/osx/newtab/controls.png deleted file mode 100644 index f42794644f4dc2b4ae69534a8c8cce352afc0092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4671 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 JF4MG&_#f2%Xxab( diff --git a/browser/themes/osx/newtab/controls@2x.png b/browser/themes/osx/newtab/controls@2x.png index abbee1f6b23c7624e4a9c73b48be08397e5f21fb..b29114c0268de5de75093cdb0f44a5ade2c6084b 100644 GIT binary patch literal 22029 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 ax%@xuNsIghG&*$v0000 .newtab-site:hover, .newtab-site[dragged] { box-shadow: 0 0 10px rgba(8,22,37,.3); } @@ -128,6 +128,10 @@ font-size: 13px; } +.newtab-site[type=sponsored] .newtab-title { + -moz-padding-end: 24px; +} + /* CONTROLS */ .newtab-control { width: 24px; @@ -140,7 +144,7 @@ @media (min-resolution: 2dppx) { .newtab-control { background-image: url(chrome://browser/skin/newtab/controls@2x.png); - background-size: 248px; + background-size: 296px; } } @@ -175,3 +179,11 @@ .newtab-control-block:active { background-position: -192px 0; } + +.newtab-control-sponsored { + background-position: -249px -1px; +} + +.newtab-control-sponsored:hover { + background-position: -265px -1px; +} diff --git a/browser/themes/shared/newtab/controls.png b/browser/themes/shared/newtab/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3d5f9871659babb76e01bdb4870b1710981579 GIT binary patch literal 7329 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 LsL5B#nuh!zs~OF_ literal 0 HcmV?d00001 diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index cdeec87bf999..31a243116c73 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -128,7 +128,7 @@ browser.jar: skin/classic/browser/feeds/subscribe-ui.css (feeds/subscribe-ui.css) skin/classic/browser/fonts/ClearSans-Regular.ttf (../shared/ClearSans-Regular.ttf) skin/classic/browser/newtab/newTab.css (newtab/newTab.css) - skin/classic/browser/newtab/controls.png (newtab/controls.png) + skin/classic/browser/newtab/controls.png (../shared/newtab/controls.png) skin/classic/browser/places/places.css (places/places.css) * skin/classic/browser/places/organizer.css (places/organizer.css) skin/classic/browser/places/bookmark.png (places/bookmark.png) @@ -476,7 +476,7 @@ browser.jar: skin/classic/aero/browser/feeds/subscribe-ui.css (feeds/subscribe-ui.css) skin/classic/aero/browser/fonts/ClearSans-Regular.ttf (../shared/ClearSans-Regular.ttf) skin/classic/aero/browser/newtab/newTab.css (newtab/newTab.css) - skin/classic/aero/browser/newtab/controls.png (newtab/controls.png) + skin/classic/aero/browser/newtab/controls.png (../shared/newtab/controls.png) * skin/classic/aero/browser/places/places.css (places/places-aero.css) * skin/classic/aero/browser/places/organizer.css (places/organizer-aero.css) skin/classic/aero/browser/places/bookmark.png (places/bookmark-aero.png) diff --git a/browser/themes/windows/newtab/controls.png b/browser/themes/windows/newtab/controls.png deleted file mode 100644 index 14f382fbdd18a1209f3dcd63831014b5ad2fc428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4180 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 .newtab-site:hover, .newtab-site[dragged] { box-shadow: 0 0 10px rgba(8,22,37,.3); } @@ -127,6 +127,10 @@ font-size: 13px; } +.newtab-site[type=sponsored] .newtab-title { + -moz-padding-end: 24px; +} + /* CONTROLS */ .newtab-control { width: 24px; @@ -167,3 +171,11 @@ .newtab-control-block:active { background-position: -192px 0; } + +.newtab-control-sponsored { + background-position: -249px -1px; +} + +.newtab-control-sponsored:hover { + background-position: -265px -1px; +} From 358fc57505ad910baabe7080c1352d188820b80b Mon Sep 17 00:00:00 2001 From: Maxim Zhilyaev Date: Sat, 29 Mar 2014 09:31:09 -0700 Subject: [PATCH 05/19] Bug 975210 - Augment Site._render logic to allow for Sponsored Tiles images & text [r=adw] For type={affiliate,organic,sponsored} tiles, show the appropriate imageURISpec instead of thumbnail. --- browser/base/content/newtab/sites.js | 8 +++++--- browser/themes/linux/newtab/newTab.css | 7 +++++++ browser/themes/osx/newtab/newTab.css | 7 +++++++ browser/themes/windows/newtab/newTab.css | 7 +++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/browser/base/content/newtab/sites.js b/browser/base/content/newtab/sites.js index 6fb99cb92865..1a8f7ff4d8ee 100644 --- a/browser/base/content/newtab/sites.js +++ b/browser/base/content/newtab/sites.js @@ -144,17 +144,19 @@ Site.prototype = { * existing thumbnail and the page allows background captures. */ captureIfMissing: function Site_captureIfMissing() { - if (gPage.allowBackgroundCaptures) + if (gPage.allowBackgroundCaptures && !this.link.imageURISpec) { BackgroundPageThumbs.captureIfMissing(this.url); + } }, /** * Refreshes the thumbnail for the site. */ refreshThumbnail: function Site_refreshThumbnail() { - let thumbnailURL = PageThumbs.getThumbnailURL(this.url); let thumbnail = this._querySelector(".newtab-thumbnail"); - thumbnail.style.backgroundImage = "url(" + thumbnailURL + ")"; + thumbnail.style.backgroundColor = this.link.bgColor; + let uri = this.link.imageURISpec || PageThumbs.getThumbnailURL(this.url); + thumbnail.style.backgroundImage = "url(" + uri + ")"; }, /** diff --git a/browser/themes/linux/newtab/newTab.css b/browser/themes/linux/newtab/newTab.css index acc3c58709c8..02ab6f2c8c84 100644 --- a/browser/themes/linux/newtab/newTab.css +++ b/browser/themes/linux/newtab/newTab.css @@ -117,6 +117,13 @@ background-size: cover; } +.newtab-site[type=affiliate] .newtab-thumbnail, +.newtab-site[type=organic] .newtab-thumbnail, +.newtab-site[type=sponsored] .newtab-thumbnail { + background-position: top center; + background-size: auto; +} + /* TITLES */ .newtab-title { color: #525c66; diff --git a/browser/themes/osx/newtab/newTab.css b/browser/themes/osx/newtab/newTab.css index 15b5c0659d91..2c29f2e516a2 100644 --- a/browser/themes/osx/newtab/newTab.css +++ b/browser/themes/osx/newtab/newTab.css @@ -121,6 +121,13 @@ background-size: cover; } +.newtab-site[type=affiliate] .newtab-thumbnail, +.newtab-site[type=organic] .newtab-thumbnail, +.newtab-site[type=sponsored] .newtab-thumbnail { + background-position: top center; + background-size: auto; +} + /* TITLES */ .newtab-title { color: #525c66; diff --git a/browser/themes/windows/newtab/newTab.css b/browser/themes/windows/newtab/newTab.css index 49ae4d5face0..63498f6eb376 100644 --- a/browser/themes/windows/newtab/newTab.css +++ b/browser/themes/windows/newtab/newTab.css @@ -120,6 +120,13 @@ background-size: cover; } +.newtab-site[type=affiliate] .newtab-thumbnail, +.newtab-site[type=organic] .newtab-thumbnail, +.newtab-site[type=sponsored] .newtab-thumbnail { + background-position: top center; + background-size: auto; +} + /* TITLES */ .newtab-title { color: #525c66; From d75bf9dcfee42034b2e29b952933e2c5186b269f Mon Sep 17 00:00:00 2001 From: Maxim Zhilyaev Date: Sat, 29 Mar 2014 09:31:09 -0700 Subject: [PATCH 06/19] Bug 974745 - Create click event on Sponsored Tiles to show explanation panel [r=adw] Have the page know how to show a panel on a sponsored icon click. --- browser/base/content/newtab/newTab.css | 13 ++++++++ browser/base/content/newtab/newTab.xul | 8 +++++ browser/base/content/newtab/page.js | 18 ++++++++++ browser/base/content/newtab/sites.js | 2 ++ browser/base/content/test/newtab/browser.ini | 1 + .../browser_newtab_sponsored_icon_click.js | 33 +++++++++++++++++++ browser/base/content/test/newtab/head.js | 9 +++++ .../locales/en-US/chrome/browser/newTab.dtd | 3 ++ browser/themes/linux/newtab/newTab.css | 4 +++ browser/themes/osx/newtab/newTab.css | 4 +++ browser/themes/windows/newtab/newTab.css | 4 +++ 11 files changed, 99 insertions(+) create mode 100644 browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js diff --git a/browser/base/content/newtab/newTab.css b/browser/base/content/newtab/newTab.css index e30483c8f2e3..1bb154193649 100644 --- a/browser/base/content/newtab/newTab.css +++ b/browser/base/content/newtab/newTab.css @@ -207,3 +207,16 @@ input[type=button] { background-color: #fff; opacity: 0.01; } + +/* PANEL */ +#sponsored-panel { + width: 330px; +} + +#sponsored-panel description { + margin: 0; +} + +#sponsored-panel .text-link { + margin: 12px 0 0; +} diff --git a/browser/base/content/newtab/newTab.xul b/browser/base/content/newtab/newTab.xul index 9c21d25f4330..87e0c4beb8af 100644 --- a/browser/base/content/newtab/newTab.xul +++ b/browser/base/content/newtab/newTab.xul @@ -17,6 +17,14 @@ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" title="&newtab.pageTitle;"> + +
diff --git a/browser/base/content/newtab/page.js b/browser/base/content/newtab/page.js index 00ff17937041..ab70f725b019 100644 --- a/browser/base/content/newtab/page.js +++ b/browser/base/content/newtab/page.js @@ -23,6 +23,9 @@ let gPage = { let button = document.getElementById("newtab-toggle"); button.addEventListener("click", this, false); + // Initialize sponsored panel + this._sponsoredPanel = document.getElementById("sponsored-panel"); + // Check if the new tab feature is enabled. let enabled = gAllPages.enabled; if (enabled) @@ -76,6 +79,21 @@ let gPage = { } }, + /** + * Shows sponsored panel + */ + showSponsoredPanel: function Page_showSponsoredPanel(aTarget) { + if (this._sponsoredPanel.state == "closed") { + let self = this; + this._sponsoredPanel.addEventListener("popuphidden", function onPopupHidden(aEvent) { + self._sponsoredPanel.removeEventListener("popuphidden", onPopupHidden, false); + aTarget.removeAttribute("panelShown"); + }); + } + aTarget.setAttribute("panelShown", "true"); + this._sponsoredPanel.openPopup(aTarget); + }, + /** * Internally initializes the page. This runs only when/if the feature * is/gets enabled. diff --git a/browser/base/content/newtab/sites.js b/browser/base/content/newtab/sites.js index 1a8f7ff4d8ee..5545b66ee56e 100644 --- a/browser/base/content/newtab/sites.js +++ b/browser/base/content/newtab/sites.js @@ -224,6 +224,8 @@ Site.prototype = { aEvent.preventDefault(); if (aEvent.target.classList.contains("newtab-control-block")) this.block(); + else if (target.classList.contains("newtab-control-sponsored")) + gPage.showSponsoredPanel(target); else if (this.isPinned()) this.unpin(); else diff --git a/browser/base/content/test/newtab/browser.ini b/browser/base/content/test/newtab/browser.ini index 01ec5ab570da..e91faaf259ea 100644 --- a/browser/base/content/test/newtab/browser.ini +++ b/browser/base/content/test/newtab/browser.ini @@ -21,6 +21,7 @@ skip-if = os == "mac" # Intermittent failures, bug 898317 [browser_newtab_focus.js] [browser_newtab_perwindow_private_browsing.js] [browser_newtab_reset.js] +[browser_newtab_sponsored_icon_click.js] [browser_newtab_tabsync.js] [browser_newtab_undo.js] [browser_newtab_unpin.js] diff --git a/browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js b/browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js new file mode 100644 index 000000000000..be20fdf4ccce --- /dev/null +++ b/browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js @@ -0,0 +1,33 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +function runTests() { + yield setLinks("0"); + yield addNewTabPageTab(); + + let site = getCell(0).node.querySelector(".newtab-site"); + site.setAttribute("type", "sponsored"); + + let sponsoredPanel = getContentDocument().getElementById("sponsored-panel"); + is(sponsoredPanel.state, "closed", "Sponsed panel must be closed"); + + function continueOnceOn(event) { + sponsoredPanel.addEventListener(event, function listener() { + sponsoredPanel.removeEventListener(event, listener); + executeSoon(TestRunner.next); + }); + } + + // test sponsoredPanel appearing upon a click + continueOnceOn("popupshown"); + let sponsoredButton = site.querySelector(".newtab-control-sponsored"); + yield synthesizeNativeMouseClick(sponsoredButton); + is(sponsoredPanel.state, "open", "Sponsored panel opens on click"); + ok(sponsoredButton.hasAttribute("panelShown"), "Sponsored button has panelShown attribute"); + + // test sponsoredPanel hiding after a click + continueOnceOn("popuphidden"); + yield synthesizeNativeMouseClick(sponsoredButton); + is(sponsoredPanel.state, "closed", "Sponsed panel hides on click"); + ok(!sponsoredButton.hasAttribute("panelShown"), "Sponsored button does not have panelShown attribute"); +} diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js index 8f823cf9738d..ee3b385daf27 100644 --- a/browser/base/content/test/newtab/head.js +++ b/browser/base/content/test/newtab/head.js @@ -452,6 +452,15 @@ function synthesizeNativeMouseLUp(aElement) { synthesizeNativeMouseEvent(aElement, msg); } +/** + * Fires a synthetic 'click' event on the current about:newtab page. + * @param aElement The element used to determine the cursor position. + */ +function synthesizeNativeMouseClick(aElement) { + synthesizeNativeMouseLDown(aElement); + synthesizeNativeMouseLUp(aElement); +} + /** * Fires a synthetic mouse drag event on the current about:newtab page. * @param aElement The element used to determine the cursor position. diff --git a/browser/locales/en-US/chrome/browser/newTab.dtd b/browser/locales/en-US/chrome/browser/newTab.dtd index ce9e3e4b0b35..b85682d55129 100644 --- a/browser/locales/en-US/chrome/browser/newTab.dtd +++ b/browser/locales/en-US/chrome/browser/newTab.dtd @@ -8,3 +8,6 @@ + + + diff --git a/browser/themes/linux/newtab/newTab.css b/browser/themes/linux/newtab/newTab.css index 02ab6f2c8c84..4b8f55f4d1c9 100644 --- a/browser/themes/linux/newtab/newTab.css +++ b/browser/themes/linux/newtab/newTab.css @@ -183,3 +183,7 @@ .newtab-control-sponsored:hover { background-position: -265px -1px; } + +.newtab-control-sponsored[panelShown] { + background-position: -281px -1px; +} diff --git a/browser/themes/osx/newtab/newTab.css b/browser/themes/osx/newtab/newTab.css index 2c29f2e516a2..b603839c4ffe 100644 --- a/browser/themes/osx/newtab/newTab.css +++ b/browser/themes/osx/newtab/newTab.css @@ -194,3 +194,7 @@ .newtab-control-sponsored:hover { background-position: -265px -1px; } + +.newtab-control-sponsored[panelShown] { + background-position: -281px -1px; +} diff --git a/browser/themes/windows/newtab/newTab.css b/browser/themes/windows/newtab/newTab.css index 63498f6eb376..bfd15d712c79 100644 --- a/browser/themes/windows/newtab/newTab.css +++ b/browser/themes/windows/newtab/newTab.css @@ -186,3 +186,7 @@ .newtab-control-sponsored:hover { background-position: -265px -1px; } + +.newtab-control-sponsored[panelShown] { + background-position: -281px -1px; +} From b566dac1b0b476f476b816476552e8ad30f31248 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Sat, 29 Mar 2014 13:01:37 -0400 Subject: [PATCH 07/19] Bug 917226 - Build a canvas inspection tool, r=rcampbell, jryans --- browser/app/profile/firefox.js | 3 + .../devtools/canvasdebugger/canvasdebugger.js | 1270 +++++++++++++++++ .../canvasdebugger/canvasdebugger.xul | 131 ++ browser/devtools/canvasdebugger/moz.build | 12 + browser/devtools/canvasdebugger/panel.js | 72 + .../devtools/canvasdebugger/test/browser.ini | 34 + .../test/browser_canvas-actor-test-01.js | 18 + .../test/browser_canvas-actor-test-02.js | 77 + .../test/browser_canvas-actor-test-03.js | 75 + .../test/browser_canvas-actor-test-04.js | 80 ++ .../test/browser_canvas-actor-test-05.js | 45 + .../test/browser_canvas-actor-test-06.js | 95 ++ .../test/browser_canvas-actor-test-07.js | 94 ++ .../browser_canvas-frontend-call-highlight.js | 41 + .../test/browser_canvas-frontend-call-list.js | 70 + .../browser_canvas-frontend-call-search.js | 72 + .../browser_canvas-frontend-call-stack-01.js | 74 + .../browser_canvas-frontend-call-stack-02.js | 49 + .../browser_canvas-frontend-call-stack-03.js | 61 + .../test/browser_canvas-frontend-clear.js | 43 + ...browser_canvas-frontend-img-screenshots.js | 34 + ...owser_canvas-frontend-img-thumbnails-01.js | 65 + ...owser_canvas-frontend-img-thumbnails-02.js | 67 + .../test/browser_canvas-frontend-open.js | 41 + .../test/browser_canvas-frontend-record-01.js | 62 + .../test/browser_canvas-frontend-record-02.js | 73 + .../test/browser_canvas-frontend-record-03.js | 37 + .../test/browser_canvas-frontend-reload-01.js | 55 + .../test/browser_canvas-frontend-reload-02.js | 70 + .../test/browser_canvas-frontend-slider-01.js | 39 + .../test/browser_canvas-frontend-slider-02.js | 97 ++ ...browser_canvas-frontend-snapshot-select.js | 93 ++ .../test/browser_canvas-frontend-stepping.js | 76 + .../test/doc_simple-canvas-deep-stack.html | 46 + .../test/doc_simple-canvas-transparent.html | 37 + .../test/doc_simple-canvas.html | 37 + browser/devtools/canvasdebugger/test/head.js | 234 +++ .../devtools/canvasdebugger/test/moz.build | 6 + browser/devtools/debugger/debugger-view.js | 6 +- browser/devtools/debugger/debugger.xul | 2 +- browser/devtools/debugger/panel.js | 3 +- browser/devtools/debugger/test/head.js | 3 +- browser/devtools/jar.mn | 2 + browser/devtools/main.js | 30 +- browser/devtools/moz.build | 1 + .../netmonitor/netmonitor-controller.js | 15 +- browser/devtools/netmonitor/panel.js | 4 +- browser/devtools/shadereditor/moz.build | 1 - browser/devtools/shadereditor/panel.js | 10 +- browser/devtools/shadereditor/shadereditor.js | 1 - .../devtools/shared/widgets/ViewHelpers.jsm | 42 +- .../browser/devtools/canvasdebugger.dtd | 45 + .../devtools/canvasdebugger.properties | 74 + browser/locales/jar.mn | 2 + .../themes/linux/devtools/canvasdebugger.css | 5 + browser/themes/linux/jar.mn | 1 + .../themes/osx/devtools/canvasdebugger.css | 6 + browser/themes/osx/jar.mn | 1 + .../shared/devtools/canvasdebugger.inc.css | 501 +++++++ .../themes/shared/devtools/toolbars.inc.css | 1 + .../themes/shared/devtools/widgets.inc.css | 2 + .../windows/devtools/canvasdebugger.css | 5 + browser/themes/windows/jar.mn | 2 + toolkit/devtools/DevToolsUtils.js | 49 +- toolkit/devtools/Loader.jsm | 3 + toolkit/devtools/content-observer.js | 72 + .../devtools/server/actors/call-watcher.js | 559 ++++++++ toolkit/devtools/server/actors/canvas.js | 759 ++++++++++ toolkit/devtools/server/actors/webgl.js | 65 +- toolkit/devtools/server/main.js | 5 +- 70 files changed, 5761 insertions(+), 101 deletions(-) create mode 100644 browser/devtools/canvasdebugger/canvasdebugger.js create mode 100644 browser/devtools/canvasdebugger/canvasdebugger.xul create mode 100644 browser/devtools/canvasdebugger/moz.build create mode 100644 browser/devtools/canvasdebugger/panel.js create mode 100644 browser/devtools/canvasdebugger/test/browser.ini create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-actor-test-01.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-actor-test-02.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-actor-test-03.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-actor-test-04.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-actor-test-05.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-actor-test-06.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-actor-test-07.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-highlight.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-list.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-search.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-stack-01.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-stack-02.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-call-stack-03.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-clear.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-img-screenshots.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-img-thumbnails-01.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-img-thumbnails-02.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-open.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-record-01.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-record-02.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-record-03.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-reload-01.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-reload-02.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-slider-01.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-slider-02.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-snapshot-select.js create mode 100644 browser/devtools/canvasdebugger/test/browser_canvas-frontend-stepping.js create mode 100644 browser/devtools/canvasdebugger/test/doc_simple-canvas-deep-stack.html create mode 100644 browser/devtools/canvasdebugger/test/doc_simple-canvas-transparent.html create mode 100644 browser/devtools/canvasdebugger/test/doc_simple-canvas.html create mode 100644 browser/devtools/canvasdebugger/test/head.js create mode 100644 browser/devtools/canvasdebugger/test/moz.build create mode 100644 browser/locales/en-US/chrome/browser/devtools/canvasdebugger.dtd create mode 100644 browser/locales/en-US/chrome/browser/devtools/canvasdebugger.properties create mode 100644 browser/themes/linux/devtools/canvasdebugger.css create mode 100644 browser/themes/osx/devtools/canvasdebugger.css create mode 100644 browser/themes/shared/devtools/canvasdebugger.inc.css create mode 100644 browser/themes/windows/devtools/canvasdebugger.css create mode 100644 toolkit/devtools/content-observer.js create mode 100644 toolkit/devtools/server/actors/call-watcher.js create mode 100644 toolkit/devtools/server/actors/canvas.js diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 631b036d07aa..ee2bd803be12 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1205,6 +1205,9 @@ pref("devtools.styleeditor.autocompletion-enabled", true); // Enable the Shader Editor. pref("devtools.shadereditor.enabled", false); +// Enable the Canvas Debugger. +pref("devtools.canvasdebugger.enabled", false); + // Enable tools for Chrome development. pref("devtools.chrome.enabled", false); diff --git a/browser/devtools/canvasdebugger/canvasdebugger.js b/browser/devtools/canvasdebugger/canvasdebugger.js new file mode 100644 index 000000000000..9211919348a2 --- /dev/null +++ b/browser/devtools/canvasdebugger/canvasdebugger.js @@ -0,0 +1,1270 @@ +/* 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/. */ +"use strict"; + +const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; + +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource:///modules/devtools/SideMenuWidget.jsm"); +Cu.import("resource:///modules/devtools/ViewHelpers.jsm"); + +const require = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools.require; +const promise = Cu.import("resource://gre/modules/Promise.jsm", {}).Promise; +const EventEmitter = require("devtools/toolkit/event-emitter"); +const { CallWatcherFront } = require("devtools/server/actors/call-watcher"); +const { CanvasFront } = require("devtools/server/actors/canvas"); + +XPCOMUtils.defineLazyModuleGetter(this, "Task", + "resource://gre/modules/Task.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "PluralForm", + "resource://gre/modules/PluralForm.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "FileUtils", + "resource://gre/modules/FileUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", + "resource://gre/modules/NetUtil.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "DevToolsUtils", + "resource://gre/modules/devtools/DevToolsUtils.jsm"); + +// The panel's window global is an EventEmitter firing the following events: +const EVENTS = { + // When the UI is reset from tab navigation. + UI_RESET: "CanvasDebugger:UIReset", + + // When all the animation frame snapshots are removed by the user. + SNAPSHOTS_LIST_CLEARED: "CanvasDebugger:SnapshotsListCleared", + + // When an animation frame snapshot starts/finishes being recorded. + SNAPSHOT_RECORDING_STARTED: "CanvasDebugger:SnapshotRecordingStarted", + SNAPSHOT_RECORDING_FINISHED: "CanvasDebugger:SnapshotRecordingFinished", + + // When an animation frame snapshot was selected and all its data displayed. + SNAPSHOT_RECORDING_SELECTED: "CanvasDebugger:SnapshotRecordingSelected", + + // After all the function calls associated with an animation frame snapshot + // are displayed in the UI. + CALL_LIST_POPULATED: "CanvasDebugger:CallListPopulated", + + // After the stack associated with a call in an animation frame snapshot + // is displayed in the UI. + CALL_STACK_DISPLAYED: "CanvasDebugger:CallStackDisplayed", + + // After a screenshot associated with a call in an animation frame snapshot + // is displayed in the UI. + CALL_SCREENSHOT_DISPLAYED: "CanvasDebugger:ScreenshotDisplayed", + + // After all the thumbnails associated with an animation frame snapshot + // are displayed in the UI. + THUMBNAILS_DISPLAYED: "CanvasDebugger:ThumbnailsDisplayed", + + // When a source is shown in the JavaScript Debugger at a specific location. + SOURCE_SHOWN_IN_JS_DEBUGGER: "CanvasDebugger:SourceShownInJsDebugger", + SOURCE_NOT_FOUND_IN_JS_DEBUGGER: "CanvasDebugger:SourceNotFoundInJsDebugger" +}; + +const HTML_NS = "http://www.w3.org/1999/xhtml"; +const STRINGS_URI = "chrome://browser/locale/devtools/canvasdebugger.properties" + +const SNAPSHOT_START_RECORDING_DELAY = 10; // ms +const SNAPSHOT_DATA_EXPORT_MAX_BLOCK = 1000; // ms +const SNAPSHOT_DATA_DISPLAY_DELAY = 10; // ms +const SCREENSHOT_DISPLAY_DELAY = 100; // ms +const STACK_FUNC_INDENTATION = 14; // px + +// This identifier string is simply used to tentatively ascertain whether or not +// a JSON loaded from disk is actually something generated by this tool or not. +// It isn't, of course, a definitive verification, but a Good Enough™ +// approximation before continuing the import. Don't localize this. +const CALLS_LIST_SERIALIZER_IDENTIFIER = "Recorded Animation Frame Snapshot"; +const CALLS_LIST_SERIALIZER_VERSION = 1; +const CALLS_LIST_SLOW_SAVE_DELAY = 100; // ms + +/** + * The current target and the Canvas front, set by this tool's host. + */ +let gToolbox, gTarget, gFront; + +/** + * Initializes the canvas debugger controller and views. + */ +function startupCanvasDebugger() { + return promise.all([ + EventsHandler.initialize(), + SnapshotsListView.initialize(), + CallsListView.initialize() + ]); +} + +/** + * Destroys the canvas debugger controller and views. + */ +function shutdownCanvasDebugger() { + return promise.all([ + EventsHandler.destroy(), + SnapshotsListView.destroy(), + CallsListView.destroy() + ]); +} + +/** + * Functions handling target-related lifetime events. + */ +let EventsHandler = { + /** + * Listen for events emitted by the current tab target. + */ + initialize: function() { + this._onTabNavigated = this._onTabNavigated.bind(this); + gTarget.on("will-navigate", this._onTabNavigated); + gTarget.on("navigate", this._onTabNavigated); + }, + + /** + * Remove events emitted by the current tab target. + */ + destroy: function() { + gTarget.off("will-navigate", this._onTabNavigated); + gTarget.off("navigate", this._onTabNavigated); + }, + + /** + * Called for each location change in the debugged tab. + */ + _onTabNavigated: function(event) { + if (event != "will-navigate") { + return; + } + // Make sure the backend is prepared to handle contexts. + gFront.setup({ reload: false }); + + // Reset UI. + SnapshotsListView.empty(); + CallsListView.empty(); + + $("#record-snapshot").removeAttribute("checked"); + $("#record-snapshot").removeAttribute("disabled"); + $("#record-snapshot").hidden = false; + + $("#reload-notice").hidden = true; + $("#empty-notice").hidden = false; + $("#import-notice").hidden = true; + + $("#debugging-pane-contents").hidden = true; + $("#screenshot-container").hidden = true; + $("#snapshot-filmstrip").hidden = true; + + window.emit(EVENTS.UI_RESET); + } +}; + +/** + * Functions handling the recorded animation frame snapshots UI. + */ +let SnapshotsListView = Heritage.extend(WidgetMethods, { + /** + * Initialization function, called when the tool is started. + */ + initialize: function() { + this.widget = new SideMenuWidget($("#snapshots-list"), { + showArrows: true + }); + + this._onSelect = this._onSelect.bind(this); + this._onClearButtonClick = this._onClearButtonClick.bind(this); + this._onRecordButtonClick = this._onRecordButtonClick.bind(this); + this._onImportButtonClick = this._onImportButtonClick.bind(this); + this._onSaveButtonClick = this._onSaveButtonClick.bind(this); + + this.emptyText = L10N.getStr("noSnapshotsText"); + this.widget.addEventListener("select", this._onSelect, false); + }, + + /** + * Destruction function, called when the tool is closed. + */ + destroy: function() { + this.widget.removeEventListener("select", this._onSelect, false); + }, + + /** + * Adds a snapshot entry to this container. + * + * @return object + * The newly inserted item. + */ + addSnapshot: function() { + let contents = document.createElement("hbox"); + contents.className = "snapshot-item"; + + let thumbnail = document.createElementNS(HTML_NS, "canvas"); + thumbnail.className = "snapshot-item-thumbnail"; + thumbnail.width = CanvasFront.THUMBNAIL_HEIGHT; + thumbnail.height = CanvasFront.THUMBNAIL_HEIGHT; + + let title = document.createElement("label"); + title.className = "plain snapshot-item-title"; + title.setAttribute("value", + L10N.getFormatStr("snapshotsList.itemLabel", this.itemCount + 1)); + + let calls = document.createElement("label"); + calls.className = "plain snapshot-item-calls"; + calls.setAttribute("value", + L10N.getStr("snapshotsList.loadingLabel")); + + let save = document.createElement("label"); + save.className = "plain snapshot-item-save"; + save.addEventListener("click", this._onSaveButtonClick, false); + + let spacer = document.createElement("spacer"); + spacer.setAttribute("flex", "1"); + + let footer = document.createElement("hbox"); + footer.className = "snapshot-item-footer"; + footer.appendChild(save); + + let details = document.createElement("vbox"); + details.className = "snapshot-item-details"; + details.appendChild(title); + details.appendChild(calls); + details.appendChild(spacer); + details.appendChild(footer); + + contents.appendChild(thumbnail); + contents.appendChild(details); + + // Append a recorded snapshot item to this container. + return this.push([contents], { + attachment: { + // The snapshot and function call actors, along with the thumbnails + // will be available as soon as recording finishes. + actor: null, + calls: null, + thumbnails: null, + screenshot: null + } + }); + }, + + /** + * Customizes a shapshot in this container. + * + * @param Item snapshotItem + * An item inserted via `SnapshotsListView.addSnapshot`. + * @param object snapshotActor + * The frame snapshot actor received from the backend. + * @param object snapshotOverview + * Additional data about the snapshot received from the backend. + */ + customizeSnapshot: function(snapshotItem, snapshotActor, snapshotOverview) { + // Make sure the function call actors are stored on the item, + // to be used when populating the CallsListView. + snapshotItem.attachment.actor = snapshotActor; + let functionCalls = snapshotItem.attachment.calls = snapshotOverview.calls; + let thumbnails = snapshotItem.attachment.thumbnails = snapshotOverview.thumbnails; + let screenshot = snapshotItem.attachment.screenshot = snapshotOverview.screenshot; + + let lastThumbnail = thumbnails[thumbnails.length - 1]; + let { width, height, flipped, pixels } = lastThumbnail; + + let thumbnailNode = $(".snapshot-item-thumbnail", snapshotItem.target); + thumbnailNode.setAttribute("flipped", flipped); + drawImage(thumbnailNode, width, height, pixels, { centered: true }); + + let callsNode = $(".snapshot-item-calls", snapshotItem.target); + let drawCalls = functionCalls.filter(e => CanvasFront.DRAW_CALLS.has(e.name)); + + let drawCallsStr = PluralForm.get(drawCalls.length, + L10N.getStr("snapshotsList.drawCallsLabel")); + let funcCallsStr = PluralForm.get(functionCalls.length, + L10N.getStr("snapshotsList.functionCallsLabel")); + + callsNode.setAttribute("value", + drawCallsStr.replace("#1", drawCalls.length) + ", " + + funcCallsStr.replace("#1", functionCalls.length)); + + let saveNode = $(".snapshot-item-save", snapshotItem.target); + saveNode.setAttribute("disabled", !!snapshotItem.isLoadedFromDisk); + saveNode.setAttribute("value", snapshotItem.isLoadedFromDisk + ? L10N.getStr("snapshotsList.loadedLabel") + : L10N.getStr("snapshotsList.saveLabel")); + + // Make sure there's always a selected item available. + if (!this.selectedItem) { + this.selectedIndex = 0; + } + }, + + /** + * The select listener for this container. + */ + _onSelect: function({ detail: snapshotItem }) { + if (!snapshotItem) { + return; + } + let { calls, thumbnails, screenshot } = snapshotItem.attachment; + + $("#reload-notice").hidden = true; + $("#empty-notice").hidden = true; + $("#import-notice").hidden = false; + + $("#debugging-pane-contents").hidden = true; + $("#screenshot-container").hidden = true; + $("#snapshot-filmstrip").hidden = true; + + Task.spawn(function*() { + // Wait for a few milliseconds between presenting the function calls, + // screenshot and thumbnails, to allow each component being + // sequentially drawn. This gives the illusion of snappiness. + + yield DevToolsUtils.waitForTime(SNAPSHOT_DATA_DISPLAY_DELAY); + CallsListView.showCalls(calls); + $("#debugging-pane-contents").hidden = false; + $("#import-notice").hidden = true; + + yield DevToolsUtils.waitForTime(SNAPSHOT_DATA_DISPLAY_DELAY); + CallsListView.showThumbnails(thumbnails); + $("#snapshot-filmstrip").hidden = false; + + yield DevToolsUtils.waitForTime(SNAPSHOT_DATA_DISPLAY_DELAY); + CallsListView.showScreenshot(screenshot); + $("#screenshot-container").hidden = false; + + window.emit(EVENTS.SNAPSHOT_RECORDING_SELECTED); + }); + }, + + /** + * The click listener for the "clear" button in this container. + */ + _onClearButtonClick: function() { + Task.spawn(function*() { + SnapshotsListView.empty(); + CallsListView.empty(); + + $("#reload-notice").hidden = true; + $("#empty-notice").hidden = true; + $("#import-notice").hidden = true; + + if (yield gFront.isInitialized()) { + $("#empty-notice").hidden = false; + } else { + $("#reload-notice").hidden = false; + } + + $("#debugging-pane-contents").hidden = true; + $("#screenshot-container").hidden = true; + $("#snapshot-filmstrip").hidden = true; + + window.emit(EVENTS.SNAPSHOTS_LIST_CLEARED); + }); + }, + + /** + * The click listener for the "record" button in this container. + */ + _onRecordButtonClick: function() { + Task.spawn(function*() { + $("#record-snapshot").setAttribute("checked", "true"); + $("#record-snapshot").setAttribute("disabled", "true"); + + // Insert a "dummy" snapshot item in the view, to hint that recording + // has now started. However, wait for a few milliseconds before actually + // starting the recording, since that might block rendering and prevent + // the dummy snapshot item from being drawn. + let snapshotItem = this.addSnapshot(); + + // If this is the first item, immediately show the "Loading…" notice. + if (this.itemCount == 1) { + $("#empty-notice").hidden = true; + $("#import-notice").hidden = false; + } + + yield DevToolsUtils.waitForTime(SNAPSHOT_START_RECORDING_DELAY); + window.emit(EVENTS.SNAPSHOT_RECORDING_STARTED); + + let snapshotActor = yield gFront.recordAnimationFrame(); + let snapshotOverview = yield snapshotActor.getOverview(); + this.customizeSnapshot(snapshotItem, snapshotActor, snapshotOverview); + + $("#record-snapshot").removeAttribute("checked"); + $("#record-snapshot").removeAttribute("disabled"); + + window.emit(EVENTS.SNAPSHOT_RECORDING_FINISHED); + }.bind(this)); + }, + + /** + * The click listener for the "import" button in this container. + */ + _onImportButtonClick: function() { + let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); + fp.init(window, L10N.getStr("snapshotsList.saveDialogTitle"), Ci.nsIFilePicker.modeOpen); + fp.appendFilter(L10N.getStr("snapshotsList.saveDialogJSONFilter"), "*.json"); + fp.appendFilter(L10N.getStr("snapshotsList.saveDialogAllFilter"), "*.*"); + + if (fp.show() != Ci.nsIFilePicker.returnOK) { + return; + } + + let channel = NetUtil.newChannel(fp.file); + channel.contentType = "text/plain"; + + NetUtil.asyncFetch(channel, (inputStream, status) => { + if (!Components.isSuccessCode(status)) { + console.error("Could not import recorded animation frame snapshot file."); + return; + } + try { + let string = NetUtil.readInputStreamToString(inputStream, inputStream.available()); + var data = JSON.parse(string); + } catch (e) { + console.error("Could not read animation frame snapshot file."); + return; + } + if (data.fileType != CALLS_LIST_SERIALIZER_IDENTIFIER) { + console.error("Unrecognized animation frame snapshot file."); + return; + } + + // Add a `isLoadedFromDisk` flag on everything to avoid sending invalid + // requests to the backend, since we're not dealing with actors anymore. + let snapshotItem = this.addSnapshot(); + snapshotItem.isLoadedFromDisk = true; + data.calls.forEach(e => e.isLoadedFromDisk = true); + + // Create array buffers from the parsed pixel arrays. + for (let thumbnail of data.thumbnails) { + let thumbnailPixelsArray = thumbnail.pixels.split(","); + thumbnail.pixels = new Uint32Array(thumbnailPixelsArray); + } + let screenshotPixelsArray = data.screenshot.pixels.split(","); + data.screenshot.pixels = new Uint32Array(screenshotPixelsArray); + + this.customizeSnapshot(snapshotItem, data.calls, data); + }); + }, + + /** + * The click listener for the "save" button of each item in this container. + */ + _onSaveButtonClick: function(e) { + let snapshotItem = this.getItemForElement(e.target); + + let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); + fp.init(window, L10N.getStr("snapshotsList.saveDialogTitle"), Ci.nsIFilePicker.modeSave); + fp.appendFilter(L10N.getStr("snapshotsList.saveDialogJSONFilter"), "*.json"); + fp.appendFilter(L10N.getStr("snapshotsList.saveDialogAllFilter"), "*.*"); + fp.defaultString = "snapshot.json"; + + // Start serializing all the function call actors for the specified snapshot, + // while the nsIFilePicker dialog is being opened. Snappy. + let serialized = Task.spawn(function*() { + let data = { + fileType: CALLS_LIST_SERIALIZER_IDENTIFIER, + version: CALLS_LIST_SERIALIZER_VERSION, + calls: [], + thumbnails: [], + screenshot: null + }; + let functionCalls = snapshotItem.attachment.calls; + let thumbnails = snapshotItem.attachment.thumbnails; + let screenshot = snapshotItem.attachment.screenshot; + + // Prepare all the function calls for serialization. + yield DevToolsUtils.yieldingEach(functionCalls, (call, i) => { + let { type, name, file, line, argsPreview, callerPreview } = call; + return call.getDetails().then(({ stack }) => { + data.calls[i] = { + type: type, + name: name, + file: file, + line: line, + stack: stack, + argsPreview: argsPreview, + callerPreview: callerPreview + }; + }); + }); + + // Prepare all the thumbnails for serialization. + yield DevToolsUtils.yieldingEach(thumbnails, (thumbnail, i) => { + let { index, width, height, flipped, pixels } = thumbnail; + data.thumbnails.push({ + index: index, + width: width, + height: height, + flipped: flipped, + pixels: Array.join(pixels, ",") + }); + }); + + // Prepare the screenshot for serialization. + let { index, width, height, flipped, pixels } = screenshot; + data.screenshot = { + index: index, + width: width, + height: height, + flipped: flipped, + pixels: Array.join(pixels, ",") + }; + + let string = JSON.stringify(data); + let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]. + createInstance(Ci.nsIScriptableUnicodeConverter); + + converter.charset = "UTF-8"; + return converter.convertToInputStream(string); + }); + + // Open the nsIFilePicker and wait for the function call actors to finish + // being serialized, in order to save the generated JSON data to disk. + fp.open({ done: result => { + if (result == Ci.nsIFilePicker.returnCancel) { + return; + } + let footer = $(".snapshot-item-footer", snapshotItem.target); + let save = $(".snapshot-item-save", snapshotItem.target); + + // Show a throbber and a "Saving…" label if serializing isn't immediate. + setNamedTimeout("call-list-save", CALLS_LIST_SLOW_SAVE_DELAY, () => { + footer.setAttribute("saving", ""); + save.setAttribute("disabled", "true"); + save.setAttribute("value", L10N.getStr("snapshotsList.savingLabel")); + }); + + serialized.then(inputStream => { + let outputStream = FileUtils.openSafeFileOutputStream(fp.file); + + NetUtil.asyncCopy(inputStream, outputStream, status => { + if (!Components.isSuccessCode(status)) { + console.error("Could not save recorded animation frame snapshot file."); + } + clearNamedTimeout("call-list-save"); + footer.removeAttribute("saving"); + save.removeAttribute("disabled"); + save.setAttribute("value", L10N.getStr("snapshotsList.saveLabel")); + }); + }); + }}); + } +}); + +/** + * Functions handling details about a single recorded animation frame snapshot + * (the calls list, rendering preview, thumbnails filmstrip etc.). + */ +let CallsListView = Heritage.extend(WidgetMethods, { + /** + * Initialization function, called when the tool is started. + */ + initialize: function() { + this.widget = new SideMenuWidget($("#calls-list")); + this._slider = $("#calls-slider"); + this._searchbox = $("#calls-searchbox"); + this._filmstrip = $("#snapshot-filmstrip"); + + this._onSelect = this._onSelect.bind(this); + this._onSlideMouseDown = this._onSlideMouseDown.bind(this); + this._onSlideMouseUp = this._onSlideMouseUp.bind(this); + this._onSlide = this._onSlide.bind(this); + this._onSearch = this._onSearch.bind(this); + this._onScroll = this._onScroll.bind(this); + this._onExpand = this._onExpand.bind(this); + this._onStackFileClick = this._onStackFileClick.bind(this); + this._onThumbnailClick = this._onThumbnailClick.bind(this); + + this.widget.addEventListener("select", this._onSelect, false); + this._slider.addEventListener("mousedown", this._onSlideMouseDown, false); + this._slider.addEventListener("mouseup", this._onSlideMouseUp, false); + this._slider.addEventListener("change", this._onSlide, false); + this._searchbox.addEventListener("input", this._onSearch, false); + this._filmstrip.addEventListener("wheel", this._onScroll, false); + }, + + /** + * Destruction function, called when the tool is closed. + */ + destroy: function() { + this.widget.removeEventListener("select", this._onSelect, false); + this._slider.removeEventListener("mousedown", this._onSlideMouseDown, false); + this._slider.removeEventListener("mouseup", this._onSlideMouseUp, false); + this._slider.removeEventListener("change", this._onSlide, false); + this._searchbox.removeEventListener("input", this._onSearch, false); + this._filmstrip.removeEventListener("wheel", this._onScroll, false); + }, + + /** + * Populates this container with a list of function calls. + * + * @param array functionCalls + * A list of function call actors received from the backend. + */ + showCalls: function(functionCalls) { + this.empty(); + + for (let i = 0, len = functionCalls.length; i < len; i++) { + let call = functionCalls[i]; + + let view = document.createElement("vbox"); + view.className = "call-item-view devtools-monospace"; + view.setAttribute("flex", "1"); + + let contents = document.createElement("hbox"); + contents.className = "call-item-contents"; + contents.setAttribute("align", "center"); + contents.addEventListener("dblclick", this._onExpand); + view.appendChild(contents); + + let index = document.createElement("label"); + index.className = "plain call-item-index"; + index.setAttribute("flex", "1"); + index.setAttribute("value", i + 1); + + let gutter = document.createElement("hbox"); + gutter.className = "call-item-gutter"; + gutter.appendChild(index); + contents.appendChild(gutter); + + // Not all function calls have a caller that was stringified (e.g. + // context calls have a "gl" or "ctx" caller preview). + if (call.callerPreview) { + let context = document.createElement("label"); + context.className = "plain call-item-context"; + context.setAttribute("value", call.callerPreview); + contents.appendChild(context); + + let separator = document.createElement("label"); + separator.className = "plain call-item-separator"; + separator.setAttribute("value", "."); + contents.appendChild(separator); + } + + let name = document.createElement("label"); + name.className = "plain call-item-name"; + name.setAttribute("value", call.name); + contents.appendChild(name); + + let argsPreview = document.createElement("label"); + argsPreview.className = "plain call-item-args"; + argsPreview.setAttribute("crop", "end"); + argsPreview.setAttribute("flex", "100"); + // Getters and setters are displayed differently from regular methods. + if (call.type == CallWatcherFront.METHOD_FUNCTION) { + argsPreview.setAttribute("value", "(" + call.argsPreview + ")"); + } else { + argsPreview.setAttribute("value", " = " + call.argsPreview); + } + contents.appendChild(argsPreview); + + let location = document.createElement("label"); + location.className = "plain call-item-location"; + location.setAttribute("value", getFileName(call.file) + ":" + call.line); + location.setAttribute("crop", "start"); + location.setAttribute("flex", "1"); + location.addEventListener("mousedown", this._onExpand); + contents.appendChild(location); + + // Append a function call item to this container. + this.push([view], { + staged: true, + attachment: { + actor: call + } + }); + + // Highlight certain calls that are probably more interesting than + // everything else, making it easier to quickly glance over them. + if (CanvasFront.DRAW_CALLS.has(call.name)) { + view.setAttribute("draw-call", ""); + } + if (CanvasFront.INTERESTING_CALLS.has(call.name)) { + view.setAttribute("interesting-call", ""); + } + } + + // Flushes all the prepared function call items into this container. + this.commit(); + window.emit(EVENTS.CALL_LIST_POPULATED); + + // Resetting the function selection slider's value (shown in this + // container's toolbar) would trigger a selection event, which should be + // ignored in this case. + this._ignoreSliderChanges = true; + this._slider.value = 0; + this._slider.max = functionCalls.length - 1; + this._ignoreSliderChanges = false; + }, + + /** + * Displays an image in the rendering preview of this container, generated + * for the specified draw call in the recorded animation frame snapshot. + * + * @param array screenshot + * A single "snapshot-image" instance received from the backend. + */ + showScreenshot: function(screenshot) { + let { index, width, height, flipped, pixels } = screenshot; + + let screenshotNode = $("#screenshot-image"); + screenshotNode.setAttribute("flipped", flipped); + drawBackground("screenshot-rendering", width, height, pixels); + + let dimensionsNode = $("#screenshot-dimensions"); + dimensionsNode.setAttribute("value", ~~width + " x " + ~~height); + + window.emit(EVENTS.CALL_SCREENSHOT_DISPLAYED); + }, + + /** + * Populates this container's footer with a list of thumbnails, one generated + * for each draw call in the recorded animation frame snapshot. + * + * @param array thumbnails + * An array of "snapshot-image" instances received from the backend. + */ + showThumbnails: function(thumbnails) { + while (this._filmstrip.hasChildNodes()) { + this._filmstrip.firstChild.remove(); + } + for (let thumbnail of thumbnails) { + this.appendThumbnail(thumbnail); + } + + window.emit(EVENTS.THUMBNAILS_DISPLAYED); + }, + + /** + * Displays an image in the thumbnails list of this container, generated + * for the specified draw call in the recorded animation frame snapshot. + * + * @param array thumbnail + * A single "snapshot-image" instance received from the backend. + */ + appendThumbnail: function(thumbnail) { + let { index, width, height, flipped, pixels } = thumbnail; + + let thumbnailNode = document.createElementNS(HTML_NS, "canvas"); + thumbnailNode.setAttribute("flipped", flipped); + thumbnailNode.width = Math.max(CanvasFront.THUMBNAIL_HEIGHT, width); + thumbnailNode.height = Math.max(CanvasFront.THUMBNAIL_HEIGHT, height); + drawImage(thumbnailNode, width, height, pixels, { centered: true }); + + thumbnailNode.className = "filmstrip-thumbnail"; + thumbnailNode.onmousedown = e => this._onThumbnailClick(e, index); + thumbnailNode.setAttribute("index", index); + this._filmstrip.appendChild(thumbnailNode); + }, + + /** + * Sets the currently highlighted thumbnail in this container. + * A screenshot will always correlate to a thumbnail in the filmstrip, + * both being identified by the same 'index' of the context function call. + * + * @param number index + * The context function call's index. + */ + set highlightedThumbnail(index) { + let currHighlightedThumbnail = $(".filmstrip-thumbnail[index='" + index + "']"); + if (currHighlightedThumbnail == null) { + return; + } + + let prevIndex = this._highlightedThumbnailIndex + let prevHighlightedThumbnail = $(".filmstrip-thumbnail[index='" + prevIndex + "']"); + if (prevHighlightedThumbnail) { + prevHighlightedThumbnail.removeAttribute("highlighted"); + } + + currHighlightedThumbnail.setAttribute("highlighted", ""); + currHighlightedThumbnail.scrollIntoView(); + this._highlightedThumbnailIndex = index; + }, + + /** + * Gets the currently highlighted thumbnail in this container. + * @return number + */ + get highlightedThumbnail() { + return this._highlightedThumbnailIndex; + }, + + /** + * The select listener for this container. + */ + _onSelect: function({ detail: callItem }) { + if (!callItem) { + return; + } + + // Some of the stepping buttons don't make sense specifically while the + // last function call is selected. + if (this.selectedIndex == this.itemCount - 1) { + $("#resume").setAttribute("disabled", "true"); + $("#step-over").setAttribute("disabled", "true"); + $("#step-out").setAttribute("disabled", "true"); + } else { + $("#resume").removeAttribute("disabled"); + $("#step-over").removeAttribute("disabled"); + $("#step-out").removeAttribute("disabled"); + } + + // Correlate the currently selected item with the function selection + // slider's value. Avoid triggering a redundant selection event. + this._ignoreSliderChanges = true; + this._slider.value = this.selectedIndex; + this._ignoreSliderChanges = false; + + // Can't generate screenshots for function call actors loaded from disk. + // XXX: Bug 984844. + if (callItem.attachment.actor.isLoadedFromDisk) { + return; + } + + // To keep continuous selection buttery smooth (for example, while pressing + // the DOWN key or moving the slider), only display the screenshot after + // any kind of user input stops. + setConditionalTimeout("screenshot-display", SCREENSHOT_DISPLAY_DELAY, () => { + return !this._isSliding; + }, () => { + let frameSnapshot = SnapshotsListView.selectedItem.attachment.actor + let functionCall = callItem.attachment.actor; + frameSnapshot.generateScreenshotFor(functionCall).then(screenshot => { + this.showScreenshot(screenshot); + this.highlightedThumbnail = screenshot.index; + }); + }); + }, + + /** + * The mousedown listener for the call selection slider. + */ + _onSlideMouseDown: function() { + this._isSliding = true; + }, + + /** + * The mouseup listener for the call selection slider. + */ + _onSlideMouseUp: function() { + this._isSliding = false; + }, + + /** + * The change listener for the call selection slider. + */ + _onSlide: function() { + // Avoid performing any operations when programatically changing the value. + if (this._ignoreSliderChanges) { + return; + } + let selectedFunctionCallIndex = this.selectedIndex = this._slider.value; + + // While sliding, immediately show the most relevant thumbnail for a + // function call, for a nice diff-like animation effect between draws. + let thumbnails = SnapshotsListView.selectedItem.attachment.thumbnails; + let thumbnail = getThumbnailForCall(thumbnails, selectedFunctionCallIndex); + + // Avoid drawing and highlighting if the selected function call has the + // same thumbnail as the last one. + if (thumbnail.index == this.highlightedThumbnail) { + return; + } + // If a thumbnail wasn't found (e.g. the backend avoids creating thumbnails + // when rendering offscreen), simply defer to the first available one. + if (thumbnail.index == -1) { + thumbnail = thumbnails[0]; + } + + let { index, width, height, flipped, pixels } = thumbnail; + this.highlightedThumbnail = index; + + let screenshotNode = $("#screenshot-image"); + screenshotNode.setAttribute("flipped", flipped); + drawBackground("screenshot-rendering", width, height, pixels); + }, + + /** + * The input listener for the calls searchbox. + */ + _onSearch: function(e) { + let lowerCaseSearchToken = this._searchbox.value.toLowerCase(); + + this.filterContents(e => { + let call = e.attachment.actor; + let name = call.name.toLowerCase(); + let file = call.file.toLowerCase(); + let line = call.line.toString().toLowerCase(); + let args = call.argsPreview.toLowerCase(); + + return name.contains(lowerCaseSearchToken) || + file.contains(lowerCaseSearchToken) || + line.contains(lowerCaseSearchToken) || + args.contains(lowerCaseSearchToken); + }); + }, + + /** + * The wheel listener for the filmstrip that contains all the thumbnails. + */ + _onScroll: function(e) { + this._filmstrip.scrollLeft += e.deltaX; + }, + + /** + * The click/dblclick listener for an item or location url in this container. + * When expanding an item, it's corresponding call stack will be displayed. + */ + _onExpand: function(e) { + let callItem = this.getItemForElement(e.target); + let view = $(".call-item-view", callItem.target); + + // If the call stack nodes were already created, simply re-show them + // or jump to the corresponding file and line in the Debugger if a + // location link was clicked. + if (view.hasAttribute("call-stack-populated")) { + let isExpanded = view.getAttribute("call-stack-expanded") == "true"; + + // If clicking on the location, jump to the Debugger. + if (e.target.classList.contains("call-item-location")) { + let { file, line } = callItem.attachment.actor; + viewSourceInDebugger(file, line); + return; + } + // Otherwise hide the call stack. + else { + view.setAttribute("call-stack-expanded", !isExpanded); + $(".call-item-stack", view).hidden = isExpanded; + return; + } + } + + let list = document.createElement("vbox"); + list.className = "call-item-stack"; + view.setAttribute("call-stack-populated", ""); + view.setAttribute("call-stack-expanded", "true"); + view.appendChild(list); + + /** + * Creates a function call nodes in this container for a stack. + */ + let display = stack => { + for (let i = 1; i < stack.length; i++) { + let call = stack[i]; + + let contents = document.createElement("hbox"); + contents.className = "call-item-stack-fn"; + contents.style.MozPaddingStart = (i * STACK_FUNC_INDENTATION) + "px"; + + let name = document.createElement("label"); + name.className = "plain call-item-stack-fn-name"; + name.setAttribute("value", "↳ " + call.name + "()"); + contents.appendChild(name); + + let spacer = document.createElement("spacer"); + spacer.setAttribute("flex", "100"); + contents.appendChild(spacer); + + let location = document.createElement("label"); + location.className = "plain call-item-stack-fn-location"; + location.setAttribute("value", getFileName(call.file) + ":" + call.line); + location.setAttribute("crop", "start"); + location.setAttribute("flex", "1"); + location.addEventListener("mousedown", e => this._onStackFileClick(e, call)); + contents.appendChild(location); + + list.appendChild(contents); + } + + window.emit(EVENTS.CALL_STACK_DISPLAYED); + }; + + // If this animation snapshot is loaded from disk, there are no corresponding + // backend actors available and the data is immediately available. + let functionCall = callItem.attachment.actor; + if (functionCall.isLoadedFromDisk) { + display(functionCall.stack); + } + // ..otherwise we need to request the function call stack from the backend. + else { + callItem.attachment.actor.getDetails().then(fn => display(fn.stack)); + } + }, + + /** + * The click listener for a location link in the call stack. + * + * @param string file + * The url of the source owning the function. + * @param number line + * The line of the respective function. + */ + _onStackFileClick: function(e, { file, line }) { + viewSourceInDebugger(file, line); + }, + + /** + * The click listener for a thumbnail in the filmstrip. + * + * @param number index + * The function index in the recorded animation frame snapshot. + */ + _onThumbnailClick: function(e, index) { + this.selectedIndex = index; + }, + + /** + * The click listener for the "resume" button in this container's toolbar. + */ + _onResume: function() { + // Jump to the next draw call in the recorded animation frame snapshot. + let drawCall = getNextDrawCall(this.items, this.selectedItem); + if (drawCall) { + this.selectedItem = drawCall; + return; + } + + // If there are no more draw calls, just jump to the last context call. + this._onStepOut(); + }, + + /** + * The click listener for the "step over" button in this container's toolbar. + */ + _onStepOver: function() { + this.selectedIndex++; + }, + + /** + * The click listener for the "step in" button in this container's toolbar. + */ + _onStepIn: function() { + if (this.selectedIndex == -1) { + this._onResume(); + return; + } + let callItem = this.selectedItem; + let { file, line } = callItem.attachment.actor; + viewSourceInDebugger(file, line); + }, + + /** + * The click listener for the "step out" button in this container's toolbar. + */ + _onStepOut: function() { + this.selectedIndex = this.itemCount - 1; + } +}); + +/** + * Localization convenience methods. + */ +let L10N = new ViewHelpers.L10N(STRINGS_URI); + +/** + * Convenient way of emitting events from the panel window. + */ +EventEmitter.decorate(this); + +/** + * DOM query helpers. + */ +function $(selector, target = document) target.querySelector(selector); +function $all(selector, target = document) target.querySelectorAll(selector); + +/** + * Helper for getting an nsIURL instance out of a string. + */ +function nsIURL(url, store = nsIURL.store) { + if (store.has(url)) { + return store.get(url); + } + let uri = Services.io.newURI(url, null, null).QueryInterface(Ci.nsIURL); + store.set(url, uri); + return uri; +} + +// The cache used in the `nsIURL` function. +nsIURL.store = new Map(); + +/** + * Gets the fileName part of a string which happens to be an URL. + */ +function getFileName(url) { + try { + let { fileName } = nsIURL(url); + return fileName || "/"; + } catch (e) { + // This doesn't look like a url, or nsIURL can't handle it. + return ""; + } +} + +/** + * Gets an image data object containing a buffer large enough to hold + * width * height pixels. + * + * This method avoids allocating memory and tries to reuse a common buffer + * as much as possible. + * + * @param number w + * The desired image data storage width. + * @param number h + * The desired image data storage height. + * @return ImageData + * The requested image data buffer. + */ +function getImageDataStorage(ctx, w, h) { + let storage = getImageDataStorage.cache; + if (storage && storage.width == w && storage.height == h) { + return storage; + } + return getImageDataStorage.cache = ctx.createImageData(w, h); +} + +// The cache used in the `getImageDataStorage` function. +getImageDataStorage.cache = null; + +/** + * Draws image data into a canvas. + * + * This method makes absolutely no assumptions about the canvas element + * dimensions, or pre-existing rendering. It's a dumb proxy that copies pixels. + * + * @param HTMLCanvasElement canvas + * The canvas element to put the image data into. + * @param number width + * The image data width. + * @param number height + * The image data height. + * @param pixels + * An array buffer view of the image data. + * @param object options + * Additional options supported by this operation: + * - centered: specifies whether the image data should be centered + * when copied in the canvas; this is useful when the + * supplied pixels don't completely cover the canvas. + */ +function drawImage(canvas, width, height, pixels, options = {}) { + let ctx = canvas.getContext("2d"); + + // FrameSnapshot actors return "snapshot-image" type instances with just an + // empty pixel array if the source image is completely transparent. + if (pixels.length <= 1) { + ctx.clearRect(0, 0, canvas.width, canvas.height); + return; + } + + let arrayBuffer = new Uint8Array(pixels.buffer); + let imageData = getImageDataStorage(ctx, width, height); + imageData.data.set(arrayBuffer); + + if (options.centered) { + let left = (canvas.width - width) / 2; + let top = (canvas.height - height) / 2; + ctx.putImageData(imageData, left, top); + } else { + ctx.putImageData(imageData, 0, 0); + } +} + +/** + * Draws image data into a canvas, and sets that as the rendering source for + * an element with the specified id as the -moz-element background image. + * + * @param string id + * The id of the -moz-element background image. + * @param number width + * The image data width. + * @param number height + * The image data height. + * @param pixels + * An array buffer view of the image data. + */ +function drawBackground(id, width, height, pixels) { + let canvas = document.createElementNS(HTML_NS, "canvas"); + canvas.width = width; + canvas.height = height; + + drawImage(canvas, width, height, pixels); + document.mozSetImageElement(id, canvas); + + // Used in tests. Not emitting an event because this shouldn't be "interesting". + if (window._onMozSetImageElement) { + window._onMozSetImageElement(pixels); + } +} + +/** + * Iterates forward to find the next draw call in a snapshot. + */ +function getNextDrawCall(calls, call) { + for (let i = calls.indexOf(call) + 1, len = calls.length; i < len; i++) { + let nextCall = calls[i]; + let name = nextCall.attachment.actor.name; + if (CanvasFront.DRAW_CALLS.has(name)) { + return nextCall; + } + } + return null; +} + +/** + * Iterates backwards to find the most recent screenshot for a function call + * in a snapshot loaded from disk. + */ +function getScreenshotFromCallLoadedFromDisk(calls, call) { + for (let i = calls.indexOf(call); i >= 0; i--) { + let prevCall = calls[i]; + let screenshot = prevCall.screenshot; + if (screenshot) { + return screenshot; + } + } + return CanvasFront.INVALID_SNAPSHOT_IMAGE; +} + +/** + * Iterates backwards to find the most recent thumbnail for a function call. + */ +function getThumbnailForCall(thumbnails, index) { + for (let i = thumbnails.length - 1; i >= 0; i--) { + let thumbnail = thumbnails[i]; + if (thumbnail.index <= index) { + return thumbnail; + } + } + return CanvasFront.INVALID_SNAPSHOT_IMAGE; +} + +/** + * Opens/selects the debugger in this toolbox and jumps to the specified + * file name and line number. + */ +function viewSourceInDebugger(url, line) { + let showSource = ({ DebuggerView }) => { + if (DebuggerView.Sources.containsValue(url)) { + DebuggerView.setEditorLocation(url, line, { noDebug: true }).then(() => { + window.emit(EVENTS.SOURCE_SHOWN_IN_JS_DEBUGGER); + }, () => { + window.emit(EVENTS.SOURCE_NOT_FOUND_IN_JS_DEBUGGER); + }); + } + } + + // If the Debugger was already open, switch to it and try to show the + // source immediately. Otherwise, initialize it and wait for the sources + // to be added first. + let debuggerAlreadyOpen = gToolbox.getPanel("jsdebugger"); + gToolbox.selectTool("jsdebugger").then(({ panelWin: dbg }) => { + if (debuggerAlreadyOpen) { + showSource(dbg); + } else { + dbg.once(dbg.EVENTS.SOURCES_ADDED, () => showSource(dbg)); + } + }); +} diff --git a/browser/devtools/canvasdebugger/canvasdebugger.xul b/browser/devtools/canvasdebugger/canvasdebugger.xul new file mode 100644 index 000000000000..7ff241435fd5 --- /dev/null +++ b/browser/devtools/canvasdebugger/canvasdebugger.xul @@ -0,0 +1,131 @@ + + + + + + + + + %canvasDebuggerDTD; +]> + + + + + + diff --git a/browser/devtools/canvasdebugger/test/doc_simple-canvas-transparent.html b/browser/devtools/canvasdebugger/test/doc_simple-canvas-transparent.html new file mode 100644 index 000000000000..f8daf1e24ff3 --- /dev/null +++ b/browser/devtools/canvasdebugger/test/doc_simple-canvas-transparent.html @@ -0,0 +1,37 @@ + + + + + + + Canvas inspector test page + + + + + + + + + diff --git a/browser/devtools/canvasdebugger/test/doc_simple-canvas.html b/browser/devtools/canvasdebugger/test/doc_simple-canvas.html new file mode 100644 index 000000000000..4fe6b587a71a --- /dev/null +++ b/browser/devtools/canvasdebugger/test/doc_simple-canvas.html @@ -0,0 +1,37 @@ + + + + + + + Canvas inspector test page + + + + + + + + + diff --git a/browser/devtools/canvasdebugger/test/head.js b/browser/devtools/canvasdebugger/test/head.js new file mode 100644 index 000000000000..889d09198bae --- /dev/null +++ b/browser/devtools/canvasdebugger/test/head.js @@ -0,0 +1,234 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ +"use strict"; + +const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; + +let { Services } = Cu.import("resource://gre/modules/Services.jsm", {}); + +// Disable logging for all the tests. Both the debugger server and frontend will +// be affected by this pref. +let gEnableLogging = Services.prefs.getBoolPref("devtools.debugger.log"); +Services.prefs.setBoolPref("devtools.debugger.log", false); + +let { Task } = Cu.import("resource://gre/modules/Task.jsm", {}); +let { Promise: promise } = Cu.import("resource://gre/modules/Promise.jsm", {}); +let { gDevTools } = Cu.import("resource:///modules/devtools/gDevTools.jsm", {}); +let { devtools } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}); +let { DebuggerServer } = Cu.import("resource://gre/modules/devtools/dbg-server.jsm", {}); +let { DebuggerClient } = Cu.import("resource://gre/modules/devtools/dbg-client.jsm", {}); + +let { CallWatcherFront } = devtools.require("devtools/server/actors/call-watcher"); +let { CanvasFront } = devtools.require("devtools/server/actors/canvas"); +let TiltGL = devtools.require("devtools/tilt/tilt-gl"); +let TargetFactory = devtools.TargetFactory; +let Toolbox = devtools.Toolbox; + +const EXAMPLE_URL = "http://example.com/browser/browser/devtools/canvasdebugger/test/"; +const SIMPLE_CANVAS_URL = EXAMPLE_URL + "doc_simple-canvas.html"; +const SIMPLE_CANVAS_TRANSPARENT_URL = EXAMPLE_URL + "doc_simple-canvas-transparent.html"; +const SIMPLE_CANVAS_DEEP_STACK_URL = EXAMPLE_URL + "doc_simple-canvas-deep-stack.html"; + +// All tests are asynchronous. +waitForExplicitFinish(); + +let gToolEnabled = Services.prefs.getBoolPref("devtools.canvasdebugger.enabled"); + +registerCleanupFunction(() => { + info("finish() was called, cleaning up..."); + Services.prefs.setBoolPref("devtools.debugger.log", gEnableLogging); + Services.prefs.setBoolPref("devtools.canvasdebugger.enabled", gToolEnabled); + + // Some of yhese tests use a lot of memory due to GL contexts, so force a GC + // to help fragmentation. + info("Forcing GC after canvas debugger test."); + Cu.forceGC(); +}); + +function addTab(aUrl, aWindow) { + info("Adding tab: " + aUrl); + + let deferred = promise.defer(); + let targetWindow = aWindow || window; + let targetBrowser = targetWindow.gBrowser; + + targetWindow.focus(); + let tab = targetBrowser.selectedTab = targetBrowser.addTab(aUrl); + let linkedBrowser = tab.linkedBrowser; + + linkedBrowser.addEventListener("load", function onLoad() { + linkedBrowser.removeEventListener("load", onLoad, true); + info("Tab added and finished loading: " + aUrl); + deferred.resolve(tab); + }, true); + + return deferred.promise; +} + +function removeTab(aTab, aWindow) { + info("Removing tab."); + + let deferred = promise.defer(); + let targetWindow = aWindow || window; + let targetBrowser = targetWindow.gBrowser; + let tabContainer = targetBrowser.tabContainer; + + tabContainer.addEventListener("TabClose", function onClose(aEvent) { + tabContainer.removeEventListener("TabClose", onClose, false); + info("Tab removed and finished closing."); + deferred.resolve(); + }, false); + + targetBrowser.removeTab(aTab); + return deferred.promise; +} + +function handleError(aError) { + ok(false, "Got an error: " + aError.message + "\n" + aError.stack); + finish(); +} + +let gRequiresWebGL = false; + +function ifTestingSupported() { + ok(false, "You need to define a 'ifTestingSupported' function."); + finish(); +} + +function ifTestingUnsupported() { + todo(false, "Skipping test because some required functionality isn't supported."); + finish(); +} + +function test() { + let generator = isTestingSupported() ? ifTestingSupported : ifTestingUnsupported; + Task.spawn(generator).then(null, handleError); +} + +function createCanvas() { + return document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"); +} + +function isTestingSupported() { + if (!gRequiresWebGL) { + info("This test does not require WebGL support."); + return true; + } + + let supported = + !TiltGL.isWebGLForceEnabled() && + TiltGL.isWebGLSupported() && + TiltGL.create3DContext(createCanvas()); + + info("This test requires WebGL support."); + info("Apparently, WebGL is" + (supported ? "" : " not") + " supported."); + return supported; +} + +function once(aTarget, aEventName, aUseCapture = false) { + info("Waiting for event: '" + aEventName + "' on " + aTarget + "."); + + let deferred = promise.defer(); + + for (let [add, remove] of [ + ["on", "off"], // Use event emitter before DOM events for consistency + ["addEventListener", "removeEventListener"], + ["addListener", "removeListener"] + ]) { + if ((add in aTarget) && (remove in aTarget)) { + aTarget[add](aEventName, function onEvent(...aArgs) { + aTarget[remove](aEventName, onEvent, aUseCapture); + deferred.resolve(...aArgs); + }, aUseCapture); + break; + } + } + + return deferred.promise; +} + +function waitForTick() { + let deferred = promise.defer(); + executeSoon(deferred.resolve); + return deferred.promise; +} + +function navigateInHistory(aTarget, aDirection, aWaitForTargetEvent = "navigate") { + executeSoon(() => content.history[aDirection]()); + return once(aTarget, aWaitForTargetEvent); +} + +function navigate(aTarget, aUrl, aWaitForTargetEvent = "navigate") { + executeSoon(() => aTarget.activeTab.navigateTo(aUrl)); + return once(aTarget, aWaitForTargetEvent); +} + +function reload(aTarget, aWaitForTargetEvent = "navigate") { + executeSoon(() => aTarget.activeTab.reload()); + return once(aTarget, aWaitForTargetEvent); +} + +function initServer() { + if (!DebuggerServer.initialized) { + DebuggerServer.init(() => true); + DebuggerServer.addBrowserActors(); + } +} + +function initCallWatcherBackend(aUrl) { + info("Initializing a call watcher front."); + initServer(); + + return Task.spawn(function*() { + let tab = yield addTab(aUrl); + let target = TargetFactory.forTab(tab); + let debuggee = target.window.wrappedJSObject; + + yield target.makeRemote(); + + let front = new CallWatcherFront(target.client, target.form); + return [target, debuggee, front]; + }); +} + +function initCanavsDebuggerBackend(aUrl) { + info("Initializing a canvas debugger front."); + initServer(); + + return Task.spawn(function*() { + let tab = yield addTab(aUrl); + let target = TargetFactory.forTab(tab); + let debuggee = target.window.wrappedJSObject; + + yield target.makeRemote(); + + let front = new CanvasFront(target.client, target.form); + return [target, debuggee, front]; + }); +} + +function initCanavsDebuggerFrontend(aUrl) { + info("Initializing a canvas debugger pane."); + + return Task.spawn(function*() { + let tab = yield addTab(aUrl); + let target = TargetFactory.forTab(tab); + let debuggee = target.window.wrappedJSObject; + + yield target.makeRemote(); + + Services.prefs.setBoolPref("devtools.canvasdebugger.enabled", true); + let toolbox = yield gDevTools.showToolbox(target, "canvasdebugger"); + let panel = toolbox.getCurrentPanel(); + return [target, debuggee, panel]; + }); +} + +function teardown(aPanel) { + info("Destroying the specified canvas debugger."); + + return promise.all([ + once(aPanel, "destroyed"), + removeTab(aPanel.target.tab) + ]); +} diff --git a/browser/devtools/canvasdebugger/test/moz.build b/browser/devtools/canvasdebugger/test/moz.build new file mode 100644 index 000000000000..a21913edfc3e --- /dev/null +++ b/browser/devtools/canvasdebugger/test/moz.build @@ -0,0 +1,6 @@ +# vim: set filetype=python: +# 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/. + +BROWSER_CHROME_MANIFESTS += ['browser.ini'] diff --git a/browser/devtools/debugger/debugger-view.js b/browser/devtools/debugger/debugger-view.js index 14af8f0a0dfa..9ce42d4c91af 100644 --- a/browser/devtools/debugger/debugger-view.js +++ b/browser/devtools/debugger/debugger-view.js @@ -390,8 +390,7 @@ let DebuggerView = { this._setEditorText(L10N.getStr("loadingText")); this._editorSource = { url: aSource.url, promise: deferred.promise }; - DebuggerController.SourceScripts.getText(aSource) - .then(([, aText, aContentType]) => { + DebuggerController.SourceScripts.getText(aSource).then(([, aText, aContentType]) => { // Avoid setting an unexpected source. This may happen when switching // very fast between sources that haven't been fetched yet. if (this._editorSource.url != aSource.url) { @@ -469,8 +468,7 @@ let DebuggerView = { // Make sure the requested source client is shown in the editor, then // update the source editor's caret position and debug location. - return this._setEditorSource(sourceForm, aFlags) - .then(([,, aContentType]) => { + return this._setEditorSource(sourceForm, aFlags).then(([,, aContentType]) => { // Record the contentType learned from fetching sourceForm.contentType = aContentType; // Line numbers in the source editor should start from 1. If invalid diff --git a/browser/devtools/debugger/debugger.xul b/browser/devtools/debugger/debugger.xul index fc5bb167807e..59bb3354016d 100644 --- a/browser/devtools/debugger/debugger.xul +++ b/browser/devtools/debugger/debugger.xul @@ -434,7 +434,7 @@ - + diff --git a/browser/devtools/debugger/panel.js b/browser/devtools/debugger/panel.js index 511f66c78cf2..3b01d9633002 100644 --- a/browser/devtools/debugger/panel.js +++ b/browser/devtools/debugger/panel.js @@ -8,7 +8,6 @@ const { Cc, Ci, Cu, Cr } = require("chrome"); const promise = require("sdk/core/promise"); const EventEmitter = require("devtools/toolkit/event-emitter"); - const { DevToolsUtils } = Cu.import("resource://gre/modules/devtools/DevToolsUtils.jsm", {}); function DebuggerPanel(iframeWindow, toolbox) { @@ -60,7 +59,7 @@ DebuggerPanel.prototype = { return this; }) .then(null, function onError(aReason) { - DevToolsUtils.reportException("DebuggerPane.prototype.open", aReason); + DevToolsUtils.reportException("DebuggerPanel.prototype.open", aReason); }); }, diff --git a/browser/devtools/debugger/test/head.js b/browser/devtools/debugger/test/head.js index cffddc5b4468..fafd420145b5 100644 --- a/browser/devtools/debugger/test/head.js +++ b/browser/devtools/debugger/test/head.js @@ -245,8 +245,7 @@ function waitForSourceShown(aPanel, aUrl) { } function waitForEditorLocationSet(aPanel) { - return waitForDebuggerEvents(aPanel, - aPanel.panelWin.EVENTS.EDITOR_LOCATION_SET); + return waitForDebuggerEvents(aPanel, aPanel.panelWin.EVENTS.EDITOR_LOCATION_SET); } function ensureSourceIs(aPanel, aUrl, aWaitFlag = false) { diff --git a/browser/devtools/jar.mn b/browser/devtools/jar.mn index 75a5ba506c85..c2d2d36d12a9 100644 --- a/browser/devtools/jar.mn +++ b/browser/devtools/jar.mn @@ -60,6 +60,8 @@ browser.jar: content/browser/devtools/debugger-panes.js (debugger/debugger-panes.js) content/browser/devtools/shadereditor.xul (shadereditor/shadereditor.xul) content/browser/devtools/shadereditor.js (shadereditor/shadereditor.js) + content/browser/devtools/canvasdebugger.xul (canvasdebugger/canvasdebugger.xul) + content/browser/devtools/canvasdebugger.js (canvasdebugger/canvasdebugger.js) content/browser/devtools/profiler.xul (profiler/profiler.xul) content/browser/devtools/cleopatra.html (profiler/cleopatra/cleopatra.html) content/browser/devtools/profiler/cleopatra/css/ui.css (profiler/cleopatra/css/ui.css) diff --git a/browser/devtools/main.js b/browser/devtools/main.js index 6393fefdbc1f..b0496a5462cf 100644 --- a/browser/devtools/main.js +++ b/browser/devtools/main.js @@ -28,6 +28,7 @@ loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/webconsole/pa loader.lazyGetter(this, "DebuggerPanel", () => require("devtools/debugger/panel").DebuggerPanel); loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/styleeditor/styleeditor-panel").StyleEditorPanel); loader.lazyGetter(this, "ShaderEditorPanel", () => require("devtools/shadereditor/panel").ShaderEditorPanel); +loader.lazyGetter(this, "CanvasDebuggerPanel", () => require("devtools/canvasdebugger/panel").CanvasDebuggerPanel); loader.lazyGetter(this, "ProfilerPanel", () => require("devtools/profiler/panel")); loader.lazyGetter(this, "NetMonitorPanel", () => require("devtools/netmonitor/panel").NetMonitorPanel); loader.lazyGetter(this, "ScratchpadPanel", () => require("devtools/scratchpad/scratchpad-panel").ScratchpadPanel); @@ -38,6 +39,7 @@ const inspectorProps = "chrome://browser/locale/devtools/inspector.properties"; const debuggerProps = "chrome://browser/locale/devtools/debugger.properties"; const styleEditorProps = "chrome://browser/locale/devtools/styleeditor.properties"; const shaderEditorProps = "chrome://browser/locale/devtools/shadereditor.properties"; +const canvasDebuggerProps = "chrome://browser/locale/devtools/canvasdebugger.properties"; const webConsoleProps = "chrome://browser/locale/devtools/webconsole.properties"; const profilerProps = "chrome://browser/locale/devtools/profiler.properties"; const netMonitorProps = "chrome://browser/locale/devtools/netmonitor.properties"; @@ -47,6 +49,7 @@ loader.lazyGetter(this, "webConsoleStrings", () => Services.strings.createBundle loader.lazyGetter(this, "debuggerStrings", () => Services.strings.createBundle(debuggerProps)); loader.lazyGetter(this, "styleEditorStrings", () => Services.strings.createBundle(styleEditorProps)); loader.lazyGetter(this, "shaderEditorStrings", () => Services.strings.createBundle(shaderEditorProps)); +loader.lazyGetter(this, "canvasDebuggerStrings", () => Services.strings.createBundle(canvasDebuggerProps)); loader.lazyGetter(this, "inspectorStrings", () => Services.strings.createBundle(inspectorProps)); loader.lazyGetter(this, "profilerStrings",() => Services.strings.createBundle(profilerProps)); loader.lazyGetter(this, "netMonitorStrings", () => Services.strings.createBundle(netMonitorProps)); @@ -200,11 +203,31 @@ Tools.shaderEditor = { } }; +Tools.canvasDebugger = { + id: "canvasdebugger", + ordinal: 6, + visibilityswitch: "devtools.canvasdebugger.enabled", + icon: "chrome://browser/skin/devtools/tool-styleeditor.svg", + invertIconForLightTheme: true, + url: "chrome://browser/content/devtools/canvasdebugger.xul", + label: l10n("ToolboxCanvasDebugger.label", canvasDebuggerStrings), + tooltip: l10n("ToolboxCanvasDebugger.tooltip", canvasDebuggerStrings), + + isTargetSupported: function(target) { + return true; + }, + + build: function(iframeWindow, toolbox) { + let panel = new CanvasDebuggerPanel(iframeWindow, toolbox); + return panel.open(); + } +}; + Tools.jsprofiler = { id: "jsprofiler", accesskey: l10n("profiler.accesskey", profilerStrings), key: l10n("profiler2.commandkey", profilerStrings), - ordinal: 6, + ordinal: 7, modifiers: "shift", visibilityswitch: "devtools.profiler.enabled", icon: "chrome://browser/skin/devtools/tool-profiler.svg", @@ -228,7 +251,7 @@ Tools.netMonitor = { id: "netmonitor", accesskey: l10n("netmonitor.accesskey", netMonitorStrings), key: l10n("netmonitor.commandkey", netMonitorStrings), - ordinal: 7, + ordinal: 8, modifiers: osString == "Darwin" ? "accel,alt" : "accel,shift", visibilityswitch: "devtools.netmonitor.enabled", icon: "chrome://browser/skin/devtools/tool-network.svg", @@ -251,7 +274,7 @@ Tools.netMonitor = { Tools.scratchpad = { id: "scratchpad", - ordinal: 8, + ordinal: 9, visibilityswitch: "devtools.scratchpad.enabled", icon: "chrome://browser/skin/devtools/tool-scratchpad.svg", invertIconForLightTheme: true, @@ -277,6 +300,7 @@ let defaultTools = [ Tools.jsdebugger, Tools.styleEditor, Tools.shaderEditor, + Tools.canvasDebugger, Tools.jsprofiler, Tools.netMonitor, Tools.scratchpad diff --git a/browser/devtools/moz.build b/browser/devtools/moz.build index 3f19e867c901..ce16ea38a840 100644 --- a/browser/devtools/moz.build +++ b/browser/devtools/moz.build @@ -6,6 +6,7 @@ DIRS += [ 'app-manager', + 'canvasdebugger', 'commandline', 'debugger', 'fontinspector', diff --git a/browser/devtools/netmonitor/netmonitor-controller.js b/browser/devtools/netmonitor/netmonitor-controller.js index e9ab5b82727b..64c6f772a984 100644 --- a/browser/devtools/netmonitor/netmonitor-controller.js +++ b/browser/devtools/netmonitor/netmonitor-controller.js @@ -117,6 +117,9 @@ const {Tooltip} = require("devtools/shared/widgets/Tooltip"); XPCOMUtils.defineLazyModuleGetter(this, "Chart", "resource:///modules/devtools/Chart.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Curl", + "resource:///modules/devtools/Curl.jsm"); + XPCOMUtils.defineLazyModuleGetter(this, "Task", "resource://gre/modules/Task.jsm"); @@ -126,23 +129,17 @@ XPCOMUtils.defineLazyModuleGetter(this, "PluralForm", XPCOMUtils.defineLazyModuleGetter(this, "DevToolsUtils", "resource://gre/modules/devtools/DevToolsUtils.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "devtools", - "resource://gre/modules/devtools/Loader.jsm"); +XPCOMUtils.defineLazyServiceGetter(this, "clipboardHelper", + "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper"); Object.defineProperty(this, "NetworkHelper", { get: function() { - return devtools.require("devtools/toolkit/webconsole/network-helper"); + return require("devtools/toolkit/webconsole/network-helper"); }, configurable: true, enumerable: true }); -XPCOMUtils.defineLazyServiceGetter(this, "clipboardHelper", - "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper"); - -XPCOMUtils.defineLazyModuleGetter(this, "Curl", - "resource:///modules/devtools/Curl.jsm"); - /** * Object defining the network monitor controller components. */ diff --git a/browser/devtools/netmonitor/panel.js b/browser/devtools/netmonitor/panel.js index 7f1a5c750f67..837345332368 100644 --- a/browser/devtools/netmonitor/panel.js +++ b/browser/devtools/netmonitor/panel.js @@ -8,6 +8,7 @@ const { Cc, Ci, Cu, Cr } = require("chrome"); const { Promise: promise } = Cu.import("resource://gre/modules/Promise.jsm", {}); const EventEmitter = require("devtools/toolkit/event-emitter"); +const { DevToolsUtils } = Cu.import("resource://gre/modules/devtools/DevToolsUtils.jsm", {}); function NetMonitorPanel(iframeWindow, toolbox) { this.panelWin = iframeWindow; @@ -49,8 +50,7 @@ NetMonitorPanel.prototype = { return this; }) .then(null, function onError(aReason) { - Cu.reportError("NetMonitorPanel open failed. " + - aReason.error + ": " + aReason.message); + DevToolsUtils.reportException("NetMonitorPanel.prototype.open", aReason); }); }, diff --git a/browser/devtools/shadereditor/moz.build b/browser/devtools/shadereditor/moz.build index 1978c0d9f9bf..64fa91a0c7e5 100644 --- a/browser/devtools/shadereditor/moz.build +++ b/browser/devtools/shadereditor/moz.build @@ -10,4 +10,3 @@ JS_MODULES_PATH = 'modules/devtools/shadereditor' EXTRA_JS_MODULES += [ 'panel.js' ] - diff --git a/browser/devtools/shadereditor/panel.js b/browser/devtools/shadereditor/panel.js index 1238c9b63414..4bd25ad7d277 100644 --- a/browser/devtools/shadereditor/panel.js +++ b/browser/devtools/shadereditor/panel.js @@ -9,6 +9,7 @@ const { Cc, Ci, Cu, Cr } = require("chrome"); const promise = Cu.import("resource://gre/modules/Promise.jsm", {}).Promise; const EventEmitter = require("devtools/toolkit/event-emitter"); const { WebGLFront } = require("devtools/server/actors/webgl"); +const { DevToolsUtils } = Cu.import("resource://gre/modules/devtools/DevToolsUtils.jsm", {}); function ShaderEditorPanel(iframeWindow, toolbox) { this.panelWin = iframeWindow; @@ -21,6 +22,12 @@ function ShaderEditorPanel(iframeWindow, toolbox) { exports.ShaderEditorPanel = ShaderEditorPanel; ShaderEditorPanel.prototype = { + /** + * Open is effectively an asynchronous constructor. + * + * @return object + * A promise that is resolved when the Shader Editor completes opening. + */ open: function() { let targetPromise; @@ -44,8 +51,7 @@ ShaderEditorPanel.prototype = { return this; }) .then(null, function onError(aReason) { - Cu.reportError("ShaderEditorPanel open failed. " + - aReason.error + ": " + aReason.message); + DevToolsUtils.reportException("ShaderEditorPanel.prototype.open", aReason); }); }, diff --git a/browser/devtools/shadereditor/shadereditor.js b/browser/devtools/shadereditor/shadereditor.js index 6820e0745743..113300956526 100644 --- a/browser/devtools/shadereditor/shadereditor.js +++ b/browser/devtools/shadereditor/shadereditor.js @@ -8,7 +8,6 @@ const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Task.jsm"); -Cu.import("resource://gre/modules/devtools/Loader.jsm"); Cu.import("resource:///modules/devtools/SideMenuWidget.jsm"); Cu.import("resource:///modules/devtools/ViewHelpers.jsm"); diff --git a/browser/devtools/shared/widgets/ViewHelpers.jsm b/browser/devtools/shared/widgets/ViewHelpers.jsm index fd7e10accd57..9a6b00217a52 100644 --- a/browser/devtools/shared/widgets/ViewHelpers.jsm +++ b/browser/devtools/shared/widgets/ViewHelpers.jsm @@ -20,7 +20,8 @@ Cu.import("resource://gre/modules/devtools/DevToolsUtils.jsm"); this.EXPORTED_SYMBOLS = [ "Heritage", "ViewHelpers", "WidgetMethods", - "setNamedTimeout", "clearNamedTimeout" + "setNamedTimeout", "clearNamedTimeout", + "setConditionalTimeout", "clearConditionalTimeout", ]; /** @@ -57,7 +58,7 @@ this.Heritage = { * @param function aCallback * Invoked when no more events are fired after the specified time. */ -this.setNamedTimeout = function(aId, aWait, aCallback) { +this.setNamedTimeout = function setNamedTimeout(aId, aWait, aCallback) { clearNamedTimeout(aId); namedTimeoutsStore.set(aId, setTimeout(() => @@ -71,7 +72,7 @@ this.setNamedTimeout = function(aId, aWait, aCallback) { * @param string aId * A string identifier for the named timeout. */ -this.clearNamedTimeout = function(aId) { +this.clearNamedTimeout = function clearNamedTimeout(aId) { if (!namedTimeoutsStore) { return; } @@ -79,6 +80,41 @@ this.clearNamedTimeout = function(aId) { namedTimeoutsStore.delete(aId); }; +/** + * Same as `setNamedTimeout`, but invokes the callback only if the provided + * predicate function returns true. Otherwise, the timeout is re-triggered. + * + * @param string aId + * A string identifier for the conditional timeout. + * @param number aWait + * The amount of milliseconds to wait after no more events are fired. + * @param function aPredicate + * The predicate function used to determine whether the timeout restarts. + * @param function aCallback + * Invoked when no more events are fired after the specified time, and + * the provided predicate function returns true. + */ +this.setConditionalTimeout = function setConditionalTimeout(aId, aWait, aPredicate, aCallback) { + setNamedTimeout(aId, aWait, function maybeCallback() { + if (aPredicate()) { + aCallback(); + return; + } + setConditionalTimeout(aId, aWait, aPredicate, aCallback); + }); +}; + +/** + * Clears a conditional timeout. + * @see setConditionalTimeout + * + * @param string aId + * A string identifier for the conditional timeout. + */ +this.clearConditionalTimeout = function clearConditionalTimeout(aId) { + clearNamedTimeout(aId); +}; + XPCOMUtils.defineLazyGetter(this, "namedTimeoutsStore", () => new Map()); /** diff --git a/browser/locales/en-US/chrome/browser/devtools/canvasdebugger.dtd b/browser/locales/en-US/chrome/browser/devtools/canvasdebugger.dtd new file mode 100644 index 000000000000..5ffd6175d626 --- /dev/null +++ b/browser/locales/en-US/chrome/browser/devtools/canvasdebugger.dtd @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/locales/en-US/chrome/browser/devtools/canvasdebugger.properties b/browser/locales/en-US/chrome/browser/devtools/canvasdebugger.properties new file mode 100644 index 000000000000..acc217f72b6c --- /dev/null +++ b/browser/locales/en-US/chrome/browser/devtools/canvasdebugger.properties @@ -0,0 +1,74 @@ +# 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/. + +# LOCALIZATION NOTE These strings are used inside the Canvas Debugger +# which is available from the Web Developer sub-menu -> 'Canvas'. +# The correct localization of this file might be to keep it in +# English, or another language commonly spoken among web developers. +# You want to make that choice consistent across the developer tools. +# A good criteria is the language in which you'd find the best +# documentation on web development on the web. + +# LOCALIZATION NOTE (ToolboxCanvasDebugger.label): +# This string is displayed in the title of the tab when the Shader Editor is +# displayed inside the developer tools window and in the Developer Tools Menu. +ToolboxCanvasDebugger.label=Canvas + +# LOCALIZATION NOTE (ToolboxCanvasDebugger.tooltip): +# This string is displayed in the tooltip of the tab when the Shader Editor is +# displayed inside the developer tools window. +ToolboxCanvasDebugger.tooltip=Tools to inspect and debug contexts + +# LOCALIZATION NOTE (noSnapshotsText): The text to display in the snapshots menu +# when there are no recorded snapshots yet. +noSnapshotsText=There are no snapshots yet. + +# LOCALIZATION NOTE (snapshotsList.itemLabel): +# This string is displayed in the snapshots list of the Canvas Debugger, +# identifying a set of function calls of a recorded animation frame. +snapshotsList.itemLabel=Snapshot #%S + +# LOCALIZATION NOTE (snapshotsList.loadingLabel): +# This string is displayed in the snapshots list of the Canvas Debugger, +# for an item that has not finished loading. +snapshotsList.loadingLabel=Loading… + +# LOCALIZATION NOTE (snapshotsList.saveLabel): +# This string is displayed in the snapshots list of the Canvas Debugger, +# for saving an item to disk. +snapshotsList.saveLabel=Save + +# LOCALIZATION NOTE (snapshotsList.savingLabel): +# This string is displayed in the snapshots list of the Canvas Debugger, +# while saving an item to disk. +snapshotsList.savingLabel=Saving… + +# LOCALIZATION NOTE (snapshotsList.loadedLabel): +# This string is displayed in the snapshots list of the Canvas Debugger, +# for an item which was loaded from disk +snapshotsList.loadedLabel=Loaded from disk + +# LOCALIZATION NOTE (snapshotsList.saveDialogTitle): +# This string is displayed as a title for saving a snapshot to disk. +snapshotsList.saveDialogTitle=Save animation frame snapshot… + +# LOCALIZATION NOTE (snapshotsList.saveDialogJSONFilter): +# This string is displayed as a filter for saving a snapshot to disk. +snapshotsList.saveDialogJSONFilter=JSON Files + +# LOCALIZATION NOTE (snapshotsList.saveDialogAllFilter): +# This string is displayed as a filter for saving a snapshot to disk. +snapshotsList.saveDialogAllFilter=All Files + +# LOCALIZATION NOTE (snapshotsList.drawCallsLabel): +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# This string is displayed in the snapshots list of the Canvas Debugger, +# as a generic description about how many draw calls were made. +snapshotsList.drawCallsLabel=#1 draw;#1 draws + +# LOCALIZATION NOTE (snapshotsList.functionCallsLabel): +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +# This string is displayed in the snapshots list of the Canvas Debugger, +# as a generic description about how many function calls were made in total. +snapshotsList.functionCallsLabel=#1 call;#1 calls diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn index 71a194d3460c..6318564c9ffa 100644 --- a/browser/locales/jar.mn +++ b/browser/locales/jar.mn @@ -32,6 +32,8 @@ locale/browser/devtools/netmonitor.properties (%chrome/browser/devtools/netmonitor.properties) locale/browser/devtools/shadereditor.dtd (%chrome/browser/devtools/shadereditor.dtd) locale/browser/devtools/shadereditor.properties (%chrome/browser/devtools/shadereditor.properties) + locale/browser/devtools/canvasdebugger.dtd (%chrome/browser/devtools/canvasdebugger.dtd) + locale/browser/devtools/canvasdebugger.properties (%chrome/browser/devtools/canvasdebugger.properties) locale/browser/devtools/gcli.properties (%chrome/browser/devtools/gcli.properties) locale/browser/devtools/gclicommands.properties (%chrome/browser/devtools/gclicommands.properties) locale/browser/devtools/webconsole.properties (%chrome/browser/devtools/webconsole.properties) diff --git a/browser/themes/linux/devtools/canvasdebugger.css b/browser/themes/linux/devtools/canvasdebugger.css new file mode 100644 index 000000000000..504c3fb9bf1d --- /dev/null +++ b/browser/themes/linux/devtools/canvasdebugger.css @@ -0,0 +1,5 @@ +/* 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 ../../shared/devtools/canvasdebugger.inc.css diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index 96d4d4e135c7..91abe3af0334 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -209,6 +209,7 @@ browser.jar: * skin/classic/browser/devtools/splitview.css (../shared/devtools/splitview.css) skin/classic/browser/devtools/styleeditor.css (../shared/devtools/styleeditor.css) * skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css) +* skin/classic/browser/devtools/canvasdebugger.css (devtools/canvasdebugger.css) * skin/classic/browser/devtools/debugger.css (devtools/debugger.css) * skin/classic/browser/devtools/profiler.css (devtools/profiler.css) * skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css) diff --git a/browser/themes/osx/devtools/canvasdebugger.css b/browser/themes/osx/devtools/canvasdebugger.css new file mode 100644 index 000000000000..0f393d1b0933 --- /dev/null +++ b/browser/themes/osx/devtools/canvasdebugger.css @@ -0,0 +1,6 @@ +/* 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 ../shared.inc +%include ../../shared/devtools/canvasdebugger.inc.css diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index 3ef24806c59b..304551141ae7 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -330,6 +330,7 @@ browser.jar: * skin/classic/browser/devtools/splitview.css (../shared/devtools/splitview.css) skin/classic/browser/devtools/styleeditor.css (../shared/devtools/styleeditor.css) * skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css) +* skin/classic/browser/devtools/canvasdebugger.css (devtools/canvasdebugger.css) * skin/classic/browser/devtools/debugger.css (devtools/debugger.css) * skin/classic/browser/devtools/profiler.css (devtools/profiler.css) * skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css) diff --git a/browser/themes/shared/devtools/canvasdebugger.inc.css b/browser/themes/shared/devtools/canvasdebugger.inc.css new file mode 100644 index 000000000000..b2c55d8d4d59 --- /dev/null +++ b/browser/themes/shared/devtools/canvasdebugger.inc.css @@ -0,0 +1,501 @@ +/* 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/. */ + +%filter substitution +%define darkCheckerboardBackground #000 +%define lightCheckerboardBackground #fff +%define checkerboardCell rgba(128,128,128,0.2) +%define checkerboardPattern linear-gradient(45deg, @checkerboardCell@ 25%, transparent 25%, transparent 75%, @checkerboardCell@ 75%, @checkerboardCell@), linear-gradient(45deg, @checkerboardCell@ 25%, transparent 25%, transparent 75%, @checkerboardCell@ 75%, @checkerboardCell@) +%define gutterWidth 3em +%define gutterPaddingStart 22px + +/* Reload and waiting notices */ + +.notice-container { + margin-top: -50vh; + font-size: 120%; +} + +.theme-dark .notice-container { + background: url(background-noise-toolbar.png), #343c45; /* Toolbars */ + color: #f5f7fa; /* Light foreground text */ +} + +.theme-light .notice-container { + background: url(background-noise-toolbar.png), #f0f1f2; /* Toolbars */ + color: #585959; /* Grey foreground text */ +} + +#reload-notice > button { + min-height: 2em; +} + +#empty-notice > button { + min-width: 30px; + min-height: 28px; + margin: 0; + list-style-image: url(profiler-stopwatch.png); + -moz-image-region: rect(0px,16px,16px,0px); +} + +#empty-notice > button .button-text { + display: none; +} + +.theme-dark #import-notice { + font-size: 250%; + color: rgba(255,255,255,0.2); +} + +.theme-light #import-notice { + font-size: 250%; + color: rgba(0,0,0,0.2); +} + +/* Snapshots pane */ + +#snapshots-pane > tabs { + -moz-border-end: 1px solid; +} + +#snapshots-pane .devtools-toolbar { + -moz-border-end: 1px solid; +} + +.theme-dark #snapshots-pane > tabs, +.theme-dark #snapshots-pane .devtools-toolbar { + -moz-border-end-color: black; /* Match the splitter color. */ +} + +.theme-light #snapshots-pane > tabs, +.theme-light #snapshots-pane .devtools-toolbar { + -moz-border-end-color: #aaa; /* Match the splitter color. */ +} + +#record-snapshot { + list-style-image: url("chrome://browser/skin/devtools/profiler-stopwatch.png"); + -moz-image-region: rect(0px,16px,16px,0px); +} + +#record-snapshot[checked] { + -moz-image-region: rect(0px,32px,16px,16px); +} + +/* Snapshots items */ + +.snapshot-item-thumbnail { + image-rendering: -moz-crisp-edges; + background-image: @checkerboardPattern@; + background-size: 12px 12px, 12px 12px; + background-position: 0px 0px, 6px 6px; + background-repeat: repeat, repeat; +} + +.snapshot-item-thumbnail[flipped=true] { + transform: scaleY(-1); +} + +.theme-dark .snapshot-item-thumbnail { + background-color: @darkCheckerboardBackground@; +} + +.theme-light .snapshot-item-thumbnail { + background-color: @lightCheckerboardBackground@; +} + +.snapshot-item-details { + -moz-padding-start: 6px; +} + +.snapshot-item-calls { + padding-top: 4px; + font-size: 80%; +} + +.snapshot-item-save { + padding-bottom: 2px; + font-size: 90%; +} + +.theme-dark .snapshot-item-calls, +.theme-dark .snapshot-item-save { + color: #b6babf; /* Foreground (Text) - Grey */ +} + +.theme-light .snapshot-item-calls, +.theme-light .snapshot-item-save { + color: #585959; /* Foreground (Text) - Grey */ +} + +.snapshot-item-save { + text-decoration: underline; + cursor: pointer; +} + +.snapshot-item-save[disabled=true] { + text-decoration: none; + pointer-events: none; +} + +.snapshot-item-footer[saving]::before { + display: inline-block; + content: ""; + background: url("chrome://global/skin/icons/loading_16.png") center no-repeat; + width: 16px; + height: 16px; + margin-top: -2px; + -moz-margin-end: 4px; +} + +#snapshots-list .selected label { + /* Text inside a selected item should not be custom colored. */ + color: inherit !important; +} + +/* Debugging pane controls */ + +#resume { + list-style-image: url(debugger-play.png); + -moz-image-region: rect(0px,32px,16px,16px); +} + +#step-over { + list-style-image: url(debugger-step-over.png); +} + +#step-in { + list-style-image: url(debugger-step-in.png); +} + +#step-out { + list-style-image: url(debugger-step-out.png); +} + +#debugging-controls > toolbarbutton { + transition: opacity 0.15s ease-in-out; +} + +#debugging-controls > toolbarbutton[disabled=true] { + opacity: 0.5; +} + +#calls-slider { + -moz-padding-end: 24px; +} + +#calls-slider .scale-slider { + margin: 0; +} + +#debugging-toolbar-sizer-button { + /* This button's only purpose in life is to make the + container .devtools-toolbar have the right height. */ + visibility: hidden; + min-width: 1px; +} + +/* Calls list pane */ + +#calls-list .side-menu-widget-container { + background: transparent; +} + +#calls-list .side-menu-widget-item { + padding: 0; +} + +/* Calls list items */ + +.theme-dark #calls-list .side-menu-widget-item { + border-color: #111; + border-bottom-color: transparent; +} + +.theme-light #calls-list .side-menu-widget-item { + border-color: #eee; + border-bottom-color: transparent; +} + +.theme-dark .call-item-view:hover { + background-color: rgba(255,255,255,.025); +} + +.theme-light .call-item-view:hover { + background-color: rgba(0,0,0,.025); +} + +.theme-dark .call-item-view[draw-call] { + background-color: rgba(112,191,83,0.15); +} + +.theme-light .call-item-view[draw-call] { + background-color: rgba(44,187,15,0.1); +} + +.theme-dark .call-item-view[interesting-call] { + background-color: rgba(223,128,255,0.15); +} + +.theme-light .call-item-view[interesting-call] { + background-color: rgba(184,46,229,0.1); +} + +.call-item-gutter { + width: calc(@gutterWidth@ + @gutterPaddingStart@); + -moz-padding-start: @gutterPaddingStart@; + -moz-padding-end: 4px; + padding-top: 2px; + padding-bottom: 2px; + -moz-border-end: 1px solid; + -moz-margin-end: 6px; +} + +.selected .call-item-gutter { + background-image: url("editor-debug-location.png"); + background-repeat: no-repeat; + background-position: 6px center; + background-size: 12px; +} + +.theme-dark .call-item-gutter { + background-color: #181d20; + color: #5f7387; + border-color: #000; +} + +.theme-light .call-item-gutter { + background-color: #f7f7f7; + color: #667380; + border-color: #aaa; +} + +.call-item-index { + text-align: end; +} + +.theme-dark .call-item-context { + color: #eb5368; /* Highlight Orange */ +} + +.theme-light .call-item-context { + color: #f13c00; /* Highlight Orange */ +} + +.theme-dark .call-item-name { + color: #46afe3; /* Highlight Blue */ +} + +.theme-light .call-item-name { + color: #0088cc; /* Highlight Blue */ +} + +.call-item-location { + -moz-padding-start: 2px; + -moz-padding-end: 6px; + text-align: end; + cursor: pointer; +} + +.theme-dark .call-item-location:hover { + color: #0088cc; /* Highlight Blue */ +} + +.theme-light .call-item-location:hover { + color: #46afe3; /* Highlight Blue */ +} + +.call-item-view:hover .call-item-location, +.call-item-view[expanded] .call-item-location { + text-decoration: underline; +} + +.theme-dark .call-item-location { + border-color: #111; + color: #5e88b0; /* Highlight Blue-Grey */ +} + +.theme-light .call-item-location { + border-color: #eee; + color: #5f88b0; /* Highlight Blue-Grey */ +} + +.call-item-stack { + -moz-padding-start: calc(@gutterWidth@ + @gutterPaddingStart@); + padding-bottom: 10px; +} + +.theme-dark .call-item-stack { + background: rgba(0,0,0,0.9); +} + +.theme-light .call-item-stack { + background: rgba(255,255,255,0.9); +} + +.call-item-stack-fn { + padding-top: 2px; + padding-bottom: 2px; +} + +.call-item-stack-fn-location { + -moz-padding-start: 2px; + -moz-padding-end: 6px; + text-align: end; + cursor: pointer; + text-decoration: underline; +} + +.theme-dark .call-item-stack-fn-name { + color: #a9bacb; /* Content (Text) - Light */ +} + +.theme-light .call-item-stack-fn-name { + color: #667380; /* Content (Text) - Dark Grey */ +} + +.theme-dark .call-item-stack-fn-location { + color: #5e88b0; /* Highlight Blue-Grey */ +} + +.theme-light .call-item-stack-fn-location { + color: #5e88b0; /* Highlight Blue-Grey */ +} + +.theme-dark .call-item-stack-fn-location:hover { + color: #0088cc; /* Highlight Blue */ +} + +.theme-light .call-item-stack-fn-location:hover { + color: #46afe3; /* Highlight Blue */ +} + +#calls-list .selected .call-item-contents > label:not(.call-item-gutter) { + /* Text inside a selected item should not be custom colored. */ + color: inherit !important; +} + +/* Rendering preview */ + +#screenshot-container { + background-image: @checkerboardPattern@; + background-size: 30px 30px, 30px 30px; + background-position: 0px 0px, 15px 15px; + background-repeat: repeat, repeat; +} + +.theme-dark #screenshot-container { + background-color: @darkCheckerboardBackground@; +} + +.theme-light #screenshot-container { + background-color: @lightCheckerboardBackground@; +} + +@media (min-width: 701px) { + #screenshot-container { + width: 30vw; + max-width: 50vw; + min-width: 100px; + } +} + +@media (max-width: 700px) { + #screenshot-container { + height: 40vh; + max-height: 70vh; + min-height: 100px; + } +} + +#screenshot-image { + background-image: -moz-element(#screenshot-rendering); + background-size: contain; + background-position: center, center; + background-repeat: no-repeat; +} + +#screenshot-image[flipped=true] { + transform: scaleY(-1); +} + +#screenshot-dimensions { + padding-top: 4px; + padding-bottom: 4px; + text-align: center; +} + +.theme-dark #screenshot-dimensions { + background-color: rgba(0,0,0,0.4); +} + +.theme-light #screenshot-dimensions { + background-color: rgba(255,255,255,0.8); +} + +/* Snapshot filmstrip */ + +#snapshot-filmstrip { + overflow: hidden; +} + +.theme-dark #snapshot-filmstrip { + border-top: 1px solid #000; + background-image: url(background-noise-toolbar.png); + color: #f5f7fa; /* Light foreground text */ +} + +.theme-light #snapshot-filmstrip { + border-top: 1px solid #aaa; + background-image: url(background-noise-toolbar.png); + color: #585959; /* Grey foreground text */ +} + +.filmstrip-thumbnail { + image-rendering: -moz-crisp-edges; + background-image: @checkerboardPattern@; + background-size: 12px 12px, 12px 12px; + background-position: 0px -1px, 6px 5px; + background-repeat: repeat, repeat; + background-origin: content-box; + cursor: pointer; + padding-top: 1px; + padding-bottom: 1px; + transition: opacity 0.1s ease-in-out; +} + +.filmstrip-thumbnail[flipped=true] { + transform: scaleY(-1); +} + +.theme-dark .filmstrip-thumbnail { + background-color: @darkCheckerboardBackground@; +} + +.theme-light .filmstrip-thumbnail { + background-color: @lightCheckerboardBackground@; +} + +.theme-dark .filmstrip-thumbnail { + -moz-border-end: 1px solid #000; +} + +.theme-light .filmstrip-thumbnail { + -moz-border-end: 1px solid #aaa; +} + +.theme-dark #snapshot-filmstrip > .filmstrip-thumbnail:hover, +.theme-dark #snapshot-filmstrip:not(:hover) > .filmstrip-thumbnail[highlighted] { + border: 1px solid #46afe3; /* Highlight Blue */ + margin: 0 0 0 -1px; + padding: 0; + opacity: 0.66; +} + +.theme-light #snapshot-filmstrip > .filmstrip-thumbnail:hover, +.theme-light #snapshot-filmstrip:not(:hover) > .filmstrip-thumbnail[highlighted] { + border: 1px solid #0088cc; /* Highlight Blue */ + margin: 0 0 0 -1px; + padding: 0; + opacity: 0.66; +} diff --git a/browser/themes/shared/devtools/toolbars.inc.css b/browser/themes/shared/devtools/toolbars.inc.css index a91a48d94a76..be2e56b19187 100644 --- a/browser/themes/shared/devtools/toolbars.inc.css +++ b/browser/themes/shared/devtools/toolbars.inc.css @@ -774,6 +774,7 @@ .theme-light .scrollbutton-up > .toolbarbutton-icon, .theme-light .scrollbutton-down > .toolbarbutton-icon, .theme-light #black-boxed-message-button .button-icon, +.theme-light #canvas-debugging-empty-notice-button .button-icon, .theme-light #requests-menu-perf-notice-button .button-icon, .theme-light #requests-menu-network-summary-button .button-icon { filter: url(filters.svg#invert); diff --git a/browser/themes/shared/devtools/widgets.inc.css b/browser/themes/shared/devtools/widgets.inc.css index 09b1dc39a459..59a0b6f14c92 100644 --- a/browser/themes/shared/devtools/widgets.inc.css +++ b/browser/themes/shared/devtools/widgets.inc.css @@ -564,10 +564,12 @@ } .theme-dark .side-menu-widget-empty-text { + background: url(background-noise-toolbar.png), #343c45; /* Toolbars */ color: #b6babf; /* Foreground (Text) - Grey */ } .theme-light .side-menu-widget-empty-text { + background: #f7f7f7; /* Toolbars */ color: #585959; /* Grey foreground text */ } diff --git a/browser/themes/windows/devtools/canvasdebugger.css b/browser/themes/windows/devtools/canvasdebugger.css new file mode 100644 index 000000000000..504c3fb9bf1d --- /dev/null +++ b/browser/themes/windows/devtools/canvasdebugger.css @@ -0,0 +1,5 @@ +/* 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 ../../shared/devtools/canvasdebugger.inc.css diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index 31a243116c73..a92a54772161 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -242,6 +242,7 @@ browser.jar: * skin/classic/browser/devtools/splitview.css (../shared/devtools/splitview.css) skin/classic/browser/devtools/styleeditor.css (../shared/devtools/styleeditor.css) * skin/classic/browser/devtools/shadereditor.css (devtools/shadereditor.css) +* skin/classic/browser/devtools/canvasdebugger.css (devtools/canvasdebugger.css) * skin/classic/browser/devtools/debugger.css (devtools/debugger.css) * skin/classic/browser/devtools/profiler.css (devtools/profiler.css) * skin/classic/browser/devtools/netmonitor.css (devtools/netmonitor.css) @@ -589,6 +590,7 @@ browser.jar: * skin/classic/aero/browser/devtools/splitview.css (../shared/devtools/splitview.css) skin/classic/aero/browser/devtools/styleeditor.css (../shared/devtools/styleeditor.css) * skin/classic/aero/browser/devtools/shadereditor.css (devtools/shadereditor.css) +* skin/classic/aero/browser/devtools/canvasdebugger.css (devtools/canvasdebugger.css) * skin/classic/aero/browser/devtools/debugger.css (devtools/debugger.css) * skin/classic/aero/browser/devtools/profiler.css (devtools/profiler.css) * skin/classic/aero/browser/devtools/netmonitor.css (devtools/netmonitor.css) diff --git a/toolkit/devtools/DevToolsUtils.js b/toolkit/devtools/DevToolsUtils.js index 9fe2f347c6a9..f662a8126aec 100644 --- a/toolkit/devtools/DevToolsUtils.js +++ b/toolkit/devtools/DevToolsUtils.js @@ -8,6 +8,7 @@ const { Ci, Cu } = require("chrome"); let { Services } = Cu.import("resource://gre/modules/Services.jsm", {}); +let { setTimeout, clearTimeout } = Cu.import("resource://gre/modules/Timer.jsm", {}); /** * Turn the error |aError| into a string, without fail. @@ -27,6 +28,8 @@ exports.safeErrorString = function safeErrorString(aError) { } } catch (ee) { } + // Append additional line and column number information to the output, + // since it might not be part of the stringified error. if (typeof aError.lineNumber == "number" && typeof aError.columnNumber == "number") { errorString += "Line: " + aError.lineNumber + ", column: " + aError.columnNumber; } @@ -113,12 +116,41 @@ exports.zip = function zip(a, b) { return pairs; }; -const executeSoon = aFn => { +/** + * Waits for the next tick in the event loop to execute a callback. + */ +exports.executeSoon = function executeSoon(aFn) { Services.tm.mainThread.dispatch({ run: exports.makeInfallible(aFn) }, Ci.nsIThread.DISPATCH_NORMAL); }; +/** + * Waits for the next tick in the event loop. + * + * @return Promise + * A promise that is resolved after the next tick in the event loop. + */ +exports.waitForTick = function waitForTick() { + let deferred = promise.defer(); + exports.executeSoon(deferred.resolve); + return deferred.promise; +}; + +/** + * Waits for the specified amount of time to pass. + * + * @param number aDelay + * The amount of time to wait, in milliseconds. + * @return Promise + * A promise that is resolved after the specified amount of time passes. + */ +exports.waitForTime = function waitForTime(aDelay) { + let deferred = promise.defer(); + setTimeout(deferred.resolve, aDelay); + return deferred.promise; +}; + /** * Like Array.prototype.forEach, but doesn't cause jankiness when iterating over * very large arrays by yielding to the browser and continuing execution on the @@ -127,16 +159,19 @@ const executeSoon = aFn => { * @param Array aArray * The array being iterated over. * @param Function aFn - * The function called on each item in the array. + * The function called on each item in the array. If a promise is + * returned by this function, iterating over the array will be paused + * until the respective promise is resolved. * @returns Promise * A promise that is resolved once the whole array has been iterated - * over. + * over, and all promises returned by the aFn callback are resolved. */ exports.yieldingEach = function yieldingEach(aArray, aFn) { const deferred = promise.defer(); let i = 0; let len = aArray.length; + let outstanding = [deferred.promise]; (function loop() { const start = Date.now(); @@ -147,12 +182,12 @@ exports.yieldingEach = function yieldingEach(aArray, aFn) { // aren't including time spent in non-JS here, but this is Good // Enough(tm). if (Date.now() - start > 16) { - executeSoon(loop); + exports.executeSoon(loop); return; } try { - aFn(aArray[i++]); + outstanding.push(aFn(aArray[i], i++)); } catch (e) { deferred.reject(e); return; @@ -162,10 +197,9 @@ exports.yieldingEach = function yieldingEach(aArray, aFn) { deferred.resolve(); }()); - return deferred.promise; + return promise.all(outstanding); } - /** * Like XPCOMUtils.defineLazyGetter, but with a |this| sensitive getter that * allows the lazy getter to be defined on a prototype and work correctly with @@ -266,4 +300,3 @@ exports.isSafeJSObject = function isSafeJSObject(aObj) { return Cu.isXrayWrapper(aObj); }; - diff --git a/toolkit/devtools/Loader.jsm b/toolkit/devtools/Loader.jsm index 2b0970a94a3d..505f27877023 100644 --- a/toolkit/devtools/Loader.jsm +++ b/toolkit/devtools/Loader.jsm @@ -71,6 +71,7 @@ BuiltinProvider.prototype = { "devtools/client": "resource://gre/modules/devtools/client", "devtools/pretty-fast": "resource://gre/modules/devtools/pretty-fast.js", "devtools/async-utils": "resource://gre/modules/devtools/async-utils", + "devtools/content-observer": "resource://gre/modules/devtools/content-observer", "gcli": "resource://gre/modules/devtools/gcli", "acorn": "resource://gre/modules/devtools/acorn", "acorn/util/walk": "resource://gre/modules/devtools/acorn/walk.js", @@ -120,6 +121,7 @@ SrcdirProvider.prototype = { let clientURI = this.fileURI(OS.Path.join(toolkitDir, "client")); let prettyFastURI = this.fileURI(OS.Path.join(toolkitDir), "pretty-fast.js"); let asyncUtilsURI = this.fileURI(OS.Path.join(toolkitDir), "async-utils.js"); + let contentObserverURI = this.fileURI(OS.Path.join(toolkitDir), "content-observer.js"); let gcliURI = this.fileURI(OS.Path.join(toolkitDir, "gcli", "source", "lib", "gcli")); let acornURI = this.fileURI(OS.Path.join(toolkitDir, "acorn")); let acornWalkURI = OS.Path.join(acornURI, "walk.js"); @@ -144,6 +146,7 @@ SrcdirProvider.prototype = { "devtools/client": clientURI, "devtools/pretty-fast": prettyFastURI, "devtools/async-utils": asyncUtilsURI, + "devtools/content-observer": contentObserverURI, "gcli": gcliURI, "acorn": acornURI, "acorn/util/walk": acornWalkURI diff --git a/toolkit/devtools/content-observer.js b/toolkit/devtools/content-observer.js new file mode 100644 index 000000000000..5c859a287530 --- /dev/null +++ b/toolkit/devtools/content-observer.js @@ -0,0 +1,72 @@ +/* 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/. */ +"use strict"; + +const {Cc, Ci, Cu, Cr} = require("chrome"); +const {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); + +const events = require("sdk/event/core"); +const promise = require("sdk/core/promise"); + +/** + * Handles adding an observer for the creation of content document globals, + * event sent immediately after a web content document window has been set up, + * but before any script code has been executed. + */ +function ContentObserver(tabActor) { + this._contentWindow = tabActor.window; + this._onContentGlobalCreated = this._onContentGlobalCreated.bind(this); + this._onInnerWindowDestroyed = this._onInnerWindowDestroyed.bind(this); + this.startListening(); +} + +module.exports.ContentObserver = ContentObserver; + +ContentObserver.prototype = { + /** + * Starts listening for the required observer messages. + */ + startListening: function() { + Services.obs.addObserver( + this._onContentGlobalCreated, "content-document-global-created", false); + Services.obs.addObserver( + this._onInnerWindowDestroyed, "inner-window-destroyed", false); + }, + + /** + * Stops listening for the required observer messages. + */ + stopListening: function() { + Services.obs.removeObserver( + this._onContentGlobalCreated, "content-document-global-created", false); + Services.obs.removeObserver( + this._onInnerWindowDestroyed, "inner-window-destroyed", false); + }, + + /** + * Fired immediately after a web content document window has been set up. + */ + _onContentGlobalCreated: function(subject, topic, data) { + if (subject == this._contentWindow) { + events.emit(this, "global-created", subject); + } + }, + + /** + * Fired when an inner window is removed from the backward/forward cache. + */ + _onInnerWindowDestroyed: function(subject, topic, data) { + let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data; + events.emit(this, "global-destroyed", id); + } +}; + +// Utility functions. + +ContentObserver.GetInnerWindowID = function(window) { + return window + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils) + .currentInnerWindowID; +}; diff --git a/toolkit/devtools/server/actors/call-watcher.js b/toolkit/devtools/server/actors/call-watcher.js new file mode 100644 index 000000000000..3c66b1aa6a49 --- /dev/null +++ b/toolkit/devtools/server/actors/call-watcher.js @@ -0,0 +1,559 @@ +/* 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/. */ +"use strict"; + +const {Cc, Ci, Cu, Cr} = require("chrome"); +const events = require("sdk/event/core"); +const promise = require("sdk/core/promise"); +const protocol = require("devtools/server/protocol"); +const {ContentObserver} = require("devtools/content-observer"); + +const {on, once, off, emit} = events; +const {method, Arg, Option, RetVal} = protocol; + +exports.register = function(handle) { + handle.addTabActor(CallWatcherActor, "callWatcherActor"); +}; + +exports.unregister = function(handle) { + handle.removeTabActor(CallWatcherActor); +}; + +/** + * Type describing a single function call in a stack trace. + */ +protocol.types.addDictType("call-stack-item", { + name: "string", + file: "string", + line: "number" +}); + +/** + * Type describing an overview of a function call. + */ +protocol.types.addDictType("call-details", { + type: "number", + name: "string", + stack: "array:call-stack-item" +}); + +/** + * This actor contains information about a function call, like the function + * type, name, stack, arguments, returned value etc. + */ +let FunctionCallActor = protocol.ActorClass({ + typeName: "function-call", + + /** + * Creates the function call actor. + * + * @param DebuggerServerConnection conn + * The server connection. + * @param DOMWindow window + * The content window. + * @param string global + * The name of the global object owning this function, like + * "CanvasRenderingContext2D" or "WebGLRenderingContext". + * @param object caller + * The object owning the function when it was called. + * For example, in `foo.bar()`, the caller is `foo`. + * @param number type + * Either METHOD_FUNCTION, METHOD_GETTER or METHOD_SETTER. + * @param string name + * The called function's name. + * @param array stack + * The called function's stack, as a list of { name, file, line } objects. + * @param array args + * The called function's arguments. + * @param any result + * The value returned by the function call. + */ + initialize: function(conn, [window, global, caller, type, name, stack, args, result]) { + protocol.Actor.prototype.initialize.call(this, conn); + + this.details = { + window: window, + caller: caller, + type: type, + name: name, + stack: stack, + args: args, + return: result + }; + + this.meta = { + global: -1, + previews: { caller: "", args: "" } + }; + + if (global == "WebGLRenderingContext") { + this.meta.global = CallWatcherFront.CANVAS_WEBGL_CONTEXT; + } else if (global == "CanvasRenderingContext2D") { + this.meta.global = CallWatcherFront.CANVAS_2D_CONTEXT; + } else if (global == "window") { + this.meta.global = CallWatcherFront.UNKNOWN_SCOPE; + } else { + this.meta.global = CallWatcherFront.GLOBAL_SCOPE; + } + + this.meta.previews.caller = this._generateCallerPreview(); + this.meta.previews.args = this._generateArgsPreview(); + }, + + /** + * Customize the marshalling of this actor to provide some generic information + * directly on the Front instance. + */ + form: function() { + return { + actor: this.actorID, + type: this.details.type, + name: this.details.name, + file: this.details.stack[0].file, + line: this.details.stack[0].line, + callerPreview: this.meta.previews.caller, + argsPreview: this.meta.previews.args + }; + }, + + /** + * Gets more information about this function call, which is not necessarily + * available on the Front instance. + */ + getDetails: method(function() { + let { type, name, stack } = this.details; + + // Since not all calls on the stack have corresponding owner files (e.g. + // callbacks of a requestAnimationFrame etc.), there's no benefit in + // returning them, as the user can't jump to the Debugger from them. + for (let i = stack.length - 1;;) { + if (stack[i].file) { + break; + } + stack.pop(); + i--; + } + + // XXX: Use grips for objects and serialize them properly, in order + // to add the function's caller, arguments and return value. Bug 978957. + return { + type: type, + name: name, + stack: stack + }; + }, { + response: { info: RetVal("call-details") } + }), + + /** + * Serializes the caller's name so that it can be easily be transferred + * as a string, but still be useful when displayed in a potential UI. + * + * @return string + * The caller's name as a string. + */ + _generateCallerPreview: function() { + let global = this.meta.global; + if (global == CallWatcherFront.CANVAS_WEBGL_CONTEXT) { + return "gl"; + } + if (global == CallWatcherFront.CANVAS_2D_CONTEXT) { + return "ctx"; + } + return ""; + }, + + /** + * Serializes the arguments so that they can be easily be transferred + * as a string, but still be useful when displayed in a potential UI. + * + * @return string + * The arguments as a string. + */ + _generateArgsPreview: function() { + let { caller, args } = this.details; + let { global } = this.meta; + + // XXX: All of this sucks. Make this smarter, so that the frontend + // can inspect each argument, be it object or primitive. Bug 978960. + let serializeArgs = () => args.map(arg => { + if (typeof arg == "undefined") { + return "undefined"; + } + if (typeof arg == "function") { + return "Function"; + } + if (typeof arg == "object") { + return "Object"; + } + if (global == CallWatcherFront.CANVAS_WEBGL_CONTEXT) { + // XXX: This doesn't handle combined bitmasks. Bug 978964. + return getEnumsLookupTable("webgl", caller)[arg] || arg; + } + if (global == CallWatcherFront.CANVAS_2D_CONTEXT) { + return getEnumsLookupTable("2d", caller)[arg] || arg; + } + return arg; + }); + + return serializeArgs().join(", "); + } +}); + +/** + * The corresponding Front object for the FunctionCallActor. + */ +let FunctionCallFront = protocol.FrontClass(FunctionCallActor, { + initialize: function(client, form) { + protocol.Front.prototype.initialize.call(this, client, form); + }, + + /** + * Adds some generic information directly to this instance, + * to avoid extra roundtrips. + */ + form: function(form) { + this.actorID = form.actor; + this.type = form.type; + this.name = form.name; + this.file = form.file; + this.line = form.line; + this.callerPreview = form.callerPreview; + this.argsPreview = form.argsPreview; + } +}); + +/** + * This actor observes function calls on certain objects or globals. + */ +let CallWatcherActor = exports.CallWatcherActor = protocol.ActorClass({ + typeName: "call-watcher", + initialize: function(conn, tabActor) { + protocol.Actor.prototype.initialize.call(this, conn); + this.tabActor = tabActor; + this._onGlobalCreated = this._onGlobalCreated.bind(this); + this._onGlobalDestroyed = this._onGlobalDestroyed.bind(this); + this._onContentFunctionCall = this._onContentFunctionCall.bind(this); + }, + destroy: function(conn) { + protocol.Actor.prototype.destroy.call(this, conn); + this.finalize(); + }, + + /** + * Starts waiting for the current tab actor's document global to be + * created, in order to instrument the specified objects and become + * aware of everything the content does with them. + */ + setup: method(function({ tracedGlobals, tracedFunctions, startRecording, performReload }) { + if (this._initialized) { + return; + } + this._initialized = true; + + this._functionCalls = []; + this._tracedGlobals = tracedGlobals || []; + this._tracedFunctions = tracedFunctions || []; + this._contentObserver = new ContentObserver(this.tabActor); + + on(this._contentObserver, "global-created", this._onGlobalCreated); + on(this._contentObserver, "global-destroyed", this._onGlobalDestroyed); + + if (startRecording) { + this.resumeRecording(); + } + if (performReload) { + this.tabActor.window.location.reload(); + } + }, { + request: { + tracedGlobals: Option(0, "nullable:array:string"), + tracedFunctions: Option(0, "nullable:array:string"), + startRecording: Option(0, "boolean"), + performReload: Option(0, "boolean") + }, + oneway: true + }), + + /** + * Stops listening for document global changes and puts this actor + * to hibernation. This method is called automatically just before the + * actor is destroyed. + */ + finalize: method(function() { + if (!this._initialized) { + return; + } + this._initialized = false; + + this._contentObserver.stopListening(); + off(this._contentObserver, "global-created", this._onGlobalCreated); + off(this._contentObserver, "global-destroyed", this._onGlobalDestroyed); + + this._tracedGlobals = null; + this._tracedFunctions = null; + this._contentObserver = null; + }, { + oneway: true + }), + + /** + * Returns whether the instrumented function calls are currently recorded. + */ + isRecording: method(function() { + return this._recording; + }, { + response: RetVal("boolean") + }), + + /** + * Starts recording function calls. + */ + resumeRecording: method(function() { + this._recording = true; + }), + + /** + * Stops recording function calls. + */ + pauseRecording: method(function() { + this._recording = false; + return this._functionCalls; + }, { + response: { calls: RetVal("array:function-call") } + }), + + /** + * Erases all the recorded function calls. + * Calling `resumeRecording` or `pauseRecording` does not erase history. + */ + eraseRecording: method(function() { + this._functionCalls = []; + }), + + /** + * Lightweight listener invoked whenever an instrumented function is called + * while recording. We're doing this to avoid the event emitter overhead, + * since this is expected to be a very hot function. + */ + onCall: function() {}, + + /** + * Invoked whenever the current tab actor's document global is created. + */ + _onGlobalCreated: function(window) { + let self = this; + + this._tracedWindowId = ContentObserver.GetInnerWindowID(window); + let unwrappedWindow = XPCNativeWrapper.unwrap(window); + let callback = this._onContentFunctionCall; + + for (let global of this._tracedGlobals) { + let prototype = unwrappedWindow[global].prototype; + let properties = Object.keys(prototype); + properties.forEach(name => overrideSymbol(global, prototype, name, callback)); + } + + for (let name of this._tracedFunctions) { + overrideSymbol("window", unwrappedWindow, name, callback); + } + + /** + * Instruments a method, getter or setter on the specified target object to + * invoke a callback whenever it is called. + */ + function overrideSymbol(global, target, name, callback) { + let propertyDescriptor = Object.getOwnPropertyDescriptor(target, name); + + if (propertyDescriptor.get || propertyDescriptor.set) { + overrideAccessor(global, target, name, propertyDescriptor, callback); + return; + } + if (propertyDescriptor.writable && typeof propertyDescriptor.value == "function") { + overrideFunction(global, target, name, propertyDescriptor, callback); + return; + } + } + + /** + * Instruments a function on the specified target object. + */ + function overrideFunction(global, target, name, descriptor, callback) { + let originalFunc = target[name]; + + Object.defineProperty(target, name, { + value: function(...args) { + let result = originalFunc.apply(this, args); + + if (self._recording) { + let stack = getStack(name); + let type = CallWatcherFront.METHOD_FUNCTION; + callback(unwrappedWindow, global, this, type, name, stack, args, result); + } + return result; + }, + configurable: descriptor.configurable, + enumerable: descriptor.enumerable, + writable: true + }); + } + + /** + * Instruments a getter or setter on the specified target object. + */ + function overrideAccessor(global, target, name, descriptor, callback) { + let originalGetter = target.__lookupGetter__(name); + let originalSetter = target.__lookupSetter__(name); + + Object.defineProperty(target, name, { + get: function(...args) { + if (!originalGetter) return undefined; + let result = originalGetter.apply(this, args); + + if (self._recording) { + let stack = getStack(name); + let type = CallWatcherFront.GETTER_FUNCTION; + callback(unwrappedWindow, global, this, type, name, stack, args, result); + } + return result; + }, + set: function(...args) { + if (!originalSetter) return; + originalSetter.apply(this, args); + + if (self._recording) { + let stack = getStack(name); + let type = CallWatcherFront.SETTER_FUNCTION; + callback(unwrappedWindow, global, this, type, name, stack, args, undefined); + } + }, + configurable: descriptor.configurable, + enumerable: descriptor.enumerable + }); + } + + /** + * Stores the relevant information about calls on the stack when + * a function is called. + */ + function getStack(caller) { + try { + // Using Components.stack wouldn't be a better idea, since it's + // much slower because it attempts to retrieve the C++ stack as well. + throw new Error(); + } catch (e) { + var stack = e.stack; + } + + // Of course, using a simple regex like /(.*?)@(.*):(\d*):\d*/ would be + // much prettier, but this is a very hot function, so let's sqeeze + // every drop of performance out of it. + let calls = []; + let callIndex = 0; + let currNewLinePivot = stack.indexOf("\n") + 1; + let nextNewLinePivot = stack.indexOf("\n", currNewLinePivot); + + while (nextNewLinePivot > 0) { + let nameDelimiterIndex = stack.indexOf("@", currNewLinePivot); + let columnDelimiterIndex = stack.lastIndexOf(":", nextNewLinePivot - 1); + let lineDelimiterIndex = stack.lastIndexOf(":", columnDelimiterIndex - 1); + + if (!calls[callIndex]) { + calls[callIndex] = { name: "", file: "", line: 0 }; + } + if (!calls[callIndex + 1]) { + calls[callIndex + 1] = { name: "", file: "", line: 0 }; + } + + if (callIndex > 0) { + let file = stack.substring(nameDelimiterIndex + 1, lineDelimiterIndex); + let line = stack.substring(lineDelimiterIndex + 1, columnDelimiterIndex); + let name = stack.substring(currNewLinePivot, nameDelimiterIndex); + calls[callIndex].name = name; + calls[callIndex - 1].file = file; + calls[callIndex - 1].line = line; + } else { + // Since the topmost stack frame is actually our overwritten function, + // it will not have the expected name. + calls[0].name = caller; + } + + currNewLinePivot = nextNewLinePivot + 1; + nextNewLinePivot = stack.indexOf("\n", currNewLinePivot); + callIndex++; + } + + return calls; + } + }, + + /** + * Invoked whenever the current tab actor's inner window is destroyed. + */ + _onGlobalDestroyed: function(id) { + if (this._tracedWindowId == id) { + this.pauseRecording(); + this.eraseRecording(); + } + }, + + /** + * Invoked whenever an instrumented function is called. + */ + _onContentFunctionCall: function(...details) { + let functionCall = new FunctionCallActor(this.conn, details); + this._functionCalls.push(functionCall); + this.onCall(functionCall); + } +}); + +/** + * The corresponding Front object for the CallWatcherActor. + */ +let CallWatcherFront = exports.CallWatcherFront = protocol.FrontClass(CallWatcherActor, { + initialize: function(client, { callWatcherActor }) { + protocol.Front.prototype.initialize.call(this, client, { actor: callWatcherActor }); + client.addActorPool(this); + this.manage(this); + } +}); + +/** + * Constants. + */ +CallWatcherFront.METHOD_FUNCTION = 0; +CallWatcherFront.GETTER_FUNCTION = 1; +CallWatcherFront.SETTER_FUNCTION = 2; + +CallWatcherFront.GLOBAL_SCOPE = 0; +CallWatcherFront.UNKNOWN_SCOPE = 1; +CallWatcherFront.CANVAS_WEBGL_CONTEXT = 2; +CallWatcherFront.CANVAS_2D_CONTEXT = 3; + +/** + * A lookup table for cross-referencing flags or properties with their name + * assuming they look LIKE_THIS most of the time. + * + * For example, when gl.clear(gl.COLOR_BUFFER_BIT) is called, the actual passed + * argument's value is 16384, which we want identified as "COLOR_BUFFER_BIT". + */ +var gEnumRegex = /^[A-Z_]+$/; +var gEnumsLookupTable = {}; + +function getEnumsLookupTable(type, object) { + let cachedEnum = gEnumsLookupTable[type]; + if (cachedEnum) { + return cachedEnum; + } + + let table = gEnumsLookupTable[type] = {}; + + for (let key in object) { + if (key.match(gEnumRegex)) { + table[object[key]] = key; + } + } + + return table; +} diff --git a/toolkit/devtools/server/actors/canvas.js b/toolkit/devtools/server/actors/canvas.js new file mode 100644 index 000000000000..3ee14defee6d --- /dev/null +++ b/toolkit/devtools/server/actors/canvas.js @@ -0,0 +1,759 @@ +/* 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/. */ +"use strict"; + +const {Cc, Ci, Cu, Cr} = require("chrome"); +const events = require("sdk/event/core"); +const promise = require("sdk/core/promise"); +const protocol = require("devtools/server/protocol"); +const {CallWatcherActor, CallWatcherFront} = require("devtools/server/actors/call-watcher"); +const DevToolsUtils = require("devtools/toolkit/DevToolsUtils.js"); + +const {on, once, off, emit} = events; +const {method, custom, Arg, Option, RetVal} = protocol; + +const CANVAS_CONTEXTS = [ + "CanvasRenderingContext2D", + "WebGLRenderingContext" +]; + +const ANIMATION_GENERATORS = [ + "requestAnimationFrame", + "mozRequestAnimationFrame" +]; + +const DRAW_CALLS = [ + // 2D canvas + "fill", + "stroke", + "clearRect", + "fillRect", + "strokeRect", + "fillText", + "strokeText", + "drawImage", + + // WebGL + "clear", + "drawArrays", + "drawElements", + "finish", + "flush" +]; + +const INTERESTING_CALLS = [ + // 2D canvas + "save", + "restore", + + // WebGL + "useProgram" +]; + +exports.register = function(handle) { + handle.addTabActor(CanvasActor, "canvasActor"); +}; + +exports.unregister = function(handle) { + handle.removeTabActor(CanvasActor); +}; + +/** + * Type representing an Uint32Array buffer, serialized fast(er). + * + * XXX: It would be nice if on local connections (only), we could just *give* + * the buffer directly to the front, instead of going through all this + * serialization redundancy. + */ +protocol.types.addType("uint32-array", { + write: (v) => "[" + Array.join(v, ",") + "]", + read: (v) => new Uint32Array(JSON.parse(v)) +}); + +/** + * Type describing a thumbnail or screenshot in a recorded animation frame. + */ +protocol.types.addDictType("snapshot-image", { + index: "number", + width: "number", + height: "number", + flipped: "boolean", + pixels: "uint32-array" +}); + +/** + * Type describing an overview of a recorded animation frame. + */ +protocol.types.addDictType("snapshot-overview", { + calls: "array:function-call", + thumbnails: "array:snapshot-image", + screenshot: "snapshot-image" +}); + +/** + * This actor represents a recorded animation frame snapshot, along with + * all the corresponding canvas' context methods invoked in that frame, + * thumbnails for each draw call and a screenshot of the end result. + */ +let FrameSnapshotActor = protocol.ActorClass({ + typeName: "frame-snapshot", + + /** + * Creates the frame snapshot call actor. + * + * @param DebuggerServerConnection conn + * The server connection. + * @param HTMLCanvasElement canvas + * A reference to the content canvas. + * @param array calls + * An array of "function-call" actor instances. + * @param object screenshot + * A single "snapshot-image" type instance. + */ + initialize: function(conn, { canvas, calls, screenshot }) { + protocol.Actor.prototype.initialize.call(this, conn); + this._contentCanvas = canvas; + this._functionCalls = calls; + this._lastDrawCallScreenshot = screenshot; + }, + + /** + * Gets as much data about this snapshot without computing anything costly. + */ + getOverview: method(function() { + return { + calls: this._functionCalls, + thumbnails: this._functionCalls.map(e => e._thumbnail).filter(e => !!e), + screenshot: this._lastDrawCallScreenshot + }; + }, { + response: { overview: RetVal("snapshot-overview") } + }), + + /** + * Gets a screenshot of the canvas's contents after the specified + * function was called. + */ + generateScreenshotFor: method(function(functionCall) { + let caller = functionCall.details.caller; + let global = functionCall.meta.global; + + let canvas = this._contentCanvas; + let calls = this._functionCalls; + let index = calls.indexOf(functionCall); + + // To get a screenshot, replay all the steps necessary to render the frame, + // by invoking the context calls up to and including the specified one. + // This will be done in a custom framebuffer in case of a WebGL context. + let { replayContext, lastDrawCallIndex } = ContextUtils.replayAnimationFrame({ + contextType: global, + canvas: canvas, + calls: calls, + first: 0, + last: index + }); + + // To keep things fast, generate an image that's relatively small. + let dimensions = Math.min(CanvasFront.SCREENSHOT_HEIGHT_MAX, canvas.height); + let screenshot; + + // Depending on the canvas' context, generating a screenshot is done + // in different ways. In case of the WebGL context, we also need to reset + // the framebuffer binding to the default value. + if (global == CallWatcherFront.CANVAS_WEBGL_CONTEXT) { + screenshot = ContextUtils.getPixelsForWebGL(replayContext); + replayContext.bindFramebuffer(replayContext.FRAMEBUFFER, null); + screenshot.flipped = true; + } + // In case of 2D contexts, no additional special treatment is necessary. + else if (global == CallWatcherFront.CANVAS_2D_CONTEXT) { + screenshot = ContextUtils.getPixelsFor2D(replayContext); + screenshot.flipped = false; + } + + screenshot.index = lastDrawCallIndex; + return screenshot; + }, { + request: { call: Arg(0, "function-call") }, + response: { screenshot: RetVal("snapshot-image") } + }) +}); + +/** + * The corresponding Front object for the FrameSnapshotActor. + */ +let FrameSnapshotFront = protocol.FrontClass(FrameSnapshotActor, { + initialize: function(client, form) { + protocol.Front.prototype.initialize.call(this, client, form); + this._lastDrawCallScreenshot = null; + this._cachedScreenshots = new WeakMap(); + }, + + /** + * This implementation caches the last draw call screenshot to optimize + * frontend requests to `generateScreenshotFor`. + */ + getOverview: custom(function() { + return this._getOverview().then(data => { + this._lastDrawCallScreenshot = data.screenshot; + return data; + }); + }, { + impl: "_getOverview" + }), + + /** + * This implementation saves a roundtrip to the backend if the screenshot + * was already generated and retrieved once. + */ + generateScreenshotFor: custom(function(functionCall) { + if (CanvasFront.ANIMATION_GENERATORS.has(functionCall.name)) { + return promise.resolve(this._lastDrawCallScreenshot); + } + let cachedScreenshot = this._cachedScreenshots.get(functionCall); + if (cachedScreenshot) { + return cachedScreenshot; + } + let screenshot = this._generateScreenshotFor(functionCall); + this._cachedScreenshots.set(functionCall, screenshot); + return screenshot; + }, { + impl: "_generateScreenshotFor" + }) +}); + +/** + * This Canvas Actor handles simple instrumentation of all the methods + * of a 2D or WebGL context, to provide information regarding all the calls + * made when drawing frame inside an animation loop. + */ +let CanvasActor = exports.CanvasActor = protocol.ActorClass({ + typeName: "canvas", + initialize: function(conn, tabActor) { + protocol.Actor.prototype.initialize.call(this, conn); + this.tabActor = tabActor; + this._onContentFunctionCall = this._onContentFunctionCall.bind(this); + }, + destroy: function(conn) { + protocol.Actor.prototype.destroy.call(this, conn); + this.finalize(); + }, + + /** + * Starts listening for function calls. + */ + setup: method(function({ reload }) { + if (this._initialized) { + return; + } + this._initialized = true; + + this._callWatcher = new CallWatcherActor(this.conn, this.tabActor); + this._callWatcher.onCall = this._onContentFunctionCall; + this._callWatcher.setup({ + tracedGlobals: CANVAS_CONTEXTS, + tracedFunctions: ANIMATION_GENERATORS, + performReload: reload + }); + }, { + request: { reload: Option(0, "boolean") }, + oneway: true + }), + + /** + * Stops listening for function calls. + */ + finalize: method(function() { + if (!this._initialized) { + return; + } + this._initialized = false; + + this._callWatcher.finalize(); + this._callWatcher = null; + }, { + oneway: true + }), + + /** + * Returns whether this actor has been set up. + */ + isInitialized: method(function() { + return !!this._initialized; + }, { + response: { initialized: RetVal("boolean") } + }), + + /** + * Records a snapshot of all the calls made during the next animation frame. + * The animation should be implemented via the de-facto requestAnimationFrame + * utility, not inside a `setInterval` or recursive `setTimeout`. + * + * XXX: Currently only supporting requestAnimationFrame. When this isn't used, + * it'd be a good idea to display a huge red flashing banner telling people to + * STOP USING `setInterval` OR `setTimeout` FOR ANIMATION. Bug 978948. + */ + recordAnimationFrame: method(function() { + if (this._callWatcher.isRecording()) { + return this._currentAnimationFrameSnapshot.promise; + } + + this._callWatcher.eraseRecording(); + this._callWatcher.resumeRecording(); + + let deferred = this._currentAnimationFrameSnapshot = promise.defer(); + return deferred.promise; + }, { + response: { snapshot: RetVal("frame-snapshot") } + }), + + /** + * Invoked whenever an instrumented function is called, be it on a + * 2d or WebGL context, or an animation generator like requestAnimationFrame. + */ + _onContentFunctionCall: function(functionCall) { + let { window, name, args } = functionCall.details; + + // The function call arguments are required to replay animation frames, + // in order to generate screenshots. However, simply storing references to + // every kind of object is a bad idea, since their properties may change. + // Consider transformation matrices for example, which are typically + // Float32Arrays whose values can easily change across context calls. + // They need to be cloned. + inplaceShallowCloneArrays(args, window); + + if (CanvasFront.ANIMATION_GENERATORS.has(name)) { + this._handleAnimationFrame(functionCall); + return; + } + if (CanvasFront.DRAW_CALLS.has(name) && this._animationStarted) { + this._handleDrawCall(functionCall); + return; + } + }, + + /** + * Handle animations generated using requestAnimationFrame. + */ + _handleAnimationFrame: function(functionCall) { + if (!this._animationStarted) { + this._handleAnimationFrameBegin(); + } else { + this._handleAnimationFrameEnd(functionCall); + } + }, + + /** + * Called whenever an animation frame rendering begins. + */ + _handleAnimationFrameBegin: function() { + this._callWatcher.eraseRecording(); + this._animationStarted = true; + }, + + /** + * Called whenever an animation frame rendering ends. + */ + _handleAnimationFrameEnd: function() { + // Get a hold of all the function calls made during this animation frame. + // Since only one snapshot can be recorded at a time, erase all the + // previously recorded calls. + let functionCalls = this._callWatcher.pauseRecording(); + this._callWatcher.eraseRecording(); + + // Since the animation frame finished, get a hold of the (already retrieved) + // canvas pixels to conveniently create a screenshot of the final rendering. + let index = this._lastDrawCallIndex; + let width = this._lastContentCanvasWidth; + let height = this._lastContentCanvasHeight; + let flipped = this._lastThumbnailFlipped; + let pixels = ContextUtils.getPixelStorage()["32bit"]; + let lastDrawCallScreenshot = { + index: index, + width: width, + height: height, + flipped: flipped, + pixels: pixels.subarray(0, width * height) + }; + + // Wrap the function calls and screenshot in a FrameSnapshotActor instance, + // which will resolve the promise returned by `recordAnimationFrame`. + let frameSnapshot = new FrameSnapshotActor(this.conn, { + canvas: this._lastDrawCallCanvas, + calls: functionCalls, + screenshot: lastDrawCallScreenshot + }); + + this._currentAnimationFrameSnapshot.resolve(frameSnapshot); + this._currentAnimationFrameSnapshot = null; + this._animationStarted = false; + }, + + /** + * Invoked whenever a draw call is detected in the animation frame which is + * currently being recorded. + */ + _handleDrawCall: function(functionCall) { + let functionCalls = this._callWatcher.pauseRecording(); + let caller = functionCall.details.caller; + let global = functionCall.meta.global; + + let contentCanvas = this._lastDrawCallCanvas = caller.canvas; + let index = this._lastDrawCallIndex = functionCalls.indexOf(functionCall); + let w = this._lastContentCanvasWidth = contentCanvas.width; + let h = this._lastContentCanvasHeight = contentCanvas.height; + + // To keep things fast, generate images of small and fixed dimensions. + let dimensions = CanvasFront.THUMBNAIL_HEIGHT; + let thumbnail; + + // Create a thumbnail on every draw call on the canvas context, to augment + // the respective function call actor with this additional data. + if (global == CallWatcherFront.CANVAS_WEBGL_CONTEXT) { + // Check if drawing to a custom framebuffer (when rendering to texture). + // Don't create a thumbnail in this particular case. + let framebufferBinding = caller.getParameter(caller.FRAMEBUFFER_BINDING); + if (framebufferBinding == null) { + thumbnail = ContextUtils.getPixelsForWebGL(caller, 0, 0, w, h, dimensions); + thumbnail.flipped = this._lastThumbnailFlipped = true; + thumbnail.index = index; + } + } else if (global == CallWatcherFront.CANVAS_2D_CONTEXT) { + thumbnail = ContextUtils.getPixelsFor2D(caller, 0, 0, w, h, dimensions); + thumbnail.flipped = this._lastThumbnailFlipped = false; + thumbnail.index = index; + } + + functionCall._thumbnail = thumbnail; + this._callWatcher.resumeRecording(); + } +}); + +/** + * A collection of methods for manipulating canvas contexts. + */ +let ContextUtils = { + /** + * WebGL contexts are sensitive to how they're queried. Use this function + * to make sure the right context is always retrieved, if available. + * + * @param HTMLCanvasElement canvas + * The canvas element for which to get a WebGL context. + * @param WebGLRenderingContext gl + * The queried WebGL context, or null if unavailable. + */ + getWebGLContext: function(canvas) { + return canvas.getContext("webgl") || + canvas.getContext("experimental-webgl"); + }, + + /** + * Gets a hold of the rendered pixels in the most efficient way possible for + * a canvas with a WebGL context. + * + * @param WebGLRenderingContext gl + * The WebGL context to get a screenshot from. + * @param number srcX [optional] + * The first left pixel that is read from the framebuffer. + * @param number srcY [optional] + * The first top pixel that is read from the framebuffer. + * @param number srcWidth [optional] + * The number of pixels to read on the X axis. + * @param number srcHeight [optional] + * The number of pixels to read on the Y axis. + * @param number dstHeight [optional] + * The desired generated screenshot height. + * @return object + * An objet containing the screenshot's width, height and pixel data. + */ + getPixelsForWebGL: function(gl, + srcX = 0, srcY = 0, + srcWidth = gl.canvas.width, + srcHeight = gl.canvas.height, + dstHeight = srcHeight) + { + let contentPixels = ContextUtils.getPixelStorage(srcWidth, srcHeight); + let { "8bit": charView, "32bit": intView } = contentPixels; + gl.readPixels(srcX, srcY, srcWidth, srcHeight, gl.RGBA, gl.UNSIGNED_BYTE, charView); + return this.resizePixels(intView, srcWidth, srcHeight, dstHeight); + }, + + /** + * Gets a hold of the rendered pixels in the most efficient way possible for + * a canvas with a 2D context. + * + * @param CanvasRenderingContext2D ctx + * The 2D context to get a screenshot from. + * @param number srcX [optional] + * The first left pixel that is read from the canvas. + * @param number srcY [optional] + * The first top pixel that is read from the canvas. + * @param number srcWidth [optional] + * The number of pixels to read on the X axis. + * @param number srcHeight [optional] + * The number of pixels to read on the Y axis. + * @param number dstHeight [optional] + * The desired generated screenshot height. + * @return object + * An objet containing the screenshot's width, height and pixel data. + */ + getPixelsFor2D: function(ctx, + srcX = 0, srcY = 0, + srcWidth = ctx.canvas.width, + srcHeight = ctx.canvas.height, + dstHeight = srcHeight) + { + let { data } = ctx.getImageData(srcX, srcY, srcWidth, srcHeight); + let { "32bit": intView } = ContextUtils.usePixelStorage(data.buffer); + return this.resizePixels(intView, srcWidth, srcHeight, dstHeight); + }, + + /** + * Resizes the provided pixels to fit inside a rectangle with the specified + * height and the same aspect ratio as the source. + * + * @param Uint32Array srcPixels + * The source pixel data, assuming 32bit/pixel and 4 color components. + * @param number srcWidth + * The source pixel data width. + * @param number srcHeight + * The source pixel data height. + * @param number dstHeight [optional] + * The desired resized pixel data height. + * @return object + * An objet containing the resized pixels width, height and data. + */ + resizePixels: function(srcPixels, srcWidth, srcHeight, dstHeight) { + let screenshotRatio = dstHeight / srcHeight; + let dstWidth = Math.floor(srcWidth * screenshotRatio); + + // Use a plain array instead of a Uint32Array to make serializing faster. + let dstPixels = new Array(dstWidth * dstHeight); + + // If the resized image ends up being completely transparent, returning + // an empty array will skip some redundant serialization cycles. + let isTransparent = true; + + for (let dstX = 0; dstX < dstWidth; dstX++) { + for (let dstY = 0; dstY < dstHeight; dstY++) { + let srcX = Math.floor(dstX / screenshotRatio); + let srcY = Math.floor(dstY / screenshotRatio); + let cPos = srcX + srcWidth * srcY; + let dPos = dstX + dstWidth * dstY; + let color = dstPixels[dPos] = srcPixels[cPos]; + if (color) { + isTransparent = false; + } + } + } + + return { + width: dstWidth, + height: dstHeight, + pixels: isTransparent ? [] : dstPixels + }; + }, + + /** + * Invokes a series of canvas context calls, to "replay" an animation frame + * and generate a screenshot. + * + * In case of a WebGL context, an offscreen framebuffer is created for + * the respective canvas, and the rendering will be performed into it. + * This is necessary because some state (like shaders, textures etc.) can't + * be shared between two different WebGL contexts. + * Hopefully, once SharedResources are a thing this won't be necessary: + * http://www.khronos.org/webgl/wiki/SharedResouces + * + * In case of a 2D context, a new canvas is created, since there's no + * intrinsic state that can't be easily duplicated. + * + * @param number contexType + * The type of context to use. See the CallWatcherFront scope types. + * @param HTMLCanvasElement canvas + * The canvas element which is the source of all context calls. + * @param array calls + * An array of function call actors. + * @param number first + * The first function call to start from. + * @param number last + * The last (inclusive) function call to end at. + * @return object + * The context on which the specified calls were invoked and the + * last registered draw call's index. + */ + replayAnimationFrame: function({ contextType, canvas, calls, first, last }) { + let w = canvas.width; + let h = canvas.height; + + let replayCanvas; + let replayContext; + let customFramebuffer; + let lastDrawCallIndex = -1; + + // In case of WebGL contexts, rendering will be done offscreen, in a + // custom framebuffer, but on the provided canvas context. + if (contextType == CallWatcherFront.CANVAS_WEBGL_CONTEXT) { + replayCanvas = canvas; + replayContext = this.getWebGLContext(replayCanvas); + customFramebuffer = this.createBoundFramebuffer(replayContext, w, h); + } + // In case of 2D contexts, draw everything on a separate canvas context. + else if (contextType == CallWatcherFront.CANVAS_2D_CONTEXT) { + let contentDocument = canvas.ownerDocument; + replayCanvas = contentDocument.createElement("canvas"); + replayCanvas.width = w; + replayCanvas.height = h; + replayContext = replayCanvas.getContext("2d"); + replayContext.clearRect(0, 0, w, h); + } + + // Replay all the context calls up to and including the specified one. + for (let i = first; i <= last; i++) { + let { type, name, args } = calls[i].details; + + // Prevent WebGL context calls that try to reset the framebuffer binding + // to the default value, since we want to perform the rendering offscreen. + if (name == "bindFramebuffer" && args[1] == null) { + replayContext.bindFramebuffer(replayContext.FRAMEBUFFER, customFramebuffer); + } else { + if (type == CallWatcherFront.METHOD_FUNCTION) { + replayContext[name].apply(replayContext, args); + } else if (type == CallWatcherFront.SETTER_FUNCTION) { + replayContext[name] = args; + } else { + // Ignore getter calls. + } + if (CanvasFront.DRAW_CALLS.has(name)) { + lastDrawCallIndex = i; + } + } + } + + return { + replayContext: replayContext, + lastDrawCallIndex: lastDrawCallIndex + }; + }, + + /** + * Gets an object containing a buffer large enough to hold width * height + * pixels, assuming 32bit/pixel and 4 color components. + * + * This method avoids allocating memory and tries to reuse a common buffer + * as much as possible. + * + * @param number w + * The desired pixel array storage width. + * @param number h + * The desired pixel array storage height. + * @return object + * The requested pixel array buffer. + */ + getPixelStorage: function(w = 0, h = 0) { + let storage = this._currentPixelStorage; + if (storage && storage["32bit"].length >= w * h) { + return storage; + } + return this.usePixelStorage(new ArrayBuffer(w * h * 4)); + }, + + /** + * Creates and saves the array buffer views used by `getPixelStorage`. + * + * @param ArrayBuffer buffer + * The raw buffer used as storage for various array buffer views. + */ + usePixelStorage: function(buffer) { + let array8bit = new Uint8Array(buffer); + let array32bit = new Uint32Array(buffer); + return this._currentPixelStorage = { + "8bit": array8bit, + "32bit": array32bit + }; + }, + + /** + * Creates a framebuffer of the specified dimensions for a WebGL context, + * assuming a RGBA color buffer, a depth buffer and no stencil buffer. + * + * @param WebGLRenderingContext gl + * The WebGL context to create and bind a framebuffer for. + * @param number width + * The desired width of the renderbuffers. + * @param number height + * The desired height of the renderbuffers. + * @return WebGLFramebuffer + * The generated framebuffer object. + */ + createBoundFramebuffer: function(gl, width, height) { + let framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); + + // Use a texture as the color rendebuffer attachment, since consumenrs of + // this function will most likely want to read the rendered pixels back. + let colorBuffer = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, colorBuffer); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); + gl.generateMipmap(gl.TEXTURE_2D); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + let depthBuffer = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, depthBuffer); + gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, width, height); + + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, colorBuffer, 0); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthBuffer); + + gl.bindTexture(gl.TEXTURE_2D, null); + gl.bindRenderbuffer(gl.RENDERBUFFER, null); + + return framebuffer; + } +}; + +/** + * The corresponding Front object for the CanvasActor. + */ +let CanvasFront = exports.CanvasFront = protocol.FrontClass(CanvasActor, { + initialize: function(client, { canvasActor }) { + protocol.Front.prototype.initialize.call(this, client, { actor: canvasActor }); + client.addActorPool(this); + this.manage(this); + } +}); + +/** + * Constants. + */ +CanvasFront.CANVAS_CONTEXTS = new Set(CANVAS_CONTEXTS); +CanvasFront.ANIMATION_GENERATORS = new Set(ANIMATION_GENERATORS); +CanvasFront.DRAW_CALLS = new Set(DRAW_CALLS); +CanvasFront.INTERESTING_CALLS = new Set(INTERESTING_CALLS); +CanvasFront.THUMBNAIL_HEIGHT = 50; // px +CanvasFront.SCREENSHOT_HEIGHT_MAX = 256; // px +CanvasFront.INVALID_SNAPSHOT_IMAGE = { + index: -1, + width: 0, + height: 0, + pixels: [] +}; + +/** + * Goes through all the arguments and creates a one-level shallow copy + * of all arrays and array buffers. + */ +function inplaceShallowCloneArrays(functionArguments, contentWindow) { + let { Object, Array, ArrayBuffer } = contentWindow; + + functionArguments.forEach((arg, index, store) => { + if (arg instanceof Array) { + store[index] = arg.slice(); + } + if (arg instanceof Object && arg.buffer instanceof ArrayBuffer) { + store[index] = new arg.constructor(arg); + } + }); +} diff --git a/toolkit/devtools/server/actors/webgl.js b/toolkit/devtools/server/actors/webgl.js index 9df1ce75e821..e1707ecc4b55 100644 --- a/toolkit/devtools/server/actors/webgl.js +++ b/toolkit/devtools/server/actors/webgl.js @@ -4,9 +4,9 @@ "use strict"; const {Cc, Ci, Cu, Cr} = require("chrome"); -const Services = require("Services"); const events = require("sdk/event/core"); const protocol = require("devtools/server/protocol"); +const { ContentObserver } = require("devtools/content-observer"); const { on, once, off, emit } = events; const { method, Arg, Option, RetVal } = protocol; @@ -293,7 +293,7 @@ let WebGLActor = exports.WebGLActor = protocol.ActorClass({ * This is useful for dealing with bfcache, when no new programs are linked. */ getPrograms: method(function() { - let id = getInnerWindowID(this.tabActor.window); + let id = ContentObserver.GetInnerWindowID(this.tabActor.window); return this._programActorsCache.filter(e => e.ownerWindow == id); }, { response: { programs: RetVal("array:gl-program") } @@ -346,58 +346,6 @@ let WebGLFront = exports.WebGLFront = protocol.FrontClass(WebGLActor, { } }); -/** - * Handles adding an observer for the creation of content document globals, - * event sent immediately after a web content document window has been set up, - * but before any script code has been executed. This will allow us to - * instrument the HTMLCanvasElement with the appropriate inspection methods. - */ -function ContentObserver(tabActor) { - this._contentWindow = tabActor.window; - this._onContentGlobalCreated = this._onContentGlobalCreated.bind(this); - this._onInnerWindowDestroyed = this._onInnerWindowDestroyed.bind(this); - this.startListening(); -} - -ContentObserver.prototype = { - /** - * Starts listening for the required observer messages. - */ - startListening: function() { - Services.obs.addObserver( - this._onContentGlobalCreated, "content-document-global-created", false); - Services.obs.addObserver( - this._onInnerWindowDestroyed, "inner-window-destroyed", false); - }, - - /** - * Stops listening for the required observer messages. - */ - stopListening: function() { - Services.obs.removeObserver( - this._onContentGlobalCreated, "content-document-global-created", false); - Services.obs.removeObserver( - this._onInnerWindowDestroyed, "inner-window-destroyed", false); - }, - - /** - * Fired immediately after a web content document window has been set up. - */ - _onContentGlobalCreated: function(subject, topic, data) { - if (subject == this._contentWindow) { - emit(this, "global-created", subject); - } - }, - - /** - * Fired when an inner window is removed from the backward/forward cache. - */ - _onInnerWindowDestroyed: function(subject, topic, data) { - let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data; - emit(this, "global-destroyed", id); - } -}; - /** * Instruments a HTMLCanvasElement with the appropriate inspection methods. */ @@ -413,7 +361,7 @@ let WebGLInstrumenter = { handle: function(window, observer) { let self = this; - let id = getInnerWindowID(window); + let id = ContentObserver.GetInnerWindowID(window); let canvasElem = XPCNativeWrapper.unwrap(window.HTMLCanvasElement); let canvasPrototype = canvasElem.prototype; let originalGetContext = canvasPrototype.getContext; @@ -1354,13 +1302,6 @@ WebGLProxy.prototype = { // Utility functions. -function getInnerWindowID(window) { - return window - .QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindowUtils) - .currentInnerWindowID; -} - function removeFromMap(map, predicate) { for (let [key, value] of map) { if (predicate(value)) { diff --git a/toolkit/devtools/server/main.js b/toolkit/devtools/server/main.js index 7a36d1e4b09d..f1a8e16cb361 100644 --- a/toolkit/devtools/server/main.js +++ b/toolkit/devtools/server/main.js @@ -393,6 +393,8 @@ var DebuggerServer = { this.addActors("resource://gre/modules/devtools/server/actors/script.js"); this.addActors("resource://gre/modules/devtools/server/actors/webconsole.js"); this.registerModule("devtools/server/actors/inspector"); + this.registerModule("devtools/server/actors/call-watcher"); + this.registerModule("devtools/server/actors/canvas"); this.registerModule("devtools/server/actors/webgl"); this.registerModule("devtools/server/actors/stylesheets"); this.registerModule("devtools/server/actors/styleeditor"); @@ -401,8 +403,9 @@ var DebuggerServer = { this.registerModule("devtools/server/actors/tracer"); this.registerModule("devtools/server/actors/memory"); this.registerModule("devtools/server/actors/eventlooplag"); - if ("nsIProfiler" in Ci) + if ("nsIProfiler" in Ci) { this.addActors("resource://gre/modules/devtools/server/actors/profiler.js"); + } }, /** From cafb852187707855ce0336f487fc41d6e51ae380 Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Sat, 29 Mar 2014 11:31:05 -0700 Subject: [PATCH 08/19] Backed out 6 changesets (bug 974745, bug 975210, bug 974736, bug 972936, bug 972930, bug 975228) for browser_tabopen_reflows.js bustage CLOSED TREE Backed out changeset 5aed75c602ce (bug 974745) Backed out changeset 208ba43a7098 (bug 975210) Backed out changeset 5227bbca70f0 (bug 974736) Backed out changeset a695139e96ee (bug 972936) Backed out changeset 8524260ce49a (bug 972930) Backed out changeset 667fc810ab49 (bug 975228) --- browser/base/content/newtab/grid.js | 4 +- browser/base/content/newtab/newTab.css | 36 +------ browser/base/content/newtab/newTab.js | 1 - browser/base/content/newtab/newTab.xul | 8 -- browser/base/content/newtab/page.js | 36 ------- browser/base/content/newtab/sites.js | 27 +---- browser/base/content/test/newtab/browser.ini | 1 - .../browser_newtab_sponsored_icon_click.js | 33 ------- browser/base/content/test/newtab/head.js | 13 --- browser/components/nsBrowserGlue.js | 5 - .../locales/en-US/chrome/browser/newTab.dtd | 3 - .../en-US/chrome/browser/newTab.properties | 1 - browser/themes/linux/jar.mn | 2 +- browser/themes/linux/newtab/controls.png | Bin 0 -> 4180 bytes browser/themes/linux/newtab/newTab.css | 27 +---- browser/themes/osx/jar.mn | 2 +- browser/themes/osx/newtab/controls.png | Bin 0 -> 4671 bytes browser/themes/osx/newtab/controls@2x.png | Bin 22029 -> 15928 bytes browser/themes/osx/newtab/newTab.css | 31 +----- browser/themes/shared/newtab/controls.png | Bin 7329 -> 0 bytes browser/themes/windows/jar.mn | 4 +- browser/themes/windows/newtab/controls.png | Bin 0 -> 4180 bytes browser/themes/windows/newtab/newTab.css | 27 +---- toolkit/components/telemetry/Histograms.json | 24 ----- toolkit/content/directoryLinks.json | 92 +++++++++--------- toolkit/modules/DirectoryLinksProvider.jsm | 8 -- toolkit/modules/NewTabUtils.jsm | 3 - 27 files changed, 66 insertions(+), 322 deletions(-) delete mode 100644 browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js create mode 100644 browser/themes/linux/newtab/controls.png create mode 100644 browser/themes/osx/newtab/controls.png delete mode 100644 browser/themes/shared/newtab/controls.png create mode 100644 browser/themes/windows/newtab/controls.png diff --git a/browser/base/content/newtab/grid.js b/browser/base/content/newtab/grid.js index 514432af122f..ec1235f4bf38 100644 --- a/browser/base/content/newtab/grid.js +++ b/browser/base/content/newtab/grid.js @@ -162,9 +162,7 @@ let gGrid = { '' + '' + - ''; + ' class="newtab-control newtab-control-block"/>'; this._siteFragment = document.createDocumentFragment(); this._siteFragment.appendChild(site); diff --git a/browser/base/content/newtab/newTab.css b/browser/base/content/newtab/newTab.css index 1bb154193649..fe13d67fb107 100644 --- a/browser/base/content/newtab/newTab.css +++ b/browser/base/content/newtab/newTab.css @@ -129,16 +129,16 @@ input[type=button] { .newtab-thumbnail[dragged], .newtab-link:-moz-focusring > .newtab-thumbnail, -.newtab-cell:not([ignorehover]) > .newtab-site:hover > .newtab-link > .newtab-thumbnail { +.newtab-site:hover > .newtab-link > .newtab-thumbnail { opacity: 1; } /* TITLES */ .newtab-title { - bottom: -21px; + bottom: -20px; position: absolute; left: 0; - line-height: 21px; + line-height: 20px; right: 0; text-align: start; white-space: nowrap; @@ -155,7 +155,7 @@ input[type=button] { } .newtab-control:-moz-focusring, -.newtab-cell:not([ignorehover]) > .newtab-site:hover > .newtab-control { +.newtab-site:hover > .newtab-control { opacity: 1; } @@ -169,31 +169,16 @@ input[type=button] { } } -.newtab-control-sponsored:-moz-locale-dir(rtl), .newtab-control-pin:-moz-locale-dir(ltr), .newtab-control-block:-moz-locale-dir(rtl) { left: 4px; } -.newtab-control-sponsored:-moz-locale-dir(ltr), .newtab-control-block:-moz-locale-dir(ltr), .newtab-control-pin:-moz-locale-dir(rtl) { right: 4px; } -.newtab-control.newtab-control-sponsored { - bottom: -20px; - height: 14px; - -moz-margin-end: -5px; - opacity: 1; - top: auto; - width: 14px; -} - -.newtab-site:not([type=sponsored]) .newtab-control-sponsored { - display: none; -} - /* DRAG & DROP */ /* @@ -207,16 +192,3 @@ input[type=button] { background-color: #fff; opacity: 0.01; } - -/* PANEL */ -#sponsored-panel { - width: 330px; -} - -#sponsored-panel description { - margin: 0; -} - -#sponsored-panel .text-link { - margin: 12px 0 0; -} diff --git a/browser/base/content/newtab/newTab.js b/browser/base/content/newtab/newTab.js index af2f6a52ffb4..2ca2ff433c01 100644 --- a/browser/base/content/newtab/newTab.js +++ b/browser/base/content/newtab/newTab.js @@ -11,7 +11,6 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/PageThumbs.jsm"); Cu.import("resource://gre/modules/BackgroundPageThumbs.jsm"); -Cu.import("resource://gre/modules/DirectoryLinksProvider.jsm"); Cu.import("resource://gre/modules/NewTabUtils.jsm"); Cu.import("resource://gre/modules/commonjs/sdk/core/promise.js"); diff --git a/browser/base/content/newtab/newTab.xul b/browser/base/content/newtab/newTab.xul index 87e0c4beb8af..9c21d25f4330 100644 --- a/browser/base/content/newtab/newTab.xul +++ b/browser/base/content/newtab/newTab.xul @@ -17,14 +17,6 @@ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" title="&newtab.pageTitle;"> - -
diff --git a/browser/base/content/newtab/page.js b/browser/base/content/newtab/page.js index ab70f725b019..e66d6e530de0 100644 --- a/browser/base/content/newtab/page.js +++ b/browser/base/content/newtab/page.js @@ -23,9 +23,6 @@ let gPage = { let button = document.getElementById("newtab-toggle"); button.addEventListener("click", this, false); - // Initialize sponsored panel - this._sponsoredPanel = document.getElementById("sponsored-panel"); - // Check if the new tab feature is enabled. let enabled = gAllPages.enabled; if (enabled) @@ -79,21 +76,6 @@ let gPage = { } }, - /** - * Shows sponsored panel - */ - showSponsoredPanel: function Page_showSponsoredPanel(aTarget) { - if (this._sponsoredPanel.state == "closed") { - let self = this; - this._sponsoredPanel.addEventListener("popuphidden", function onPopupHidden(aEvent) { - self._sponsoredPanel.removeEventListener("popuphidden", onPopupHidden, false); - aTarget.removeAttribute("panelShown"); - }); - } - aTarget.setAttribute("panelShown", "true"); - this._sponsoredPanel.openPopup(aTarget); - }, - /** * Internally initializes the page. This runs only when/if the feature * is/gets enabled. @@ -108,29 +90,11 @@ let gPage = { if (this.allowBackgroundCaptures) { Services.telemetry.getHistogramById("NEWTAB_PAGE_SHOWN").add(true); - // Initialize type counting with the types we want to count - let directoryCount = {}; - for (let type of DirectoryLinksProvider.linkTypes) { - directoryCount[type] = 0; - } - for (let site of gGrid.sites) { if (site) { site.captureIfMissing(); - let {type} = site.link; - if (type in directoryCount) { - directoryCount[type]++; - } } } - - // Record how many directory sites were shown, but place counts over the - // default 9 in the same bucket - for (let [type, count] of Iterator(directoryCount)) { - let shownId = "NEWTAB_PAGE_DIRECTORY_" + type.toUpperCase() + "_SHOWN"; - let shownCount = Math.min(10, count); - Services.telemetry.getHistogramById(shownId).add(shownCount); - } } }); this._mutationObserver.observe(document.documentElement, { diff --git a/browser/base/content/newtab/sites.js b/browser/base/content/newtab/sites.js index 5545b66ee56e..e91706fd0e8c 100644 --- a/browser/base/content/newtab/sites.js +++ b/browser/base/content/newtab/sites.js @@ -128,7 +128,6 @@ Site.prototype = { link.setAttribute("title", tooltip); link.setAttribute("href", url); this._querySelector(".newtab-title").textContent = title; - this.node.setAttribute("type", this.link.type); if (this.isPinned()) this._updateAttributes(true); @@ -144,19 +143,17 @@ Site.prototype = { * existing thumbnail and the page allows background captures. */ captureIfMissing: function Site_captureIfMissing() { - if (gPage.allowBackgroundCaptures && !this.link.imageURISpec) { + if (gPage.allowBackgroundCaptures) BackgroundPageThumbs.captureIfMissing(this.url); - } }, /** * Refreshes the thumbnail for the site. */ refreshThumbnail: function Site_refreshThumbnail() { + let thumbnailURL = PageThumbs.getThumbnailURL(this.url); let thumbnail = this._querySelector(".newtab-thumbnail"); - thumbnail.style.backgroundColor = this.link.bgColor; - let uri = this.link.imageURISpec || PageThumbs.getThumbnailURL(this.url); - thumbnail.style.backgroundImage = "url(" + uri + ")"; + thumbnail.style.backgroundImage = "url(" + thumbnailURL + ")"; }, /** @@ -168,15 +165,6 @@ Site.prototype = { this._node.addEventListener("dragend", this, false); this._node.addEventListener("mouseover", this, false); this._node.addEventListener("click", this, false); - - // Specially treat the sponsored icon to prevent regular hover effects - let sponsored = this._querySelector(".newtab-control-sponsored"); - sponsored.addEventListener("mouseover", () => { - this.cell.node.setAttribute("ignorehover", "true"); - }); - sponsored.addEventListener("mouseout", () => { - this.cell.node.removeAttribute("ignorehover"); - }); }, /** @@ -201,13 +189,6 @@ Site.prototype = { } Services.telemetry.getHistogramById("NEWTAB_PAGE_SITE_CLICKED") .add(aIndex); - - // Specially count clicks on directory tiles - let typeIndex = DirectoryLinksProvider.linkTypes.indexOf(this.link.type); - if (typeIndex != -1) { - Services.telemetry.getHistogramById("NEWTAB_PAGE_DIRECTORY_TYPE_CLICKED") - .add(typeIndex); - } }, /** @@ -224,8 +205,6 @@ Site.prototype = { aEvent.preventDefault(); if (aEvent.target.classList.contains("newtab-control-block")) this.block(); - else if (target.classList.contains("newtab-control-sponsored")) - gPage.showSponsoredPanel(target); else if (this.isPinned()) this.unpin(); else diff --git a/browser/base/content/test/newtab/browser.ini b/browser/base/content/test/newtab/browser.ini index e91faaf259ea..01ec5ab570da 100644 --- a/browser/base/content/test/newtab/browser.ini +++ b/browser/base/content/test/newtab/browser.ini @@ -21,7 +21,6 @@ skip-if = os == "mac" # Intermittent failures, bug 898317 [browser_newtab_focus.js] [browser_newtab_perwindow_private_browsing.js] [browser_newtab_reset.js] -[browser_newtab_sponsored_icon_click.js] [browser_newtab_tabsync.js] [browser_newtab_undo.js] [browser_newtab_unpin.js] diff --git a/browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js b/browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js deleted file mode 100644 index be20fdf4ccce..000000000000 --- a/browser/base/content/test/newtab/browser_newtab_sponsored_icon_click.js +++ /dev/null @@ -1,33 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -function runTests() { - yield setLinks("0"); - yield addNewTabPageTab(); - - let site = getCell(0).node.querySelector(".newtab-site"); - site.setAttribute("type", "sponsored"); - - let sponsoredPanel = getContentDocument().getElementById("sponsored-panel"); - is(sponsoredPanel.state, "closed", "Sponsed panel must be closed"); - - function continueOnceOn(event) { - sponsoredPanel.addEventListener(event, function listener() { - sponsoredPanel.removeEventListener(event, listener); - executeSoon(TestRunner.next); - }); - } - - // test sponsoredPanel appearing upon a click - continueOnceOn("popupshown"); - let sponsoredButton = site.querySelector(".newtab-control-sponsored"); - yield synthesizeNativeMouseClick(sponsoredButton); - is(sponsoredPanel.state, "open", "Sponsored panel opens on click"); - ok(sponsoredButton.hasAttribute("panelShown"), "Sponsored button has panelShown attribute"); - - // test sponsoredPanel hiding after a click - continueOnceOn("popuphidden"); - yield synthesizeNativeMouseClick(sponsoredButton); - is(sponsoredPanel.state, "closed", "Sponsed panel hides on click"); - ok(!sponsoredButton.hasAttribute("panelShown"), "Sponsored button does not have panelShown attribute"); -} diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js index ee3b385daf27..fa298d506873 100644 --- a/browser/base/content/test/newtab/head.js +++ b/browser/base/content/test/newtab/head.js @@ -2,11 +2,8 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ const PREF_NEWTAB_ENABLED = "browser.newtabpage.enabled"; -const PREF_NEWTAB_DIRECTORYSOURCE = "browser.newtabpage.directorySource"; Services.prefs.setBoolPref(PREF_NEWTAB_ENABLED, true); -// start with no directory links by default -Services.prefs.setCharPref(PREF_NEWTAB_DIRECTORYSOURCE, "data:application/json,{}"); let tmp = {}; Cu.import("resource://gre/modules/Promise.jsm", tmp); @@ -29,7 +26,6 @@ registerCleanupFunction(function () { gWindow.gBrowser.removeTab(gWindow.gBrowser.tabs[1]); Services.prefs.clearUserPref(PREF_NEWTAB_ENABLED); - Services.prefs.clearUserPref(PREF_NEWTAB_DIRECTORYSOURCE); }); /** @@ -452,15 +448,6 @@ function synthesizeNativeMouseLUp(aElement) { synthesizeNativeMouseEvent(aElement, msg); } -/** - * Fires a synthetic 'click' event on the current about:newtab page. - * @param aElement The element used to determine the cursor position. - */ -function synthesizeNativeMouseClick(aElement) { - synthesizeNativeMouseLDown(aElement); - synthesizeNativeMouseLUp(aElement); -} - /** * Fires a synthetic mouse drag event on the current about:newtab page. * @param aElement The element used to determine the cursor position. diff --git a/browser/components/nsBrowserGlue.js b/browser/components/nsBrowserGlue.js index 65353e3279aa..bca11c903050 100644 --- a/browser/components/nsBrowserGlue.js +++ b/browser/components/nsBrowserGlue.js @@ -22,9 +22,6 @@ XPCOMUtils.defineLazyModuleGetter(this, "AddonManager", XPCOMUtils.defineLazyModuleGetter(this, "ContentClick", "resource:///modules/ContentClick.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "DirectoryLinksProvider", - "resource://gre/modules/DirectoryLinksProvider.jsm"); - XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm"); @@ -478,8 +475,6 @@ BrowserGlue.prototype = { WebappManager.init(); PageThumbs.init(); NewTabUtils.init(); - DirectoryLinksProvider.init(); - NewTabUtils.links.addProvider(DirectoryLinksProvider); BrowserNewTabPreloader.init(); #ifdef NIGHTLY_BUILD if (Services.prefs.getBoolPref("dom.identity.enabled")) { diff --git a/browser/locales/en-US/chrome/browser/newTab.dtd b/browser/locales/en-US/chrome/browser/newTab.dtd index b85682d55129..ce9e3e4b0b35 100644 --- a/browser/locales/en-US/chrome/browser/newTab.dtd +++ b/browser/locales/en-US/chrome/browser/newTab.dtd @@ -8,6 +8,3 @@ - - - diff --git a/browser/locales/en-US/chrome/browser/newTab.properties b/browser/locales/en-US/chrome/browser/newTab.properties index 0ec4df801f9b..a249356f54f9 100644 --- a/browser/locales/en-US/chrome/browser/newTab.properties +++ b/browser/locales/en-US/chrome/browser/newTab.properties @@ -7,4 +7,3 @@ newtab.unpin=Unpin this site newtab.block=Remove this site newtab.show=Show the new tab page newtab.hide=Hide the new tab page -newtab.sponsored=Show information on sponsored tiles diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index 91abe3af0334..fc5d2c7fc6b0 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -107,7 +107,7 @@ browser.jar: skin/classic/browser/feeds/subscribe-ui.css (feeds/subscribe-ui.css) skin/classic/browser/fonts/ClearSans-Regular.ttf (../shared/ClearSans-Regular.ttf) skin/classic/browser/newtab/newTab.css (newtab/newTab.css) - skin/classic/browser/newtab/controls.png (../shared/newtab/controls.png) + skin/classic/browser/newtab/controls.png (newtab/controls.png) skin/classic/browser/places/bookmarksMenu.png (places/bookmarksMenu.png) skin/classic/browser/places/bookmarksToolbar.png (places/bookmarksToolbar.png) skin/classic/browser/places/bookmarksToolbar-menuPanel.png (places/bookmarksToolbar-menuPanel.png) diff --git a/browser/themes/linux/newtab/controls.png b/browser/themes/linux/newtab/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..14f382fbdd18a1209f3dcd63831014b5ad2fc428 GIT binary patch literal 4180 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 .newtab-site:hover, +.newtab-site:hover, .newtab-site[dragged] { box-shadow: 0 0 10px rgba(8,22,37,.3); } @@ -117,13 +117,6 @@ background-size: cover; } -.newtab-site[type=affiliate] .newtab-thumbnail, -.newtab-site[type=organic] .newtab-thumbnail, -.newtab-site[type=sponsored] .newtab-thumbnail { - background-position: top center; - background-size: auto; -} - /* TITLES */ .newtab-title { color: #525c66; @@ -131,10 +124,6 @@ font-size: 13px; } -.newtab-site[type=sponsored] .newtab-title { - -moz-padding-end: 24px; -} - /* CONTROLS */ .newtab-control { width: 24px; @@ -175,15 +164,3 @@ .newtab-control-block:active { background-position: -192px 0; } - -.newtab-control-sponsored { - background-position: -249px -1px; -} - -.newtab-control-sponsored:hover { - background-position: -265px -1px; -} - -.newtab-control-sponsored[panelShown] { - background-position: -281px -1px; -} diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index 304551141ae7..888a81df496e 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -170,7 +170,7 @@ browser.jar: skin/classic/browser/feeds/audioFeedIcon16.png (feeds/feedIcon16.png) skin/classic/browser/fonts/ClearSans-Regular.ttf (../shared/ClearSans-Regular.ttf) skin/classic/browser/newtab/newTab.css (newtab/newTab.css) - skin/classic/browser/newtab/controls.png (../shared/newtab/controls.png) + skin/classic/browser/newtab/controls.png (newtab/controls.png) skin/classic/browser/newtab/controls@2x.png (newtab/controls@2x.png) skin/classic/browser/setDesktopBackground.css skin/classic/browser/monitor.png diff --git a/browser/themes/osx/newtab/controls.png b/browser/themes/osx/newtab/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..f42794644f4dc2b4ae69534a8c8cce352afc0092 GIT binary patch literal 4671 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 JF4MG&_#f2%Xxab( literal 0 HcmV?d00001 diff --git a/browser/themes/osx/newtab/controls@2x.png b/browser/themes/osx/newtab/controls@2x.png index b29114c0268de5de75093cdb0f44a5ade2c6084b..abbee1f6b23c7624e4a9c73b48be08397e5f21fb 100644 GIT binary patch literal 15928 zcmV-8KF7g{P)14h|OYbu#|e5mewk5#`q_tZJ(R?V2k$HxV?j=u8<9mF-Qg^*IXMzh2i){v0u{lzs?qo4(m zyH=GtEG%a1xgqA2`$nI&75A&bv%fk(KG0XbcF-VHV7;O{y8Yn)0#vQoAL3X zI%7iWwD#WB3*sL?^`V)sZhLzVv-2V{GmNe^!heqc9RIoavrztX@uyBpLHZ%RkQ_wT z%s&q~4ms&``yeYC)H?+^(bwN!{Pwng5`TT&76qNOF(%a7D6O@H#Aj{^bf+Mb5aIMv z4eBKWH~#$yD|ycO=8Ce=No<{sl&4auR1o;S$M5)k|uVj6Tn;$9PxR#Iw)D@T!@ znwmmM5+}AABWZOQyw-`pF1RfNeio{lgrtxPj@xO+QJHq?@9Xv2ayhBBk)?8p*hw&l z8RpfiRxXJDqP3TsnSqInl+uJjh@SLBKCe%lJQXL!abvk;z)H@6O)c{x_%-;;q!aLq zCh-gKE9MV)9?j=ZgTH@?`A>j9Wiyt)4F1IOize|4qre|H z{(PY*j)8Z0bZoTHAU}L&71jal-^ccM{3YLwZAW+Lc);8&bR*Zb$uJJSbxcvZ`=A!c;5v? z+VGQ0@A4;iq}4z;V~aAES-QJO6)kPW)kpIfLhnF`3f#Y`x`ge+u;25n9k-8ZBH91HT9R!;WjW zZoT>6g{0f}?EAyM!-o!?f*ToYYuD=W_u?;Zxcss;TesZ&Qz2C@(I!lcA#GgblA<*k z&~Q({6{I{eU8%I?2h#0(_U_wvL?`p&@2TM@<~QKi0{nnqf+mT`lfrac{#(FLmjCcP z`Fnf1XZ%MujV9>gE;bNs=@tik#Vm$xvZo6f>Aj(B? z9K5mbkazU`k3>0&mxMp?J@Lu&SBednUMNsK(bk)91po8(_>aI zd>?^-a&j{D(8J$RzkT@?%IEV-!Vmk2YreSIY~OY-rPFD#>2p_ae{9E-+k`Num=R}Z zbplwGzb%tqz4;59?&IWLjFQy1fAXYy;jKe75ou^iNc~;UhQqKi5G`_^6xXl6&^+*u zw^GJeV$L8Qu`v4&d>;0fxk4#U-T&y1)o=cLkj6?8_+^!!s7csW`*RuC9{S=-pIv7j zy!#Hyh93OqD%igcziZ1a{$z4F%P+xiO64H){BvIT_S=G{rj~@?q*9`^W{oIbe}j-= zVEKRj{0sArKWP_#IC&?CKTkjOkowcEU1W+yJ5eHP!Rkd{d5J*G`P9IG*|L2*DHnf! zQH?)f?4nA|B}^sRn)$eB6ZNWN`hLL2k5MWWCZ4BQtY2uY5?qTy-xnp{x61e&Lr*lM z7X~po##ss6onv@J630&+pN^BnE}l2{z9W{hO-_{rkLfApT|4ku(bwB^F*7k67?q1c zs>aHymS2znf9IzY@bBJt(0ljD`%B7SiXw67$e+28^wzJvQ1tcnUJRys{MyYyvf!+q z&`G6KC(b`E1b_JOcOFsCKKBCo0jj*Vj@d!CRd3>23m!8}rPQ{2?+I}Zxt5uLYZ)nQ zla4#F0CV|CbY?Q(*Cu@M-=0!W4IU-gz7ozD2$CMpfu-r(EJnv-GA@g!29Hqc=f6_- zf9002tquGn=Fcyu`D0_kM_<~jogSrI2j-q&Gaq(wdBdE>%DwxwVjp$i8l2*x^N#0frOA59LSrG|@-Z}8D z9rkRrz3&_ln?JYFLNgPyLCP+8%9O`FvKiinm<2T zJ<{6HtA|HOWjdzWVFF_I7A0`91&D@uVmr>xcZcY%0b|*~v;h0lwEe;V?CbkTw)YAO z(n2U78cGnP1^CwXf+dN#j1W)%?hSh2t6y>Uug~v9E~ogTjRC(Vlfdlz_6c*A;!iO6 zmMC0zEint2<{f{?#UG;)Kk?>$UOFu@o+kn+g$IFBQbYV>S19$SNf4aH2% zrj0H-g>ubVnw-ne#!bMFEx5DB&toTN=GX4WXWEQl%46u)% z|A|k0Un=#rI!QMV`7UNT7v73M)a<_V(rBK0|%{Nc^uz}s9L>yc!EKY0wh(o z#hTHs{lZn^#aCWiL^84C6EiWJj>-WP;_AY;jq3C3X5ot~*Igq1XK??*`7Og~`GII{ zO@e$cmC5-ygZAASk4+xF@7q|{$Yj2}1XDpOGG>-B&__d2{9A1MdLC13|Tdo z#XiQL%UNK?B?WdrB_xD=Or5{CC;@Wvqa+fBY~r?KGXt}LY2N(VY|ba<#~mUCX0Iwz zwQdVt8droclpC8F(7-f*{)+wij)W_DNZx)5J=@=FX#pZ+3>w8yc5KVQ{PpZ#O@1wp zKTei3{%GfuXS2Br{fkfj<kF?^w}>!h|>?478HNT z#UBs753z6GPE?B$cmfV*bGw!9P4f}ei9fY})13?3>-bjdGvsuMrOvfQ>4C@UR))d9 zaiB}((tZ>f9nc9O3L=t3B*2?0PENivGCHPNH!4T_GnsT(BYG40{DCM=+!=TkRJtv7 zpR+z2<^S6I4sbb&E8SDo-7|B8bQN;|1Q>+KNx&kaWCJ2d0z~kxF*e_a1K0%HeBVCo z_pRUC^>e@v0X7b-_ggO(LeU}#BR~WP5C}w)5Yfs=xF#>xRM$++bk9upOwXW2 z@0K`pPxtAmzw1_?f6l3@(*zK=)$%W-7cPV-i^Ns^Oob6FiIIV$Zpv0_Mj`x6dBD}e zPhPkXZh0gwq$w(fpXGHF0UXs0#BP94t`(_>>fpZ$y>Qw-9LW>UubVItHo}<2tdVK_ zq(|airNXtQBtC&##;v?nAjgdx0uRhR3Wg-hBbC;$`9A*YCpZFYJa7+tb=aQ23k~D0;R& zVPF;D*CtG|k0evUxt@cd$mhfAb1e#iAgk@DI-|_GRR2@H(_%R@)C;nDs{6yf6 zQxZQ3CvC^Exs9SzEQ)ydpm8Wq97$Y6C2^72GQ#9|xVXk%7(d=C*O{4e9ae^tpM~O$ z-Cc0~%8l^5dDD=@O^8z3dTsd1%1yAjrB{DB2-?-8my1xy_Adj!oy9MdD4#=pzb@~z z_QS0&?18(^8Uu|HNxU7&`!>9W$Xl0O&@5Z8#&4H{U+XaL2{5(KNV2D2+u8yPkcbz5 z^*k6_mxzSFwYwj#e&AUo?|m8yQ}}gVQd9}U&tll07*ZSi<0|`u0`7jtuL!&>`{Q`_ zN4uQBP&i2qXQ6XnT^gWZcJA}*I`Y(z;UmQ7rX3AOPMbcar>EzeMJBN|5D_Ehhg5q= zQjVu5zF`{XV%xSQfxqzAR}A!)&!J&DM~Hrdd&|C%vp7ybvzlAG&--}m_LoREl}et6 ziIw8%wX~io1T0Y@bnTHSF@!5j<+fDs0m}KF3p9yGypDmyq&)2s;SLhR6|TfDn5c;X zIPD}PaS-s*`Y;mLS)&kB2!0grq30yI*OSC={$M!$;gE28ZoOGtBpNf6#4i*9`hf`0 zM;#m9`e++m_h38x$2F%yQ=L_syn6=V`bF#D-MyUvbwhMGSZCME6A&@*D`7(6R+3wU zlZK63THxD{x53XZJRF9G{0M39v*Fg&@4*Lc{lM#o0yDIJZXHZlQyKnj!V{q(%N<|C zxDLGe{@>xMdso4tZ(ah!>XRYl-3QnF;!)VRvlT?5PPKo4@bWXJ2~i3^i(!A_O3mz# zy8r#{fvdkitJwbJgxT}>K-4PQp+wgm?Ek8EmRVlH4c>tFS2`1$fO^#)4OP&q$NCyG z_R%m+j;n->;Uh+NA(5vol{qbK+g49cuZ+eFq;0OUwy`Sc)!UTF#Z?}-j|6oHv5Fq7 z9t$eV6VD4FY68^cQ4GIFoUBUtgY9sd^u)tS+`CMK;@9^;Bm>;H#-a-NUEi4ar2xW3 z5?@sUeBM5n*ur0jrAdaw6(CT+bvk?N;PX zP_%)R`@$1dr-rF8MZ}My+l|byUNS3u__+bBt`VaF9dOGNo8jN*PA>%?$$K-r-`Xe1 z8#t%$_YJp@xFo)FP!WC*LgChucR53KD+On6C?^_khRBswr-GuB>sHqKPr=31}K^UbuaSvHU4b2QH4Lg z$9=5EUy#J#EXm-CGD_jsI|5YuXNfx#|&{Y#J8j{iK}{r2VJ)-iJ(nk z{38D)AE5eBp0Hr(IE5tsNqcC>apUd|)NS;x@%K$4TP?l_g2WaDzpwp$o`J^aBk>{d zUQ0(SmTBk7U8Dx^pH;ZZacg)6fC$(_6_BYhWx&rhM|yL$DjAP$9i> zT9@=tU+d~Rbe$r%|7aVUF^}3lqC|=&3aE~raI{pne$bJ1*%m@k@jj;#NQHF?BL=d9o?385)_&#Ae%eww-C;(-9nXn8HqaB9r62MJtn)rUyWZ>9Ffw$reD)#Eff7cRMQwp6%qHWIbaB#z`w z$FleK=;}4_$P-V|*d>^z1tFy({82;b-Hrph7cYjC<$-6#> zy!S3&4ttj^gL=b&29z)cRwcUqVa!k9`2xE1BF=Yy|9g5#HXL&8wVqdg)m3!k@Cn|R z{EWn%IY#AUB>j*7@CRC3E=87-^=M2wdcdSzacqZ(tqVdjvC(-|2kke+)a!9ww==^F zw3BJmZgs*7Cs$G~M^uF^X#eLrsQ7+Upa z?~{O*5d9eEsV<+yE+R055u#q!T#6zg^tcg_= z*HPsCG!ZzFclO%am2d*DV+>rB-Ak5$a2!qIm&#{X?>kPGy!W6GdCO~ExAyNwC=o(W zD*PWl_@KmlNX8Rius~u{`&s-Squ2cr5;zfe()WYiS5NW&!@Z&Wj(u(X{Y@KP&e`q> z6EPDT=S4HI2_ah4XPIFwjvi%V6Ry3Rt5Jxv&Nvk_u{CwSvf-U!1L?GBJHjGG)8tlT zeIuK7=BX_m?Hyi*wWgt6s5df>-nnO-(z)^7%_@Xmu&^iuu8A6@KnV@UJ^rU>P@YyZ z`78uzhB)5k7ZHNt^plT6IkpnxLCXi=c@!#%L=vn-q6W_oi6}|b6Jh>?eTle*bc;G^hfuqDIIwY*a|3wqH3`-iJ z9{7ZM19o(!OVs5miIIiOhp)&awt$RiNQJilK_ePrOG{@Vg;I4CZL_%cN0T^^S1t7~ zzF=0yHs#r&$DYiPw^adovx>Bw2n3r_B)DtoGD&)4=Fj(t`;tp&lO?}B7;fLad<8TZ zTwddpN#3jiJt0KU3on3Q5Q(E#olD~5khs;4ZcW}ObzI{2wSS-v+6FN(<|QK%!1guo z;cu*8ComIR3unf{$p;;Tnb-`>#MWOt!y1HTVhh*nSDDxnim%R?aS~=?8`?7CH z;^P17E3cD|BywMgOx`4zzK`(NfW%9CVzd;DNbgGWpraQeZz-zCP?Ru)kHkeaToCP< zDH1GHQlK^^`@cH(0g^ajn~Guc-15=l#aZ%B7HJn({eV?O zC%Z8dTmQg2_y)HoJeLFkhSGL$Xa_T_^}XHJwol&7K-zw%p{{N?FsN9MGO^jVtq44( z2TNb{$46HK0>Fpn{OIJZ9wsF0kosyHf=dq!z|+tD83qRW;jGh7iALUkdqonsWhMNC zU7e5|i#~~sjMbvWOTn>i%(OPI9P%#Wb&JB2*jR=51q7Cn`3q+Zess}MFn!#RPy(FP zl!BjLJRQEa>~%;xZeaq?hR~rx{48$Vc1Mu;BY=jE6g( z+Xl8Pf&?BI$JdxDd`X*XhvMF`!5Q3j^-MTs(#Y@#2zuZPuRR;C|M#bY?XSLHum6q_ z|ERzo7~GI%+;xJ+pN?^El8*k)8jFZb;5r=b0F%q31WIn9V=1!cWqRH${>WXxD;6ap z34+9N{rKq^oez56#l3xvf%*EFL*&K9uu-GkqmMm79DdaF(PPJsyV=G}YoXcxVHovF_{-6izuk?=dkASnLj*6VM>V%2I;D3I8 z8r=EB+aLOp=NG3K=8P-5$Sc|78zQGN1v6IQf_Lp@s z6I(rIPD{F?pL6ai?&1Aj=Ct!Z-m+C@SW708=T$-POvJaO8X@%T_^BZb3{kBi{gNb3 zI^=cp$YHG78vxU?q~7y?c^S7QNt|?uytCKTqA-+l61i~3+im=Z1Gp z2>wbO@SsDcy<&O5XV7js^Dwyln2AxzLmT8H#=@@lUby$g_wzk)RfixEBvlAOLvauM z`s2pHoWq7enegG9gNDNH?g9AS8+!_S;83j)w9xMwFW`aS`h^qWsu@R=o$_VLC)XDo0~b|G0UW&zX5$N!W}SN`ILg4Ue(G6|)IWb7ZR9yuxUl9^BXLodx7>td z-b3fi$&&XjH4A;bT4F}$$P;gW^wBa1T*Mx}(^7g?$#|TAH-6r{EdGxaSx>#<3fg$* zTo-mNUtX-Q21L8yLBk|du5ykNJrf&%XsCi-y~xSL#tnm~>gtT)!-sd()zzg<%S?O2 z!nW1h+e<{j(m5H{;_A`q&dv^<$R#cTs+#~q2n}czR#V@_9J@6RqAEyt_K6fU}I_J!+ z$NS`(wOIlu92cl{;-o_)vS#gz|E)amVMyLh7heoQ>F@mGDwIEFC*e()D<`UEb@ma7 z*S_e4Dj^>Dg!%I`1f3=C4^h-4wg8FmT(P342QKusq>JM^j+}ecFEg=)*+(I{E{ z6B}eRv0>)4{*fa_I1Ms$nx!(QrR%yWb6PsBGpsc>_Msk&rDxk-CN{emfwRB_s!&nC z8sLWOu7P1qP0-Wb3w3oVze)w8-q(JUC+*a*G7eUM5f3lO+f;TRf= zGl?o9{yMnhwr|0R;llwZIzR*7kFP``@A!#aSbzX^SXC3qve&o3vUQt*rTYT_*8N~X z-se+)xFm?rN&;A^B8glCN&NO#OVb#0LHK5&Kf1XE9(i*ch=JgQuBUFyPYL_^Uk3?; zB~rkW^?_OFIwfo@0t~MI_Icoo|F#Jpe(?=pPH;ltn?Juf@AI*@-5dORBLTup6!O4x z>kcV#?GKUiOgR5+ByUHN_tR^on1-n`u011(^nzKE#64YCIvdruKNZYEA5P?*<9YAI z3~M`3GHax_ucTxz4opxP+enx0r>({$E=cr{RBlSuAbHQ7t37Y@u!+1=%)|e|k|iFA zt0i)zt4O?<2d?W30T?+Gn?7A7Jzb||dYRY~iG*u#?qps*VsOX7V>XH)9nw{wSu8!v zvK7x)&jTm2Bl13Y%4BG1ZH2pk`CEL^`AL|*@ceSWZ@;VqPb4guH)j@17&ivmIy&I@ z4=sn|k2#9g_?7*AwO>XS6#B9BJtXhL4?7h0>}iI7`Pcu0p7>0-V*X_nw|`asRM`-^ z2oN~f1HjU~APRae5h5uAy&lF4iMYBhxfQjYg)Y*4Ao_cY^tHg`N=d$F@Rgx2m46a@y zGq&OQ_&KCT*U&xD1lIlPfsa6sdiX^b0Vwj@fn(g;6?vy})-G*Zxl)qeL>vpJLe~&s zwm$Y)tv&FPW8f3eqaII*XB7Sqk(56~0w?lLDn(Z?cz@|q*%pVYC318Pecp-pRdfs- zB{UOTA_)mAnZ`-T(K4)osEQuAkd``%JAeTvt7AJhgS6K~w6An{B4Mi5ka{Af9s!NF zj4VjrSHnS*Cn9;bz(OSN*0y$>u(n1Tj0-i1e>$OO7L~9xdC#9S8^(_v4g1=pnFY?;a%YA479`P=TWYYlLjW!bcw44~PB9aNWk$;3;93nOSV|PGtM+5y7z%#@o}qH90T8> z2)kF~SL?iWzova+oDa||C($~r^cZ-EF(odcFuLP7T?|;sOl*j}C$o>z5L2(m1<|Ph z5^u0{+M&C#geydPz*f8}Oge^3Ye)#JVscvChNfK>+0aUx7-AWO+5s5@7W7K{I{PVdAERJ8qx?aUA{_UzI@)L z6|{eK46yc$C5u!NIf<50&dsf>DwDu8b{3Y%CCF*f@drcbYFnLE0AYz-B6;AU*97aR z{TR4hJ{cr$BY;;O%jnXxO*-*NJbnnBh%Z3iiQskKF@UUYCvF{0;o#Y82%mKPF=E`9QN8P4duw=KdLZdIZp!P6%xXy0v-4-p*o(GVDvupA zx_jOFH%G_OJNJx}dp5nhnJ{JvTxf|zfSSC&bPXJYUrAgG-UFDEgs`4)=A z;}W0`rzmn<=R+56Y4X09!ser)U4_jRdCQAU)1>Qh=J`t?KziczIj;9D0=R?6{hhif zd4K1YZ^B`RPDRhV*(2|k7PUN2jd!CgU4bMnB#F~DuJIHk(T?jG$vUh`+bFy#DwvF@ zCs1hu5f$QBN}7;DRs@82;86+Cw`N;Z)c#B>XWOB?(6;Nk<+i`?Z|sN3B0az5{s8CP zAn{)lPdC2(iR^(VNjUdk6H7NJ(d|zlf)ElyPmpk4s_%#E>V3ZiBM6KM;HEsWuX(Sr zVf`ykXLtAB6HYjJ;e<(({=f~RaiG6H(;*y{B6T-Pn+lN=F)u}FM5#y**Jn3##`hYg zcQ5ChIl~@3azyhPGfp&+Y%SLn5-jJe&oFq}G|ZO0%`Gus z2PQ&DNRs#5Ik}#>3_|e}>2ikJ*^|0XKY8E&?Qg=NQ>UWm z-3a@lCvjJli(lllKMxPX>7^Y$QYza6B#lZ4Fd*7^myKV;_YrH9A}aJ? z>7SmQ12OO`T><;C{j;b_;g4>AYA^Ba4`G*jOcU&WFAP{X{$T$Pdg1z_T1deAF4F%w zm%6>(9SjAM4Gq21rysK=m8#o9{DK5dSc~?}FsWIRh6MEMK{*+>oKhz!Wwq8gmdo zQ##rJi(n#=(DEP8zXjLLJX-Gm?)f((hM;{RbPYpeD+50ZzRV=D`C7Do3tWBTLEiqW ze~(V!D7l7=Rfu2nw~tUG-otPIv<|*9`xLeRav33X2(}dq#V;b;pZHQ^`vZb`y1@23 zfop^cQ#AX7QZyHOEeJe37rGA{qYYCZ<$7q_cI2>wB5m46=9h9yZ(pCBBzeSP2ZJgD zD4S6}MlpSaYoqil9V+jkY>BDoys&y{4uP|5yc7Eya=Y!?>Uco{Ja+mtIA{uzcN>j) zKcGBsD@cAp5~uSO5eQ)-Y=kk_Ko!LAxOS-}Q->dVFit!eLlf3Q$y^?r_oQDiyrDJP$(!sbNYKlORu#c*)h<)g#Tj~o*w!j>7`ErmawPCG$T zg0e{PH_vW>gu!Lb?L~jx2%>Ii8Edv7&~S*UEc_Cse;vE)0Ptut68~%6hlroSzTN>? zzF{k{#^Djiz@5Bx)DlCv_)!$UR2%{M)#|@O!o>FP>VXH>z6R*#R2%`JEn*76AJP8A zmzvuj+fn#Izin%O-+*0~{TXn4r21(Sc)->YCf$F8HxGqdxaD9E^ux~WTVP1jP#8OQ zJfJ5|a~JR7=l9Fs}A&1=5V2PJ5Zs1%tvC|K)Y-W&Y$h z-`bcZZ{@#)<|>AA2~d4AVIpjVQDV*WMwkzO+NNWy2qC}m_9ltr-S^%{^6p0RPWj2Z zIEj~wU*SVcMe#H6!dn925A^lgJ-xk-BKd+0{@n9_1`Dygy8dJB4Q|8 zJ9xQ)BvBGSZCP~t6JKg>f3Vn@<g?P6gJsGS&w%PFZz zAhG`1=l?!3zt}h<3Cy=hHr`q%v^oxmGy|9 zhmdzXNhT8#Kf*!$qBwr9lgYTR@&M&gx)zrVfV`c&*_tk_rX_kzy-E>8O)}U~-Gl*= zGs2`iC|6@HjDNtkv-pQ5IdqWSFcNC5E9!C{UOzX1afj-W``|i}W{guEg0_g4>gH%0s#~_dQz?GNhNUcMvj+eSla8qN z562=%mrH%xkKX>IN0J_ZVJQ;`1BBq$&u^&xi7&OcKO`~1BbvxE`g&AfDi-TWD+h;JnmTd^WWCx0btw!!=SBtz(sAq zoqEy+vdfe{@(z#kzg0?zxP=hl4h{Gg);RVEt z;Mby#IaqA^XmCT!nsuI>#cx^(J-!1(OkP+VL~TM@^uWx$?_rW!19V;;qD8v*QzoYPT z24c>%aj^KE7SCpw1fM#-8)=+PCzx?U+gt5OU4i#2`g&mAaT6s50_~K6-*#2|b0)4l z>qPj?+BY&}tm@#Amcj|(nfP(U@VTqVyAPnZ9lrSa(40nJ*&nVWHxehH0<`S@1U9_-GW7QMD^Gk<%{}qIZ`%n6PoA*< z2;AqvGTQbJq&s)++_i1WX#y$gffFbi!|B|)3-M2xJQb(-Q~%}fzW)*6n_M)Bn?}uMxzZ%LBM+Yn zGfzL+Wt^oy{&34jh^Z8Q&lZGZ1>gMojV@zs0N0goB20uW7i&@c{R4=9--n|{kD2x_H!R=+mhcs?ya(-R2Fx%t zc~o1J=h|cmn1A}`;GeIX?{W|WIMHttVv3G`AT9Ba9y4az9dl0Rg1yQg-?Rrh`;=G8 zSZ#ucDttb~aAD5TWAH^ICrJFe5kF#zj=wLb{crjTcg64c(!Xqg_6`A1)pWkr%6H{t$e{8frI}rcDlP66b_2uiO{pot~Me@WyHP5?o z=1ds*#eZ~xbF@DnePowme+K&cr2QF-_UE!Y?%=Bs|5p4FV)XP#BCnMnD>5E9+Mg+y z;cd>Xx4MG!f#%(NHW8*^|M5OD83ne$?eB%%JGX<&06p=fbVSCE9}o2njk3$92hwu= zzw5dOj7M&w=rM4C0xaFx)w%1g|9j8x@4o9NcO(-QTQL6;^YY6sVvdu|aHVI7{cJ(#(H}1{pGJ7B20vh0OVoD62RZtwd-eye<9*em?oQj_8I1RGiMO~ zB9kOU9P|pi7Kxu5f)jpM;YUnG@Cz*l1IFFfwzg0H@X*5xZ@%g4cO?=D<9oN?W_|az zTba;+p(YHX3iAqmrt!$`hnFtDpD+#t@Wd?2_{HK zh}z<3%nSc9*<1)ejrdpGkC-Ck$6N+^__6YW>1%gcXn!vM!4E9>{`U*^ zpZEk&xc>lSR9UwFw->TM{-ht=^m*ca(i5LJ`5@q&(*Qxn<{vQObTfDS1{fpv$nNUu zZrQYX^Sd|S`kkNM{_UH;G;z{|i2&YkmaE(+re=w;_zbQ(AQOzK^_Ey%EZeqj-*MN% zdw>7l`|rO?m{7-7cy&01ipFnB{N3Fx?<)MaA^u5-U$}xRo?*H93e;}=4yc()U|k5v zakp&Uw&Uj+{M|+IYeU8j6PO`zU47fDuf4wUo_p{A&KIw}>XuO>M|{q}!m#L?sz!uD zuNBqDY}1BTL zu&cJ0Eh`uobR+o5-M(e(j-TJH@kg~kt=NCozxLY3yQ%+>{lWgj4Fu0vkZy?uVihI| zCA)HM?Eln%(EhxJ{in4^|0(H-8wS*+>Y=NngCef-_J$81A(sL(COPK7@W3?zauXQq z$HKO5-M$MAxclZ?Z!b)xQll)>tQSHg9M?(UjVD|oO#Ez+R7512MI92(n9VsKFt{;5 zVO#V(diwhMnvwXn_jLE{MoeA6IjztqtWq?AsLzZ$dH9A0?`+MUZECNT=*OnMZE*&&aEGj8MeJBYczqoV_9Z{JS*UkhPkhT(wVe$NSt;{W*X z&f2xl-r3aHIHI9GmE?$DWbnHRzle#SDg4~S&k(KN4>% zdfq$Rg7(K%0;N3h*5+o|@cOIp!KSz6(A`)Z6F>g=lb~_PP~Zla312?zg|XxiNdzj> zT{0`KTL(ha$rqb5UXKmXz&Wo6fRqrz!YxULz*&U^D2O-|nWb?*4M1}k+#caL-5}f^ z0M?Btdx7&_xzJt9fcC&E!7mhkh>0H*epU&72Xrx1M8qQp$FWeTCtASGgqcbu(TF8o z#4dzOxJ^wU6?;)a69^Fbks+h7Rlkjc-r(AZk*C2hY?QS6TiGN&1IEJeTZrGx!!Hzm zh>0H*ewM{=BmQ)J{K59GE&l)i+FuvrfV4mRAOC@Ge@F@!oj}Uzl?n$>J08C9g^S_H zqo&Kq2fkaoqOtHkBz_7=96ogloH^r!{X2=x7sg7Xu$=T$HcCGTw_Dhv+tCDRW(W`^ z7J-Ot-IDxlO>m+I#UnaFg8LpprhVZb_^jd&<|1ZJHjk$33UB(gi$vrYc8{H~W#$55 zdbowg9s|GjhBAhL*>Wm3I0N3AQSO4v1aRqHI0|DRpK=)fG~!Qx_V5q3f9>(JLHiR2 z|DgQ|3e%@u$N%CRm9Y&Dh_P_fmw~~~4u%>=ZfkIqp6oIS?XB<_BobUgqDgo_ZuNeD z&S%?4-Uk4Foyp0I%5#8(O#Pq5D6r^yl)+HgA{Gd~t?29^;78#S#6$kN0og;m!B zp{)*&_y{lUJEyT8Aov55lC(J5(@^5W9TR`h7-(_wwpyUN_y_S1;vcj>(Phy7lq1Zr zz{}XS7x3+6fNw7Ye0v$-+sl9(#%FjeT!+wE9uaAAlup`5B6`0HvsnFv;qy9dpNH!w z3iwRp4>tsa(NP`^3pZTx4T0X*+v4Ogh(DGL;vcj>amt|m2^Y>)#G>x8EEUdv4@fbex2nn6U3#Ir7*eOCFg0R!hXC1%q9>5pk3V2Ie zs#-*`>|P=75!Nz@KcWoc_x1fj`%|$D+MjS?d0*!^2hMtMlQuad&U^&Id|8IHj{01s z5DNH+0tzP^2$J6cfIsYe1&QBa)q+5xZM6*Ik6Q-u589tt_y_GzxCDF&(=@Z5Hxc<~ ax%@xuNsIghG&*$v0000^ zbJveq-My-+tGer{nvy7GMJZGyLL?|CC{!6~aaAa&Ps$%-76iDD-|Z-Iu8$XitHd`~ zHHYu69>&h*P$FgyCguPcJ7WuTRdZuAFQ;*H0VpUK3M=(*uHO{o`Ai+`n2i60Ve+(d z{J@5S5&(HR8k^dfy8=wiEv)PX$*($l$pKbog5+A93M>kaV&;}s(%#PIYTk@-d%f!mb%E80R0AOQbWoKq#XJ%z*WM$)H;pJoH1pN0y{;`|0*>^rw zamoMQ>tiNJZt3dk$j8j=;o-sL!OrC1Y{AUR%gf8m!p6+T#`poj=;CGXYV65q??Uk( z3gYH2rp{K5u2v5AfPX0(n>e_+3X*?t`hP^QbNnB&_AdW@Odkiv>}l-C%*w>_uSov^ zR8aW;2eq^NA7~d>RrCML@Bb%Z7j-X3b7oa@7Y8?I(~pb$PVw(nj(lRy=EklL&gu>h zw*NUrWlINF2Nz2RM}U|ZfJVXC)XM(fIqiQTC@ApB*t@tI+nbuphzpW`kYKX1GUMZ5 zljM>RmE`5+l;mV(m0%ZP5$Bc=li=YJ7vq*>7v=d6uDFA#o1MA6>wj>~{x7b`|BCys zF4#GK>@05XY~^llCh6>82ly|U`K^29VcOh2nD4YC?hVS?zw*M2M@s=Zh4=&-1ZOXo{Ne6 zL=KSV3=aI&hx98c-9p~Wt6?bZw~rSsb5B=#z`k5Vi8UB28G$bN8wUMDu=;0cMz7R}5yNfL_RHIw)*8zj+X~5K~kTwzstF#?Ob0L&OsEkr04F!)ibu zdK^A7vWwpPT7NiooBpX2NCE&c?Q%879gTX?55i;s5XBIpI9T#JhdlB5{+>?WfN0z_ zl(R9Drox~Wy-dp+$vd~~%NO_hqJcJjt(jy%z&}`@p@y5#+J83!jXy6JHDr*WMFb^P z6OzU%N8OAlRet9m_CTs2zGaSyU0~neeNU}rR04^NFlsR*M&*K?L~VkR$qkz(PH~Q!6p58 z%6%d^8oh#s#E#+zu|WvA+pFhhRiZ_v1^fq_&iWMRQYib#Zy;iKCB{g_HvTBMeTI_k~MRm4Q;p2ZDKYw|78JCxr^Mq|E zF7+%)nZKh1$H7J8w!FODgY;gozP|n^2nLSEzc;>MH(LC!bYQz4WOL&yKq@EYpF zMp)@8v2|uJPlnVpfLJ`Nary?SA8wu{fK#5 z_uV2tIst{(WIpwby(vVWpB9vQ^GraTO zJIZ8!79r{Gqm~x5FHCRMsWS&w8Z6?EgYp^{$hA5Vh&cd&rVris3~loE(zh zG%+1mFa(&(M!3LUBEwF3t0#=K1^|2kyf;04D5pxy(Ee<)XaZYmC=WG7x-b8UuvA2kcV#*?lJ&s>VJ@*MiJ}+S_i3nJ3p1=Mv_F=~?FQM%c z7i9@FR_`AH-QUrovX?6n2P~(i??BhS1I5m!+Nd%xsj`UKb)e}VrsWaMBGD&WHp&=G zU_*aNO_KWGQ9IP{{Npz`qQIC-Oso=#gesi|>jLDxF>JU)OE9I*ly#9$M@;3SR;pR5 zH%+3kMgdKGc}wFRu6$r?Co=m_G}8!_O3yuyBOlLJXLFf@pFSfW2ke~O#)c&l9G6f} z<}KP;!729zm;}^#L7IKlp4Ma1E^+(&_TRKvk1q{0>h;iV4Ow|t?T z*qr)dY3~-QZ+eJNL6JG)3{Q*})~dXku70f7*=^J8-=T&MiX(1E^ECs?ke*?#*wb`2 z9P}XnG%k}^d*Rvkq7Vw#SG<2!J&f-&n%+d;nar+5|Cs=9NU-m<_xgGR>M|HVxZxxG z`W1$xUP}WfY(u58>JP%_5Lp|!7#z5TsS`qd`^uie!e-A}#!G=HWNS~jtSjfq)pxHs zPAvoHy}Pu-a6)C0ilb9>SDZAd(tJ87$}?Bf|^}WfD6z}cwI`h%>xLRLE zn$AcxgZae)xxe0RUZhrP^F7@MVaYt$@VQvAh%RUT<^?Wrql6OVw!zi|=u?*41mXN; zd%C6sVl+6nBMSdg~g zMTmZYlV?3B8Cyrw5V8P__if0L6608YrE)-B;9rUm2H5 zKxR}csb?4lLb$QCx*71!J2dBcxZ(D{M-H)n8R7i7vbvH(-K?3WGxz!xj@`$epSxD-lI{ z*AYX;X|Sl5I0iFk+kTJK1jE8=Kz};2wX&+TcW`(V?Ts0-LBpv08G%l^of##ZDH+Ez zjB_@K_{U^Hg=OFr>t%Yx0sLoO+{QS@lhJJiDk@L)7gd?p{1-Ijx--|@7N zo$viO^9p)_%VY{(ZiuC1kTufHzj;bI_7;AO)T`CT|>HDmZM02jSf_r{zC8Z{(R48#^!LDvysl| z!{Y$)ug^Y^0^_J>zTnN;r5SE-Df(!boCf?YqYx=Phr#5&8q#r}Y)`J#V!Z}6+j@b7wN2u0uqcFw%=RHStnZOGBI{LZl9YlvkvkJx@+jpFQTxgX8 zzKcC?>{Gj6JT5W?boqlunG3%IvD~~@1!~*21M=q_pE7nW?75@lGlYYY@i51a4xjSB z-O6u+M=1``lc-S-XQT7q)Zfgu_$Goy-U@gLnO)9~-15=)g^zQ10)%wEUoOSf`ERrX=cmD_eDwq55hZP9AXm`>DLcP4K&J3CF-Qs!Nzde52&6(_Ng}cm! z0)AJTy}T#OikQMUw1P8uKQ7^&y2wMsF`6W5xI-E4a>)bsU*TRqP|WD(*4K5Q zhbo2eQHpYx&R<_1d%sH+B_XD;#@7ZW)Yewk5!PB0;u(BxwWSyZBZN`F-iC^5&1Apx zE+`v%AeroY&I>R8{%j`4m|pwjgrT9PFGz@A;_|wZI}zc7Mxq8u{PyE~-31C>bz&*X zR9Z~zl{Ru5uGcE24^{T#U!W5tZc?kdTj&aZNnq=~$#6_b=oQ6{$2dhzMWaWNIh#s$ z74i7gx%0?j$33RHsL_Pn_Ka}ug{M{mD7mGEF41_oE|UE5cT9!6+N8G`;c#QJ9>p56U045Tzx4Ny>H6-$ zow}(pR7sNq^?(}1HinJW7g>chwb*?r_+0iG8x^AZ_JkWXGWibwC;$N6t$(3=wvN(+ zZVa68(|HTE0zw_ddv)jsq+NC0OcH@i8vE;Gf>S_p;0PzkaJYyxPAJRlTK7G7k$1te`i&O63g%8(|XAR7bEYVw_kh^1Hu zMIU3x#JbCAkMpOCShB}nwD6E=>ChycqWnheke1g=X2hEnBxC-k#oRXw3zek9T(7?+ z`J#lV?95M)5JwyF;fm9I*a!Q_BY={0N|_0k66B~yE~v{dcVQqbmO(CWIOYpP*G@rW zOXA)2RaPDw9Pr_}KY)2Y^CQ=bT#84a5wEN2>k~tHRfr1Cv+$tmO2L^=hh&hH;up+n zy!wL_Z!3k{21o-SH%5R9X=#g3QQoQe55_XEveC#;md-r>K^><9=wac(8}7cI4B7q* z4dxqYjk`6O19Pe#1i!wiyBeewHb0|%0#Pt=uneb4`k)ih_I4}hjZ(j$CDI-!4OC(` zXOD;H>y$wY+fU~F+Hc;HJ2NOuU3MEfxHnnd_LxAA0WP}5h8i`uKdhac*8bcaY9PpH z^X8XK(jqQBNJo%`j$U-P;R=vH`V$n|(RGcCMWa0i(m5t$fJcLfQK0ZS0z;{O3;xaV;GIDZz?W6 z5o+9aC&i%)u&5osR*zy?QB2p&S;P*nxL70@i?2@OIeX&NBulE*hk=^Ky_qZ1y-&limi+l5XzN6QX#H ztN30>J+E}0r(k2{yMx0oQN?^$Iwzi#n&*5@n?I|7+E(TrNVk^6dVAWQf^aFoIxigc z>k8~)lucd&Py3cVP?;~sE#TlEW*YB9%uFk%W8#=$Wn{U*Jr=r;^kw2)SVKss`voBr zhf2l+zdIq#THE(uGCsQ^)a;?WgY&;`_*fh`B!{D;GcdAeT$78atjq6Vx+j6fHDeV=YXGaPsmseK{vVQ&UiXX;-LSP*}C9hS8@FEsw zh#cQ@uY&{s zf$INp1)!&0tT!&jp8~AF89)})9ixj-aftcmZo?@-D-7IaUouPGJBY+^w!Xj zFj{=+tSYXm63%tP*CG0I{a4U+X6o5)YfI3Vu&%MO$m8~f|4cTD+vo349?Ci?hkxDE zUyvc|?;lp>uPn)nHK^G;)bMDeaL-u4#d7)Jp5esQAtRlHW1n81>qLqSDWj|KR+Q)B zX^jJklNq}<*S+9u_M`W|8(+ur{NNGlR&v>G_?-BfPU5XmQSgu*2#g`!N zb|z0D&+n#%oX^Fyg~>$J)|(+(UbzLqAc^Cz;y``6!ZU~IgeQ2W>_Xy>o=A)fB46_( zm@HS!$>$ZVclHD@Ac@28P_qlcPQ7N+V(boOFihN;(3(QNbrs$=sb!atk7Qh_r87|% zQy^9)^zY4wIcBCBEFDw;A}sA4>R_x(!NQKiFPjJp@i^^!u@C-3^i^{E$xo;^#2EzB z)~3pZkVyb+zbd~@YXf3nMT0Z}Z65LXUIQVGHBaOwl-U_Y;tE*qPsHTK zFT3yN!T7ki%!ILS(v3@X%BBDwmvyt2s>UL_^%R-k2b0D>czO4tpz1PEoH{#vo?Q7y zvW3ixno>NK88Uwu&nrN^uDBU?$P836WVeQd1dB<3Lh%4HVuY16xjFxY0=V-o|~cOQrnNFbP5^@!x?SEIA&V{|?@#uTOS4nH|ppmE9Ky z^xjMg7hGcL{NqPZgmxUJ{NdZcOEHIt<@+B&jQW#qL;-6=IUQD2tP4K{K59iGHi#gr{n!qtT9X+LrGh`-x%S=`}dfM4m&kzh( z-rdETuzi}w1gPjKeh$r*M;RDOPjQkGp^P)F*K?+w{r+qkfAR=rIGz0MYwU-yGXkml zj;9j)r>k*IryLB4IpK@QQ`|?Pq9viz)dfl4_(~{7R$@SoYY0c_%DR7?N>SeEk>VR? z+YAx>MM*I;Vd`K&=v~x#O9(ef=@l`0(S(V-_S9e2FnvL9f;6q>3#Ef7F%p80&|T}I zMSed|j2Q+xY&XDq6p<*@?|IkeCff~xEZFI64Uu# z?)9r`YO-B<+uOv05vVfDZ-Dvgr*vi};w5D*7ymN%5M*GPyg;h0zXShFTteK8eWU-u z7dAV#tW5JXU8hX`{_ zqqtUhT-n;H39nkJp`mf==H_O{|3KUg!iv?Gn@^;oD1IQd>hy<UD@LNt#<+9sc;pmH4F>tcH%(nP*`ix>x6*pmVOh9L{ESaZm2Qch-?=gJ zi~l)Yo{3bn_i2gpUBH!#w9M%V5x`fd(fr}V&w$apEJr4lblgsOn?JSfDiE)|o?s#4b=J$B^r zO=5_;35|2-)IgJ{Bjhs!^m<*-%~xeqp)ynE?VPQ>zxep)==lDoQTw}(i)Yy9j30|m zAds*@()}3-7hgPGdl-A4J$6Tn-LB$aHXC9E6ZAKEj6MO(&sUhz`!HPUlGFveK|~RO zezfR*W^kamI$lU2H6BynBlA6uBcVZANh$vHx+%A0YVW`i??e~ZD7^7HNp1oUg}`Tf&1KB%)&lRZz=s<`Wz`|< zbu&xotG_3HBT%DCAV^kXB&rwwsI(dkwcRu#`p0 zusfFifLgp6?3C4<9YPF4RrqBXlWL@!?LFR7Ed);8yG+~ZUyTR5WK0(*Oj_P+2nIS|v&pymT2o9XmTpm8$Ew(UV z8)wLf60j*%0*nMI{1VdEgSK1Wk*tFvU&8%C^=07*!LA$AdHIzY+Ut+}UH{FM(KLNS zrac;@`RYhXrV#L4ta}*mpA!;g$SnP4>GVvY&eWwZL;kIP68C)JXB%&MRm-{LRL}E`ep&t@7r9gvYf^;YCVS3?AJ!Crc^UzM`HYnJQ->BK@hp zwm76_2SO6$JoAK7##kjDrtl_hU6QPbFGQ9Pfk(9jvMc5jrMpbq*&Vk0C1DLtx3{1C4YEjuii0v54^G?>ER#nVvJjJoD= z?(o#Xwl1Loi9t*xC3@8VSC= zI#5Xp5q(3ZBs4W}2a=d*250O?%qS`JYgN+TyCVbw2~L(Sr9Z2}TENvDXPotw7P^eY z7}vGJccV^4#fDq6%1Rix9wk<6gf;u_CNRFgXn*C`oUZ3}WeuLY$4j)Xr|&#w{;)Og ze`LV@d+q~{=7tllMw==n%cgB)QfzzWqvCHVOO8nCpyL-(2UHyFCb!{<{1Pjn$wwnU z)g@ZH9}6h=JDbBJ-wf!-lhC)BJE@(&d*VlMU#F7g;el_n!77?K;|KQ>oGotM2KCg( z79?$^yIH*9tiVuJRMzkN5RuE|2$Y|>({>?o?L5?5N$gj(GH zT46^{j{Ng=@r&DVcK@4fRb35!p2J(QBpQWcL`c`orDR@!nhX7^te^dey3le)8gvQc zAA2{rPf4JF^m7Tm zrUQZhq!gbsK4BltPR3-AbrZGwrHm@Mw|pL-wsAj#;QSP5it$|{*`M9z(6aW1)Bp0U zU7k-siv(ijjLL*Ee&*jid=05Rta`~C(|*hEMIT!%fxs5&bk7TUodTB*ycF&vT!+;~cX zL@g~XmEScKZf-4m;o;#%2Z7LA_}7G28tR(itY~muOq>Sh8mYNbn)Xlei-BQFSJ1Kd zX5dh@ea5cRT2$#Js*Sb;_m&EN_hP-fUI1@yT(l^dl+6<=lhe&v;JtX7(QNC?VQnO= znO@@c{@39w0Uic5E+P(L0F0Ap`e(gtafNsDG^oSaTtS;ZlJTRjy6l(=7Uk#so_D(6 ziG05-3RAdp$o@Pww=Re@x1f~yAxaaYM4T!V%=doYWGj_)GR&z`Z$_Nz$Zk8RJZJLD zBDbV)DH_zXA(MGME8the=nqu!e7}gjGAHd?6;( z^JHFIxy**Z1XJKynBEqMn&gQ46HinXfV9=^Wa*3luP^&q)V@>~o$Cn>F{oN1Pqna{ z3;`3aFAsr>NoaU$?*C9)JUj3&nONqrrS#r^O#r@S;er@7-x&BjNVF091@ipuiM4Mx z`8L|{9TF*-Mtu0hHcgI{OhSy((%~ljPD_XU#wl-l2jfAC1JxHB6eELAH*FZ`2PZ4! zUl%=Vpq@>!zHNPnvVC=isqe``2{a;+N@t`{m`qzU>GyT0>B;HOh zUH2#4iKWi2+pMfLuGD5uHuDSXqUp+`bb7D6(+1W>$-eStILdV3jxT(kh5wOZ62$Az zTDoUW*a`lSmQV>#-c{a^U0Ujm>AbXxDi%!WAZ|dE%dZr943E zDIIDW4KJCftkNl8q~$!+rRB2U`mnn}Sff$YDAeUYc*nWy8OpLGc+X>xmO&3FX%*Z?}C?y*yC1u6yN1sy$J!Wkfy1-zqu9(n z{>0ZsnNFfWIUA;&fMf8`+?eN=Ng*OM`n0YZ!U~SrkrEM=DB@s<06lN zn_x?r4NG0K5@NF~U>l-G=tZ;o9S%aN>n~)8L8p8ebn)ExRFFSwSbD0k6`_?*PYy=~oz=I-(4E^)Dx#|9SU~0k>iRH& z7J&zREA570&miF^GhS|(2?M2tBlJ=$*a>@`WNhBP_Sb%R8I0|N(Aj|PIaz%#O41=B zefv8xm>{0a$Ln7(B{s7=ZzFzkUO?Jd;k6^vejG#2U^`gBM6r|bk#23lMC?6dqJ6V_ z@jQzzfbS|vlRcVsO)+b%4KeZWHV*4wlZ6nGV!w#l1M_8nipmUod5JVE<`8OUvxLjM z?Y_MAtg0@ArLx+M@xtOSU=C*rHFc>dYyMuhY1vDQEMhz|Qnx(MikGy@cI?;Nl3haShyw$k(gD&ghk z0+f!My7D4KRkgIzXOpzBf+mE5FT}v=z$iN5AmvS*?HYk`HMXdQaou(fmEluNBx)t$ z=(@J^{Vw8XV?CU?_!>QZgF~m-(8?gTpThK)3QavqNwpeYC<)1B2;fXQnj?>m)PzzS zs6_-@v@qkD%9trq>M)jcnUJ)jK4Kx3nLp+EM`lMw$Y1cm7X3M%8z-wBRAYba#PQLQltOk^1Jh8mBM&{Ri0HdE|xwuO{R z?XK;t-neEl&{#vh`SX!+y!v4!NPr+d-4hbQy`rwAI4hI4y^&YrwSRazRC58nunm-M z)qk7D2=~3-qvj7sA#}8^gY0;7X9~pfB91LSHE7@N+{{z+e-5&4cqZ6F;(!VQ?`tw( zBzzNVS!|;ZR-Z+x&htCst1xAsVv zGBW`XXav37H8G2N_G5&yV5#GjLMa5~U4Y=jwbiIaGQOo;``=G{jMHPZ5w4z+qm?%? zA8Kh5Nv9}>n9Wi*9t3y}(=|foQ$?v{MhtvDyOup;^oFA1G`a3SG}s8l{St0S0tx3pWi7@NKz7wT4|51B`VBIP{=}M(Pny6Qp2JHITA1$Ixh(zNRQ;QTKtkM}nkY^1s(iJp$@0N6u1$d(YO3fADbVy)F8KuV( zrL-Iu=G#0QL~@uq#%N$fgtD~ifC}-oKq1TOryrUCuOf*dc1{rjPO(oQ>u}KX#!iy- zk}yDVMFgE%38PKRMRsul#EE`(B_pI_c3Ga{-pVDX%Ux#?q+Fm-1l}5y{NbsbW^M?? z8b3GAIXsOLkn4)P7Qe)KT_#{x)T*YV-}o*ss1QE0V!WOpQcesl5FT+;XFoXTi5q{y zKxqJ{bXbvE`2G`elkWd)=;51dcJn#x5V1Qjdz1#CWa^SY?du`0>x;yXI;S#q`_?Pa zx_7?Dp8kD982?r20%S&}R4jD_RN~2vvWj`+vo0?fC<)|g4?O4b@$m_nw@mTDm7*ag zCT?zRO|$sN`C@Vv87wXjc0Fx(Sr}9E@#%c7aecZrwxGe0rBGJAd=r}`%=0oP)RP&9T0bEZzE}!w~O(Lt*mn_{0 zC){D>CygS?;|EGYgLW8Say{G)Vv}t0j5sXI-Auf_H2$y z#-@Kv*)H`Ve^Yo8Ys=+_DG(8Yf8Hht86##U1ys%0mTzQi$+nVrf!Jffv@*!4qElv` zLHYWe+4A^0A3d<&&Zs>C-WZ%ONb}^F0~RAU_n~T*R+J+J5}eG7huTJumuB#;WRgsV z=Hp`>XwybR*9;GU}!9C71&z>9OleNFhtvKIxZ zkFQBWBetpw7IMVDgBNl!4uBlS5eZS@^Nfw2|>$PM`x~i5x9UUE2Xrw~t^%WJ7 z%PT9^ZN0>s2kRwXO^TquhsgD>eE4y`#AAyclz3B3`fSnb)V^?I$z66ETp-AFuEi%Z ze#=;`MpT>~5d6Nt{nV`<3*(eX(MqHhe^~YW(SdzPU@Hdx$Tlc{^tJzG2 zchXgladL!uGHDKfoUg}pD+hJ%)Sv5mA}$`j@ph!Ej!KyEAN@UDH~H(kWIq+YO8bLX z_FN$yoGF!`PHC$FYS#ge`XYij7fq)F|&Z5Ah5MFrmmJQ*nR$yOSy9N z^U2f!)n^@~cK-LAXWy^cCkEcBM3cqJ&vTyR!zB|Yw`L?TyCii1=l=Uq!3)W9^@8I% zOGG8Mhezqj{c`CTWmNUeAn41zmBR{&$#0sK221Rc91|mk`o-}i>~T2)-}Ov+@VkUU zFx%s?$z;=`kj$l`k$#NUC7YS^qUi7jdEdw0H?E##p4~qaG3D-s_jWuzr~(Pynp<0D zcbXjDH*$cTdbg7p=z@tLlj6^O=U;hS-flRV7m)F$o_E5KzXz;dx}e%tP}GelODnjU z3$Y~$zU-g9BU=?cRKnbj;b8i2pgqU?+6-!*Dov8SZ>+vqjkmZzqZ9m+KAy^odpSEw z1(kia+DGaO$&mV@-GC>(0Hv@<`1s*rhOQo^<_f7g*aLkkScgLNd}ne{m3r^KuNFO9 z_?o3F+St%voSy@Qa}Hy_a(jcGc0&>?{62}UtZZ#{{}ld|stZ*>CH9>yKW*@7O&VuJ zq&68SXTDKhrw(1iLu8_JN$fu(S;T^tM17mt!?TdKe>5hwzwsSEi*m^Id0(!{I$!w= zXs)YZE>>WvV$RILh!timu@0mCu_Zo!nJd;y-RnZz4BdLXV?qqZsDZ79ZnFO-8Yh4vibXEu=D2b;^oPhnMJCiM1m%|#4 z({XxHw5SM(;P)AyUA32A6wcJC0OQ}B7{Z-Q<%@lp;!k!^jUHv6?KVrOayhwWe+v&k znk8k&`fw~?H1u6DEA^Ub6!YRDH9SK?V_+btoGSWCLfTM4CX{y@2G#;TO1sB5WT94u-S_ZknvlJd7WQ(*j+q&f zO2RQU63&qBrqkCQW1WgfEUS~8f*{8ubpOBA3iocDsp&Z&hba9wH{m?+`1`npp+C_g zd3biHFCmjXIvX`s6ySyc+RYLK*@D3+GU3dNJIPEQ@y$U(j>67Uxo!4)aW`KqQ|RH| z@x2{#RIG}Q{`_EX!2Vj1O;A`G*3ZMR>y_tk@BOplyS6!WdQ;LEo?)(s0k_ z63;3+^Z8Fr@-}}gTkWL1fZP6Zn#SOuqm$8Pv7c1|+DmYIo zA-aYrC*Ek_tB($51@GZ|56JIS!58#a!+?wBRUV?~>IBFhF-3q*kN0!H_Wcm242S7#E?`^J7Y$1Zw|My4J zyx8zeF25AC@%@3H=UXkASUBu0g))a1Y|<5UO{VXCR<(?q1}-9;=+MDOW~Fujwi-VO zr{q&Z&Hg;{V8GhI=aPjh>O$p=HaqvSk;>71TbgJ+iEn+}*WQAMak{-S);8ACN)F67 zUfr$Y^gDOa+$LqGI#Ex}ibZ1D4PK<$4gPqA4X(YGXT1Ru3p#)2 zO*^f5No8Q=+qE4fjXi&I7t+?E^KR@?{os&1F?!hue?m{MqMmReA z!P0d5>f}G~v=T5akXquyz13E%Dv3oBzpE2&s#n3A6`#fA^xRNdMO{?&Mo@)GwUWPE zK>z02;d#@{p}S&^KvWoG^e+p?X%}W^a+kMHA>ub}9jw33zCI@}VIKWZ3ppGw^5X0A z=H!L#ze{v=#O2#q8Z+8!AUfE8alK=Wimnf3j}qMR9{nGR|?7z^r#hK$mzP+VHh_97%Ohg=M3eCt5nCf=khf zV|lVMQ5W@F8Rc-(qj;XIiKEw3iEhth@=pWri`@FR(b{)#3mMGUlkd93)Y~z{eCrT! zz&qse5%jz{IW2nIOfV+r(Q^+6b_j>47#TkG_WoUb(AwF&J|KO4;btcB09TAZANC#$ zZe{nr9QfpY>-G8?$8e)h8Ue{h0=!yYhptzh3i}EOe-v0h9)9OT>BRz(5K&G}PP%o; z%ARA7vIXpfw~uR z|7v#Jyf{AKGRxGdSzLf=l$S+r^nBPTf$TVHwJ^V>K%)16&)u5sGICe6K)-{)(#s~+ z=*^!{o-CO!ot3RSj{g4gp4jg4J-L*Y2@Q$%z0tSo35P_ELRmcalNZt&l8pYWSTa5; z0sge2p3)(%VXT%jb?OvY5pM z{&9iiIzo@%ED0|gc#>6Wx6OUCi=f!0&I7=I_F{{G%NPjKsP@by`KU|4od#PZ{L>7& zUt*mXHg60f^j$MI!{B?vc>+PJ-XUVp0F{`mS14tLyzf*DzEC6Kp+2F!`FSo^aiFH; zslk}vh+n#5mJi|%N(islo-+?Q4?KQ+!7 zHKiPxj2Hq$iC#?e07P*H-t|0Zw9$Q^kz-EciTHjuPawS`^yxEl=;m$-cE3E32s9o! z(C2v{HI(Op$dme)zw@KpdXcGH_A*K@6+7~hMq&s)MhAE~t{*_>w`W(jTwAcacN=mE0Um|V$XH>qKIH4-EiEma z?yjy&-rd`QvnOZJ;3XJfbUe{s4@|Dv!`+>FxM(3#v&X(pUvxBAPOI2-a@~f_(xeHD zc|v*hSfsI7pg>DvXOKXPhif9|tkCS|)6ZY9+~mu8ER92M;$0ZfLW^l5qWbbB`XR9as1?f@%oEsWoJhnU#B;0XO(8)9;ILO znHEZpA`s50sFHqi4liCWF(?ptu(XA%jTqbl!+jAUOBSe(ppr-UlaxCWwS_8L$Euf} z88T#;?3a=+S%5H`jiI?OOJ@vKpBzfo)xJm?2KJyK;Co8}dptG9s-EBS!Eq_i*88N^ ze0DCeiV|sOpx*dK$d!dP92p z^?*FEr*N~ck5FdPtek0EfQC4L)40nG5up6jqHEjo_a+)w0JuN*gRtU!otm)zYsX$$ z5niN{rqW?T7Vm4)GPYOVP4FC-k9^>q!`wId!JkenmQM{8baY?DxDG$ec1=f;%V#V# z&M1c$RZ)T7+3fTe-<%n-3rvhmV@HzfrQ3RC1oXlCL0%GxkP9jR6TGYyy!8HVGa)!1 z_JsAyew#|9&+9(jSs)tL9`CTXMI0Poyx~!B882Rkeo-e#3PG)LqFaI1JdKdR|6CCAj+771ongST{IPMAja;!-d)AX&aY?3xf= znZC2Mm&(%SRDRx7${e7NAgvD74cd(3XtF8zX5dA6K*m5Kk!HYdqkHYj;kNgh*80ExsfiKr^mGuyA$GWIx<{q z_zfvamK`wrJ4$aqhWC@;)?HtZ;MB!U^9m;i1dUJD6_6=glz^}W4_hrJt>&ucXc~3n zkABg#Oca^pzYfdwPlHgi|Kbbh-nXSvtB#F|n58`zpVPG_i{?Pv<3xB4F4z?Z-}=H7 z&)b;{LWYDf045)lI2@;9OGV!hS#E`<9-;(_()rWng|Hsqq;?n}04SN=Pz4psTe{~cc40OZ38Nns>!{FpXlrz|s zOmTxVfr-`5B8l1;A9dvBS!>%f+e5S>impnnjNm3Y#lzU0Sh_4e;_y_L+fYd|pC_8* zXEWhpWvxP61jd6R28n)qR(TMx>K|Hxv}%aU=Fh*M*~;DSx;(Y3;DEi(KW!;R*^;={7>f)nJB+<;oHYxjJb5^-c10rK`g@;Q-H1SJcWw~v+&C>j6%1QrzO z>k0x>`)+$k{MOKV=nS168wV|%I^^6%)WFR{Z+&RRkZ!|2+QcRJRwwBg5&fM$k z>)OtkKG{`DJiyjlB$4S9+NI-iK>mjWNjffvaDdrf&NP*@Mh_KKqBOqUYbHf%oIDK$ z^3(?8={NV24j@kok|&yYj*tA{-3VYFs8OV;xt09ak4^HV zBpfG_WD=zpyuTW=l)seMG(g(U*S0>OSe`i-LqP29mCRka3&kI|K}+^ZSupv`SA%0Z zp=2!C5oqD~sdWzKIF)~*QD(tkl>9lCM`7}ZihZ|eu>_}2-hk$b-*)Hvlu>w}eUU8M zr=!-owq_itJcVOELp-Y5OX-^HOM+EIL$SJBZ^{?AVEbMo{>i{|M! z4*&`2G{}=pXTdd5GUHA(oi10QO`nKWFs9_Us28Y3a+~-KqCyEt+fON3^K=e381L%t zArCHFVN0Ikg~Uk|;hHFq*H@eZ$|%!J_{~^Gw?i$=#YSXt@`ReF(W6LnYb*JYg*@4b zHyF8~1rm8|)#}2hEE0RQGnO=ZwHilR@zbOpnp1)tjvVcd|9jKZMLHH@L*-SXk?&G12`^Z&OMi|!{_U2EZtVZO?8@CpQpQdP_tSjU4c!&F+ zT~EGz&NOlTP61PRB)zO?PW-G8`E!h^M}hLkSg2;c_VFfA@#dQyf3p0sw%^pf@cNKI zW!noc85?hz)cg~->QQkkD!y8ll2k2P?(bXJ5ekR-B84%dN1C^A3TziKyksjWga;Ag~YKx^);rwLJ(Tj>5}{U?B* zlFm?+Jho*&p&5+G(+CviVckUFmv{N6 zX#nAjm~!CHTmBpm22zOpQHA`$AN1pmUw~5!l0Q++med?e0+k|b5mTc6FvAW}!qsmQ zQKJ!Z_~1TLQB_F>3>X9hd=IyE!|lbgXrhWQQJSV*#PSM>kn0GGP_B6W$MGak=$SJy zGGWln)L2aAe)t(B_C4-9>o@ZKv)+6EgE)Djd8qkuAF4tPOT`F*AtuCz7~`6z#1JR+j=MfznBdd+cSXIacCiwSmH0>FpO+064ge z>}+i&TQ;sIfl!c~K6M5eJY*Qxv?GBkH+kwm`j2!ClvsF-0~KiSFjCQV!|S<3ak>tj zN+tn5l-4S^_`A87n|9QFKudi6lD; z#Faa5zq^rZW%4CY#T+h|lj8?C6ftGQZ!~f~?<6!J{4PF=n=kU$Nm{L) zud?_0I?sc5T7Vbxmc;xeVk!oIg+n5}h#SejZq5?tvGPfA3%3D)-@MNG(!zNr_85>S z=FQ7rD;7Vc)ousrP@~*sgn^qcj?N7Q;|g0Uew}amV>}G8D5-WUIDO1_$jypBt^H<~ zKga4QR{k)qnn3t6C0=O1fxvOWFZq0gV?cJ44S!1gQDfZk5U>B#?OcAq z$uev-=U1ap+oIfIz35T>6#85@vc{D_#0`C-+9m)YWn zfTJpWcI@aA(h|m1YPeF+<#JhO{>vZ6j~UJJQ)9H34Zrn0G>xyd2AuHhf(7%58jXsM zRgBjO?^xk?B|U{Q1k6i~#>m18&f^$_oq;KM^(;?w{N@yf4Bu_>j8mWk=`x&7YVaPo zd_2#fL&uFwxR7Uf9*~zF=pGd+t0l zCa$vwMkGTGnnzqCO_46<73v~iID00?K#Yzt8~%di&#?+c%O8l#dA}?%@0n-XPE8$) z;F~uOeP9_jS=sR?)gSZ*$&6*x?8FN$AZ<_|!@ygjkY?08_eBtCV_xl$=NR<74j8yU zHq}o4P;;dcKeaU-C0jPULpDKZK6=!c^$<3neMO%39yr|3BKkE@@evf(GA$B~^&CEY zod9=(UKewAqIc);D=z?=}5MZ(0AMe?Xm@Ew_ z(+Chj;T(R?;Uj>5_^?rP&zym}X=&$2yGbOP&_to1By)nJ?3yR1lZ-uS6q!A1DsTWA z+w;l3-H0g*ep3s`rvt*_NKa>H*C!1P_2X{&<_$Q8mtK77RT2mun~^MT0dw933&{1~ z_&RR97;SBB+ku!!Vs)e4yhH+jBntRDKdEnM9QVVoUI9JOBht!uKO|ka02jSO_ti*H zXl|+;j4YmYGWpImi*=v?(dO3H9f&D!{7}~re?w#AxH}e2g&t^w^z@Eq(i0Y18A|(R z5<^ViRmeJ7bZR5H<-Expe-q;8^*>MiVN3bn@MTG7f0Q15V+-l(W~j34)AC0RV3muK z%jcd({^RRk1pLG(|8UmwPinvU$e%vdJe4SaV8GLJ2=I>_Hgr_|m#*dVr}wqjj+rJ3 zHBbK8vq{|-{z-@W3i4<7ZnXgU6Ag#C{22i9=aM__kX8f!{cG0}IT$30B$2+-<1kYL z1@dS3WtWjfx7?xwi;lK7HSa)7>GemL)A3ml2hk%T(scMB47}hQ!r&N5{A`IkTY=^ao>y_&8o zFf6Aq3XXetW|{re6b3-3kd4i74P$2+JqOD&lO+jlnSwXpcKc6Wf9vhd%}0(NgiJeu z{oou|m?Ty#AbvOCcX0dz2M+z*88au}&G8d2?rEdxCVo33#nSeCqjCI3;P@pON64?rYzw+t(kn?z@uO@26e<0RGR-LizKPJ1EK@O;Z@huO(cG zFms!rQU$oM)1sye6v{R1Fi>HVEUS#mpF4i?hCO~;`7@5!pGzm-bi==L`GelCNv8V4 z%2WSS>kqfd67uKn`+f`c=kd)u67>h8#S(;2h!)fm>nf2Hg)}q{Bx5E_;x(cYlI^aZqIwtsNv+y8I#G#VT1db#6RdEQ^h5VYAkUpUl6tocga#?(e>|c z{P>iyV@Fg}_;HDvM&m-8;x*2$z?q^^U-3brnq*w7__stQJYznw1N#pi_}&kH^qXBD zez>EhrL8Fzi-jT22y~B8O9NsS{0hep>8Jw#xUpk6ex@@GnwXlfFeYecf$w3wLs5Zf z+`@yG0a1B+cqSB8;IaLH|NAEXR$Kh41wV9|x{QvqBw4}xA$b2Sqeh)@qTB7N0y2i$ zAl)$fr{*Y9v#8^X4I&+CNuQ`7Xrj$6tvet1!=LWlxOwvjpX}b#8VCeb{>^2@nlDMi zuO#rFIBLX+ZWrLkv>^f&OU&S`iJ+Gl;_0BZ7S>Cg^n(fzZEb1UdH)~&ToV3KCz$w& z$WJdXegGx6jlS0d%SxgBM?f26ze@H_9 zj2$<2gukNFgVuQfScSsT7?m_=XgZ!5Ir~uERp&(upAbb38NyanC9~#?tz#@NI z@|Qm{uRkobPsksa+g-)bl#^Nlydw{kZ*^CEh^LcCTSrInn$G3V??L`-g8H*Nx&G)W z_1|a&NF34SOe~6C%1JO9C5r6etMuC2T1ih&4_^r6aJsl_mtu(&2uJQ0udb$w3?Dj( zR998>Gl_p-4U{5Au&DEN!yON_AU6tKug^Qc@AD0HyWRCL67fQXb85Qg)OFnnBPj*` zmN67LqBXtVYKGvVDv*RINdG8K8^OpU7!HS9djo-k!9cJHSbrCE>S2QW+fZtbo~$GA zbo^cezsv1P!_PQ=BI_tLO2RL35@m-!5{?-7gBkH#1(*VTGZ(;4mrJg$s`A#>*3{M3 zR1dDKti(+aT`(d>yb6xUMY-c%NhR&&03C>KkV&fHh#NZ)NM8fYk?!v9_V$j>!|-2Q zXIED+8i`;>A0vilO|=Lx$rgW2bsY$q!Bu{Lt^{MBV=^${)b*_4`5oxa$?g;RWXE)HSR8 zDIb0+@B{yeO5A2Y2J$D|8tm=OhCi$PsR8*@RZ}zA5Aw(3^FsTTq5f!!t}_UFS?fPw z*MQVO{gKh#f))w{BfTJhx;i=zceH1%KYFq{E1`*!Jw8(3&`A7lHz!vEh72XAopw4I zI(#HIK|zO`{TitLqf`PV3jypDs&pghx(6yNjQkib zd<0Xt06?$3rY0o@*Icy>jWftJEdV2;AS4?Alp$y|A<^i~5KZYo3dGL@eo`X-xCW;f z{MMySvgk;R&P~%CgzpNiJBXw>6%fhLiMXKSa6qSrxD|^4D|R}DB|1RVph?(~pxQj5 zhQkpMLV!_<5m^RlB*(_*K9kD>MG|^6xwR z|3Kw$t^5CA^5^dY|7St|WK<)?9r$X7d!~`&P9x`?cOe;j%6L9~8tCmU$`-1hK=mKy zp;%bFCe*sr;(i%bxe=&|0j9EmmJkq%NkD|~D7pc$c;3`hDT@YEs~gKP_qFJzRuwT5EVLKXhOp@%ntEw!WU*N8zXX``E9r|M)Z$ zC_<7A@~o9QCK{l_s^+x_hBA#n2uo4VS{r;U<+m)$xIeY{Q+IhcgJv12N*RQ1DfsP# zvDLubde$>w@5kSdzf}DF@~2<^lu~~(>!Z*Y8~0e=Lbhytm-GYzWb)*xWbn|Te6#yv zZK3*){==NYqa<}7hD760L<6)oA~~fYm2xnf24fv{s3{|?)P_zz1NgHEV(wc;jL2x2 z1aB@uY`xY~-Z9tFkG~&(A^7{{Prv*rXZ=q<#LfqyKsSUQ;_!IL=+P&0mlcvEk^ZCq zD4IZZwH#tq4MQ@iRjFura!TVVMRl8xD%UE2v .newtab-site:hover, +.newtab-site:hover, .newtab-site[dragged] { box-shadow: 0 0 10px rgba(8,22,37,.3); } @@ -121,13 +121,6 @@ background-size: cover; } -.newtab-site[type=affiliate] .newtab-thumbnail, -.newtab-site[type=organic] .newtab-thumbnail, -.newtab-site[type=sponsored] .newtab-thumbnail { - background-position: top center; - background-size: auto; -} - /* TITLES */ .newtab-title { color: #525c66; @@ -135,10 +128,6 @@ font-size: 13px; } -.newtab-site[type=sponsored] .newtab-title { - -moz-padding-end: 24px; -} - /* CONTROLS */ .newtab-control { width: 24px; @@ -151,7 +140,7 @@ @media (min-resolution: 2dppx) { .newtab-control { background-image: url(chrome://browser/skin/newtab/controls@2x.png); - background-size: 296px; + background-size: 248px; } } @@ -186,15 +175,3 @@ .newtab-control-block:active { background-position: -192px 0; } - -.newtab-control-sponsored { - background-position: -249px -1px; -} - -.newtab-control-sponsored:hover { - background-position: -265px -1px; -} - -.newtab-control-sponsored[panelShown] { - background-position: -281px -1px; -} diff --git a/browser/themes/shared/newtab/controls.png b/browser/themes/shared/newtab/controls.png deleted file mode 100644 index 7f3d5f9871659babb76e01bdb4870b1710981579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7329 zcmaKRWmH_t)-5?`ut0EcpmBF-q;Y6M10i^DXdD`8+#wJoxFx}ZdvJG$UtmlB3*)hc zV4FU+C=>_@CDB8NgBi2`|tifg=oI2JmupaB>5ANizJ+3wrGT8RlUC{Oy9Umt^>#r1YQ~ z06DlT3?RfU#AU(DCkPM`kKCpUzdlLZVSFUjyo!EI}636kOE7gFSt zR}d3Y;N{~}5Rl=O7g3N?5EYh}6Hye975xV*54Ui4ggGJp!CL+=R`Fl4f3)D}{1{mt z=4$H!vs842I|BZmGsyPebCLU3zW-n?|2-G^f5q}VCd2b*W&f|0{%7b>K7YFZ)$OD4 zU**G`9_8-(sOwPTo!rM)iWnj$$ckFIG?`$_paLnhp6b7 z`ta~@1SPW(QyStv(h1>3{q47ks%T zC40;&5BtkS8@tqK4e_ca{~0=Zm^-*ItC+-Pdw%lW31PPFEZx;zDDd(u4O3;<{j*+$ z!|bzhrC2)65O}ErYj&_+&>hAmZ zhHV`m)5zANRTDxsEg13|{gJbq)h`_tZ*D&<ulo-6BCo;u(h=-*a*nJ(^b1MV!5|cF}moB?`IA277nE^3s)~B*N5ilnp>M~ z^*(Ed-Y;>yhDgU|`!M$+_(ZbTaHKW_Cb_vacirG*Oj11e_>AmxRQ4Qdj?*X>i$6I&7o)<5>BHk za`dH1;q+2!W6?}?2P>d^t&;XEt^Bsg_Tt{6JacOEYvIfsO1tS>Ho4ogGAnRi-vjh= zFz|{y>3R!-Av!K%B2yIl(YXE1ah{UzbhZ(^&1__;IY}sC_3*{RqVjh&i-FTPZiDFgc-6AoM93o-m)7bOm4G8=KE_QCnt057Of4->W7OU zr@hk7aisI;uUdJ-(qcLxKMl>Vh4rJlXa=ayw?snzs>n>d`Q7pDJG}8(y6{8FR{Psn zTBZ$q71ytO2qSX~3%IMsY5(F%#KoW#Y&nC9N~AU1&Y`OU17hN%ebb zdNs2q4eu!&-KTw}2rFdS>1}e=RW**u`?&hwBt(6Yo!dxs9lAL@-1{d|Q0I;YY$@oN zc^a6}t8djM_sxuwd~mnT&q&j2AF9Kf`uI%nkifkXrl!7d4eBnm4`eO0v1x8z79L2W z0@EG$F^GIf-;Y~8+r(W>p2wwE{T4~2x*d@~d%5$RzQ{K;q|1&MDX)=&hvyt{<)ow6 zr12fxw??GWe}ZPaVV`1VM?q@N+GK1>QWeuN1Qg&0)o3r-M_X522~dbDZzcuY>+UX8 zx7QM^Fv5hXK_7449&*fW9n(^gKF?@68`Cwe#n4-5DN{dY@{#ccQK+I|GR{^cq<2Gu->YzOn?7?{Hes? zX~tCwd^ZO;AGm8{!L%tRjoUZUo~X-ylL{Ez5nQ`Eo}y687}uEMlfk1Skqr#YUYQ08 zfBfBLUjKaCl@9Fh*OT|z{kBrEOxFl1)UH^*8S532pR4A_iy6$#`xkjqr#ki*^55M$ znrk$xyU##@IJ`cggR40X;&}o=?IWuk9cyIDf^5{}=aL-+<la`!Z<4wR!>N^d?zV2(!9)gF4O@G5iXr{3JQT~=NCI;?i~MEA zk7!j@vup=FNr;-7?FTZ`iv}9rrUz7Bhptf9M7xKx)-q=1n5;yld(P+md~|KsBaD5n zb_W$w&*yJM5|yCHO$mn=m6no(jg`#Y+?AXX5=*l!?)JAs)kGeS3+MWMIhZF8g{8&L z07pwbatdQ#LP)o8I#+B&4O0le@VuD7$87`Ei(J&C_#?B`Tt;?a52`tRp+lNN_{p;1 zi9g&rWI}F#&&}ZU~ zu?FQ+$uJb_a6*OTo=X>fR-_bt^5div4U;=Ij12ZfVv{DtbnTdD5NW+$bLHm<<$xyXJN( zL8O|&ZqttMP9AqPVT8m%+_LW6xY8Y8qLc`s=eIaZlZI1K&6T0zgNcQh>=v}n9rZv4 z`DoRe!f>b;h+CBPy>VJfTJ>#1V7@*xp_ZZQmU8p<_b@#v#<%z(c_l1+t8zCiVkc($ z=VuA;a?D#j_a;s3{W)JqNhJ_!0jp!#d4EmUz(z5E#bs%=;W2cQ68;a3N+CXogN)~v zmf^2CNjn-E8ko7bD)Kuzq>R-xFl4C}&2w#{XaHjL5Ho!yh#0RZH6T>A+pm{wGHPE1 z0=(Qoz>!+rSQqNoY9}?@6(N6WOFS*xvTedEr~I5n?kYvAyP^hJHS3=Dmp%Xt+<%=?X^!#(wn65StCQ}W zx$cBb7KofaU=}wesb;qkeJCm%6BDCu#vnUc!S!j{+mZ-(En-T_1p-3CZoJ7%YtA<2MX@G8d8If;G+10@B-;xpG$z5ENHe25NN!`SheCLl-aJa264VFL zTpcYE?bnR7u<1FuxOE!WZn|nW+I8Qbur)q|h|#o46;Qze?@E#yr)-&~Tae5wtJZ`~D zc1b(IIbaieY95F^EqT5YfZ3b~`YIa#D^Q_4zmx6s)wq#cd=f4l+7AEkh)}0vp{z%o%vOVV`5yK;GJCE+L!9mcHzWR%_kgz^tiYKb9BHeY%2m z*?KPXI%zJG3BN8z{Gn<5dP;o3k<*tY!Ti1UcV}#f*GnTB()#|ib*y}rJ1_PF=MB3?E&Q1b3r_sACfTezF3>-6Cve<_`& z8&dfvM3ywP)v$96QBLZwbiv~?gWNi;WLC2zbF8n%)i|1KT0m6P)_M6_0cA};RiaNP z(YP+7UyPi?&g2X_^Yi;;BZ`PU?IVR0aI%y;o9H=M=HNf$gTnz}8oX2@oTz4(O-1R! zSQ>O)oROFidNw>J{fRwb9vtevKt2$FN?JCtt2J-O1!iB_;W)%|cp1Dd4^$ukxm zoz-vhSX!#j$J}}Cb^+u<4!kKxs^2l$RxM{e2`$@!|Q8v3R8p)M3auv*@$4MuosE z$_3)@Jru8YcSg3zDA7CXNBXoft`D|D+kFx4&!?Ml($=PVc5(t&S0?l9mC_n4^vfB` z0=EZ~tOF<|5z-;4H+rO&)*qBdc(}M?#wI3s99BEp@wf`2=bX5}=`OiPeM;eba$hhg zyBL528Dee&(pcoh}@lRHMwvjsGAGw;sXz7SWY z_^pl#)0JF_A-39KLkTW4rWP~v@AJGI<$^J68w!4keQ7)%5=MaO zOY51Iz$UcLv@Zd|fA4%4aUZD3sEL6Xoul7F#T#u>BTJlba7Hy_4;LgxC`}82-%2E_ zMY%{LBJH-HOBI(^Hot>a#~!l$zS%gh2QRI1@Ud|MMMqxUZG5fq($JlvDvQM)x370cpx?-{>fAQ$J4O@;PKqJa|uKBOz&byQr8DRbsrr+q1jBX2+I z>0N37^>9Hd8s`oSI;&-O47L<3QahQ_Xj4A2H4YSOnCV#*xWNGfibq#0l~cE`FedpE z-3$9=U+ts*`0%Z$XYI+|+Qv5Z$1_Tp9ju-png1=9Ar?KOqV#qcj^L)y$n=QMj5`1K zEuVL&Zbs@6Q&Zbv($95&DYjpbVDGhO8)u<` z4LO6nvuWK23emvPo3$>uBX?+IMs4XNc&A&bMB^#f={rdgi+Xbuaai_MAb+P3}ivnbbnlr%mw6X&FS z_3@_0S~c|jF6(=2mHx@G_ccuPVT7YGbnE!9VfMR1?H}{n z7gacTPYVjYAk~b>3T@^Wb62z=#kQ(pfw?L*+U0`Y6O7lKR)3Bub6bRIM{DoGI6TNw zlGndy`K4G{W~hx?-o#`W*4phY1w8wyc1S@a~B$vGbQ?Q8l)lmAJ(4t5&>LFf|-tH-6lm*)*l-b3!2BNOQvKC=BU-^#^SV zogOM>Frpy>W)rnn={=J;`@fuiUiIcX-nQK^H{54;x!gS1-``NrmV%O0$i2ny*&0qd z_%W95nWd*Db}qaNW7f+vYS5EaQB6Yvz*5t+Z79;VBR`d`H%LmN&rOarwf`%Lm9QVy9>va{@WGDBaiODb?L9G( zhDJXb7i+NNA@{t3Nb-)BVdMa5GP{&$V;Pmw3s#vaBT+RW;X*GdX#3rW1xD1b#btf- zaSM!6WLv9|L8h8VqC#5{^S4s43eE`UYomN$JN}BB-WS|i${NHk+ETHUp^7_i((fTz z;P#i&hS7%w-V;+3Goz$Jf4*y8{vupu2iz`uo6jZ_U%nI@kI>JX0RL> zkB7@UuKgbQxzF{ZG-uI-?Gj2O<{51Z$t^yu$4maXc5NSq)?62aW*-@*;3VavOYmp= z2@z+Z&iH}!Q`!yM7k3o67@_LOeE$p!>p2$yKc^tE)txt}{J}ISDPxzBC4cBwX6xR` zOPp%PaMTwx*#nrCq!AK#o41H2M47B4`Ei}J#O9_xb9k1%t%S>iKRcQ0h~3O^ih&2^ zLY#X+xiZz&1DbwV|9)y#Z7irmGw|cbw!OGJHCp$n9B_zNU(nnQdHk1pcU5_jJ2&gS zUh(+5Dm9;kDN1Z?>`3qs)>k%zjozNcllEr?FcJj+XbP#x>)gUVauHeFK3Uc8?Av{5 zf7unlwofOx7IRt($02I2)b)^vBaQANb;{p~9+lW)Sew8mb}|x@-Wrms-ip`#YOaYK zC0|#IwiHapp8RDV$q}YC6geS09XhGOBBirY+D8><85A^#iU=R*Q`+Bc#;8L6#n!uc z&@bm+iF^RbaXOp#hpfzFnE;N=(OY%>XjY}mfs02($2E2LT@X78tn!f!xqb5BSG~G3 z*@Zx^8#&Y|sANU##GLn3HYmiA5eHYQVPiCpTdyd~r3^f_hyN7&O5HvlCGlp3h5GIc zD20#0R6v6GWaBM_J?o#Nt}aujYA3G>Nyhf8&{CSt+x(v!#}O;ec`AapD(8 z*#TfjT}I6kbjdi~9w&|pIu(c6 zq7t=ls2>qBIY2lp58q7{HRA1hQAvCt-y?ZY&r5vs>=%tSB_hCyj?_vk#LdT-MgqL? zM95G3ZryKbZL$>nW4$-5wB47YTlYm&e75_pM%B%?vuA+>HBz_ls;6hJ9oboNFLAYW7;l}`Zhvzz^htr^L+9`9&gF-( zk`it)i<+;EB#G2$v2$Jxe7Coayw}%Z*nhzj+TFipZkw^_Xw+9!R^}Hr==dD51f)je z;4H!XwD^B||IR;&#CrCu0qs3%WV#K*Z1(uY$e6RGcD=UljMmcQjegSlZ1<4}xA11` zpmqA?p#Q^~??n2I+POINfo#Q=yFF=%6(8S8d_&ker%6B9cM^k#e0OwFzLr9ld5N|H zV@|hp1?oqQo{6M+f2RNwh$8*e=x?QFc(kujP)bs@UFG07;2Ad|co27c-|d+wLNuM( z?3IY4!StbJ13(E2Jvn~*#JCXcE6T8m%Ck;FDV}Jyc?G7a;pFHu0;%|9RZYR`GSl?4 z`gM_mxSe}jHE4a#$A?9>qEA8(jjy1C@Y(Fv(^WO0*BU4fgr+F0sdHZ4XV2&V{4|6p LsL5B#nuh!zs~OF_ diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index a92a54772161..35e2c1a4ae7d 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -128,7 +128,7 @@ browser.jar: skin/classic/browser/feeds/subscribe-ui.css (feeds/subscribe-ui.css) skin/classic/browser/fonts/ClearSans-Regular.ttf (../shared/ClearSans-Regular.ttf) skin/classic/browser/newtab/newTab.css (newtab/newTab.css) - skin/classic/browser/newtab/controls.png (../shared/newtab/controls.png) + skin/classic/browser/newtab/controls.png (newtab/controls.png) skin/classic/browser/places/places.css (places/places.css) * skin/classic/browser/places/organizer.css (places/organizer.css) skin/classic/browser/places/bookmark.png (places/bookmark.png) @@ -477,7 +477,7 @@ browser.jar: skin/classic/aero/browser/feeds/subscribe-ui.css (feeds/subscribe-ui.css) skin/classic/aero/browser/fonts/ClearSans-Regular.ttf (../shared/ClearSans-Regular.ttf) skin/classic/aero/browser/newtab/newTab.css (newtab/newTab.css) - skin/classic/aero/browser/newtab/controls.png (../shared/newtab/controls.png) + skin/classic/aero/browser/newtab/controls.png (newtab/controls.png) * skin/classic/aero/browser/places/places.css (places/places-aero.css) * skin/classic/aero/browser/places/organizer.css (places/organizer-aero.css) skin/classic/aero/browser/places/bookmark.png (places/bookmark-aero.png) diff --git a/browser/themes/windows/newtab/controls.png b/browser/themes/windows/newtab/controls.png new file mode 100644 index 0000000000000000000000000000000000000000..14f382fbdd18a1209f3dcd63831014b5ad2fc428 GIT binary patch literal 4180 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 .newtab-site:hover, +.newtab-site:hover, .newtab-site[dragged] { box-shadow: 0 0 10px rgba(8,22,37,.3); } @@ -120,13 +120,6 @@ background-size: cover; } -.newtab-site[type=affiliate] .newtab-thumbnail, -.newtab-site[type=organic] .newtab-thumbnail, -.newtab-site[type=sponsored] .newtab-thumbnail { - background-position: top center; - background-size: auto; -} - /* TITLES */ .newtab-title { color: #525c66; @@ -134,10 +127,6 @@ font-size: 13px; } -.newtab-site[type=sponsored] .newtab-title { - -moz-padding-end: 24px; -} - /* CONTROLS */ .newtab-control { width: 24px; @@ -178,15 +167,3 @@ .newtab-control-block:active { background-position: -192px 0; } - -.newtab-control-sponsored { - background-position: -249px -1px; -} - -.newtab-control-sponsored:hover { - background-position: -265px -1px; -} - -.newtab-control-sponsored[panelShown] { - background-position: -281px -1px; -} diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index a9a9d92ff06f..8eca5ef9480d 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -4041,30 +4041,6 @@ "n_values": 10, "description": "Track click count on about:newtab tiles per index (0-8). For non-default row or column configurations all clicks into the '9' bucket." }, - "NEWTAB_PAGE_DIRECTORY_AFFILIATE_SHOWN": { - "expires_in_version": "35", - "kind": "enumerated", - "n_values": 11, - "description": "Number of affiliate directory links shown on about:newtab. For non-default row or column configurations, extra links fall into the '10' bucket." - }, - "NEWTAB_PAGE_DIRECTORY_ORGANIC_SHOWN": { - "expires_in_version": "35", - "kind": "enumerated", - "n_values": 11, - "description": "Number of organic directory links shown on about:newtab. For non-default row or column configurations, extra links fall into the '10' bucket." - }, - "NEWTAB_PAGE_DIRECTORY_SPONSORED_SHOWN": { - "expires_in_version": "35", - "kind": "enumerated", - "n_values": 11, - "description": "Number of sponsored directory links shown on about:newtab. For non-default row or column configurations, extra links fall into the '10' bucket." - }, - "NEWTAB_PAGE_DIRECTORY_TYPE_CLICKED": { - "expires_in_version": "35", - "kind": "enumerated", - "n_values": 3, - "description": "Track click count on about:newtab directory links per type (sponsored, affiliate, organic)." - }, "PANORAMA_INITIALIZATION_TIME_MS": { "expires_in_version": "never", "kind": "exponential", diff --git a/toolkit/content/directoryLinks.json b/toolkit/content/directoryLinks.json index ae1f8d3e9282..72ea6a101165 100644 --- a/toolkit/content/directoryLinks.json +++ b/toolkit/content/directoryLinks.json @@ -3,10 +3,52 @@ { "url": "https://www.facebook.com/", "bgColor": "#3a5898", - "type": "organic", + "type": "sponsored", "imageURISpec": "data:image/jpg;base64,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\n", "title": "Facebook" }, + { + "url": "https://www.youtube.com/", + "bgColor": "#e5523f", + "type": "sponsored", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "YouTube" + }, + { + "url": "https://twitter.com/", + "bgColor": "#00b5f0", + "type": "sponsored", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Twitter" + }, + { + "url": "https://www.wikipedia.org/", + "bgColor": "#ffffff", + "type": "sponsored", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Wikipedia" + }, + { + "url": "https://www.mozilla.org/", + "bgColor": "#4d4e54", + "type": "sponsored", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Mozilla Foundation" + }, + { + "url": "https://www.eff.org/", + "bgColor": "#000000", + "type": "sponsored", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Electronic Frontier Foundation" + }, + { + "url": "http://www.lonelyplanet.com/", + "bgColor": "#002f74", + "type": "sponsored", + "imageURISpec": "data:image/jpg;base64,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\n", + "title": "Lonely Planet" + }, { "url": "http://www.bbc.co.uk/", "bgColor": "#990000", @@ -15,53 +57,11 @@ "title": "BBC" }, { - "url": "https://www.youtube.com/", - "bgColor": "#e5523f", - "type": "organic", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "YouTube" - }, - { - "url": "http://www.wired.com/", - "bgColor": "#000000", + "url": "http://www.nytimes.com/", + "bgColor": "#0093b9", "type": "sponsored", "imageURISpec": "data:image/jpg;base64,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\n", - "title": "WIRED" - }, - { - "url": "https://www.wikipedia.org/", - "bgColor": "#ffffff", - "type": "affiliate", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Wikipedia" - }, - { - "url": "https://twitter.com/", - "bgColor": "#00b5f0", - "type": "organic", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Twitter" - }, - { - "url": "https://www.yahoo.com/", - "bgColor": "#500095", - "type": "organic", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Yahoo" - }, - { - "url": "http://www.amazon.com/", - "bgColor": "#ffffff", - "type": "organic", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Amazon.com" - }, - { - "url": "https://www.mozilla.org/", - "bgColor": "#4d4e54", - "type": "affiliate", - "imageURISpec": "data:image/jpg;base64,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\n", - "title": "Mozilla Foundation" + "title": "The New York Times" } ] } diff --git a/toolkit/modules/DirectoryLinksProvider.jsm b/toolkit/modules/DirectoryLinksProvider.jsm index 2be6eba75596..d90530f34381 100644 --- a/toolkit/modules/DirectoryLinksProvider.jsm +++ b/toolkit/modules/DirectoryLinksProvider.jsm @@ -60,12 +60,6 @@ const PREF_DIRECTORY_SOURCE = "browser.newtabpage.directorySource"; // The frecency of a directory link const DIRECTORY_FRECENCY = 1000; -const LINK_TYPES = Object.freeze([ - "sponsored", - "affiliate", - "organic", -]); - /** * Singleton that serves as the provider of directory links. * Directory links are a hard-coded set of links shown if a user's link @@ -95,8 +89,6 @@ let DirectoryLinksProvider = { return this.__linksURL; }, - get linkTypes() LINK_TYPES, - observe: function DirectoryLinksProvider_observe(aSubject, aTopic, aData) { if (aTopic == "nsPref:changed") { if (aData == this._prefs["linksURL"]) { diff --git a/toolkit/modules/NewTabUtils.jsm b/toolkit/modules/NewTabUtils.jsm index 44d6e09d5183..5fbc3119aa92 100644 --- a/toolkit/modules/NewTabUtils.jsm +++ b/toolkit/modules/NewTabUtils.jsm @@ -577,9 +577,6 @@ let PlacesProvider = { title: title, frecency: frecency, lastVisitDate: lastVisitDate, - bgColor: "transparent", - type: "history", - imageURISpec: null, }); } } From 44de0dbb4d1f81f4905e909b32f4d7dca345fb31 Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Fri, 28 Mar 2014 20:17:04 +0100 Subject: [PATCH 09/19] Bug 975000 - Disable updating and compatibility checking for Experiments; r=Unfocused Experiment add-ons are installed and updated via the Experiments Manager service. With this change, the Add-ons Manager lets experiment add-ons play by their own rules without interference. --HG-- extra : rebase_source : 12f990198fed7171b9572c24aa2f8319620414a2 --- toolkit/mozapps/extensions/AddonManager.jsm | 20 ++++++- .../extensions/LightweightThemeManager.jsm | 7 +-- .../extensions/internal/XPIProvider.jsm | 52 +++++++++++++++++-- .../test/addons/test_experiment1/install.rdf | 17 ++++++ .../test/browser/browser_experiments.js | 20 +++++-- .../test/xpcshell/test_experiment.js | 48 +++++++++++++++++ .../extensions/test/xpcshell/test_shutdown.js | 3 +- .../test/xpcshell/xpcshell-shared.ini | 1 + 8 files changed, 154 insertions(+), 14 deletions(-) create mode 100644 toolkit/mozapps/extensions/test/addons/test_experiment1/install.rdf create mode 100644 toolkit/mozapps/extensions/test/xpcshell/test_experiment.js diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm index 46da6db81543..4133200bcdb7 100644 --- a/toolkit/mozapps/extensions/AddonManager.jsm +++ b/toolkit/mozapps/extensions/AddonManager.jsm @@ -2317,7 +2317,25 @@ this.AddonManagerPrivate = { return { done: () => this.recordSimpleMeasure(aName, Date.now() - startTime) }; - } + }, + + /** + * Helper to call update listeners when no update is available. + * + * This can be used as an implementation for Addon.findUpdates() when + * no update mechanism is available. + */ + callNoUpdateListeners: function (addon, listener, reason, appVersion, platformVersion) { + if ("onNoCompatibilityUpdateAvailable" in listener) { + safeCall(listener.onNoCompatibilityUpdateAvailable.bind(listener), addon); + } + if ("onNoUpdateAvailable" in listener) { + safeCall(listener.onNoUpdateAvailable.bind(listener), addon); + } + if ("onUpdateFinished" in listener) { + safeCall(listener.onUpdateFinished.bind(listener), addon); + } + }, }; /** diff --git a/toolkit/mozapps/extensions/LightweightThemeManager.jsm b/toolkit/mozapps/extensions/LightweightThemeManager.jsm index 8c9f30492d3f..615f792b6e4c 100644 --- a/toolkit/mozapps/extensions/LightweightThemeManager.jsm +++ b/toolkit/mozapps/extensions/LightweightThemeManager.jsm @@ -508,12 +508,7 @@ function AddonWrapper(aTheme) { }; this.findUpdates = function AddonWrapper_findUpdates(listener, reason, appVersion, platformVersion) { - if ("onNoCompatibilityUpdateAvailable" in listener) - listener.onNoCompatibilityUpdateAvailable(this); - if ("onNoUpdateAvailable" in listener) - listener.onNoUpdateAvailable(this); - if ("onUpdateFinished" in listener) - listener.onUpdateFinished(this); + AddonManagerPrivate.callNoUpdateListeners(this, listener, reason, appVersion, platformVersion); }; } diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm index e0607d964a1a..991c76f01909 100644 --- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm @@ -915,6 +915,17 @@ function loadManifestFromRDF(aUri, aStream) { addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT; + // Experiments are managed and updated through an external "experiments + // manager." So disable some built-in mechanisms. + if (addon.type == "experiment") { + addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DISABLE; + addon.updateURL = null; + addon.updateKey = null; + + addon.targetApplications = []; + addon.targetPlatforms = []; + } + // Load the storage service before NSS (nsIRandomGenerator), // to avoid a SQLite initialization error (bug 717904). let storage = Services.storage; @@ -6014,6 +6025,17 @@ AddonInternal.prototype = { }, isCompatibleWith: function AddonInternal_isCompatibleWith(aAppVersion, aPlatformVersion) { + // Experiments are installed through an external mechanism that + // limits target audience to compatible clients. We trust it knows what + // it's doing and skip compatibility checks. + // + // This decision does forfeit defense in depth. If the experiments system + // is ever wrong about targeting an add-on to a specific application + // or platform, the client will likely see errors. + if (this.type == "experiment") { + return true; + } + let app = this.matchingTargetApplication; if (!app) return false; @@ -6398,6 +6420,11 @@ function AddonWrapper(aAddon) { return aAddon.applyBackgroundUpdates; }); this.__defineSetter__("applyBackgroundUpdates", function AddonWrapper_applyBackgroundUpdatesSetter(val) { + if (this.type == "experiment") { + logger.warn("Setting applyBackgroundUpdates on an experiment is not supported."); + return; + } + if (val != AddonManager.AUTOUPDATE_DEFAULT && val != AddonManager.AUTOUPDATE_DISABLE && val != AddonManager.AUTOUPDATE_ENABLE) { @@ -6498,22 +6525,33 @@ function AddonWrapper(aAddon) { if (!(aAddon.inDatabase)) return permissions; + // Experiments can only be uninstalled. An uninstall reflects the user + // intent of "disable this experiment." This is partially managed by the + // experiments manager. + if (aAddon.type == "experiment") { + return AddonManager.PERM_CAN_UNINSTALL; + } + if (!aAddon.appDisabled) { - if (this.userDisabled) + if (this.userDisabled) { permissions |= AddonManager.PERM_CAN_ENABLE; - else if (aAddon.type != "theme") + } + else if (aAddon.type != "theme") { permissions |= AddonManager.PERM_CAN_DISABLE; + } } // Add-ons that are in locked install locations, or are pending uninstall // cannot be upgraded or uninstalled if (!aAddon._installLocation.locked && !aAddon.pendingUninstall) { // Add-ons that are installed by a file link cannot be upgraded - if (!aAddon._installLocation.isLinkedAddon(aAddon.id)) + if (!aAddon._installLocation.isLinkedAddon(aAddon.id)) { permissions |= AddonManager.PERM_CAN_UPGRADE; + } permissions |= AddonManager.PERM_CAN_UNINSTALL; } + return permissions; }); @@ -6595,6 +6633,14 @@ function AddonWrapper(aAddon) { }; this.findUpdates = function AddonWrapper_findUpdates(aListener, aReason, aAppVersion, aPlatformVersion) { + // Short-circuit updates for experiments because updates are handled + // through the Experiments Manager. + if (this.type == "experiment") { + AddonManagerPrivate.callNoUpdateListeners(this, aListener, aReason, + aAppVersion, aPlatformVersion); + return; + } + new UpdateChecker(aAddon, aListener, aReason, aAppVersion, aPlatformVersion); }; diff --git a/toolkit/mozapps/extensions/test/addons/test_experiment1/install.rdf b/toolkit/mozapps/extensions/test/addons/test_experiment1/install.rdf new file mode 100644 index 000000000000..9508b1562e78 --- /dev/null +++ b/toolkit/mozapps/extensions/test/addons/test_experiment1/install.rdf @@ -0,0 +1,17 @@ + + + + + + experiment1@tests.mozilla.org + 1.0 + 128 + true + + + Test Experiment 1 + Test Description + + + diff --git a/toolkit/mozapps/extensions/test/browser/browser_experiments.js b/toolkit/mozapps/extensions/test/browser/browser_experiments.js index 6c2b771897aa..05ca5dc415ef 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_experiments.js +++ b/toolkit/mozapps/extensions/test/browser/browser_experiments.js @@ -50,9 +50,7 @@ add_test(function testActiveExperiment() { install_addon("addons/browser_experiment1.xpi", (addon) => { gInstalledAddons.push(addon); - // This may change if we remove compatibility checking from experiments. - // Putting this check here so a test fails if preconditions change. - Assert.equal(addon.isActive, false, "Add-on is not active."); + Assert.ok(addon.isActive, "Add-on is active."); Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible."); @@ -133,3 +131,19 @@ add_test(function testOpenPreferences() { EventUtils.synthesizeMouseAtCenter(btn, {}, gManagerWindow); }); }); + +add_test(function testButtonPresence() { + gCategoryUtilities.openType("experiment", (win) => { + let item = get_addon_element(gManagerWindow, "test-experiment1@experiments.mozilla.org"); + Assert.ok(item, "Got add-on element."); + + let el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + // Corresponds to the uninstall permission. + is_element_visible(el, "Remove button is visible."); + // Corresponds to lack of disable permission. + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); + is_element_hidden(el, "Disable button not visible."); + + run_next_test(); + }); +}); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_experiment.js b/toolkit/mozapps/extensions/test/xpcshell/test_experiment.js new file mode 100644 index 000000000000..88d9d31b66e3 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_experiment.js @@ -0,0 +1,48 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +function run_test() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + startupManager(); + + run_next_test(); +} + +add_test(function test_experiment() { + AddonManager.getInstallForFile(do_get_addon("test_experiment1"), (install) => { + completeAllInstalls([install], () => { + AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => { + Assert.ok(addon, "Addon is found."); + + Assert.ok(addon.isActive, "Add-on is active."); + Assert.equal(addon.updateURL, null, "No updateURL for experiments."); + Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE, + "Background updates are disabled."); + Assert.equal(addon.permissions, AddonManager.PERM_CAN_UNINSTALL, + "Permissions are minimal."); + + // Setting applyBackgroundUpdates should not work. + addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_ENABLE; + Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE, + "Setting applyBackgroundUpdates shouldn't do anything."); + + let noCompatibleCalled = false; + let noUpdateCalled = false; + let finishedCalled = false; + + let listener = { + onNoCompatibilityUpdateAvailable: () => { noCompatibleCalled = true; }, + onNoUpdateAvailable: () => { noUpdateCalled = true; }, + onUpdateFinished: () => { finishedCalled = true; }, + }; + + addon.findUpdates(listener, "testing", null, null); + Assert.ok(noCompatibleCalled, "Listener called."); + Assert.ok(noUpdateCalled, "Listener called."); + Assert.ok(finishedCalled, "Listener called."); + + run_next_test(); + }); + }); + }); +}); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_shutdown.js b/toolkit/mozapps/extensions/test/xpcshell/test_shutdown.js index c9c67d8138b5..6bf3f27d890a 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_shutdown.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_shutdown.js @@ -17,7 +17,8 @@ const IGNORE_PRIVATE = ["AddonAuthor", "AddonCompatibilityOverride", "addStartupChange", "removeStartupChange", "recordTimestamp", "recordSimpleMeasure", "recordException", "getSimpleMeasures", "simpleTimer", - "setTelemetryDetails", "getTelemetryDetails"]; + "setTelemetryDetails", "getTelemetryDetails", + "callNoUpdateListeners"]; function test_functions() { for (let prop in AddonManager) { diff --git a/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini b/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini index d0ced7767e9e..644dbdb128b3 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini +++ b/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini @@ -163,6 +163,7 @@ fail-if = os == "android" # Bug 676992: test consistently hangs on Android skip-if = os == "android" [test_error.js] +[test_experiment.js] [test_filepointer.js] # Bug 676992: test consistently hangs on Android skip-if = os == "android" From c26a532a0232b5637638e4003d3c3ab2e0abe59a Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Fri, 21 Mar 2014 16:05:29 -0700 Subject: [PATCH 10/19] Bug 985084 - Experiment add-ons should be disabled by default; r=Unfocused Experiment add-ons are now disabled by default on application load. It is up to the Experiments Manager to enable them. This means that experiments may not be able to reliably collect data or modify behavior close to application startup. (There is a window between when the Addon Manager initializes and when the Experiments Manager initializes.) This window is acceptable for the initial version of the experiments feature. The Experiments Manager doesn't currently enable experiments on startup. This will be addressed in a subsequent patch. Its tests do not regress (indicating a lack of test coverage), so no harm no foul. --HG-- extra : rebase_source : 00a55146576f490200a6148bd5516f84def9879c extra : source : bd901384b973c7ff581fe24a3012f0191b8bbe67 --- browser/experiments/Experiments.jsm | 7 +++ .../extensions/internal/XPIProvider.jsm | 34 ++++++++++++--- .../test/browser/browser_experiments.js | 6 ++- .../test/xpcshell/test_experiment.js | 43 ++++++++++++++++++- 4 files changed, 81 insertions(+), 9 deletions(-) diff --git a/browser/experiments/Experiments.jsm b/browser/experiments/Experiments.jsm index fd3b6a5e9006..dae7aedc496e 100644 --- a/browser/experiments/Experiments.jsm +++ b/browser/experiments/Experiments.jsm @@ -611,6 +611,8 @@ Experiments.Experiments.prototype = { return this._run(); }, + // START OF ADD-ON LISTENERS + onDisabled: function (addon) { gLogger.trace("Experiments::onDisabled() - addon id: " + addon.id); if (addon.id == this._pendingUninstall) { @@ -636,6 +638,8 @@ Experiments.Experiments.prototype = { this.disableExperiment(); }, + // END OF ADD-ON LISTENERS. + _getExperimentByAddonId: function (addonId) { for (let [, entry] of this._experiments) { if (entry._addonId === addonId) { @@ -1401,6 +1405,9 @@ Experiments.ExperimentEntry.prototype = { gLogger.error("ExperimentEntry::_installAddon() - onInstallStarted, wrong addon type"); return false; } + + // Experiment add-ons default to userDisabled = true. + install.addon.userDisabled = false; }, onInstallEnded: install => { diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm index 991c76f01909..030cd253587a 100644 --- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm @@ -908,6 +908,11 @@ function loadManifestFromRDF(aUri, aStream) { addon.userDisabled = !!LightweightThemeManager.currentTheme || addon.internalName != XPIProvider.selectedSkin; } + // Experiments are disabled by default. It is up to the Experiments Manager + // to enable them (it drives installation). + else if (addon.type == "experiment") { + addon.userDisabled = true; + } else { addon.userDisabled = false; addon.softDisabled = addon.blocklistState == Ci.nsIBlocklistService.STATE_SOFTBLOCKED; @@ -2082,8 +2087,19 @@ var XPIProvider = { * Persists changes to XPIProvider.bootstrappedAddons to its store (a pref). */ persistBootstrappedAddons: function XPI_persistBootstrappedAddons() { + // Experiments are disabled upon app load, so don't persist references. + let filtered = {}; + for (let id in this.bootstrappedAddons) { + let entry = this.bootstrappedAddons[id]; + if (entry.type == "experiment") { + continue; + } + + filtered[id] = entry; + } + Services.prefs.setCharPref(PREF_BOOTSTRAP_ADDONS, - JSON.stringify(this.bootstrappedAddons)); + JSON.stringify(filtered)); }, /** @@ -4238,12 +4254,16 @@ var XPIProvider = { // no onDisabling/onEnabling is sent - so send a onPropertyChanged. let appDisabledChanged = aAddon.appDisabled != appDisabled; - // Update the properties in the database - XPIDatabase.setAddonProperties(aAddon, { - userDisabled: aUserDisabled, - appDisabled: appDisabled, - softDisabled: aSoftDisabled - }); + // Update the properties in the database. + // We never persist this for experiments because the disabled flags + // are controlled by the Experiments Manager. + if (aAddon.type != "experiment") { + XPIDatabase.setAddonProperties(aAddon, { + userDisabled: aUserDisabled, + appDisabled: appDisabled, + softDisabled: aSoftDisabled + }); + } if (appDisabledChanged) { AddonManagerPrivate.callAddonListeners("onPropertyChanged", diff --git a/toolkit/mozapps/extensions/test/browser/browser_experiments.js b/toolkit/mozapps/extensions/test/browser/browser_experiments.js index 05ca5dc415ef..2f760acc3f6e 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_experiments.js +++ b/toolkit/mozapps/extensions/test/browser/browser_experiments.js @@ -50,7 +50,8 @@ add_test(function testActiveExperiment() { install_addon("addons/browser_experiment1.xpi", (addon) => { gInstalledAddons.push(addon); - Assert.ok(addon.isActive, "Add-on is active."); + Assert.ok(addon.userDisabled, "Add-on is disabled upon initial install."); + Assert.equal(addon.isActive, false, "Add-on is not active."); Assert.ok(gCategoryUtilities.isTypeVisible("experiment"), "Experiment tab visible."); @@ -143,6 +144,9 @@ add_test(function testButtonPresence() { // Corresponds to lack of disable permission. el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "disable-btn"); is_element_hidden(el, "Disable button not visible."); + // Corresponds to lack of enable permission. + el = item.ownerDocument.getAnonymousElementByAttribute(item, "anonid", "enable-btn"); + is_element_hidden(el, "Enable button not visible."); run_next_test(); }); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_experiment.js b/toolkit/mozapps/extensions/test/xpcshell/test_experiment.js index 88d9d31b66e3..72efdb32b3ad 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/test_experiment.js +++ b/toolkit/mozapps/extensions/test/xpcshell/test_experiment.js @@ -1,6 +1,9 @@ /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ +let scope = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm"); +const XPIProvider = scope.XPIProvider; + function run_test() { createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); startupManager(); @@ -14,7 +17,8 @@ add_test(function test_experiment() { AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => { Assert.ok(addon, "Addon is found."); - Assert.ok(addon.isActive, "Add-on is active."); + Assert.ok(addon.userDisabled, "Experiments are userDisabled by default."); + Assert.equal(addon.isActive, false, "Add-on is not active."); Assert.equal(addon.updateURL, null, "No updateURL for experiments."); Assert.equal(addon.applyBackgroundUpdates, AddonManager.AUTOUPDATE_DISABLE, "Background updates are disabled."); @@ -46,3 +50,40 @@ add_test(function test_experiment() { }); }); }); + +// Changes to userDisabled should not be persisted to the database. +add_test(function test_userDisabledNotPersisted() { + AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => { + Assert.ok(addon, "Addon is found."); + + let listener = { + onEnabled: (addon2) => { + Assert.equal(addon2.id, addon.id, "Changed add-on matches expected."); + Assert.ok(addon2.isActive, "Add-on is no longer disabled."); + + Assert.ok("experiment1@tests.mozilla.org" in XPIProvider.bootstrappedAddons, + "Experiment add-on listed in XPIProvider bootstrapped list."); + + AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => { + Assert.ok(addon, "Add-on retrieved."); + Assert.ok(addon.userDisabled, "Add-on is disabled according to database."); + + restartManager(); + let persisted = JSON.parse(Services.prefs.getCharPref("extensions.bootstrappedAddons")); + Assert.ok(!("experiment1@tests.mozilla.org" in persisted), + "Experiment add-on not persisted to bootstrappedAddons."); + + AddonManager.getAddonByID("experiment1@tests.mozilla.org", (addon) => { + Assert.ok(addon, "Add-on retrieved."); + Assert.ok(addon.userDisabled, "Add-on is disabled after restart."); + + run_next_test(); + }); + }); + }, + }; + + AddonManager.addAddonListener(listener); + addon.userDisabled = false; + }); +}); From 4d197467ef41a19e7b6f320bdbde485e49dd4d9c Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Wed, 26 Mar 2014 22:20:23 -0700 Subject: [PATCH 11/19] Bug 989137 - Part 1: Uninstall unknown experiments; r=Unfocused Before this patch, experiment add-ons may have existed in the Addons Manager without the Experiments service knowing about them. This detects these unknown add-ons and uninstalls them. See the in-line comment on the rationale behind this decision. The added unit test fails without the Experiments.jsm change. --HG-- extra : rebase_source : bb0d0d5d77c7ae562f76e6c647eea25e6a06d99a --- browser/experiments/Experiments.jsm | 24 +++++++++++ browser/experiments/test/xpcshell/head.js | 20 +++++++++ .../test/xpcshell/test_activate.js | 12 ------ browser/experiments/test/xpcshell/test_api.js | 41 +++++++++++++------ .../experiments/test/xpcshell/test_cache.js | 12 ------ .../experiments/test/xpcshell/test_fetch.js | 2 +- .../test/xpcshell/test_healthreport.js | 6 ++- 7 files changed, 79 insertions(+), 38 deletions(-) diff --git a/browser/experiments/Experiments.jsm b/browser/experiments/Experiments.jsm index dae7aedc496e..50713beb5c45 100644 --- a/browser/experiments/Experiments.jsm +++ b/browser/experiments/Experiments.jsm @@ -853,6 +853,30 @@ Experiments.Experiments.prototype = { this._checkForShutdown(); + // The first thing we do is reconcile our state against what's in the + // Addon Manager. It's possible that the Addon Manager knows of experiment + // add-ons that we don't. This could happen if an experiment gets installed + // when we're not listening or if there is a bug in our synchronization + // code. + // + // We have a few options of what to do with unknown experiment add-ons + // coming from the Addon Manager. Ideally, we'd convert these to + // ExperimentEntry instances and stuff them inside this._experiments. + // However, since ExperimentEntry contain lots of metadata from the + // manifest and trying to make up data could be error prone, it's safer + // to not try. Furthermore, if an experiment really did come from us, we + // should have some record of it. In the end, we decide to discard all + // knowledge for these unknown experiment add-ons. + let installedExperiments = yield installedExperimentAddons(); + let expectedAddonIds = new Set([e._addonId for ([,e] of this._experiments)]); + let unknownAddons = [a for (a of installedExperiments) if (!expectedAddonIds.has(a.id))]; + if (unknownAddons.length) { + gLogger.warn("Experiments::_evaluateExperiments() - unknown add-ons in AddonManager: " + + [a.id for (a of unknownAddons)].join(", ")); + + yield uninstallAddons(unknownAddons); + } + let activeExperiment = this._getActiveExperiment(); let activeChanged = false; let now = this._policy.now(); diff --git a/browser/experiments/test/xpcshell/head.js b/browser/experiments/test/xpcshell/head.js index 2d1e2247e5b7..5c5a53f72aa1 100644 --- a/browser/experiments/test/xpcshell/head.js +++ b/browser/experiments/test/xpcshell/head.js @@ -105,6 +105,18 @@ function dateToSeconds(date) { return date.getTime() / 1000; } +let gGlobalScope = this; +function loadAddonManager() { + let ns = {}; + Cu.import("resource://gre/modules/Services.jsm", ns); + let head = "../../../../toolkit/mozapps/extensions/test/xpcshell/head_addons.js"; + let file = do_get_file(head); + let uri = ns.Services.io.newFileURI(file); + ns.Services.scriptloader.loadSubScript(uri.spec, gGlobalScope); + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); + startupManager(); +} + // Install addon and return a Promise that is // resolve with true on success, false otherwise. function installAddon(url, hash) { @@ -160,6 +172,14 @@ function uninstallAddon(id) { return deferred.promise; } +function getExperimentAddons() { + let deferred = Promise.defer(); + + AddonManager.getAddonsByTypes(["experiment"], deferred.resolve); + + return deferred.promise; +} + function createAppInfo(optionsIn) { const XULAPPINFO_CONTRACTID = "@mozilla.org/xre/app-info;1"; const XULAPPINFO_CID = Components.ID("{c763b610-9d49-455a-bbd2-ede71682a1ac}"); diff --git a/browser/experiments/test/xpcshell/test_activate.js b/browser/experiments/test/xpcshell/test_activate.js index ba1ce3fc0ded..019307b91eea 100644 --- a/browser/experiments/test/xpcshell/test_activate.js +++ b/browser/experiments/test/xpcshell/test_activate.js @@ -21,18 +21,6 @@ let gHttpRoot = null; let gReporter = null; let gPolicy = null; -let gGlobalScope = this; -function loadAddonManager() { - let ns = {}; - Cu.import("resource://gre/modules/Services.jsm", ns); - let head = "../../../../toolkit/mozapps/extensions/test/xpcshell/head_addons.js"; - let file = do_get_file(head); - let uri = ns.Services.io.newFileURI(file); - ns.Services.scriptloader.loadSubScript(uri.spec, gGlobalScope); - createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); - startupManager(); -} - function ManifestEntry(data) { this.id = data.id || EXPERIMENT1_ID; this.xpiURL = data.xpiURL || gHttpRoot + EXPERIMENT1_XPI_NAME; diff --git a/browser/experiments/test/xpcshell/test_api.js b/browser/experiments/test/xpcshell/test_api.js index 4ab0642f4e63..05fd7dcbe296 100644 --- a/browser/experiments/test/xpcshell/test_api.js +++ b/browser/experiments/test/xpcshell/test_api.js @@ -29,18 +29,6 @@ let gManifestObject = null; let gManifestHandlerURI = null; let gTimerScheduleOffset = -1; -let gGlobalScope = this; -function loadAddonManager() { - let ns = {}; - Cu.import("resource://gre/modules/Services.jsm", ns); - let head = "../../../../toolkit/mozapps/extensions/test/xpcshell/head_addons.js"; - let file = do_get_file(head); - let uri = ns.Services.io.newFileURI(file); - ns.Services.scriptloader.loadSubScript(uri.spec, gGlobalScope); - createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); - startupManager(); -} - function run_test() { run_next_test(); } @@ -1352,3 +1340,32 @@ add_task(function* test_unexpectedUninstall() { yield experiments.uninit(); yield removeCacheFile(); }); + +// If the Addon Manager knows of an experiment that we don't, it should get +// uninstalled. +add_task(function* testUnknownExperimentsUninstalled() { + let experiments = new Experiments.Experiments(gPolicy); + + let addons = yield getExperimentAddons(); + Assert.equal(addons.length, 0, "Precondition: No experiment add-ons are present."); + yield installAddon(gDataRoot + EXPERIMENT1_XPI_NAME, EXPERIMENT1_XPI_SHA1); + addons = yield getExperimentAddons(); + Assert.equal(addons.length, 1, "Experiment 1 installed via AddonManager"); + + // Simulate no known experiments. + gManifestObject = { + "version": 1, + experiments: [], + }; + + yield experiments.updateManifest(); + let fromManifest = yield experiments.getExperiments(); + Assert.equal(fromManifest.length, 0, "No experiments known in manifest."); + + // And the unknown add-on should be gone. + addons = yield getExperimentAddons(); + Assert.equal(addons.length, 0, "Experiment 1 was uninstalled."); + + yield experiments.uninit(); + yield removeCacheFile(); +}); diff --git a/browser/experiments/test/xpcshell/test_cache.js b/browser/experiments/test/xpcshell/test_cache.js index fa157b98e5f3..98614ef06256 100644 --- a/browser/experiments/test/xpcshell/test_cache.js +++ b/browser/experiments/test/xpcshell/test_cache.js @@ -29,18 +29,6 @@ let gManifestObject = null; let gManifestHandlerURI = null; let gTimerScheduleOffset = -1; -let gGlobalScope = this; -function loadAddonManager() { - let ns = {}; - Cu.import("resource://gre/modules/Services.jsm", ns); - let head = "../../../../toolkit/mozapps/extensions/test/xpcshell/head_addons.js"; - let file = do_get_file(head); - let uri = ns.Services.io.newFileURI(file); - ns.Services.scriptloader.loadSubScript(uri.spec, gGlobalScope); - createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); - startupManager(); -} - function run_test() { run_next_test(); } diff --git a/browser/experiments/test/xpcshell/test_fetch.js b/browser/experiments/test/xpcshell/test_fetch.js index c9056bb3d7b0..a28db91e5c64 100644 --- a/browser/experiments/test/xpcshell/test_fetch.js +++ b/browser/experiments/test/xpcshell/test_fetch.js @@ -20,7 +20,7 @@ let gHttpRoot = null; let gPolicy = new Experiments.Policy(); function run_test() { - createAppInfo(); + loadAddonManager(); gProfileDir = do_get_profile(); gHttpServer = new HttpServer(); diff --git a/browser/experiments/test/xpcshell/test_healthreport.js b/browser/experiments/test/xpcshell/test_healthreport.js index 2d034995293d..f7d10b00f001 100644 --- a/browser/experiments/test/xpcshell/test_healthreport.js +++ b/browser/experiments/test/xpcshell/test_healthreport.js @@ -20,11 +20,15 @@ function getStorageAndProvider(name) { } function run_test() { + run_next_test(); +} + +add_test(function setup() { do_get_profile(); initTestLogging(); run_next_test(); -} +}); add_task(function test_constructor() { let provider = new ExperimentsProvider(); From f3005fef1005934dfcaa4b9dc3a275719c10a4b9 Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Fri, 28 Mar 2014 11:20:31 -0700 Subject: [PATCH 12/19] Bug 989137 - Part 2: Don't use a global logger; r=gfritzsche As part of debugging subsequent patches, I ran into issues debugging the interaction between multiple Experiments instances. To get to the bottom of the problem, I had to make some changes to the logging framework. This is the first patch in a sub-series dealing with logging. This patch stops relying on the global logger. Subsequent patches will make the logging output aid debugging. --HG-- extra : rebase_source : 40b34a1444ff3fb70a9da7cf242ee522d6ec07ea extra : source : 61877a5f15aa01dec05fe1882eae6ad9f18f81a0 --- browser/experiments/Experiments.jsm | 143 ++++++++++++++-------------- 1 file changed, 74 insertions(+), 69 deletions(-) diff --git a/browser/experiments/Experiments.jsm b/browser/experiments/Experiments.jsm index 50713beb5c45..b699119bf353 100644 --- a/browser/experiments/Experiments.jsm +++ b/browser/experiments/Experiments.jsm @@ -236,6 +236,7 @@ let Experiments = { */ Experiments.Policy = function () { + this._log = Log.repository.getLogger("Browser.Experiments.Policy"); }; Experiments.Policy.prototype = { @@ -247,7 +248,7 @@ Experiments.Policy.prototype = { let pref = gPrefs.get(PREF_FORCE_SAMPLE); if (pref !== undefined) { let val = Number.parseFloat(pref); - gLogger.debug("Experiments::Policy::random sample forced: " + val); + this._log.debug("Experiments::Policy::random sample forced: " + val); if (IsNaN(val) || val < 0) { return 0; } @@ -301,6 +302,8 @@ Experiments.Policy.prototype = { */ Experiments.Experiments = function (policy=new Experiments.Policy()) { + this._log = Log.repository.getLogger("Browser.Experiments.Experiments"); + this._policy = policy; // This is a Map of (string -> ExperimentEntry), keyed with the experiment id. @@ -340,7 +343,7 @@ Experiments.Experiments.prototype = { configureLogging(); gExperimentsEnabled = gPrefs.get(PREF_ENABLED, false); - gLogger.trace("enabled="+gExperimentsEnabled+", "+this.enabled); + this._log.trace("enabled=" + gExperimentsEnabled + ", " + this.enabled); gPrefs.observe(PREF_LOGGING, configureLogging); gPrefs.observe(PREF_MANIFEST_URI, this.updateManifest, this); @@ -357,12 +360,12 @@ Experiments.Experiments.prototype = { this._loadTask = Task.spawn(this._loadFromCache.bind(this)); this._loadTask.then( () => { - gLogger.trace("Experiments::_loadTask finished ok"); + this._log.trace("Experiments::_loadTask finished ok"); this._loadTask = null; this._run(); }, (e) => { - gLogger.error("Experiments::_loadFromCache caught error: " + e); + this._log.error("Experiments::_loadFromCache caught error: " + e); } ); }, @@ -414,12 +417,12 @@ Experiments.Experiments.prototype = { * Toggle whether the experiments feature is enabled or not. */ set enabled(enabled) { - gLogger.trace("Experiments::set enabled(" + enabled + ")"); + this._log.trace("Experiments::set enabled(" + enabled + ")"); gPrefs.set(PREF_ENABLED, enabled); }, _toggleExperimentsEnabled: function (enabled) { - gLogger.trace("Experiments::_toggleExperimentsEnabled(" + enabled + ")"); + this._log.trace("Experiments::_toggleExperimentsEnabled(" + enabled + ")"); let wasEnabled = gExperimentsEnabled; gExperimentsEnabled = enabled && telemetryEnabled(); @@ -525,18 +528,18 @@ Experiments.Experiments.prototype = { }, _run: function() { - gLogger.trace("Experiments::_run"); + this._log.trace("Experiments::_run"); this._checkForShutdown(); if (!this._mainTask) { this._mainTask = Task.spawn(this._main.bind(this)); this._mainTask.then( () => { - gLogger.trace("Experiments::_main finished, scheduling next run"); + this._log.trace("Experiments::_main finished, scheduling next run"); this._mainTask = null; this._scheduleNextRun(); }, (e) => { - gLogger.error("Experiments::_main caught error: " + e); + this._log.error("Experiments::_main caught error: " + e); this._mainTask = null; } ); @@ -546,7 +549,7 @@ Experiments.Experiments.prototype = { _main: function*() { do { - gLogger.trace("Experiments::_main iteration"); + this._log.trace("Experiments::_main iteration"); yield this._loadTask; if (this._refresh) { yield this._loadManifest(); @@ -562,7 +565,7 @@ Experiments.Experiments.prototype = { }, _loadManifest: function*() { - gLogger.trace("Experiments::_loadManifest"); + this._log.trace("Experiments::_loadManifest"); let uri = Services.urlFormatter.formatURLPref(PREF_BRANCH + PREF_MANIFEST_URI); this._checkForShutdown(); @@ -570,7 +573,7 @@ Experiments.Experiments.prototype = { this._refresh = false; try { let responseText = yield this._httpGetRequest(uri); - gLogger.trace("Experiments::_loadManifest() - responseText=\"" + responseText + "\""); + this._log.trace("Experiments::_loadManifest() - responseText=\"" + responseText + "\""); if (this._shutdown) { return; @@ -579,7 +582,7 @@ Experiments.Experiments.prototype = { let data = JSON.parse(responseText); this._updateExperiments(data); } catch (e) { - gLogger.error("Experiments::_loadManifest - failure to fetch/parse manifest (continuing anyway): " + e); + this._log.error("Experiments::_loadManifest - failure to fetch/parse manifest (continuing anyway): " + e); } }, @@ -591,7 +594,7 @@ Experiments.Experiments.prototype = { * The promise is resolved when the manifest and experiment list is updated. */ updateManifest: function () { - gLogger.trace("Experiments::updateManifest()"); + this._log.trace("Experiments::updateManifest()"); if (!gExperimentsEnabled) { return Promise.reject(new Error("experiments are disabled")); @@ -606,7 +609,7 @@ Experiments.Experiments.prototype = { }, notify: function (timer) { - gLogger.trace("Experiments::notify()"); + this._log.trace("Experiments::notify()"); this._checkForShutdown(); return this._run(); }, @@ -614,7 +617,7 @@ Experiments.Experiments.prototype = { // START OF ADD-ON LISTENERS onDisabled: function (addon) { - gLogger.trace("Experiments::onDisabled() - addon id: " + addon.id); + this._log.trace("Experiments::onDisabled() - addon id: " + addon.id); if (addon.id == this._pendingUninstall) { return; } @@ -626,9 +629,9 @@ Experiments.Experiments.prototype = { }, onUninstalled: function (addon) { - gLogger.trace("Experiments::onUninstalled() - addon id: " + addon.id); + this._log.trace("Experiments::onUninstalled() - addon id: " + addon.id); if (addon.id == this._pendingUninstall) { - gLogger.trace("onUninstalled: matches pending uninstall"); + this._log.trace("onUninstalled: matches pending uninstall"); return; } let activeExperiment = this._getActiveExperiment(); @@ -655,25 +658,26 @@ Experiments.Experiments.prototype = { * the responseText when the request is complete. */ _httpGetRequest: function (url) { - gLogger.trace("Experiments::httpGetRequest(" + url + ")"); + this._log.trace("Experiments::httpGetRequest(" + url + ")"); let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); try { xhr.open("GET", url); } catch (e) { - gLogger.error("Experiments::httpGetRequest() - Error opening request to " + url + ": " + e); + this._log.error("Experiments::httpGetRequest() - Error opening request to " + url + ": " + e); return Promise.reject(new Error("Experiments - Error opening XHR for " + url)); } let deferred = Promise.defer(); + let log = this._log; xhr.onerror = function (e) { - gLogger.error("Experiments::httpGetRequest::onError() - Error making request to " + url + ": " + e.error); + log.error("Experiments::httpGetRequest::onError() - Error making request to " + url + ": " + e.error); deferred.reject(new Error("Experiments - XHR error for " + url + " - " + e.error)); }; xhr.onload = function (event) { if (xhr.status !== 200 && xhr.state !== 0) { - gLogger.error("Experiments::httpGetRequest::onLoad() - Request to " + url + " returned status " + xhr.status); + log.error("Experiments::httpGetRequest::onLoad() - Request to " + url + " returned status " + xhr.status); deferred.reject(new Error("Experiments - XHR status for " + url + " is " + xhr.status)); return; } @@ -687,7 +691,7 @@ Experiments.Experiments.prototype = { CertUtils.checkCert(xhr.channel, allowNonBuiltin, certs); } catch (e) { - gLogger.error("Experiments: manifest fetch failed certificate checks", [e]); + log.error("Experiments: manifest fetch failed certificate checks", [e]); deferred.reject(new Error("Experiments - manifest fetch failed certificate checks: " + e)); return; } @@ -714,7 +718,7 @@ Experiments.Experiments.prototype = { * Part of the main task to save the cache to disk, called from _main. */ _saveToCache: function* () { - gLogger.trace("Experiments::_saveToCache"); + this._log.trace("Experiments::_saveToCache"); let path = this._cacheFilePath; let textData = JSON.stringify({ version: CACHE_VERSION, @@ -726,14 +730,14 @@ Experiments.Experiments.prototype = { let options = { tmpPath: path + ".tmp", compression: "lz4" }; yield OS.File.writeAtomic(path, data, options); this._dirty = false; - gLogger.debug("Experiments._saveToCache saved to " + path); + this._log.debug("Experiments._saveToCache saved to " + path); }, /* * Task function, load the cached experiments manifest file from disk. */ _loadFromCache: function*() { - gLogger.trace("Experiments::_loadFromCache"); + this._log.trace("Experiments::_loadFromCache"); let path = this._cacheFilePath; try { let result = yield loadJSONAsync(path, { compression: "lz4" }); @@ -745,7 +749,7 @@ Experiments.Experiments.prototype = { }, _populateFromCache: function (data) { - gLogger.trace("Experiments::populateFromCache() - data: " + JSON.stringify(data)); + this._log.trace("Experiments::populateFromCache() - data: " + JSON.stringify(data)); // If the user has a newer cache version than we can understand, we fail // hard; no experiments should be active in this older client. @@ -770,10 +774,10 @@ Experiments.Experiments.prototype = { * array in the manifest */ _updateExperiments: function (manifestObject) { - gLogger.trace("Experiments::_updateExperiments() - experiments: " + JSON.stringify(manifestObject)); + this._log.trace("Experiments::_updateExperiments() - experiments: " + JSON.stringify(manifestObject)); if (manifestObject.version !== MANIFEST_VERSION) { - gLogger.warning("Experiments::updateExperiments() - unsupported version " + manifestObject.version); + this._log.warning("Experiments::updateExperiments() - unsupported version " + manifestObject.version); } let experiments = new Map(); // The new experiments map @@ -784,7 +788,7 @@ Experiments.Experiments.prototype = { if (entry) { if (!entry.updateFromManifestData(data)) { - gLogger.error("Experiments::updateExperiments() - Invalid manifest data for " + data.id); + this._log.error("Experiments::updateExperiments() - Invalid manifest data for " + data.id); continue; } } else { @@ -805,7 +809,7 @@ Experiments.Experiments.prototype = { // We remove them after KEEP_HISTORY_N_DAYS. for (let [id, entry] of this._experiments) { if (experiments.has(id) || !entry.startDate || entry.shouldDiscard()) { - gLogger.trace("Experiments::updateExperiments() - discarding entry for " + id); + this._log.trace("Experiments::updateExperiments() - discarding entry for " + id); continue; } @@ -824,7 +828,7 @@ Experiments.Experiments.prototype = { } if (enabled.length > 1) { - gLogger.error("Experiments::getActiveExperimentId() - should not have more than 1 active experiment"); + this._log.error("Experiments::getActiveExperimentId() - should not have more than 1 active experiment"); throw new Error("have more than 1 active experiment"); } @@ -838,7 +842,7 @@ Experiments.Experiments.prototype = { * @return Promise<> Promise that will get resolved once the task is done or failed. */ disableExperiment: function (userDisabled=true) { - gLogger.trace("Experiments::disableExperiment()"); + this._log.trace("Experiments::disableExperiment()"); this._terminateReason = userDisabled ? TELEMETRY_LOG.TERMINATION.USERDISABLED : TELEMETRY_LOG.TERMINATION.FROM_API; return this._run(); @@ -849,7 +853,7 @@ Experiments.Experiments.prototype = { * experiment if needed and activate the first applicable candidate. */ _evaluateExperiments: function*() { - gLogger.trace("Experiments::_evaluateExperiments"); + this._log.trace("Experiments::_evaluateExperiments"); this._checkForShutdown(); @@ -871,8 +875,8 @@ Experiments.Experiments.prototype = { let expectedAddonIds = new Set([e._addonId for ([,e] of this._experiments)]); let unknownAddons = [a for (a of installedExperiments) if (!expectedAddonIds.has(a.id))]; if (unknownAddons.length) { - gLogger.warn("Experiments::_evaluateExperiments() - unknown add-ons in AddonManager: " + - [a.id for (a of unknownAddons)].join(", ")); + this._log.warn("Experiments::_evaluateExperiments() - unknown add-ons in AddonManager: " + + [a.id for (a of unknownAddons)].join(", ")); yield uninstallAddons(unknownAddons); } @@ -893,18 +897,18 @@ Experiments.Experiments.prototype = { } if (wasStopped) { this._dirty = true; - gLogger.debug("Experiments::evaluateExperiments() - stopped experiment " + this._log.debug("Experiments::evaluateExperiments() - stopped experiment " + activeExperiment.id); activeExperiment = null; activeChanged = true; } else if (activeExperiment.needsUpdate) { - gLogger.debug("Experiments::evaluateExperiments() - updating experiment " + this._log.debug("Experiments::evaluateExperiments() - updating experiment " + activeExperiment.id); try { yield activeExperiment.stop(); yield activeExperiment.start(); } catch (e) { - gLogger.error(e); + this._log.error(e); // On failure try the next experiment. activeExperiment = null; } @@ -938,7 +942,7 @@ Experiments.Experiments.prototype = { } if (applicable) { - gLogger.debug("Experiments::evaluateExperiments() - activating experiment " + id); + this._log.debug("Experiments::evaluateExperiments() - activating experiment " + id); try { yield experiment.start(); activeChanged = true; @@ -996,7 +1000,7 @@ Experiments.Experiments.prototype = { return; } - gLogger.trace("Experiments::scheduleExperimentEvaluation() - scheduling for "+time+", now: "+now); + this._log.trace("Experiments::scheduleExperimentEvaluation() - scheduling for "+time+", now: "+now); this._policy.oneshotTimer(this.notify, time - now, this, "_timer"); }, }; @@ -1008,6 +1012,7 @@ Experiments.Experiments.prototype = { Experiments.ExperimentEntry = function (policy) { this._policy = policy || new Experiments.Policy(); + this._log = policy._log; // Is this experiment running? this._enabled = false; @@ -1140,7 +1145,7 @@ Experiments.ExperimentEntry.prototype = { initFromCacheData: function (data) { for (let key of this.SERIALIZE_KEYS) { if (!(key in data) && !this.DATE_KEYS.has(key)) { - gLogger.error("ExperimentEntry::initFromCacheData() - missing required key " + key); + this._log.error("ExperimentEntry::initFromCacheData() - missing required key " + key); return false; } }; @@ -1247,9 +1252,9 @@ Experiments.ExperimentEntry.prototype = { let maxActive = data.maxActiveSeconds || 0; let startSec = (this.startDate || 0) / 1000; - gLogger.trace("ExperimentEntry::isApplicable() - now=" + now - + ", randomValue=" + this._randomValue - + ", data=" + JSON.stringify(this._manifestData)); + this._log.trace("ExperimentEntry::isApplicable() - now=" + now + + ", randomValue=" + this._randomValue + + ", data=" + JSON.stringify(this._manifestData)); // Not applicable if it already ran. @@ -1301,8 +1306,8 @@ Experiments.ExperimentEntry.prototype = { for (let check of simpleChecks) { let result = check.condition(); if (!result) { - gLogger.debug("ExperimentEntry::isApplicable() - id=" - + data.id + " - test '" + check.name + "' failed"); + this._log.debug("ExperimentEntry::isApplicable() - id=" + + data.id + " - test '" + check.name + "' failed"); return Promise.reject([check.name]); } } @@ -1319,7 +1324,7 @@ Experiments.ExperimentEntry.prototype = { * result (forced to boolean). */ _runFilterFunction: function (jsfilter) { - gLogger.trace("ExperimentEntry::runFilterFunction() - filter: " + jsfilter); + this._log.trace("ExperimentEntry::runFilterFunction() - filter: " + jsfilter); return Task.spawn(function ExperimentEntry_runFilterFunction_task() { const nullprincipal = Cc["@mozilla.org/nullprincipal;1"].createInstance(Ci.nsIPrincipal); @@ -1336,7 +1341,7 @@ Experiments.ExperimentEntry.prototype = { try { Cu.evalInSandbox(jsfilter, sandbox); } catch (e) { - gLogger.error("ExperimentEntry::runFilterFunction() - failed to eval jsfilter: " + e.message); + this._log.error("ExperimentEntry::runFilterFunction() - failed to eval jsfilter: " + e.message); throw ["jsfilter-evalfailed"]; } @@ -1351,7 +1356,7 @@ Experiments.ExperimentEntry.prototype = { result = !!Cu.evalInSandbox("filter({healthReportPayload: JSON.parse(_hr), telemetryPayload: JSON.parse(_t)})", sandbox); } catch (e) { - gLogger.debug("ExperimentEntry::runFilterFunction() - filter function failed: " + this._log.debug("ExperimentEntry::runFilterFunction() - filter function failed: " + e.message + ", " + e.stack); throw ["jsfilter-threw", e.message]; } @@ -1372,13 +1377,13 @@ Experiments.ExperimentEntry.prototype = { * @return Promise<> Resolved when the operation is complete. */ start: function () { - gLogger.trace("ExperimentEntry::start() for " + this.id); + this._log.trace("ExperimentEntry::start() for " + this.id); return Task.spawn(function* ExperimentEntry_start_task() { let addons = yield installedExperimentAddons(); if (addons.length > 0) { - gLogger.error("ExperimentEntry::start() - there are already " - + addons.length + " experiment addons installed"); + this._log.error("ExperimentEntry::start() - there are already " + + addons.length + " experiment addons installed"); yield uninstallAddons(addons); } @@ -1395,7 +1400,7 @@ Experiments.ExperimentEntry.prototype = { let failureHandler = (install, handler) => { let message = "AddonInstall " + handler + " for " + this.id + ", state=" + (install.state || "?") + ", error=" + install.error; - gLogger.error("ExperimentEntry::_installAddon() - " + message); + this._log.error("ExperimentEntry::_installAddon() - " + message); this._failedStart = true; TelemetryLog.log(TELEMETRY_LOG.ACTIVATION_KEY, @@ -1406,27 +1411,27 @@ Experiments.ExperimentEntry.prototype = { let listener = { onDownloadEnded: install => { - gLogger.trace("ExperimentEntry::_installAddon() - onDownloadEnded for " + this.id); + this._log.trace("ExperimentEntry::_installAddon() - onDownloadEnded for " + this.id); if (install.existingAddon) { - gLogger.warn("ExperimentEntry::_installAddon() - onDownloadEnded, addon already installed"); + this._log.warn("ExperimentEntry::_installAddon() - onDownloadEnded, addon already installed"); } if (install.addon.type !== "experiment") { - gLogger.error("ExperimentEntry::_installAddon() - onDownloadEnded, wrong addon type"); + this._log.error("ExperimentEntry::_installAddon() - onDownloadEnded, wrong addon type"); install.cancel(); } }, onInstallStarted: install => { - gLogger.trace("ExperimentEntry::_installAddon() - onInstallStarted for " + this.id); + this._log.trace("ExperimentEntry::_installAddon() - onInstallStarted for " + this.id); if (install.existingAddon) { - gLogger.warn("ExperimentEntry::_installAddon() - onInstallStarted, addon already installed"); + this._log.warn("ExperimentEntry::_installAddon() - onInstallStarted, addon already installed"); } if (install.addon.type !== "experiment") { - gLogger.error("ExperimentEntry::_installAddon() - onInstallStarted, wrong addon type"); + this._log.error("ExperimentEntry::_installAddon() - onInstallStarted, wrong addon type"); return false; } @@ -1435,7 +1440,7 @@ Experiments.ExperimentEntry.prototype = { }, onInstallEnded: install => { - gLogger.trace("ExperimentEntry::_installAddon() - install ended for " + this.id); + this._log.trace("ExperimentEntry::_installAddon() - install ended for " + this.id); this._lastChangedDate = this._policy.now(); this._startDate = this._policy.now(); this._enabled = true; @@ -1472,9 +1477,9 @@ Experiments.ExperimentEntry.prototype = { * @return Promise<> Resolved when the operation is complete. */ stop: function (terminationKind, terminationReason) { - gLogger.trace("ExperimentEntry::stop() - id=" + this.id + ", terminationKind=" + terminationKind); + this._log.trace("ExperimentEntry::stop() - id=" + this.id + ", terminationKind=" + terminationKind); if (!this._enabled) { - gLogger.warning("ExperimentEntry::stop() - experiment not enabled: " + id); + this._log.warning("ExperimentEntry::stop() - experiment not enabled: " + id); return Promise.reject(); } @@ -1489,7 +1494,7 @@ Experiments.ExperimentEntry.prototype = { AddonManager.getAddonByID(this._addonId, addon => { if (!addon) { let message = "could not get Addon for " + this.id; - gLogger.warn("ExperimentEntry::stop() - " + message); + this._log.warn("ExperimentEntry::stop() - " + message); updateDates(); deferred.resolve(); return; @@ -1509,7 +1514,7 @@ Experiments.ExperimentEntry.prototype = { } if (!(terminationKind in TELEMETRY_LOG.TERMINATION)) { - gLogger.warn("ExperimentEntry::stop() - unknown terminationKind " + terminationKind); + this._log.warn("ExperimentEntry::stop() - unknown terminationKind " + terminationKind); return; } @@ -1527,7 +1532,7 @@ Experiments.ExperimentEntry.prototype = { * the value indicates whether it was stopped. */ maybeStop: function () { - gLogger.trace("ExperimentEntry::maybeStop()"); + this._log.trace("ExperimentEntry::maybeStop()"); return Task.spawn(function ExperimentEntry_maybeStop_task() { let result = yield this._shouldStop(); @@ -1594,11 +1599,11 @@ Experiments.ExperimentEntry.prototype = { * Perform sanity checks on the experiment data. */ _isManifestDataValid: function (data) { - gLogger.trace("ExperimentEntry::isManifestDataValid() - data: " + JSON.stringify(data)); + this._log.trace("ExperimentEntry::isManifestDataValid() - data: " + JSON.stringify(data)); for (let key of this.MANIFEST_REQUIRED_FIELDS) { if (!(key in data)) { - gLogger.error("ExperimentEntry::isManifestDataValid() - missing required key: " + key); + this._log.error("ExperimentEntry::isManifestDataValid() - missing required key: " + key); return false; } } @@ -1606,7 +1611,7 @@ Experiments.ExperimentEntry.prototype = { for (let key in data) { if (!this.MANIFEST_OPTIONAL_FIELDS.has(key) && !this.MANIFEST_REQUIRED_FIELDS.has(key)) { - gLogger.error("ExperimentEntry::isManifestDataValid() - unknown key: " + key); + this._log.error("ExperimentEntry::isManifestDataValid() - unknown key: " + key); return false; } } From 5b230fc390cf2ae61295b1003fc4b16148c01e3e Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Fri, 28 Mar 2014 11:36:37 -0700 Subject: [PATCH 13/19] Bug 989137 - Part 3: Log.jsm API to get a Logger that prefixes messages; r=bsmedberg A common pattern for logging is to have multiple loggers for multiple underlying object instances. You often want to have each instance attach some identifying metdata contained in each logged message. This patch provides an API to facilitate that. --HG-- extra : rebase_source : 5816e0671c78f55cca45bdd1aed52c85695945c4 --- toolkit/modules/Log.jsm | 63 +++++++++++++++++++++- toolkit/modules/Sqlite.jsm | 24 +-------- toolkit/modules/tests/xpcshell/test_Log.js | 20 +++++++ 3 files changed, 83 insertions(+), 24 deletions(-) diff --git a/toolkit/modules/Log.jsm b/toolkit/modules/Log.jsm index b8aecb38e024..cddd3103cde1 100644 --- a/toolkit/modules/Log.jsm +++ b/toolkit/modules/Log.jsm @@ -69,6 +69,7 @@ this.Log = { Formatter: Formatter, BasicFormatter: BasicFormatter, + MessageOnlyFormatter: MessageOnlyFormatter, StructuredFormatter: StructuredFormatter, Appender: Appender, @@ -359,13 +360,58 @@ LoggerRepository.prototype = { } }, - getLogger: function LogRep_getLogger(name) { + /** + * Obtain a named Logger. + * + * The returned Logger instance for a particular name is shared among + * all callers. In other words, if two consumers call getLogger("foo"), + * they will both have a reference to the same object. + * + * @return Logger + */ + getLogger: function (name) { if (name in this._loggers) return this._loggers[name]; this._loggers[name] = new Logger(name, this); this._updateParents(name); return this._loggers[name]; - } + }, + + /** + * Obtain a Logger that logs all string messages with a prefix. + * + * A common pattern is to have separate Logger instances for each instance + * of an object. But, you still want to distinguish between each instance. + * Since Log.repository.getLogger() returns shared Logger objects, + * monkeypatching one Logger modifies them all. + * + * This function returns a new object with a prototype chain that chains + * up to the original Logger instance. The new prototype has log functions + * that prefix content to each message. + * + * @param name + * (string) The Logger to retrieve. + * @param prefix + * (string) The string to prefix each logged message with. + */ + getLoggerWithMessagePrefix: function (name, prefix) { + let log = this.getLogger(name); + + let proxy = {__proto__: log}; + + for (let level in Log.Level) { + if (level == "Desc") { + continue; + } + + let lc = level.toLowerCase(); + proxy[lc] = function (msg, ...args) { + return log[lc].apply(log, [prefix + msg, ...args]); + }; + } + + return proxy; + }, }; /* @@ -396,6 +442,19 @@ BasicFormatter.prototype = { } }; +/** + * A formatter that only formats the string message component. + */ +function MessageOnlyFormatter() { +} +MessageOnlyFormatter.prototype = Object.freeze({ + __proto__: Formatter.prototype, + + format: function (message) { + return message.message + "\n"; + }, +}); + // Structured formatter that outputs JSON based on message data. // This formatter will format unstructured messages by supplying // default values. diff --git a/toolkit/modules/Sqlite.jsm b/toolkit/modules/Sqlite.jsm index bafc61091e2b..9808118383a2 100644 --- a/toolkit/modules/Sqlite.jsm +++ b/toolkit/modules/Sqlite.jsm @@ -173,28 +173,8 @@ function openConnection(options) { * `openConnection`. */ function OpenedConnection(connection, basename, number, options) { - let log = Log.repository.getLogger("Sqlite.Connection." + basename); - - // getLogger() returns a shared object. We can't modify the functions on this - // object since they would have effect on all instances and last write would - // win. So, we create a "proxy" object with our custom functions. Everything - // else is proxied back to the shared logger instance via prototype - // inheritance. - let logProxy = {__proto__: log}; - - // Automatically prefix all log messages with the identifier. - for (let level in Log.Level) { - if (level == "Desc") { - continue; - } - - let lc = level.toLowerCase(); - logProxy[lc] = function (msg) { - return log[lc].call(log, "Conn #" + number + ": " + msg); - }; - } - - this._log = logProxy; + this._log = Log.repository.getLoggerWithMessagePrefix("Sqlite.Connection." + basename, + "Conn #" + number + ": "); this._log.info("Opened"); diff --git a/toolkit/modules/tests/xpcshell/test_Log.js b/toolkit/modules/tests/xpcshell/test_Log.js index 4c94b7fc00d3..0e4f2690946c 100644 --- a/toolkit/modules/tests/xpcshell/test_Log.js +++ b/toolkit/modules/tests/xpcshell/test_Log.js @@ -72,6 +72,26 @@ add_test(function test_Logger_parent() { run_next_test(); }); +add_test(function test_LoggerWithMessagePrefix() { + let log = Log.repository.getLogger("test.logger.prefix"); + let appender = new MockAppender(new Log.MessageOnlyFormatter()); + log.addAppender(appender); + + let prefixed = Log.repository.getLoggerWithMessagePrefix( + "test.logger.prefix", "prefix: "); + + log.warn("no prefix"); + prefixed.warn("with prefix"); + + Assert.equal(appender.messages.length, 2, "2 messages were logged."); + Assert.deepEqual(appender.messages, [ + "no prefix\n", + "prefix: with prefix\n", + ], "Prefix logger works."); + + run_next_test(); +}); + // A utility method for checking object equivalence. // Fields with a reqular expression value in expected will be tested // against the corresponding value in actual. Otherwise objects From 6752ec750c610ab4fea0e52bd7e20271e875c124 Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Fri, 28 Mar 2014 12:57:43 -0700 Subject: [PATCH 14/19] Bug 989137 - Part 4: Use a prefixing logger for Experiments logging; r=gfritzsche Logging in the Experiments module were using a common pattern of prefixing all messages with the type. We move this prefixing into a prefixed logger. --HG-- extra : rebase_source : 213a99e93a3569a7f2ab3d72fb37dc0c538e5c97 extra : source : 96def94c8fb705e5ad8af5a1393492a28ea47d16 --- browser/experiments/Experiments.jsm | 133 ++++++++++++++-------------- 1 file changed, 68 insertions(+), 65 deletions(-) diff --git a/browser/experiments/Experiments.jsm b/browser/experiments/Experiments.jsm index b699119bf353..7f8ac0540162 100644 --- a/browser/experiments/Experiments.jsm +++ b/browser/experiments/Experiments.jsm @@ -236,7 +236,8 @@ let Experiments = { */ Experiments.Policy = function () { - this._log = Log.repository.getLogger("Browser.Experiments.Policy"); + this._log = Log.repository.getLoggerWithMessagePrefix( + "Browser.Experiments.Policy", "Experiments::Policy::"); }; Experiments.Policy.prototype = { @@ -248,7 +249,7 @@ Experiments.Policy.prototype = { let pref = gPrefs.get(PREF_FORCE_SAMPLE); if (pref !== undefined) { let val = Number.parseFloat(pref); - this._log.debug("Experiments::Policy::random sample forced: " + val); + this._log.debug("random sample forced: " + val); if (IsNaN(val) || val < 0) { return 0; } @@ -302,7 +303,8 @@ Experiments.Policy.prototype = { */ Experiments.Experiments = function (policy=new Experiments.Policy()) { - this._log = Log.repository.getLogger("Browser.Experiments.Experiments"); + this._log = Log.repository.getLoggerWithMessagePrefix( + "Browser.Experiments.Experiments", "Experiments::"); this._policy = policy; @@ -360,12 +362,12 @@ Experiments.Experiments.prototype = { this._loadTask = Task.spawn(this._loadFromCache.bind(this)); this._loadTask.then( () => { - this._log.trace("Experiments::_loadTask finished ok"); + this._log.trace("_loadTask finished ok"); this._loadTask = null; this._run(); }, (e) => { - this._log.error("Experiments::_loadFromCache caught error: " + e); + this._log.error("_loadFromCache caught error: " + e); } ); }, @@ -417,12 +419,12 @@ Experiments.Experiments.prototype = { * Toggle whether the experiments feature is enabled or not. */ set enabled(enabled) { - this._log.trace("Experiments::set enabled(" + enabled + ")"); + this._log.trace("set enabled(" + enabled + ")"); gPrefs.set(PREF_ENABLED, enabled); }, _toggleExperimentsEnabled: function (enabled) { - this._log.trace("Experiments::_toggleExperimentsEnabled(" + enabled + ")"); + this._log.trace("_toggleExperimentsEnabled(" + enabled + ")"); let wasEnabled = gExperimentsEnabled; gExperimentsEnabled = enabled && telemetryEnabled(); @@ -528,18 +530,18 @@ Experiments.Experiments.prototype = { }, _run: function() { - this._log.trace("Experiments::_run"); + this._log.trace("_run"); this._checkForShutdown(); if (!this._mainTask) { this._mainTask = Task.spawn(this._main.bind(this)); this._mainTask.then( () => { - this._log.trace("Experiments::_main finished, scheduling next run"); + this._log.trace("_main finished, scheduling next run"); this._mainTask = null; this._scheduleNextRun(); }, (e) => { - this._log.error("Experiments::_main caught error: " + e); + this._log.error("_main caught error: " + e); this._mainTask = null; } ); @@ -549,7 +551,7 @@ Experiments.Experiments.prototype = { _main: function*() { do { - this._log.trace("Experiments::_main iteration"); + this._log.trace("_main iteration"); yield this._loadTask; if (this._refresh) { yield this._loadManifest(); @@ -565,7 +567,7 @@ Experiments.Experiments.prototype = { }, _loadManifest: function*() { - this._log.trace("Experiments::_loadManifest"); + this._log.trace("_loadManifest"); let uri = Services.urlFormatter.formatURLPref(PREF_BRANCH + PREF_MANIFEST_URI); this._checkForShutdown(); @@ -573,7 +575,7 @@ Experiments.Experiments.prototype = { this._refresh = false; try { let responseText = yield this._httpGetRequest(uri); - this._log.trace("Experiments::_loadManifest() - responseText=\"" + responseText + "\""); + this._log.trace("_loadManifest() - responseText=\"" + responseText + "\""); if (this._shutdown) { return; @@ -582,7 +584,7 @@ Experiments.Experiments.prototype = { let data = JSON.parse(responseText); this._updateExperiments(data); } catch (e) { - this._log.error("Experiments::_loadManifest - failure to fetch/parse manifest (continuing anyway): " + e); + this._log.error("_loadManifest - failure to fetch/parse manifest (continuing anyway): " + e); } }, @@ -594,7 +596,7 @@ Experiments.Experiments.prototype = { * The promise is resolved when the manifest and experiment list is updated. */ updateManifest: function () { - this._log.trace("Experiments::updateManifest()"); + this._log.trace("updateManifest()"); if (!gExperimentsEnabled) { return Promise.reject(new Error("experiments are disabled")); @@ -609,7 +611,7 @@ Experiments.Experiments.prototype = { }, notify: function (timer) { - this._log.trace("Experiments::notify()"); + this._log.trace("notify()"); this._checkForShutdown(); return this._run(); }, @@ -617,7 +619,7 @@ Experiments.Experiments.prototype = { // START OF ADD-ON LISTENERS onDisabled: function (addon) { - this._log.trace("Experiments::onDisabled() - addon id: " + addon.id); + this._log.trace("onDisabled() - addon id: " + addon.id); if (addon.id == this._pendingUninstall) { return; } @@ -629,9 +631,9 @@ Experiments.Experiments.prototype = { }, onUninstalled: function (addon) { - this._log.trace("Experiments::onUninstalled() - addon id: " + addon.id); + this._log.trace("onUninstalled() - addon id: " + addon.id); if (addon.id == this._pendingUninstall) { - this._log.trace("onUninstalled: matches pending uninstall"); + this._log.trace("matches pending uninstall"); return; } let activeExperiment = this._getActiveExperiment(); @@ -658,12 +660,12 @@ Experiments.Experiments.prototype = { * the responseText when the request is complete. */ _httpGetRequest: function (url) { - this._log.trace("Experiments::httpGetRequest(" + url + ")"); + this._log.trace("httpGetRequest(" + url + ")"); let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest); try { xhr.open("GET", url); } catch (e) { - this._log.error("Experiments::httpGetRequest() - Error opening request to " + url + ": " + e); + this._log.error("httpGetRequest() - Error opening request to " + url + ": " + e); return Promise.reject(new Error("Experiments - Error opening XHR for " + url)); } @@ -671,13 +673,13 @@ Experiments.Experiments.prototype = { let log = this._log; xhr.onerror = function (e) { - log.error("Experiments::httpGetRequest::onError() - Error making request to " + url + ": " + e.error); + log.error("httpGetRequest::onError() - Error making request to " + url + ": " + e.error); deferred.reject(new Error("Experiments - XHR error for " + url + " - " + e.error)); }; xhr.onload = function (event) { if (xhr.status !== 200 && xhr.state !== 0) { - log.error("Experiments::httpGetRequest::onLoad() - Request to " + url + " returned status " + xhr.status); + log.error("httpGetRequest::onLoad() - Request to " + url + " returned status " + xhr.status); deferred.reject(new Error("Experiments - XHR status for " + url + " is " + xhr.status)); return; } @@ -691,7 +693,7 @@ Experiments.Experiments.prototype = { CertUtils.checkCert(xhr.channel, allowNonBuiltin, certs); } catch (e) { - log.error("Experiments: manifest fetch failed certificate checks", [e]); + log.error("manifest fetch failed certificate checks", [e]); deferred.reject(new Error("Experiments - manifest fetch failed certificate checks: " + e)); return; } @@ -718,7 +720,7 @@ Experiments.Experiments.prototype = { * Part of the main task to save the cache to disk, called from _main. */ _saveToCache: function* () { - this._log.trace("Experiments::_saveToCache"); + this._log.trace("_saveToCache"); let path = this._cacheFilePath; let textData = JSON.stringify({ version: CACHE_VERSION, @@ -730,14 +732,14 @@ Experiments.Experiments.prototype = { let options = { tmpPath: path + ".tmp", compression: "lz4" }; yield OS.File.writeAtomic(path, data, options); this._dirty = false; - this._log.debug("Experiments._saveToCache saved to " + path); + this._log.debug("_saveToCache saved to " + path); }, /* * Task function, load the cached experiments manifest file from disk. */ _loadFromCache: function*() { - this._log.trace("Experiments::_loadFromCache"); + this._log.trace("_loadFromCache"); let path = this._cacheFilePath; try { let result = yield loadJSONAsync(path, { compression: "lz4" }); @@ -749,7 +751,7 @@ Experiments.Experiments.prototype = { }, _populateFromCache: function (data) { - this._log.trace("Experiments::populateFromCache() - data: " + JSON.stringify(data)); + this._log.trace("populateFromCache() - data: " + JSON.stringify(data)); // If the user has a newer cache version than we can understand, we fail // hard; no experiments should be active in this older client. @@ -774,10 +776,10 @@ Experiments.Experiments.prototype = { * array in the manifest */ _updateExperiments: function (manifestObject) { - this._log.trace("Experiments::_updateExperiments() - experiments: " + JSON.stringify(manifestObject)); + this._log.trace("_updateExperiments() - experiments: " + JSON.stringify(manifestObject)); if (manifestObject.version !== MANIFEST_VERSION) { - this._log.warning("Experiments::updateExperiments() - unsupported version " + manifestObject.version); + this._log.warning("updateExperiments() - unsupported version " + manifestObject.version); } let experiments = new Map(); // The new experiments map @@ -788,7 +790,7 @@ Experiments.Experiments.prototype = { if (entry) { if (!entry.updateFromManifestData(data)) { - this._log.error("Experiments::updateExperiments() - Invalid manifest data for " + data.id); + this._log.error("updateExperiments() - Invalid manifest data for " + data.id); continue; } } else { @@ -809,7 +811,7 @@ Experiments.Experiments.prototype = { // We remove them after KEEP_HISTORY_N_DAYS. for (let [id, entry] of this._experiments) { if (experiments.has(id) || !entry.startDate || entry.shouldDiscard()) { - this._log.trace("Experiments::updateExperiments() - discarding entry for " + id); + this._log.trace("updateExperiments() - discarding entry for " + id); continue; } @@ -828,7 +830,7 @@ Experiments.Experiments.prototype = { } if (enabled.length > 1) { - this._log.error("Experiments::getActiveExperimentId() - should not have more than 1 active experiment"); + this._log.error("getActiveExperimentId() - should not have more than 1 active experiment"); throw new Error("have more than 1 active experiment"); } @@ -842,7 +844,7 @@ Experiments.Experiments.prototype = { * @return Promise<> Promise that will get resolved once the task is done or failed. */ disableExperiment: function (userDisabled=true) { - this._log.trace("Experiments::disableExperiment()"); + this._log.trace("disableExperiment()"); this._terminateReason = userDisabled ? TELEMETRY_LOG.TERMINATION.USERDISABLED : TELEMETRY_LOG.TERMINATION.FROM_API; return this._run(); @@ -853,7 +855,7 @@ Experiments.Experiments.prototype = { * experiment if needed and activate the first applicable candidate. */ _evaluateExperiments: function*() { - this._log.trace("Experiments::_evaluateExperiments"); + this._log.trace("_evaluateExperiments"); this._checkForShutdown(); @@ -875,7 +877,7 @@ Experiments.Experiments.prototype = { let expectedAddonIds = new Set([e._addonId for ([,e] of this._experiments)]); let unknownAddons = [a for (a of installedExperiments) if (!expectedAddonIds.has(a.id))]; if (unknownAddons.length) { - this._log.warn("Experiments::_evaluateExperiments() - unknown add-ons in AddonManager: " + + this._log.warn("_evaluateExperiments() - unknown add-ons in AddonManager: " + [a.id for (a of unknownAddons)].join(", ")); yield uninstallAddons(unknownAddons); @@ -897,12 +899,12 @@ Experiments.Experiments.prototype = { } if (wasStopped) { this._dirty = true; - this._log.debug("Experiments::evaluateExperiments() - stopped experiment " + this._log.debug("evaluateExperiments() - stopped experiment " + activeExperiment.id); activeExperiment = null; activeChanged = true; } else if (activeExperiment.needsUpdate) { - this._log.debug("Experiments::evaluateExperiments() - updating experiment " + this._log.debug("evaluateExperiments() - updating experiment " + activeExperiment.id); try { yield activeExperiment.stop(); @@ -942,7 +944,7 @@ Experiments.Experiments.prototype = { } if (applicable) { - this._log.debug("Experiments::evaluateExperiments() - activating experiment " + id); + this._log.debug("evaluateExperiments() - activating experiment " + id); try { yield experiment.start(); activeChanged = true; @@ -1000,7 +1002,7 @@ Experiments.Experiments.prototype = { return; } - this._log.trace("Experiments::scheduleExperimentEvaluation() - scheduling for "+time+", now: "+now); + this._log.trace("scheduleExperimentEvaluation() - scheduling for "+time+", now: "+now); this._policy.oneshotTimer(this.notify, time - now, this, "_timer"); }, }; @@ -1012,7 +1014,8 @@ Experiments.Experiments.prototype = { Experiments.ExperimentEntry = function (policy) { this._policy = policy || new Experiments.Policy(); - this._log = policy._log; + this._log = Log.repository.getLoggerWithMessagePrefix( + "Browser.Experiments.Experiments", "ExperimentEntry::"); // Is this experiment running? this._enabled = false; @@ -1145,7 +1148,7 @@ Experiments.ExperimentEntry.prototype = { initFromCacheData: function (data) { for (let key of this.SERIALIZE_KEYS) { if (!(key in data) && !this.DATE_KEYS.has(key)) { - this._log.error("ExperimentEntry::initFromCacheData() - missing required key " + key); + this._log.error("initFromCacheData() - missing required key " + key); return false; } }; @@ -1252,7 +1255,7 @@ Experiments.ExperimentEntry.prototype = { let maxActive = data.maxActiveSeconds || 0; let startSec = (this.startDate || 0) / 1000; - this._log.trace("ExperimentEntry::isApplicable() - now=" + now + this._log.trace("isApplicable() - now=" + now + ", randomValue=" + this._randomValue + ", data=" + JSON.stringify(this._manifestData)); @@ -1306,7 +1309,7 @@ Experiments.ExperimentEntry.prototype = { for (let check of simpleChecks) { let result = check.condition(); if (!result) { - this._log.debug("ExperimentEntry::isApplicable() - id=" + this._log.debug("isApplicable() - id=" + data.id + " - test '" + check.name + "' failed"); return Promise.reject([check.name]); } @@ -1324,7 +1327,7 @@ Experiments.ExperimentEntry.prototype = { * result (forced to boolean). */ _runFilterFunction: function (jsfilter) { - this._log.trace("ExperimentEntry::runFilterFunction() - filter: " + jsfilter); + this._log.trace("runFilterFunction() - filter: " + jsfilter); return Task.spawn(function ExperimentEntry_runFilterFunction_task() { const nullprincipal = Cc["@mozilla.org/nullprincipal;1"].createInstance(Ci.nsIPrincipal); @@ -1341,7 +1344,7 @@ Experiments.ExperimentEntry.prototype = { try { Cu.evalInSandbox(jsfilter, sandbox); } catch (e) { - this._log.error("ExperimentEntry::runFilterFunction() - failed to eval jsfilter: " + e.message); + this._log.error("runFilterFunction() - failed to eval jsfilter: " + e.message); throw ["jsfilter-evalfailed"]; } @@ -1356,7 +1359,7 @@ Experiments.ExperimentEntry.prototype = { result = !!Cu.evalInSandbox("filter({healthReportPayload: JSON.parse(_hr), telemetryPayload: JSON.parse(_t)})", sandbox); } catch (e) { - this._log.debug("ExperimentEntry::runFilterFunction() - filter function failed: " + this._log.debug("runFilterFunction() - filter function failed: " + e.message + ", " + e.stack); throw ["jsfilter-threw", e.message]; } @@ -1377,12 +1380,12 @@ Experiments.ExperimentEntry.prototype = { * @return Promise<> Resolved when the operation is complete. */ start: function () { - this._log.trace("ExperimentEntry::start() for " + this.id); + this._log.trace("start() for " + this.id); return Task.spawn(function* ExperimentEntry_start_task() { let addons = yield installedExperimentAddons(); if (addons.length > 0) { - this._log.error("ExperimentEntry::start() - there are already " + this._log.error("start() - there are already " + addons.length + " experiment addons installed"); yield uninstallAddons(addons); } @@ -1400,7 +1403,7 @@ Experiments.ExperimentEntry.prototype = { let failureHandler = (install, handler) => { let message = "AddonInstall " + handler + " for " + this.id + ", state=" + (install.state || "?") + ", error=" + install.error; - this._log.error("ExperimentEntry::_installAddon() - " + message); + this._log.error("_installAddon() - " + message); this._failedStart = true; TelemetryLog.log(TELEMETRY_LOG.ACTIVATION_KEY, @@ -1411,27 +1414,27 @@ Experiments.ExperimentEntry.prototype = { let listener = { onDownloadEnded: install => { - this._log.trace("ExperimentEntry::_installAddon() - onDownloadEnded for " + this.id); + this._log.trace("_installAddon() - onDownloadEnded for " + this.id); if (install.existingAddon) { - this._log.warn("ExperimentEntry::_installAddon() - onDownloadEnded, addon already installed"); + this._log.warn("_installAddon() - onDownloadEnded, addon already installed"); } if (install.addon.type !== "experiment") { - this._log.error("ExperimentEntry::_installAddon() - onDownloadEnded, wrong addon type"); + this._log.error("_installAddon() - onDownloadEnded, wrong addon type"); install.cancel(); } }, onInstallStarted: install => { - this._log.trace("ExperimentEntry::_installAddon() - onInstallStarted for " + this.id); + this._log.trace("_installAddon() - onInstallStarted for " + this.id); if (install.existingAddon) { - this._log.warn("ExperimentEntry::_installAddon() - onInstallStarted, addon already installed"); + this._log.warn("_installAddon() - onInstallStarted, addon already installed"); } if (install.addon.type !== "experiment") { - this._log.error("ExperimentEntry::_installAddon() - onInstallStarted, wrong addon type"); + this._log.error("_installAddon() - onInstallStarted, wrong addon type"); return false; } @@ -1440,7 +1443,7 @@ Experiments.ExperimentEntry.prototype = { }, onInstallEnded: install => { - this._log.trace("ExperimentEntry::_installAddon() - install ended for " + this.id); + this._log.trace("_installAddon() - install ended for " + this.id); this._lastChangedDate = this._policy.now(); this._startDate = this._policy.now(); this._enabled = true; @@ -1477,9 +1480,9 @@ Experiments.ExperimentEntry.prototype = { * @return Promise<> Resolved when the operation is complete. */ stop: function (terminationKind, terminationReason) { - this._log.trace("ExperimentEntry::stop() - id=" + this.id + ", terminationKind=" + terminationKind); + this._log.trace("stop() - id=" + this.id + ", terminationKind=" + terminationKind); if (!this._enabled) { - this._log.warning("ExperimentEntry::stop() - experiment not enabled: " + id); + this._log.warning("stop() - experiment not enabled: " + id); return Promise.reject(); } @@ -1494,7 +1497,7 @@ Experiments.ExperimentEntry.prototype = { AddonManager.getAddonByID(this._addonId, addon => { if (!addon) { let message = "could not get Addon for " + this.id; - this._log.warn("ExperimentEntry::stop() - " + message); + this._log.warn("stop() - " + message); updateDates(); deferred.resolve(); return; @@ -1514,7 +1517,7 @@ Experiments.ExperimentEntry.prototype = { } if (!(terminationKind in TELEMETRY_LOG.TERMINATION)) { - this._log.warn("ExperimentEntry::stop() - unknown terminationKind " + terminationKind); + this._log.warn("stop() - unknown terminationKind " + terminationKind); return; } @@ -1532,7 +1535,7 @@ Experiments.ExperimentEntry.prototype = { * the value indicates whether it was stopped. */ maybeStop: function () { - this._log.trace("ExperimentEntry::maybeStop()"); + this._log.trace("maybeStop()"); return Task.spawn(function ExperimentEntry_maybeStop_task() { let result = yield this._shouldStop(); @@ -1599,11 +1602,11 @@ Experiments.ExperimentEntry.prototype = { * Perform sanity checks on the experiment data. */ _isManifestDataValid: function (data) { - this._log.trace("ExperimentEntry::isManifestDataValid() - data: " + JSON.stringify(data)); + this._log.trace("isManifestDataValid() - data: " + JSON.stringify(data)); for (let key of this.MANIFEST_REQUIRED_FIELDS) { if (!(key in data)) { - this._log.error("ExperimentEntry::isManifestDataValid() - missing required key: " + key); + this._log.error("isManifestDataValid() - missing required key: " + key); return false; } } @@ -1611,7 +1614,7 @@ Experiments.ExperimentEntry.prototype = { for (let key in data) { if (!this.MANIFEST_OPTIONAL_FIELDS.has(key) && !this.MANIFEST_REQUIRED_FIELDS.has(key)) { - this._log.error("ExperimentEntry::isManifestDataValid() - unknown key: " + key); + this._log.error("isManifestDataValid() - unknown key: " + key); return false; } } From d5f21696c489b62cff63d90b6017ec75de84bfbc Mon Sep 17 00:00:00 2001 From: Gregory Szorc Date: Fri, 28 Mar 2014 13:04:09 -0700 Subject: [PATCH 15/19] Bug 989137 - Part 5: Prefix each log message with the instance of the object; r=gfritzsche We now maintain per-type counts/IDs of each Policy, Experiments, and ExperimentEntry. The log events for each type are prefixed with the count/ID so one can easily attribute events to specific instances. --HG-- extra : rebase_source : 4f1fcc38e5f52ff38b90f9ce71e332492983ff37 --- browser/experiments/Experiments.jsm | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/browser/experiments/Experiments.jsm b/browser/experiments/Experiments.jsm index 7f8ac0540162..15a092bba018 100644 --- a/browser/experiments/Experiments.jsm +++ b/browser/experiments/Experiments.jsm @@ -95,6 +95,9 @@ const gPrefsTelemetry = new Preferences(PREF_BRANCH_TELEMETRY); let gExperimentsEnabled = false; let gExperiments = null; let gLogAppenderDump = null; +let gPolicyCounter = 0; +let gExperimentsCounter = 0; +let gExperimentEntryCounter = 0; let gLogger; let gLogDumping = false; @@ -237,7 +240,8 @@ let Experiments = { Experiments.Policy = function () { this._log = Log.repository.getLoggerWithMessagePrefix( - "Browser.Experiments.Policy", "Experiments::Policy::"); + "Browser.Experiments.Policy", + "Policy #" + gPolicyCounter++ + "::"); }; Experiments.Policy.prototype = { @@ -304,7 +308,8 @@ Experiments.Policy.prototype = { Experiments.Experiments = function (policy=new Experiments.Policy()) { this._log = Log.repository.getLoggerWithMessagePrefix( - "Browser.Experiments.Experiments", "Experiments::"); + "Browser.Experiments.Experiments", + "Experiments #" + gExperimentsCounter++ + "::"); this._policy = policy; @@ -1015,7 +1020,8 @@ Experiments.Experiments.prototype = { Experiments.ExperimentEntry = function (policy) { this._policy = policy || new Experiments.Policy(); this._log = Log.repository.getLoggerWithMessagePrefix( - "Browser.Experiments.Experiments", "ExperimentEntry::"); + "Browser.Experiments.Experiments", + "ExperimentEntry #" + gExperimentEntryCounter++ + "::"); // Is this experiment running? this._enabled = false; From fabe6973a805edd3f8cd6ec2bd23c68a1a02ae13 Mon Sep 17 00:00:00 2001 From: Drew Willcoxon Date: Fri, 28 Mar 2014 23:30:04 -0700 Subject: [PATCH 16/19] Bug 911307 - Reflect changes to top sites immediately in about:newtab (part 1, Places patch). r=mak --- .../downloads/nsDownloadManager.cpp | 16 ++ toolkit/components/places/Database.cpp | 2 + toolkit/components/places/History.cpp | 23 +- toolkit/components/places/SQLFunctions.cpp | 58 ++++++ toolkit/components/places/SQLFunctions.h | 37 ++++ .../places/nsINavHistoryService.idl | 33 ++- toolkit/components/places/nsNavBookmarks.cpp | 18 ++ toolkit/components/places/nsNavHistory.cpp | 196 ++++++++++++++++-- toolkit/components/places/nsNavHistory.h | 23 ++ .../components/places/nsNavHistoryResult.cpp | 36 ++++ .../components/places/nsNavHistoryResult.h | 4 + .../tests/unit/test_frecency_observers.js | 85 ++++++++ .../components/places/tests/unit/xpcshell.ini | 1 + 13 files changed, 509 insertions(+), 23 deletions(-) create mode 100644 toolkit/components/places/tests/unit/test_frecency_observers.js diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/components/downloads/nsDownloadManager.cpp index c9c85db5c508..13508c7402ff 100644 --- a/toolkit/components/downloads/nsDownloadManager.cpp +++ b/toolkit/components/downloads/nsDownloadManager.cpp @@ -2338,6 +2338,22 @@ nsDownloadManager::OnTitleChanged(nsIURI *aURI, return NS_OK; } +NS_IMETHODIMP +nsDownloadManager::OnFrecencyChanged(nsIURI* aURI, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate) +{ + return NS_OK; +} + +NS_IMETHODIMP +nsDownloadManager::OnManyFrecenciesChanged() +{ + return NS_OK; +} + NS_IMETHODIMP nsDownloadManager::OnDeleteURI(nsIURI *aURI, const nsACString& aGUID, diff --git a/toolkit/components/places/Database.cpp b/toolkit/components/places/Database.cpp index b75d97e43b80..0177b3ed7113 100644 --- a/toolkit/components/places/Database.cpp +++ b/toolkit/components/places/Database.cpp @@ -941,6 +941,8 @@ Database::InitFunctions() NS_ENSURE_SUCCESS(rv, rv); rv = FixupURLFunction::create(mMainConn); NS_ENSURE_SUCCESS(rv, rv); + rv = FrecencyNotificationFunction::create(mMainConn); + NS_ENSURE_SUCCESS(rv, rv); return NS_OK; } diff --git a/toolkit/components/places/History.cpp b/toolkit/components/places/History.cpp index 33ea3bde3ce9..3e9d9bf1022a 100644 --- a/toolkit/components/places/History.cpp +++ b/toolkit/components/places/History.cpp @@ -1185,7 +1185,10 @@ private: if (aPlace.placeId) { stmt = mHistory->GetStatement( "UPDATE moz_places " - "SET frecency = CALCULATE_FRECENCY(:page_id) " + "SET frecency = NOTIFY_FRECENCY(" + "CALCULATE_FRECENCY(:page_id), " + "url, guid, hidden, last_visit_date" + ") " "WHERE id = :page_id" ); NS_ENSURE_STATE(stmt); @@ -1195,7 +1198,9 @@ private: else { stmt = mHistory->GetStatement( "UPDATE moz_places " - "SET frecency = CALCULATE_FRECENCY(id) " + "SET frecency = NOTIFY_FRECENCY(" + "CALCULATE_FRECENCY(id), url, guid, hidden, last_visit_date" + ") " "WHERE url = :page_url" ); NS_ENSURE_STATE(stmt); @@ -2037,13 +2042,14 @@ History::InsertPlace(const VisitData& aPlace) NS_ENSURE_SUCCESS(rv, rv); rv = URIBinder::Bind(stmt, NS_LITERAL_CSTRING("url"), aPlace.spec); NS_ENSURE_SUCCESS(rv, rv); + nsString title = aPlace.title; // Empty strings should have no title, just like nsNavHistory::SetPageTitle. - if (aPlace.title.IsEmpty()) { + if (title.IsEmpty()) { rv = stmt->BindNullByName(NS_LITERAL_CSTRING("title")); } else { - rv = stmt->BindStringByName(NS_LITERAL_CSTRING("title"), - StringHead(aPlace.title, TITLE_LENGTH_MAX)); + title.Assign(StringHead(aPlace.title, TITLE_LENGTH_MAX)); + rv = stmt->BindStringByName(NS_LITERAL_CSTRING("title"), title); } NS_ENSURE_SUCCESS(rv, rv); rv = stmt->BindInt32ByName(NS_LITERAL_CSTRING("typed"), aPlace.typed); @@ -2065,6 +2071,13 @@ History::InsertPlace(const VisitData& aPlace) rv = stmt->Execute(); NS_ENSURE_SUCCESS(rv, rv); + // Post an onFrecencyChanged observer notification. + const nsNavHistory* navHistory = nsNavHistory::GetConstHistoryService(); + NS_ENSURE_STATE(navHistory); + navHistory->DispatchFrecencyChangedNotification(aPlace.spec, frecency, guid, + aPlace.hidden, + aPlace.visitTime); + return NS_OK; } diff --git a/toolkit/components/places/SQLFunctions.cpp b/toolkit/components/places/SQLFunctions.cpp index f8fd439db9b1..62ea36c130f7 100644 --- a/toolkit/components/places/SQLFunctions.cpp +++ b/toolkit/components/places/SQLFunctions.cpp @@ -749,5 +749,63 @@ namespace places { return NS_OK; } +//////////////////////////////////////////////////////////////////////////////// +//// Frecency Changed Notification Function + + /* static */ + nsresult + FrecencyNotificationFunction::create(mozIStorageConnection *aDBConn) + { + nsRefPtr function = + new FrecencyNotificationFunction(); + nsresult rv = aDBConn->CreateFunction( + NS_LITERAL_CSTRING("notify_frecency"), 5, function + ); + NS_ENSURE_SUCCESS(rv, rv); + + return NS_OK; + } + + NS_IMPL_ISUPPORTS1( + FrecencyNotificationFunction, + mozIStorageFunction + ) + + NS_IMETHODIMP + FrecencyNotificationFunction::OnFunctionCall(mozIStorageValueArray *aArgs, + nsIVariant **_result) + { + uint32_t numArgs; + nsresult rv = aArgs->GetNumEntries(&numArgs); + NS_ENSURE_SUCCESS(rv, rv); + MOZ_ASSERT(numArgs == 5); + + int32_t newFrecency = aArgs->AsInt32(0); + + nsAutoCString spec; + rv = aArgs->GetUTF8String(1, spec); + NS_ENSURE_SUCCESS(rv, rv); + + nsAutoCString guid; + rv = aArgs->GetUTF8String(2, guid); + NS_ENSURE_SUCCESS(rv, rv); + + bool hidden = static_cast(aArgs->AsInt32(3)); + PRTime lastVisitDate = static_cast(aArgs->AsInt64(4)); + + const nsNavHistory* navHistory = nsNavHistory::GetConstHistoryService(); + NS_ENSURE_STATE(navHistory); + navHistory->DispatchFrecencyChangedNotification(spec, newFrecency, guid, + hidden, lastVisitDate); + + nsCOMPtr result = + do_CreateInstance("@mozilla.org/variant;1"); + NS_ENSURE_STATE(result); + rv = result->SetAsInt32(newFrecency); + NS_ENSURE_SUCCESS(rv, rv); + NS_ADDREF(*_result = result); + return NS_OK; + } + } // namespace places } // namespace mozilla diff --git a/toolkit/components/places/SQLFunctions.h b/toolkit/components/places/SQLFunctions.h index 79f6218b1f24..315ce2f4b89c 100644 --- a/toolkit/components/places/SQLFunctions.h +++ b/toolkit/components/places/SQLFunctions.h @@ -280,6 +280,43 @@ public: static nsresult create(mozIStorageConnection *aDBConn); }; + +//////////////////////////////////////////////////////////////////////////////// +//// Frecency Changed Notification Function + +/** + * For a given place, posts a runnable to the main thread that calls + * onFrecencyChanged on nsNavHistory's nsINavHistoryObservers. The passed-in + * newFrecency value is returned unchanged. + * + * @param newFrecency + * The place's new frecency. + * @param url + * The place's URL. + * @param guid + * The place's GUID. + * @param hidden + * The place's hidden boolean. + * @param lastVisitDate + * The place's last visit date. + * @return newFrecency + */ +class FrecencyNotificationFunction MOZ_FINAL : public mozIStorageFunction +{ +public: + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_MOZISTORAGEFUNCTION + + /** + * Registers the function with the specified database connection. + * + * @param aDBConn + * The database connection to register with. + */ + static nsresult create(mozIStorageConnection *aDBConn); +}; + + } // namespace places } // namespace storage diff --git a/toolkit/components/places/nsINavHistoryService.idl b/toolkit/components/places/nsINavHistoryService.idl index 1a584b8c45a1..7e375114b94e 100644 --- a/toolkit/components/places/nsINavHistoryService.idl +++ b/toolkit/components/places/nsINavHistoryService.idl @@ -610,7 +610,7 @@ interface nsINavHistoryResult : nsISupports * DANGER! If you are in the middle of a batch transaction, there may be a * database transaction active. You can still access the DB, but be careful. */ -[scriptable, uuid(45e2970b-9b00-4473-9938-39d6beaf4248)] +[scriptable, uuid(0f0f45b0-13a1-44ae-a0ab-c6046ec6d4da)] interface nsINavHistoryObserver : nsISupports { /** @@ -675,6 +675,37 @@ interface nsINavHistoryObserver : nsISupports in AString aPageTitle, in ACString aGUID); + /** + * Called when an individual page's frecency has changed. + * + * This is not called for pages whose frecencies change as the result of some + * large operation where some large or unknown number of frecencies change at + * once. Use onManyFrecenciesChanged to detect such changes. + * + * @param aURI + * The page's URI. + * @param aNewFrecency + * The page's new frecency. + * @param aGUID + * The page's GUID. + * @param aHidden + * True if the page is marked as hidden. + * @param aVisitDate + * The page's last visit date. + */ + void onFrecencyChanged(in nsIURI aURI, + in long aNewFrecency, + in ACString aGUID, + in boolean aHidden, + in PRTime aVisitDate); + + /** + * Called when the frecencies of many pages have changed at once. + * + * onFrecencyChanged is not called for each of those pages. + */ + void onManyFrecenciesChanged(); + /** * Removed by the user. */ diff --git a/toolkit/components/places/nsNavBookmarks.cpp b/toolkit/components/places/nsNavBookmarks.cpp index 640483dd2672..7d4f2191d4b0 100644 --- a/toolkit/components/places/nsNavBookmarks.cpp +++ b/toolkit/components/places/nsNavBookmarks.cpp @@ -2841,6 +2841,24 @@ nsNavBookmarks::OnTitleChanged(nsIURI* aURI, } +NS_IMETHODIMP +nsNavBookmarks::OnFrecencyChanged(nsIURI* aURI, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate) +{ + return NS_OK; +} + + +NS_IMETHODIMP +nsNavBookmarks::OnManyFrecenciesChanged() +{ + return NS_OK; +} + + NS_IMETHODIMP nsNavBookmarks::OnPageChanged(nsIURI* aURI, uint32_t aChangedAttribute, diff --git a/toolkit/components/places/nsNavHistory.cpp b/toolkit/components/places/nsNavHistory.cpp index c48da35912d1..f2d773032a3c 100644 --- a/toolkit/components/places/nsNavHistory.cpp +++ b/toolkit/components/places/nsNavHistory.cpp @@ -535,6 +535,82 @@ nsNavHistory::NotifyTitleChange(nsIURI* aURI, nsINavHistoryObserver, OnTitleChanged(aURI, aTitle, aGUID)); } +void +nsNavHistory::NotifyFrecencyChanged(nsIURI* aURI, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate) +{ + MOZ_ASSERT(!aGUID.IsEmpty()); + NOTIFY_OBSERVERS(mCanNotify, mCacheObservers, mObservers, + nsINavHistoryObserver, + OnFrecencyChanged(aURI, aNewFrecency, aGUID, aHidden, + aLastVisitDate)); +} + +void +nsNavHistory::NotifyManyFrecenciesChanged() +{ + NOTIFY_OBSERVERS(mCanNotify, mCacheObservers, mObservers, + nsINavHistoryObserver, + OnManyFrecenciesChanged()); +} + +namespace { + +class FrecencyNotification : public nsRunnable +{ +public: + FrecencyNotification(const nsACString& aSpec, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate) + : mSpec(aSpec) + , mNewFrecency(aNewFrecency) + , mGUID(aGUID) + , mHidden(aHidden) + , mLastVisitDate(aLastVisitDate) + { + } + + NS_IMETHOD Run() + { + MOZ_ASSERT(NS_IsMainThread(), "Must be called on the main thread"); + nsNavHistory* navHistory = nsNavHistory::GetHistoryService(); + if (navHistory) { + nsCOMPtr uri; + (void)NS_NewURI(getter_AddRefs(uri), mSpec); + navHistory->NotifyFrecencyChanged(uri, mNewFrecency, mGUID, mHidden, + mLastVisitDate); + } + return NS_OK; + } + +private: + nsCString mSpec; + int32_t mNewFrecency; + nsCString mGUID; + bool mHidden; + PRTime mLastVisitDate; +}; + +} // anonymous namespace + +void +nsNavHistory::DispatchFrecencyChangedNotification(const nsACString& aSpec, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate) const +{ + nsCOMPtr notif = new FrecencyNotification(aSpec, aNewFrecency, + aGUID, aHidden, + aLastVisitDate); + (void)NS_DispatchToMainThread(notif); +} + int32_t nsNavHistory::GetDaysOfHistory() { MOZ_ASSERT(NS_IsMainThread(), "This can only be called on the main thread"); @@ -928,32 +1004,68 @@ nsNavHistory::GetHasHistoryEntries(bool* aHasEntries) } +namespace { + +class InvalidateAllFrecenciesCallback : public AsyncStatementCallback +{ +public: + InvalidateAllFrecenciesCallback() + { + } + + NS_IMETHOD HandleCompletion(uint16_t aReason) + { + if (aReason == REASON_FINISHED) { + nsNavHistory *navHistory = nsNavHistory::GetHistoryService(); + NS_ENSURE_STATE(navHistory); + navHistory->NotifyManyFrecenciesChanged(); + } + return NS_OK; + } +}; + +} // anonymous namespace + nsresult nsNavHistory::invalidateFrecencies(const nsCString& aPlaceIdsQueryString) { // Exclude place: queries by setting their frecency to zero. - nsAutoCString invalideFrecenciesSQLFragment( - "UPDATE moz_places SET frecency = (CASE " - "WHEN url BETWEEN 'place:' AND 'place;' " - "THEN 0 " - "ELSE -1 " - "END) " + nsCString invalidFrecenciesSQLFragment( + "UPDATE moz_places SET frecency = " + ); + if (!aPlaceIdsQueryString.IsEmpty()) + invalidFrecenciesSQLFragment.AppendLiteral("NOTIFY_FRECENCY("); + invalidFrecenciesSQLFragment.AppendLiteral( + "(CASE " + "WHEN url BETWEEN 'place:' AND 'place;' " + "THEN 0 " + "ELSE -1 " + "END) " + ); + if (!aPlaceIdsQueryString.IsEmpty()) { + invalidFrecenciesSQLFragment.AppendLiteral( + ", url, guid, hidden, last_visit_date) " + ); + } + invalidFrecenciesSQLFragment.AppendLiteral( "WHERE frecency > 0 " ); - if (!aPlaceIdsQueryString.IsEmpty()) { - invalideFrecenciesSQLFragment.AppendLiteral("AND id IN("); - invalideFrecenciesSQLFragment.Append(aPlaceIdsQueryString); - invalideFrecenciesSQLFragment.AppendLiteral(")"); + invalidFrecenciesSQLFragment.AppendLiteral("AND id IN("); + invalidFrecenciesSQLFragment.Append(aPlaceIdsQueryString); + invalidFrecenciesSQLFragment.AppendLiteral(")"); } + nsRefPtr cb = + aPlaceIdsQueryString.IsEmpty() ? new InvalidateAllFrecenciesCallback() + : nullptr; nsCOMPtr stmt = mDB->GetAsyncStatement( - invalideFrecenciesSQLFragment + invalidFrecenciesSQLFragment ); NS_ENSURE_STATE(stmt); nsCOMPtr ps; - nsresult rv = stmt->ExecuteAsync(nullptr, getter_AddRefs(ps)); + nsresult rv = stmt->ExecuteAsync(cb, getter_AddRefs(ps)); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; @@ -3078,6 +3190,30 @@ nsNavHistory::Observe(nsISupports *aSubject, const char *aTopic, } +namespace { + +class DecayFrecencyCallback : public AsyncStatementTelemetryTimer +{ +public: + DecayFrecencyCallback() + : AsyncStatementTelemetryTimer(Telemetry::PLACES_IDLE_FRECENCY_DECAY_TIME_MS) + { + } + + NS_IMETHOD HandleCompletion(uint16_t aReason) + { + (void)AsyncStatementTelemetryTimer::HandleCompletion(aReason); + if (aReason == REASON_FINISHED) { + nsNavHistory *navHistory = nsNavHistory::GetHistoryService(); + NS_ENSURE_STATE(navHistory); + navHistory->NotifyManyFrecenciesChanged(); + } + return NS_OK; + } +}; + +} // anonymous namespace + nsresult nsNavHistory::DecayFrecency() { @@ -3115,8 +3251,7 @@ nsNavHistory::DecayFrecency() deleteAdaptive.get() }; nsCOMPtr ps; - nsRefPtr cb = - new AsyncStatementTelemetryTimer(Telemetry::PLACES_IDLE_FRECENCY_DECAY_TIME_MS); + nsRefPtr cb = new DecayFrecencyCallback(); rv = mDB->MainConn()->ExecuteAsync(stmts, ArrayLength(stmts), cb, getter_AddRefs(ps)); NS_ENSURE_SUCCESS(rv, rv); @@ -4312,7 +4447,9 @@ nsNavHistory::UpdateFrecency(int64_t aPlaceId) { nsCOMPtr updateFrecencyStmt = mDB->GetAsyncStatement( "UPDATE moz_places " - "SET frecency = CALCULATE_FRECENCY(:page_id) " + "SET frecency = NOTIFY_FRECENCY(" + "CALCULATE_FRECENCY(:page_id), url, guid, hidden, last_visit_date" + ") " "WHERE id = :page_id" ); NS_ENSURE_STATE(updateFrecencyStmt); @@ -4345,6 +4482,31 @@ nsNavHistory::UpdateFrecency(int64_t aPlaceId) } +namespace { + +class FixInvalidFrecenciesCallback : public AsyncStatementCallbackNotifier +{ +public: + FixInvalidFrecenciesCallback() + : AsyncStatementCallbackNotifier(TOPIC_FRECENCY_UPDATED) + { + } + + NS_IMETHOD HandleCompletion(uint16_t aReason) + { + nsresult rv = AsyncStatementCallbackNotifier::HandleCompletion(aReason); + NS_ENSURE_SUCCESS(rv, rv); + if (aReason == REASON_FINISHED) { + nsNavHistory *navHistory = nsNavHistory::GetHistoryService(); + NS_ENSURE_STATE(navHistory); + navHistory->NotifyManyFrecenciesChanged(); + } + return NS_OK; + } +}; + +} // anonymous namespace + nsresult nsNavHistory::FixInvalidFrecencies() { @@ -4355,8 +4517,8 @@ nsNavHistory::FixInvalidFrecencies() ); NS_ENSURE_STATE(stmt); - nsRefPtr callback = - new AsyncStatementCallbackNotifier(TOPIC_FRECENCY_UPDATED); + nsRefPtr callback = + new FixInvalidFrecenciesCallback(); nsCOMPtr ps; (void)stmt->ExecuteAsync(callback, getter_AddRefs(ps)); diff --git a/toolkit/components/places/nsNavHistory.h b/toolkit/components/places/nsNavHistory.h index 149ce1cc282d..b2ebcec72b6a 100644 --- a/toolkit/components/places/nsNavHistory.h +++ b/toolkit/components/places/nsNavHistory.h @@ -418,6 +418,29 @@ public: const nsString& title, const nsACString& aGUID); + /** + * Fires onFrecencyChanged event to nsINavHistoryService observers + */ + void NotifyFrecencyChanged(nsIURI* aURI, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate); + + /** + * Fires onManyFrecenciesChanged event to nsINavHistoryService observers + */ + void NotifyManyFrecenciesChanged(); + + /** + * Posts a runnable to the main thread that calls NotifyFrecencyChanged. + */ + void DispatchFrecencyChangedNotification(const nsACString& aSpec, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate) const; + bool isBatching() { return mBatchLevel > 0; } diff --git a/toolkit/components/places/nsNavHistoryResult.cpp b/toolkit/components/places/nsNavHistoryResult.cpp index aa7b9d48ee5e..817aa90d0cb9 100644 --- a/toolkit/components/places/nsNavHistoryResult.cpp +++ b/toolkit/components/places/nsNavHistoryResult.cpp @@ -2614,6 +2614,24 @@ nsNavHistoryQueryResultNode::OnTitleChanged(nsIURI* aURI, } +NS_IMETHODIMP +nsNavHistoryQueryResultNode::OnFrecencyChanged(nsIURI* aURI, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate) +{ + return NS_OK; +} + + +NS_IMETHODIMP +nsNavHistoryQueryResultNode::OnManyFrecenciesChanged() +{ + return NS_OK; +} + + /** * Here, we can always live update by just deleting all occurrences of * the given URI. @@ -4662,6 +4680,24 @@ nsNavHistoryResult::OnTitleChanged(nsIURI* aURI, } +NS_IMETHODIMP +nsNavHistoryResult::OnFrecencyChanged(nsIURI* aURI, + int32_t aNewFrecency, + const nsACString& aGUID, + bool aHidden, + PRTime aLastVisitDate) +{ + return NS_OK; +} + + +NS_IMETHODIMP +nsNavHistoryResult::OnManyFrecenciesChanged() +{ + return NS_OK; +} + + NS_IMETHODIMP nsNavHistoryResult::OnDeleteURI(nsIURI *aURI, const nsACString& aGUID, diff --git a/toolkit/components/places/nsNavHistoryResult.h b/toolkit/components/places/nsNavHistoryResult.h index 21aff6528363..bac24871bb41 100644 --- a/toolkit/components/places/nsNavHistoryResult.h +++ b/toolkit/components/places/nsNavHistoryResult.h @@ -64,6 +64,10 @@ private: NS_DECL_NSINAVBOOKMARKOBSERVER \ NS_IMETHOD OnTitleChanged(nsIURI* aURI, const nsAString& aPageTitle, \ const nsACString& aGUID); \ + NS_IMETHOD OnFrecencyChanged(nsIURI* aURI, int32_t aNewFrecency, \ + const nsACString& aGUID, bool aHidden, \ + PRTime aLastVisitDate); \ + NS_IMETHOD OnManyFrecenciesChanged(); \ NS_IMETHOD OnDeleteURI(nsIURI *aURI, const nsACString& aGUID, \ uint16_t aReason); \ NS_IMETHOD OnClearHistory(); \ diff --git a/toolkit/components/places/tests/unit/test_frecency_observers.js b/toolkit/components/places/tests/unit/test_frecency_observers.js new file mode 100644 index 000000000000..f027e98e57cc --- /dev/null +++ b/toolkit/components/places/tests/unit/test_frecency_observers.js @@ -0,0 +1,85 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +function run_test() { + run_next_test(); +} + +// Each of these tests a path that triggers a frecency update. Together they +// hit all sites that update a frecency. + +// InsertVisitedURIs::UpdateFrecency and History::InsertPlace +add_task(function test_InsertVisitedURIs_UpdateFrecency_and_History_InsertPlace() { + // InsertPlace is at the end of a path that UpdateFrecency is also on, so kill + // two birds with one stone and expect two notifications. Trigger the path by + // adding a download. + let uri = NetUtil.newURI("http://example.com/a"); + Cc["@mozilla.org/browser/download-history;1"]. + getService(Ci.nsIDownloadHistory). + addDownload(uri); + yield Promise.all([onFrecencyChanged(uri), onFrecencyChanged(uri)]); +}); + +// nsNavHistory::UpdateFrecency +add_task(function test_nsNavHistory_UpdateFrecency() { + let bm = PlacesUtils.bookmarks; + let uri = NetUtil.newURI("http://example.com/b"); + bm.insertBookmark(bm.unfiledBookmarksFolder, uri, + Ci.nsINavBookmarksService.DEFAULT_INDEX, "test"); + yield onFrecencyChanged(uri); +}); + +// nsNavHistory::invalidateFrecencies for particular pages +add_task(function test_nsNavHistory_invalidateFrecencies_somePages() { + let uri = NetUtil.newURI("http://test-nsNavHistory-invalidateFrecencies-somePages.com/"); + // Bookmarking the URI is enough to add it to moz_places, and importantly, it + // means that removePagesFromHost doesn't remove it from moz_places, so its + // frecency is able to be changed. + let bm = PlacesUtils.bookmarks; + bm.insertBookmark(bm.unfiledBookmarksFolder, uri, + Ci.nsINavBookmarksService.DEFAULT_INDEX, "test"); + PlacesUtils.history.removePagesFromHost(uri.host, false); + yield onFrecencyChanged(uri); +}); + +// nsNavHistory::invalidateFrecencies for all pages +add_task(function test_nsNavHistory_invalidateFrecencies_allPages() { + PlacesUtils.history.removeAllPages(); + yield onManyFrecenciesChanged(); +}); + +// nsNavHistory::DecayFrecency and nsNavHistory::FixInvalidFrecencies +add_task(function test_nsNavHistory_DecayFrecency_and_nsNavHistory_FixInvalidFrecencies() { + // FixInvalidFrecencies is at the end of a path that DecayFrecency is also on, + // so expect two notifications. Trigger the path by making nsNavHistory + // observe the idle-daily notification. + PlacesUtils.history.QueryInterface(Ci.nsIObserver). + observe(null, "idle-daily", ""); + yield Promise.all([onManyFrecenciesChanged(), onManyFrecenciesChanged()]); +}); + +function onFrecencyChanged(expectedURI) { + let deferred = Promise.defer(); + let obs = new NavHistoryObserver(); + obs.onFrecencyChanged = + (uri, newFrecency, guid, hidden, visitDate) => { + PlacesUtils.history.removeObserver(obs); + do_check_true(!!uri); + do_check_true(uri.equals(expectedURI)); + deferred.resolve(); + }; + PlacesUtils.history.addObserver(obs, false); + return deferred.promise; +} + +function onManyFrecenciesChanged() { + let deferred = Promise.defer(); + let obs = new NavHistoryObserver(); + obs.onManyFrecenciesChanged = () => { + PlacesUtils.history.removeObserver(obs); + do_check_true(true); + deferred.resolve(); + }; + PlacesUtils.history.addObserver(obs, false); + return deferred.promise; +} diff --git a/toolkit/components/places/tests/unit/xpcshell.ini b/toolkit/components/places/tests/unit/xpcshell.ini index 2389aff76b49..3165288b9b1c 100644 --- a/toolkit/components/places/tests/unit/xpcshell.ini +++ b/toolkit/components/places/tests/unit/xpcshell.ini @@ -113,6 +113,7 @@ skip-if = true [test_null_interfaces.js] [test_onItemChanged_tags.js] [test_pageGuid_bookmarkGuid.js] +[test_frecency_observers.js] [test_placeURIs.js] [test_PlacesUtils_asyncGetBookmarkIds.js] [test_PlacesUtils_lazyobservers.js] From 1e64e83e8ed5f608a307e0b241f32e73f8d003ab Mon Sep 17 00:00:00 2001 From: Drew Willcoxon Date: Fri, 28 Mar 2014 23:31:05 -0700 Subject: [PATCH 17/19] Bug 911307 - Reflect changes to top sites immediately in about:newtab (part 2, front-end patch). r=ttaubert --- browser/base/content/newtab/page.js | 13 +- browser/base/content/test/newtab/browser.ini | 1 + .../test/newtab/browser_newtab_update.js | 52 +++ browser/base/content/test/newtab/head.js | 34 +- toolkit/modules/BinarySearch.jsm | 74 +++ toolkit/modules/NewTabUtils.jsm | 423 ++++++++++++++++-- toolkit/modules/moz.build | 1 + .../tests/xpcshell/test_BinarySearch.js | 81 ++++ .../tests/xpcshell/test_NewTabUtils.js | 176 ++++++++ toolkit/modules/tests/xpcshell/xpcshell.ini | 2 + 10 files changed, 819 insertions(+), 38 deletions(-) create mode 100644 browser/base/content/test/newtab/browser_newtab_update.js create mode 100644 toolkit/modules/BinarySearch.jsm create mode 100644 toolkit/modules/tests/xpcshell/test_BinarySearch.js create mode 100644 toolkit/modules/tests/xpcshell/test_NewTabUtils.js diff --git a/browser/base/content/newtab/page.js b/browser/base/content/newtab/page.js index 112f7b8e9ea4..fa0686246733 100644 --- a/browser/base/content/newtab/page.js +++ b/browser/base/content/newtab/page.js @@ -36,7 +36,11 @@ let gPage = { * thumbnail service. */ get allowBackgroundCaptures() { - return document.documentElement.getAttribute("allow-background-captures") == + // The preloader is bypassed altogether for private browsing windows, and + // therefore allow-background-captures will not be set. In that case, the + // page is not preloaded and so it's visible, so allow background captures. + return inPrivateBrowsingMode() || + document.documentElement.getAttribute("allow-background-captures") == "true"; }, @@ -65,10 +69,13 @@ let gPage = { /** * Updates the whole page and the grid when the storage has changed. + * @param aOnlyIfHidden If true, the page is updated only if it's hidden in + * the preloader. */ - update: function Page_update() { + update: function Page_update(aOnlyIfHidden=false) { + let skipUpdate = aOnlyIfHidden && this.allowBackgroundCaptures; // The grid might not be ready yet as we initialize it asynchronously. - if (gGrid.ready) { + if (gGrid.ready && !skipUpdate) { gGrid.refresh(); } }, diff --git a/browser/base/content/test/newtab/browser.ini b/browser/base/content/test/newtab/browser.ini index c7b1c7f9449d..01ec5ab570da 100644 --- a/browser/base/content/test/newtab/browser.ini +++ b/browser/base/content/test/newtab/browser.ini @@ -24,3 +24,4 @@ skip-if = os == "mac" # Intermittent failures, bug 898317 [browser_newtab_tabsync.js] [browser_newtab_undo.js] [browser_newtab_unpin.js] +[browser_newtab_update.js] diff --git a/browser/base/content/test/newtab/browser_newtab_update.js b/browser/base/content/test/newtab/browser_newtab_update.js new file mode 100644 index 000000000000..c9c36dfa1354 --- /dev/null +++ b/browser/base/content/test/newtab/browser_newtab_update.js @@ -0,0 +1,52 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Checks that newtab is updated as its links change. + */ + +function runTests() { + if (NewTabUtils.allPages.updateScheduledForHiddenPages) { + // Wait for dynamic updates triggered by the previous test to finish. + yield whenPagesUpdated(null, true); + } + + // First, start with an empty page. setLinks will trigger a hidden page + // update because it calls clearHistory. We need to wait for that update to + // happen so that the next time we wait for a page update below, we catch the + // right update and not the one triggered by setLinks. + // + // Why this weird way of yielding? First, these two functions don't return + // promises, they call TestRunner.next when done. Second, the point at which + // setLinks is done is independent of when the page update will happen, so + // calling whenPagesUpdated cannot wait until that time. + setLinks([]); + whenPagesUpdated(null, true); + yield null; + yield null; + + // Strategy: Add some visits, open a new page, check the grid, repeat. + fillHistory([link(1)]); + yield whenPagesUpdated(null, true); + yield addNewTabPageTab(); + checkGrid("1,,,,,,,,"); + + fillHistory([link(2)]); + yield whenPagesUpdated(null, true); + yield addNewTabPageTab(); + checkGrid("2,1,,,,,,,"); + + fillHistory([link(1)]); + yield whenPagesUpdated(null, true); + yield addNewTabPageTab(); + checkGrid("1,2,,,,,,,"); + + fillHistory([link(2), link(3), link(4)]); + yield whenPagesUpdated(null, true); + yield addNewTabPageTab(); + checkGrid("2,1,3,4,,,,,"); +} + +function link(id) { + return { url: "http://example.com/#" + id, title: "site#" + id }; +} diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js index 6df4bff9c620..fa298d506873 100644 --- a/browser/base/content/test/newtab/head.js +++ b/browser/base/content/test/newtab/head.js @@ -159,20 +159,34 @@ function clearHistory(aCallback) { function fillHistory(aLinks, aCallback) { let numLinks = aLinks.length; + if (!numLinks) { + if (aCallback) + executeSoon(aCallback); + return; + } + let transitionLink = Ci.nsINavHistoryService.TRANSITION_LINK; - for (let link of aLinks.reverse()) { + // Important: To avoid test failures due to clock jitter on Windows XP, call + // Date.now() once here, not each time through the loop. + let now = Date.now() * 1000; + + for (let i = 0; i < aLinks.length; i++) { + let link = aLinks[i]; let place = { uri: makeURI(link.url), title: link.title, - visits: [{visitDate: Date.now() * 1000, transitionType: transitionLink}] + // Links are secondarily sorted by visit date descending, so decrease the + // visit date as we progress through the array so that links appear in the + // grid in the order they're present in the array. + visits: [{visitDate: now - i, transitionType: transitionLink}] }; PlacesUtils.asyncHistory.updatePlaces(place, { handleError: function () ok(false, "couldn't add visit to history"), handleResult: function () {}, handleCompletion: function () { - if (--numLinks == 0) + if (--numLinks == 0 && aCallback) aCallback(); } }); @@ -503,12 +517,18 @@ function createDragEvent(aEventType, aData) { /** * Resumes testing when all pages have been updated. + * @param aCallback Called when done. If not specified, TestRunner.next is used. + * @param aOnlyIfHidden If true, this resumes testing only when an update that + * applies to pre-loaded, hidden pages is observed. If + * false, this resumes testing when any update is observed. */ -function whenPagesUpdated(aCallback) { +function whenPagesUpdated(aCallback, aOnlyIfHidden=false) { let page = { - update: function () { - NewTabUtils.allPages.unregister(this); - executeSoon(aCallback || TestRunner.next); + update: function (onlyIfHidden=false) { + if (onlyIfHidden == aOnlyIfHidden) { + NewTabUtils.allPages.unregister(this); + executeSoon(aCallback || TestRunner.next); + } } }; diff --git a/toolkit/modules/BinarySearch.jsm b/toolkit/modules/BinarySearch.jsm new file mode 100644 index 000000000000..b07879b78eab --- /dev/null +++ b/toolkit/modules/BinarySearch.jsm @@ -0,0 +1,74 @@ +/* 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/. */ + +"use strict"; + +this.EXPORTED_SYMBOLS = [ + "BinarySearch", +]; + +this.BinarySearch = Object.freeze({ + + /** + * Returns the index of the given target in the given array or -1 if the + * target is not found. + * + * See search() for a description of this function's parameters. + * + * @return The index of `target` in `array` or -1 if `target` is not found. + */ + indexOf: function (array, target, comparator) { + let [found, idx] = this.search(array, target, comparator); + return found ? idx : -1; + }, + + /** + * Returns the index within the given array where the given target may be + * inserted to keep the array ordered. + * + * See search() for a description of this function's parameters. + * + * @return The index in `array` where `target` may be inserted to keep `array` + * ordered. + */ + insertionIndexOf: function (array, target, comparator) { + return this.search(array, target, comparator)[1]; + }, + + /** + * Searches for the given target in the given array. + * + * @param array + * An array whose elements are ordered by `comparator`. + * @param target + * The value to search for. + * @param comparator + * A function that takes two arguments and compares them, returning a + * negative number if the first should be ordered before the second, + * zero if the first and second have the same ordering, or a positive + * number if the second should be ordered before the first. The first + * argument is always `target`, and the second argument is a value + * from the array. + * @return An array with two elements. If `target` is found, the first + * element is true, and the second element is its index in the array. + * If `target` is not found, the first element is false, and the + * second element is the index where it may be inserted to keep the + * array ordered. + */ + search: function (array, target, comparator) { + let low = 0; + let high = array.length - 1; + while (low <= high) { + let mid = Math.floor((low + high) / 2); + let cmp = comparator(target, array[mid]); + if (cmp == 0) + return [true, mid]; + if (cmp < 0) + high = mid - 1; + else + low = mid + 1; + } + return [false, low]; + }, +}); diff --git a/toolkit/modules/NewTabUtils.jsm b/toolkit/modules/NewTabUtils.jsm index 45a077db70db..5fbc3119aa92 100644 --- a/toolkit/modules/NewTabUtils.jsm +++ b/toolkit/modules/NewTabUtils.jsm @@ -19,6 +19,13 @@ XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils", XPCOMUtils.defineLazyModuleGetter(this, "PageThumbs", "resource://gre/modules/PageThumbs.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "BinarySearch", + "resource://gre/modules/BinarySearch.jsm"); + +XPCOMUtils.defineLazyGetter(this, "Timer", () => { + return Cu.import("resource://gre/modules/Timer.jsm", {}); +}); + XPCOMUtils.defineLazyGetter(this, "gPrincipal", function () { let uri = Services.io.newURI("about:newtab", null, null); return Services.scriptSecurityManager.getNoAppCodebasePrincipal(uri); @@ -44,12 +51,18 @@ const PREF_NEWTAB_ROWS = "browser.newtabpage.rows"; // The preference that tells the number of columns of the newtab grid. const PREF_NEWTAB_COLUMNS = "browser.newtabpage.columns"; -// The maximum number of results we want to retrieve from history. +// The maximum number of results PlacesProvider retrieves from history. const HISTORY_RESULTS_LIMIT = 100; +// The maximum number of links Links.getLinks will return. +const LINKS_GET_LINKS_LIMIT = 100; + // The gather telemetry topic. const TOPIC_GATHER_TELEMETRY = "gather-telemetry"; +// The amount of time we wait while coalescing updates for hidden pages. +const SCHEDULE_UPDATE_TIMEOUT_MS = 1000; + /** * Calculate the MD5 hash for a string. * @param aValue @@ -244,14 +257,34 @@ let AllPages = { /** * Updates all currently active pages but the given one. * @param aExceptPage The page to exclude from updating. + * @param aHiddenPagesOnly If true, only pages hidden in the preloader are + * updated. */ - update: function AllPages_update(aExceptPage) { + update: function AllPages_update(aExceptPage, aHiddenPagesOnly=false) { this._pages.forEach(function (aPage) { if (aExceptPage != aPage) - aPage.update(); + aPage.update(aHiddenPagesOnly); }); }, + /** + * Many individual link changes may happen in a small amount of time over + * multiple turns of the event loop. This method coalesces updates by waiting + * a small amount of time before updating hidden pages. + */ + scheduleUpdateForHiddenPages: function AllPages_scheduleUpdateForHiddenPages() { + if (!this._scheduleUpdateTimeout) { + this._scheduleUpdateTimeout = Timer.setTimeout(() => { + delete this._scheduleUpdateTimeout; + this.update(null, true); + }, SCHEDULE_UPDATE_TIMEOUT_MS); + } + }, + + get updateScheduledForHiddenPages() { + return !!this._scheduleUpdateTimeout; + }, + /** * Implements the nsIObserver interface to get notified when the preference * value changes or when a new copy of a page thumbnail is available. @@ -504,13 +537,25 @@ let BlockedLinks = { * the history to retrieve the most frequently visited sites. */ let PlacesProvider = { + /** + * Set this to change the maximum number of links the provider will provide. + */ + maxNumLinks: HISTORY_RESULTS_LIMIT, + + /** + * Must be called before the provider is used. + */ + init: function PlacesProvider_init() { + PlacesUtils.history.addObserver(this, true); + }, + /** * Gets the current set of links delivered by this provider. * @param aCallback The function that the array of links is passed to. */ getLinks: function PlacesProvider_getLinks(aCallback) { let options = PlacesUtils.history.getNewQueryOptions(); - options.maxResults = HISTORY_RESULTS_LIMIT; + options.maxResults = this.maxNumLinks; // Sort by frecency, descending. options.sortingMode = Ci.nsINavHistoryQueryOptions.SORT_BY_FRECENCY_DESCENDING @@ -525,7 +570,14 @@ let PlacesProvider = { let url = row.getResultByIndex(1); if (LinkChecker.checkLoadURI(url)) { let title = row.getResultByIndex(2); - links.push({url: url, title: title}); + let frecency = row.getResultByIndex(12); + let lastVisitDate = row.getResultByIndex(5); + links.push({ + url: url, + title: title, + frecency: frecency, + lastVisitDate: lastVisitDate, + }); } } }, @@ -536,6 +588,26 @@ let PlacesProvider = { }, handleCompletion: function (aReason) { + // The Places query breaks ties in frecency by place ID descending, but + // that's different from how Links.compareLinks breaks ties, because + // compareLinks doesn't have access to place IDs. It's very important + // that the initial list of links is sorted in the same order imposed by + // compareLinks, because Links uses compareLinks to perform binary + // searches on the list. So, ensure the list is so ordered. + let i = 1; + let outOfOrder = []; + while (i < links.length) { + if (Links.compareLinks(links[i - 1], links[i]) > 0) + outOfOrder.push(links.splice(i, 1)[0]); + else + i++; + } + for (let link of outOfOrder) { + i = BinarySearch.insertionIndexOf(links, link, + Links.compareLinks.bind(Links)); + links.splice(i, 0, link); + } + aCallback(links); } }; @@ -544,28 +616,116 @@ let PlacesProvider = { let query = PlacesUtils.history.getNewQuery(); let db = PlacesUtils.history.QueryInterface(Ci.nsPIPlacesDatabase); db.asyncExecuteLegacyQueries([query], 1, options, callback); - } + }, + + /** + * Registers an object that will be notified when the provider's links change. + * @param aObserver An object with the following optional properties: + * * onLinkChanged: A function that's called when a single link + * changes. It's passed the provider and the link object. Only the + * link's `url` property is guaranteed to be present. If its `title` + * property is present, then its title has changed, and the + * property's value is the new title. If any sort properties are + * present, then its position within the provider's list of links may + * have changed, and the properties' values are the new sort-related + * values. Note that this link may not necessarily have been present + * in the lists returned from any previous calls to getLinks. + * * onManyLinksChanged: A function that's called when many links + * change at once. It's passed the provider. You should call + * getLinks to get the provider's new list of links. + */ + addObserver: function PlacesProvider_addObserver(aObserver) { + this._observers.push(aObserver); + }, + + _observers: [], + + /** + * Called by the history service. + */ + onFrecencyChanged: function PlacesProvider_onFrecencyChanged(aURI, aNewFrecency, aGUID, aHidden, aLastVisitDate) { + // The implementation of the query in getLinks excludes hidden and + // unvisited pages, so it's important to exclude them here, too. + if (!aHidden && aLastVisitDate) { + this._callObservers("onLinkChanged", { + url: aURI.spec, + frecency: aNewFrecency, + lastVisitDate: aLastVisitDate, + }); + } + }, + + /** + * Called by the history service. + */ + onManyFrecenciesChanged: function PlacesProvider_onManyFrecenciesChanged() { + this._callObservers("onManyLinksChanged"); + }, + + /** + * Called by the history service. + */ + onTitleChanged: function PlacesProvider_onTitleChanged(aURI, aNewTitle, aGUID) { + this._callObservers("onLinkChanged", { + url: aURI.spec, + title: aNewTitle + }); + }, + + _callObservers: function PlacesProvider__callObservers(aMethodName, aArg) { + for (let obs of this._observers) { + if (obs[aMethodName]) { + try { + obs[aMethodName](this, aArg); + } catch (err) { + Cu.reportError(err); + } + } + } + }, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsINavHistoryObserver, + Ci.nsISupportsWeakReference]), }; /** * Singleton that provides access to all links contained in the grid (including - * the ones that don't fit on the grid). A link is a plain object with title - * and url properties. + * the ones that don't fit on the grid). A link is a plain object that looks + * like this: * - * Example: - * - * {url: "http://www.mozilla.org/", title: "Mozilla"} + * { + * url: "http://www.mozilla.org/", + * title: "Mozilla", + * frecency: 1337, + * lastVisitDate: 1394678824766431, + * } */ let Links = { /** - * The links cache. + * The maximum number of links returned by getLinks. */ - _links: null, + maxNumLinks: LINKS_GET_LINKS_LIMIT, /** - * The default provider for links. + * The link providers. */ - _provider: PlacesProvider, + _providers: new Set(), + + /** + * A mapping from each provider to an object { sortedLinks, linkMap }. + * sortedLinks is the cached, sorted array of links for the provider. linkMap + * is a Map from link URLs to link objects. + */ + _providerLinks: new Map(), + + /** + * The properties of link objects used to sort them. + */ + _sortProperties: [ + "frecency", + "lastVisitDate", + "url", + ], /** * List of callbacks waiting for the cache to be populated. @@ -573,7 +733,26 @@ let Links = { _populateCallbacks: [], /** - * Populates the cache with fresh links from the current provider. + * Adds a link provider. + * @param aProvider The link provider. + */ + addProvider: function Links_addProvider(aProvider) { + this._providers.add(aProvider); + aProvider.addObserver(this); + }, + + /** + * Removes a link provider. + * @param aProvider The link provider. + */ + removeProvider: function Links_removeProvider(aProvider) { + if (!this._providers.delete(aProvider)) + throw new Error("Unknown provider"); + this._providerLinks.delete(aProvider); + }, + + /** + * Populates the cache with fresh links from the providers. * @param aCallback The callback to call when finished (optional). * @param aForce When true, populates the cache even when it's already filled. */ @@ -601,16 +780,15 @@ let Links = { } } - if (this._links && !aForce) { - executeCallbacks(); - } else { - this._provider.getLinks(function (aLinks) { - this._links = aLinks; - executeCallbacks(); - }.bind(this)); - - this._addObserver(); + let numProvidersRemaining = this._providers.size; + for (let provider of this._providers) { + this._populateProviderCache(provider, () => { + if (--numProvidersRemaining == 0) + executeCallbacks(); + }, aForce); } + + this._addObserver(); }, /** @@ -619,9 +797,10 @@ let Links = { */ getLinks: function Links_getLinks() { let pinnedLinks = Array.slice(PinnedLinks.links); + let links = this._getMergedProviderLinks(); // Filter blocked and pinned links. - let links = (this._links || []).filter(function (link) { + links = links.filter(function (link) { return !BlockedLinks.isBlocked(link) && !PinnedLinks.isPinned(link); }); @@ -641,7 +820,186 @@ let Links = { * Resets the links cache. */ resetCache: function Links_resetCache() { - this._links = null; + this._providerLinks.clear(); + }, + + /** + * Compares two links. + * @param aLink1 The first link. + * @param aLink2 The second link. + * @return A negative number if aLink1 is ordered before aLink2, zero if + * aLink1 and aLink2 have the same ordering, or a positive number if + * aLink1 is ordered after aLink2. + */ + compareLinks: function Links_compareLinks(aLink1, aLink2) { + for (let prop of this._sortProperties) { + if (!(prop in aLink1) || !(prop in aLink2)) + throw new Error("Comparable link missing required property: " + prop); + } + return aLink2.frecency - aLink1.frecency || + aLink2.lastVisitDate - aLink1.lastVisitDate || + aLink1.url.localeCompare(aLink2.url); + }, + + /** + * Calls getLinks on the given provider and populates our cache for it. + * @param aProvider The provider whose cache will be populated. + * @param aCallback The callback to call when finished. + * @param aForce When true, populates the provider's cache even when it's + * already filled. + */ + _populateProviderCache: function Links_populateProviderCache(aProvider, aCallback, aForce) { + if (this._providerLinks.has(aProvider) && !aForce) { + aCallback(); + } else { + aProvider.getLinks(links => { + // Filter out null and undefined links so we don't have to deal with + // them in getLinks when merging links from providers. + links = links.filter((link) => !!link); + this._providerLinks.set(aProvider, { + sortedLinks: links, + linkMap: links.reduce((map, link) => { + map.set(link.url, link); + return map; + }, new Map()), + }); + aCallback(); + }); + } + }, + + /** + * Merges the cached lists of links from all providers whose lists are cached. + * @return The merged list. + */ + _getMergedProviderLinks: function Links__getMergedProviderLinks() { + // Build a list containing a copy of each provider's sortedLinks list. + let linkLists = []; + for (let links of this._providerLinks.values()) { + linkLists.push(links.sortedLinks.slice()); + } + + function getNextLink() { + let minLinks = null; + for (let links of linkLists) { + if (links.length && + (!minLinks || Links.compareLinks(links[0], minLinks[0]) < 0)) + minLinks = links; + } + return minLinks ? minLinks.shift() : null; + } + + let finalLinks = []; + for (let nextLink = getNextLink(); + nextLink && finalLinks.length < this.maxNumLinks; + nextLink = getNextLink()) { + finalLinks.push(nextLink); + } + + return finalLinks; + }, + + /** + * Called by a provider to notify us when a single link changes. + * @param aProvider The provider whose link changed. + * @param aLink The link that changed. If the link is new, it must have all + * of the _sortProperties. Otherwise, it may have as few or as + * many as is convenient. + */ + onLinkChanged: function Links_onLinkChanged(aProvider, aLink) { + if (!("url" in aLink)) + throw new Error("Changed links must have a url property"); + + let links = this._providerLinks.get(aProvider); + if (!links) + // This is not an error, it just means that between the time the provider + // was added and the future time we call getLinks on it, it notified us of + // a change. + return; + + let { sortedLinks, linkMap } = links; + + // Nothing to do if the list is full and the link isn't in it and shouldn't + // be in it. + if (!linkMap.has(aLink.url) && + sortedLinks.length && + sortedLinks.length == aProvider.maxNumLinks) { + let lastLink = sortedLinks[sortedLinks.length - 1]; + if (this.compareLinks(lastLink, aLink) < 0) + return; + } + + let updatePages = false; + + // Update the title in O(1). + if ("title" in aLink) { + let link = linkMap.get(aLink.url); + if (link && link.title != aLink.title) { + link.title = aLink.title; + updatePages = true; + } + } + + // Update the link's position in O(lg n). + if (this._sortProperties.some((prop) => prop in aLink)) { + let link = linkMap.get(aLink.url); + if (link) { + // The link is already in the list. + let idx = this._indexOf(sortedLinks, link); + if (idx < 0) + throw new Error("Link should be in _sortedLinks if in _linkMap"); + sortedLinks.splice(idx, 1); + for (let prop of this._sortProperties) { + if (prop in aLink) + link[prop] = aLink[prop]; + } + } + else { + // The link is new. + for (let prop of this._sortProperties) { + if (!(prop in aLink)) + throw new Error("New link missing required sort property: " + prop); + } + // Copy the link object so that if the caller changes it, it doesn't + // screw up our bookkeeping. + link = {}; + for (let [prop, val] of Iterator(aLink)) { + link[prop] = val; + } + linkMap.set(link.url, link); + } + let idx = this._insertionIndexOf(sortedLinks, link); + sortedLinks.splice(idx, 0, link); + if (sortedLinks.length > aProvider.maxNumLinks) { + let lastLink = sortedLinks.pop(); + linkMap.delete(lastLink.url); + } + updatePages = true; + } + + if (updatePages) + AllPages.scheduleUpdateForHiddenPages(); + }, + + /** + * Called by a provider to notify us when many links change. + */ + onManyLinksChanged: function Links_onManyLinksChanged(aProvider) { + this._populateProviderCache(aProvider, () => { + AllPages.scheduleUpdateForHiddenPages(); + }, true); + }, + + _indexOf: function Links__indexOf(aArray, aLink) { + return this._binsearch(aArray, aLink, "indexOf"); + }, + + _insertionIndexOf: function Links__insertionIndexOf(aArray, aLink) { + return this._binsearch(aArray, aLink, "insertionIndexOf"); + }, + + _binsearch: function Links__binsearch(aArray, aLink, aMethod) { + return BinarySearch[aMethod](aArray, aLink, this.compareLinks.bind(this)); }, /** @@ -654,7 +1012,7 @@ let Links = { if (AllPages.length && AllPages.enabled) this.populateCache(function () { AllPages.update() }, true); else - this._links = null; + this.resetCache(); }, /** @@ -774,11 +1132,20 @@ this.NewTabUtils = { _initialized: false, init: function NewTabUtils_init() { + if (this.initWithoutProviders()) { + PlacesProvider.init(); + Links.addProvider(PlacesProvider); + } + }, + + initWithoutProviders: function NewTabUtils_initWithoutProviders() { if (!this._initialized) { this._initialized = true; ExpirationFilter.init(); Telemetry.init(); + return true; } + return false; }, /** diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build index ce51fa079139..bd3028e51fe9 100644 --- a/toolkit/modules/moz.build +++ b/toolkit/modules/moz.build @@ -11,6 +11,7 @@ MOCHITEST_CHROME_MANIFESTS += ['tests/chrome/chrome.ini'] EXTRA_JS_MODULES += [ 'AsyncShutdown.jsm', + 'BinarySearch.jsm', 'BrowserUtils.jsm', 'CharsetMenu.jsm', 'debug.js', diff --git a/toolkit/modules/tests/xpcshell/test_BinarySearch.js b/toolkit/modules/tests/xpcshell/test_BinarySearch.js new file mode 100644 index 000000000000..1601bffb194e --- /dev/null +++ b/toolkit/modules/tests/xpcshell/test_BinarySearch.js @@ -0,0 +1,81 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +Components.utils.import("resource://gre/modules/BinarySearch.jsm"); + +function run_test() { + // empty array + ok([], 1, false, 0); + + // one-element array + ok([2], 2, true, 0); + ok([2], 1, false, 0); + ok([2], 3, false, 1); + + // two-element array + ok([2, 4], 2, true, 0); + ok([2, 4], 4, true, 1); + ok([2, 4], 1, false, 0); + ok([2, 4], 3, false, 1); + ok([2, 4], 5, false, 2); + + // three-element array + ok([2, 4, 6], 2, true, 0); + ok([2, 4, 6], 4, true, 1); + ok([2, 4, 6], 6, true, 2); + ok([2, 4, 6], 1, false, 0); + ok([2, 4, 6], 3, false, 1); + ok([2, 4, 6], 5, false, 2); + ok([2, 4, 6], 7, false, 3); + + // duplicates + ok([2, 2], 2, true, 0); + ok([2, 2], 1, false, 0); + ok([2, 2], 3, false, 2); + + // duplicates on the left + ok([2, 2, 4], 2, true, 1); + ok([2, 2, 4], 4, true, 2); + ok([2, 2, 4], 1, false, 0); + ok([2, 2, 4], 3, false, 2); + ok([2, 2, 4], 5, false, 3); + + // duplicates on the right + ok([2, 4, 4], 2, true, 0); + ok([2, 4, 4], 4, true, 1); + ok([2, 4, 4], 1, false, 0); + ok([2, 4, 4], 3, false, 1); + ok([2, 4, 4], 5, false, 3); + + // duplicates in the middle + ok([2, 4, 4, 6], 2, true, 0); + ok([2, 4, 4, 6], 4, true, 1); + ok([2, 4, 4, 6], 6, true, 3); + ok([2, 4, 4, 6], 1, false, 0); + ok([2, 4, 4, 6], 3, false, 1); + ok([2, 4, 4, 6], 5, false, 3); + ok([2, 4, 4, 6], 7, false, 4); + + // duplicates all around + ok([2, 2, 4, 4, 6, 6], 2, true, 0); + ok([2, 2, 4, 4, 6, 6], 4, true, 2); + ok([2, 2, 4, 4, 6, 6], 6, true, 4); + ok([2, 2, 4, 4, 6, 6], 1, false, 0); + ok([2, 2, 4, 4, 6, 6], 3, false, 2); + ok([2, 2, 4, 4, 6, 6], 5, false, 4); + ok([2, 2, 4, 4, 6, 6], 7, false, 6); +} + +function ok(array, target, expectedFound, expectedIdx) { + let [found, idx] = BinarySearch.search(array, target, cmp); + do_check_eq(found, expectedFound); + do_check_eq(idx, expectedIdx); + + idx = expectedFound ? expectedIdx : -1; + do_check_eq(BinarySearch.indexOf(array, target, cmp), idx); + do_check_eq(BinarySearch.insertionIndexOf(array, target, cmp), expectedIdx); +} + +function cmp(num1, num2) { + return num1 - num2; +} diff --git a/toolkit/modules/tests/xpcshell/test_NewTabUtils.js b/toolkit/modules/tests/xpcshell/test_NewTabUtils.js new file mode 100644 index 000000000000..b8c6856c0ec4 --- /dev/null +++ b/toolkit/modules/tests/xpcshell/test_NewTabUtils.js @@ -0,0 +1,176 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// See also browser/base/content/test/newtab/. + +const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components; +Cu.import("resource://gre/modules/NewTabUtils.jsm"); +Cu.import("resource://gre/modules/Promise.jsm"); + +function run_test() { + run_next_test(); +} + +add_test(function multipleProviders() { + // Make each provider generate NewTabUtils.links.maxNumLinks links to check + // that no more than maxNumLinks are actually returned in the merged list. + let evenLinks = makeLinks(0, 2 * NewTabUtils.links.maxNumLinks, 2); + let evenProvider = new TestProvider(done => done(evenLinks)); + let oddLinks = makeLinks(0, 2 * NewTabUtils.links.maxNumLinks - 1, 2); + let oddProvider = new TestProvider(done => done(oddLinks)); + + NewTabUtils.initWithoutProviders(); + NewTabUtils.links.addProvider(evenProvider); + NewTabUtils.links.addProvider(oddProvider); + + // This is sync since the providers' getLinks are sync. + NewTabUtils.links.populateCache(function () {}, false); + + let links = NewTabUtils.links.getLinks(); + let expectedLinks = makeLinks(NewTabUtils.links.maxNumLinks, + 2 * NewTabUtils.links.maxNumLinks, + 1); + do_check_eq(links.length, NewTabUtils.links.maxNumLinks); + do_check_links(links, expectedLinks); + + NewTabUtils.links.removeProvider(evenProvider); + NewTabUtils.links.removeProvider(oddProvider); + run_next_test(); +}); + +add_test(function changeLinks() { + let expectedLinks = makeLinks(0, 20, 2); + let provider = new TestProvider(done => done(expectedLinks)); + + NewTabUtils.initWithoutProviders(); + NewTabUtils.links.addProvider(provider); + + // This is sync since the provider's getLinks is sync. + NewTabUtils.links.populateCache(function () {}, false); + + do_check_links(NewTabUtils.links.getLinks(), expectedLinks); + + // Notify of a new link. + let newLink = { + url: "http://example.com/19", + title: "My frecency is 19", + frecency: 19, + lastVisitDate: 0, + }; + expectedLinks.splice(1, 0, newLink); + provider.notifyLinkChanged(newLink); + do_check_links(NewTabUtils.links.getLinks(), expectedLinks); + + // Notify of a link that's changed sort criteria. + newLink.frecency = 17; + expectedLinks.splice(1, 1); + expectedLinks.splice(2, 0, newLink); + provider.notifyLinkChanged({ + url: newLink.url, + frecency: 17, + }); + do_check_links(NewTabUtils.links.getLinks(), expectedLinks); + + // Notify of a link that's changed title. + newLink.title = "My frecency is now 17"; + provider.notifyLinkChanged({ + url: newLink.url, + title: newLink.title, + }); + do_check_links(NewTabUtils.links.getLinks(), expectedLinks); + + // Notify of a new link again, but this time make it overflow maxNumLinks. + provider.maxNumLinks = expectedLinks.length; + newLink = { + url: "http://example.com/21", + frecency: 21, + lastVisitDate: 0, + }; + expectedLinks.unshift(newLink); + expectedLinks.pop(); + do_check_eq(expectedLinks.length, provider.maxNumLinks); // Sanity check. + provider.notifyLinkChanged(newLink); + do_check_links(NewTabUtils.links.getLinks(), expectedLinks); + + // Notify of many links changed. + expectedLinks = makeLinks(0, 3, 1); + provider.notifyManyLinksChanged(); + // NewTabUtils.links will now repopulate its cache, which is sync since + // the provider's getLinks is sync. + do_check_links(NewTabUtils.links.getLinks(), expectedLinks); + + NewTabUtils.links.removeProvider(provider); + run_next_test(); +}); + +add_task(function oneProviderAlreadyCached() { + let links1 = makeLinks(0, 10, 1); + let provider1 = new TestProvider(done => done(links1)); + + NewTabUtils.initWithoutProviders(); + NewTabUtils.links.addProvider(provider1); + + // This is sync since the provider's getLinks is sync. + NewTabUtils.links.populateCache(function () {}, false); + do_check_links(NewTabUtils.links.getLinks(), links1); + + let links2 = makeLinks(10, 20, 1); + let provider2 = new TestProvider(done => done(links2)); + NewTabUtils.links.addProvider(provider2); + + NewTabUtils.links.populateCache(function () {}, false); + do_check_links(NewTabUtils.links.getLinks(), links2.concat(links1)); + + NewTabUtils.links.removeProvider(provider1); + NewTabUtils.links.removeProvider(provider2); +}); + +function TestProvider(getLinksFn) { + this.getLinks = getLinksFn; + this._observers = new Set(); +} + +TestProvider.prototype = { + addObserver: function (observer) { + this._observers.add(observer); + }, + notifyLinkChanged: function (link) { + this._notifyObservers("onLinkChanged", link); + }, + notifyManyLinksChanged: function () { + this._notifyObservers("onManyLinksChanged"); + }, + _notifyObservers: function (observerMethodName, arg) { + for (let obs of this._observers) { + if (obs[observerMethodName]) + obs[observerMethodName](this, arg); + } + }, +}; + +function do_check_links(actualLinks, expectedLinks) { + do_check_true(Array.isArray(actualLinks)); + do_check_eq(actualLinks.length, expectedLinks.length); + for (let i = 0; i < expectedLinks.length; i++) { + let expected = expectedLinks[i]; + let actual = actualLinks[i]; + do_check_eq(actual.url, expected.url); + do_check_eq(actual.title, expected.title); + do_check_eq(actual.frecency, expected.frecency); + do_check_eq(actual.lastVisitDate, expected.lastVisitDate); + } +} + +function makeLinks(frecRangeStart, frecRangeEnd, step) { + let links = []; + // Remember, links are ordered by frecency descending. + for (let i = frecRangeEnd; i > frecRangeStart; i -= step) { + links.push({ + url: "http://example.com/" + i, + title: "My frecency is " + i, + frecency: i, + lastVisitDate: 0, + }); + } + return links; +} diff --git a/toolkit/modules/tests/xpcshell/xpcshell.ini b/toolkit/modules/tests/xpcshell/xpcshell.ini index c4bd72cf2b1e..7c85f29a1622 100644 --- a/toolkit/modules/tests/xpcshell/xpcshell.ini +++ b/toolkit/modules/tests/xpcshell/xpcshell.ini @@ -8,12 +8,14 @@ support-files = zips/zen.zip [test_AsyncShutdown.js] +[test_BinarySearch.js] [test_DeferredTask.js] [test_dict.js] [test_DirectoryLinksProvider.js] [test_FileUtils.js] [test_Http.js] [test_Log.js] +[test_NewTabUtils.js] [test_PermissionsUtils.js] [test_Preferences.js] [test_Promise.js] From 8b6019482c20b8665cfcca7ea11e66767b5cfc2f Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Sun, 30 Mar 2014 11:58:49 -0700 Subject: [PATCH 18/19] Bug 989083 - disable browser_tabview_bug628061.js and browser_tabview_bug650280_perwindowpb.js on Linux debug for leaking until shutdown when they get shoved into browser-chrome-2 CLOSED TREE --- browser/components/tabview/test/browser.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/browser/components/tabview/test/browser.ini b/browser/components/tabview/test/browser.ini index e6a62e33e25c..155a0dd8a818 100644 --- a/browser/components/tabview/test/browser.ini +++ b/browser/components/tabview/test/browser.ini @@ -88,6 +88,7 @@ skip-if = true # Bug 921984, hopefully fixed by bug 930202 [browser_tabview_bug626791.js] [browser_tabview_bug627736.js] [browser_tabview_bug628061.js] +skip-if = os == 'linux'&&debug # bug 989083 [browser_tabview_bug628165.js] [browser_tabview_bug628270.js] [browser_tabview_bug628887.js] @@ -118,6 +119,7 @@ skip-if = true # Bug 752862 [browser_tabview_bug649307.js] [browser_tabview_bug649319.js] [browser_tabview_bug650280_perwindowpb.js] +skip-if = os == 'linux'&&debug # bug 989083 [browser_tabview_bug650573.js] [browser_tabview_bug651311.js] [browser_tabview_bug654295.js] From 5828eecda1490657aff4bb4e31ccefd994828fb3 Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Sun, 30 Mar 2014 12:42:09 -0700 Subject: [PATCH 19/19] Back out ab12037022ef:81f65b2f3d07 (bug 911307) for intermittent Win8 debug failures in its browser_newtab_update.js CLOSED TREE --- browser/base/content/newtab/page.js | 13 +- browser/base/content/test/newtab/browser.ini | 1 - .../test/newtab/browser_newtab_update.js | 52 --- browser/base/content/test/newtab/head.js | 34 +- .../downloads/nsDownloadManager.cpp | 16 - toolkit/components/places/Database.cpp | 2 - toolkit/components/places/History.cpp | 23 +- toolkit/components/places/SQLFunctions.cpp | 58 --- toolkit/components/places/SQLFunctions.h | 37 -- .../places/nsINavHistoryService.idl | 33 +- toolkit/components/places/nsNavBookmarks.cpp | 18 - toolkit/components/places/nsNavHistory.cpp | 196 +------- toolkit/components/places/nsNavHistory.h | 23 - .../components/places/nsNavHistoryResult.cpp | 36 -- .../components/places/nsNavHistoryResult.h | 4 - .../tests/unit/test_frecency_observers.js | 85 ---- .../components/places/tests/unit/xpcshell.ini | 1 - toolkit/modules/BinarySearch.jsm | 74 --- toolkit/modules/NewTabUtils.jsm | 423 ++---------------- toolkit/modules/moz.build | 1 - .../tests/xpcshell/test_BinarySearch.js | 81 ---- .../tests/xpcshell/test_NewTabUtils.js | 176 -------- toolkit/modules/tests/xpcshell/xpcshell.ini | 2 - 23 files changed, 61 insertions(+), 1328 deletions(-) delete mode 100644 browser/base/content/test/newtab/browser_newtab_update.js delete mode 100644 toolkit/components/places/tests/unit/test_frecency_observers.js delete mode 100644 toolkit/modules/BinarySearch.jsm delete mode 100644 toolkit/modules/tests/xpcshell/test_BinarySearch.js delete mode 100644 toolkit/modules/tests/xpcshell/test_NewTabUtils.js diff --git a/browser/base/content/newtab/page.js b/browser/base/content/newtab/page.js index fa0686246733..112f7b8e9ea4 100644 --- a/browser/base/content/newtab/page.js +++ b/browser/base/content/newtab/page.js @@ -36,11 +36,7 @@ let gPage = { * thumbnail service. */ get allowBackgroundCaptures() { - // The preloader is bypassed altogether for private browsing windows, and - // therefore allow-background-captures will not be set. In that case, the - // page is not preloaded and so it's visible, so allow background captures. - return inPrivateBrowsingMode() || - document.documentElement.getAttribute("allow-background-captures") == + return document.documentElement.getAttribute("allow-background-captures") == "true"; }, @@ -69,13 +65,10 @@ let gPage = { /** * Updates the whole page and the grid when the storage has changed. - * @param aOnlyIfHidden If true, the page is updated only if it's hidden in - * the preloader. */ - update: function Page_update(aOnlyIfHidden=false) { - let skipUpdate = aOnlyIfHidden && this.allowBackgroundCaptures; + update: function Page_update() { // The grid might not be ready yet as we initialize it asynchronously. - if (gGrid.ready && !skipUpdate) { + if (gGrid.ready) { gGrid.refresh(); } }, diff --git a/browser/base/content/test/newtab/browser.ini b/browser/base/content/test/newtab/browser.ini index 01ec5ab570da..c7b1c7f9449d 100644 --- a/browser/base/content/test/newtab/browser.ini +++ b/browser/base/content/test/newtab/browser.ini @@ -24,4 +24,3 @@ skip-if = os == "mac" # Intermittent failures, bug 898317 [browser_newtab_tabsync.js] [browser_newtab_undo.js] [browser_newtab_unpin.js] -[browser_newtab_update.js] diff --git a/browser/base/content/test/newtab/browser_newtab_update.js b/browser/base/content/test/newtab/browser_newtab_update.js deleted file mode 100644 index c9c36dfa1354..000000000000 --- a/browser/base/content/test/newtab/browser_newtab_update.js +++ /dev/null @@ -1,52 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -/** - * Checks that newtab is updated as its links change. - */ - -function runTests() { - if (NewTabUtils.allPages.updateScheduledForHiddenPages) { - // Wait for dynamic updates triggered by the previous test to finish. - yield whenPagesUpdated(null, true); - } - - // First, start with an empty page. setLinks will trigger a hidden page - // update because it calls clearHistory. We need to wait for that update to - // happen so that the next time we wait for a page update below, we catch the - // right update and not the one triggered by setLinks. - // - // Why this weird way of yielding? First, these two functions don't return - // promises, they call TestRunner.next when done. Second, the point at which - // setLinks is done is independent of when the page update will happen, so - // calling whenPagesUpdated cannot wait until that time. - setLinks([]); - whenPagesUpdated(null, true); - yield null; - yield null; - - // Strategy: Add some visits, open a new page, check the grid, repeat. - fillHistory([link(1)]); - yield whenPagesUpdated(null, true); - yield addNewTabPageTab(); - checkGrid("1,,,,,,,,"); - - fillHistory([link(2)]); - yield whenPagesUpdated(null, true); - yield addNewTabPageTab(); - checkGrid("2,1,,,,,,,"); - - fillHistory([link(1)]); - yield whenPagesUpdated(null, true); - yield addNewTabPageTab(); - checkGrid("1,2,,,,,,,"); - - fillHistory([link(2), link(3), link(4)]); - yield whenPagesUpdated(null, true); - yield addNewTabPageTab(); - checkGrid("2,1,3,4,,,,,"); -} - -function link(id) { - return { url: "http://example.com/#" + id, title: "site#" + id }; -} diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js index fa298d506873..6df4bff9c620 100644 --- a/browser/base/content/test/newtab/head.js +++ b/browser/base/content/test/newtab/head.js @@ -159,34 +159,20 @@ function clearHistory(aCallback) { function fillHistory(aLinks, aCallback) { let numLinks = aLinks.length; - if (!numLinks) { - if (aCallback) - executeSoon(aCallback); - return; - } - let transitionLink = Ci.nsINavHistoryService.TRANSITION_LINK; - // Important: To avoid test failures due to clock jitter on Windows XP, call - // Date.now() once here, not each time through the loop. - let now = Date.now() * 1000; - - for (let i = 0; i < aLinks.length; i++) { - let link = aLinks[i]; + for (let link of aLinks.reverse()) { let place = { uri: makeURI(link.url), title: link.title, - // Links are secondarily sorted by visit date descending, so decrease the - // visit date as we progress through the array so that links appear in the - // grid in the order they're present in the array. - visits: [{visitDate: now - i, transitionType: transitionLink}] + visits: [{visitDate: Date.now() * 1000, transitionType: transitionLink}] }; PlacesUtils.asyncHistory.updatePlaces(place, { handleError: function () ok(false, "couldn't add visit to history"), handleResult: function () {}, handleCompletion: function () { - if (--numLinks == 0 && aCallback) + if (--numLinks == 0) aCallback(); } }); @@ -517,18 +503,12 @@ function createDragEvent(aEventType, aData) { /** * Resumes testing when all pages have been updated. - * @param aCallback Called when done. If not specified, TestRunner.next is used. - * @param aOnlyIfHidden If true, this resumes testing only when an update that - * applies to pre-loaded, hidden pages is observed. If - * false, this resumes testing when any update is observed. */ -function whenPagesUpdated(aCallback, aOnlyIfHidden=false) { +function whenPagesUpdated(aCallback) { let page = { - update: function (onlyIfHidden=false) { - if (onlyIfHidden == aOnlyIfHidden) { - NewTabUtils.allPages.unregister(this); - executeSoon(aCallback || TestRunner.next); - } + update: function () { + NewTabUtils.allPages.unregister(this); + executeSoon(aCallback || TestRunner.next); } }; diff --git a/toolkit/components/downloads/nsDownloadManager.cpp b/toolkit/components/downloads/nsDownloadManager.cpp index 13508c7402ff..c9c85db5c508 100644 --- a/toolkit/components/downloads/nsDownloadManager.cpp +++ b/toolkit/components/downloads/nsDownloadManager.cpp @@ -2338,22 +2338,6 @@ nsDownloadManager::OnTitleChanged(nsIURI *aURI, return NS_OK; } -NS_IMETHODIMP -nsDownloadManager::OnFrecencyChanged(nsIURI* aURI, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate) -{ - return NS_OK; -} - -NS_IMETHODIMP -nsDownloadManager::OnManyFrecenciesChanged() -{ - return NS_OK; -} - NS_IMETHODIMP nsDownloadManager::OnDeleteURI(nsIURI *aURI, const nsACString& aGUID, diff --git a/toolkit/components/places/Database.cpp b/toolkit/components/places/Database.cpp index 0177b3ed7113..b75d97e43b80 100644 --- a/toolkit/components/places/Database.cpp +++ b/toolkit/components/places/Database.cpp @@ -941,8 +941,6 @@ Database::InitFunctions() NS_ENSURE_SUCCESS(rv, rv); rv = FixupURLFunction::create(mMainConn); NS_ENSURE_SUCCESS(rv, rv); - rv = FrecencyNotificationFunction::create(mMainConn); - NS_ENSURE_SUCCESS(rv, rv); return NS_OK; } diff --git a/toolkit/components/places/History.cpp b/toolkit/components/places/History.cpp index 3e9d9bf1022a..33ea3bde3ce9 100644 --- a/toolkit/components/places/History.cpp +++ b/toolkit/components/places/History.cpp @@ -1185,10 +1185,7 @@ private: if (aPlace.placeId) { stmt = mHistory->GetStatement( "UPDATE moz_places " - "SET frecency = NOTIFY_FRECENCY(" - "CALCULATE_FRECENCY(:page_id), " - "url, guid, hidden, last_visit_date" - ") " + "SET frecency = CALCULATE_FRECENCY(:page_id) " "WHERE id = :page_id" ); NS_ENSURE_STATE(stmt); @@ -1198,9 +1195,7 @@ private: else { stmt = mHistory->GetStatement( "UPDATE moz_places " - "SET frecency = NOTIFY_FRECENCY(" - "CALCULATE_FRECENCY(id), url, guid, hidden, last_visit_date" - ") " + "SET frecency = CALCULATE_FRECENCY(id) " "WHERE url = :page_url" ); NS_ENSURE_STATE(stmt); @@ -2042,14 +2037,13 @@ History::InsertPlace(const VisitData& aPlace) NS_ENSURE_SUCCESS(rv, rv); rv = URIBinder::Bind(stmt, NS_LITERAL_CSTRING("url"), aPlace.spec); NS_ENSURE_SUCCESS(rv, rv); - nsString title = aPlace.title; // Empty strings should have no title, just like nsNavHistory::SetPageTitle. - if (title.IsEmpty()) { + if (aPlace.title.IsEmpty()) { rv = stmt->BindNullByName(NS_LITERAL_CSTRING("title")); } else { - title.Assign(StringHead(aPlace.title, TITLE_LENGTH_MAX)); - rv = stmt->BindStringByName(NS_LITERAL_CSTRING("title"), title); + rv = stmt->BindStringByName(NS_LITERAL_CSTRING("title"), + StringHead(aPlace.title, TITLE_LENGTH_MAX)); } NS_ENSURE_SUCCESS(rv, rv); rv = stmt->BindInt32ByName(NS_LITERAL_CSTRING("typed"), aPlace.typed); @@ -2071,13 +2065,6 @@ History::InsertPlace(const VisitData& aPlace) rv = stmt->Execute(); NS_ENSURE_SUCCESS(rv, rv); - // Post an onFrecencyChanged observer notification. - const nsNavHistory* navHistory = nsNavHistory::GetConstHistoryService(); - NS_ENSURE_STATE(navHistory); - navHistory->DispatchFrecencyChangedNotification(aPlace.spec, frecency, guid, - aPlace.hidden, - aPlace.visitTime); - return NS_OK; } diff --git a/toolkit/components/places/SQLFunctions.cpp b/toolkit/components/places/SQLFunctions.cpp index 62ea36c130f7..f8fd439db9b1 100644 --- a/toolkit/components/places/SQLFunctions.cpp +++ b/toolkit/components/places/SQLFunctions.cpp @@ -749,63 +749,5 @@ namespace places { return NS_OK; } -//////////////////////////////////////////////////////////////////////////////// -//// Frecency Changed Notification Function - - /* static */ - nsresult - FrecencyNotificationFunction::create(mozIStorageConnection *aDBConn) - { - nsRefPtr function = - new FrecencyNotificationFunction(); - nsresult rv = aDBConn->CreateFunction( - NS_LITERAL_CSTRING("notify_frecency"), 5, function - ); - NS_ENSURE_SUCCESS(rv, rv); - - return NS_OK; - } - - NS_IMPL_ISUPPORTS1( - FrecencyNotificationFunction, - mozIStorageFunction - ) - - NS_IMETHODIMP - FrecencyNotificationFunction::OnFunctionCall(mozIStorageValueArray *aArgs, - nsIVariant **_result) - { - uint32_t numArgs; - nsresult rv = aArgs->GetNumEntries(&numArgs); - NS_ENSURE_SUCCESS(rv, rv); - MOZ_ASSERT(numArgs == 5); - - int32_t newFrecency = aArgs->AsInt32(0); - - nsAutoCString spec; - rv = aArgs->GetUTF8String(1, spec); - NS_ENSURE_SUCCESS(rv, rv); - - nsAutoCString guid; - rv = aArgs->GetUTF8String(2, guid); - NS_ENSURE_SUCCESS(rv, rv); - - bool hidden = static_cast(aArgs->AsInt32(3)); - PRTime lastVisitDate = static_cast(aArgs->AsInt64(4)); - - const nsNavHistory* navHistory = nsNavHistory::GetConstHistoryService(); - NS_ENSURE_STATE(navHistory); - navHistory->DispatchFrecencyChangedNotification(spec, newFrecency, guid, - hidden, lastVisitDate); - - nsCOMPtr result = - do_CreateInstance("@mozilla.org/variant;1"); - NS_ENSURE_STATE(result); - rv = result->SetAsInt32(newFrecency); - NS_ENSURE_SUCCESS(rv, rv); - NS_ADDREF(*_result = result); - return NS_OK; - } - } // namespace places } // namespace mozilla diff --git a/toolkit/components/places/SQLFunctions.h b/toolkit/components/places/SQLFunctions.h index 315ce2f4b89c..79f6218b1f24 100644 --- a/toolkit/components/places/SQLFunctions.h +++ b/toolkit/components/places/SQLFunctions.h @@ -280,43 +280,6 @@ public: static nsresult create(mozIStorageConnection *aDBConn); }; - -//////////////////////////////////////////////////////////////////////////////// -//// Frecency Changed Notification Function - -/** - * For a given place, posts a runnable to the main thread that calls - * onFrecencyChanged on nsNavHistory's nsINavHistoryObservers. The passed-in - * newFrecency value is returned unchanged. - * - * @param newFrecency - * The place's new frecency. - * @param url - * The place's URL. - * @param guid - * The place's GUID. - * @param hidden - * The place's hidden boolean. - * @param lastVisitDate - * The place's last visit date. - * @return newFrecency - */ -class FrecencyNotificationFunction MOZ_FINAL : public mozIStorageFunction -{ -public: - NS_DECL_THREADSAFE_ISUPPORTS - NS_DECL_MOZISTORAGEFUNCTION - - /** - * Registers the function with the specified database connection. - * - * @param aDBConn - * The database connection to register with. - */ - static nsresult create(mozIStorageConnection *aDBConn); -}; - - } // namespace places } // namespace storage diff --git a/toolkit/components/places/nsINavHistoryService.idl b/toolkit/components/places/nsINavHistoryService.idl index 7e375114b94e..1a584b8c45a1 100644 --- a/toolkit/components/places/nsINavHistoryService.idl +++ b/toolkit/components/places/nsINavHistoryService.idl @@ -610,7 +610,7 @@ interface nsINavHistoryResult : nsISupports * DANGER! If you are in the middle of a batch transaction, there may be a * database transaction active. You can still access the DB, but be careful. */ -[scriptable, uuid(0f0f45b0-13a1-44ae-a0ab-c6046ec6d4da)] +[scriptable, uuid(45e2970b-9b00-4473-9938-39d6beaf4248)] interface nsINavHistoryObserver : nsISupports { /** @@ -675,37 +675,6 @@ interface nsINavHistoryObserver : nsISupports in AString aPageTitle, in ACString aGUID); - /** - * Called when an individual page's frecency has changed. - * - * This is not called for pages whose frecencies change as the result of some - * large operation where some large or unknown number of frecencies change at - * once. Use onManyFrecenciesChanged to detect such changes. - * - * @param aURI - * The page's URI. - * @param aNewFrecency - * The page's new frecency. - * @param aGUID - * The page's GUID. - * @param aHidden - * True if the page is marked as hidden. - * @param aVisitDate - * The page's last visit date. - */ - void onFrecencyChanged(in nsIURI aURI, - in long aNewFrecency, - in ACString aGUID, - in boolean aHidden, - in PRTime aVisitDate); - - /** - * Called when the frecencies of many pages have changed at once. - * - * onFrecencyChanged is not called for each of those pages. - */ - void onManyFrecenciesChanged(); - /** * Removed by the user. */ diff --git a/toolkit/components/places/nsNavBookmarks.cpp b/toolkit/components/places/nsNavBookmarks.cpp index 7d4f2191d4b0..640483dd2672 100644 --- a/toolkit/components/places/nsNavBookmarks.cpp +++ b/toolkit/components/places/nsNavBookmarks.cpp @@ -2841,24 +2841,6 @@ nsNavBookmarks::OnTitleChanged(nsIURI* aURI, } -NS_IMETHODIMP -nsNavBookmarks::OnFrecencyChanged(nsIURI* aURI, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate) -{ - return NS_OK; -} - - -NS_IMETHODIMP -nsNavBookmarks::OnManyFrecenciesChanged() -{ - return NS_OK; -} - - NS_IMETHODIMP nsNavBookmarks::OnPageChanged(nsIURI* aURI, uint32_t aChangedAttribute, diff --git a/toolkit/components/places/nsNavHistory.cpp b/toolkit/components/places/nsNavHistory.cpp index f2d773032a3c..c48da35912d1 100644 --- a/toolkit/components/places/nsNavHistory.cpp +++ b/toolkit/components/places/nsNavHistory.cpp @@ -535,82 +535,6 @@ nsNavHistory::NotifyTitleChange(nsIURI* aURI, nsINavHistoryObserver, OnTitleChanged(aURI, aTitle, aGUID)); } -void -nsNavHistory::NotifyFrecencyChanged(nsIURI* aURI, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate) -{ - MOZ_ASSERT(!aGUID.IsEmpty()); - NOTIFY_OBSERVERS(mCanNotify, mCacheObservers, mObservers, - nsINavHistoryObserver, - OnFrecencyChanged(aURI, aNewFrecency, aGUID, aHidden, - aLastVisitDate)); -} - -void -nsNavHistory::NotifyManyFrecenciesChanged() -{ - NOTIFY_OBSERVERS(mCanNotify, mCacheObservers, mObservers, - nsINavHistoryObserver, - OnManyFrecenciesChanged()); -} - -namespace { - -class FrecencyNotification : public nsRunnable -{ -public: - FrecencyNotification(const nsACString& aSpec, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate) - : mSpec(aSpec) - , mNewFrecency(aNewFrecency) - , mGUID(aGUID) - , mHidden(aHidden) - , mLastVisitDate(aLastVisitDate) - { - } - - NS_IMETHOD Run() - { - MOZ_ASSERT(NS_IsMainThread(), "Must be called on the main thread"); - nsNavHistory* navHistory = nsNavHistory::GetHistoryService(); - if (navHistory) { - nsCOMPtr uri; - (void)NS_NewURI(getter_AddRefs(uri), mSpec); - navHistory->NotifyFrecencyChanged(uri, mNewFrecency, mGUID, mHidden, - mLastVisitDate); - } - return NS_OK; - } - -private: - nsCString mSpec; - int32_t mNewFrecency; - nsCString mGUID; - bool mHidden; - PRTime mLastVisitDate; -}; - -} // anonymous namespace - -void -nsNavHistory::DispatchFrecencyChangedNotification(const nsACString& aSpec, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate) const -{ - nsCOMPtr notif = new FrecencyNotification(aSpec, aNewFrecency, - aGUID, aHidden, - aLastVisitDate); - (void)NS_DispatchToMainThread(notif); -} - int32_t nsNavHistory::GetDaysOfHistory() { MOZ_ASSERT(NS_IsMainThread(), "This can only be called on the main thread"); @@ -1004,68 +928,32 @@ nsNavHistory::GetHasHistoryEntries(bool* aHasEntries) } -namespace { - -class InvalidateAllFrecenciesCallback : public AsyncStatementCallback -{ -public: - InvalidateAllFrecenciesCallback() - { - } - - NS_IMETHOD HandleCompletion(uint16_t aReason) - { - if (aReason == REASON_FINISHED) { - nsNavHistory *navHistory = nsNavHistory::GetHistoryService(); - NS_ENSURE_STATE(navHistory); - navHistory->NotifyManyFrecenciesChanged(); - } - return NS_OK; - } -}; - -} // anonymous namespace - nsresult nsNavHistory::invalidateFrecencies(const nsCString& aPlaceIdsQueryString) { // Exclude place: queries by setting their frecency to zero. - nsCString invalidFrecenciesSQLFragment( - "UPDATE moz_places SET frecency = " - ); - if (!aPlaceIdsQueryString.IsEmpty()) - invalidFrecenciesSQLFragment.AppendLiteral("NOTIFY_FRECENCY("); - invalidFrecenciesSQLFragment.AppendLiteral( - "(CASE " - "WHEN url BETWEEN 'place:' AND 'place;' " - "THEN 0 " - "ELSE -1 " - "END) " - ); - if (!aPlaceIdsQueryString.IsEmpty()) { - invalidFrecenciesSQLFragment.AppendLiteral( - ", url, guid, hidden, last_visit_date) " - ); - } - invalidFrecenciesSQLFragment.AppendLiteral( + nsAutoCString invalideFrecenciesSQLFragment( + "UPDATE moz_places SET frecency = (CASE " + "WHEN url BETWEEN 'place:' AND 'place;' " + "THEN 0 " + "ELSE -1 " + "END) " "WHERE frecency > 0 " ); + if (!aPlaceIdsQueryString.IsEmpty()) { - invalidFrecenciesSQLFragment.AppendLiteral("AND id IN("); - invalidFrecenciesSQLFragment.Append(aPlaceIdsQueryString); - invalidFrecenciesSQLFragment.AppendLiteral(")"); + invalideFrecenciesSQLFragment.AppendLiteral("AND id IN("); + invalideFrecenciesSQLFragment.Append(aPlaceIdsQueryString); + invalideFrecenciesSQLFragment.AppendLiteral(")"); } - nsRefPtr cb = - aPlaceIdsQueryString.IsEmpty() ? new InvalidateAllFrecenciesCallback() - : nullptr; nsCOMPtr stmt = mDB->GetAsyncStatement( - invalidFrecenciesSQLFragment + invalideFrecenciesSQLFragment ); NS_ENSURE_STATE(stmt); nsCOMPtr ps; - nsresult rv = stmt->ExecuteAsync(cb, getter_AddRefs(ps)); + nsresult rv = stmt->ExecuteAsync(nullptr, getter_AddRefs(ps)); NS_ENSURE_SUCCESS(rv, rv); return NS_OK; @@ -3190,30 +3078,6 @@ nsNavHistory::Observe(nsISupports *aSubject, const char *aTopic, } -namespace { - -class DecayFrecencyCallback : public AsyncStatementTelemetryTimer -{ -public: - DecayFrecencyCallback() - : AsyncStatementTelemetryTimer(Telemetry::PLACES_IDLE_FRECENCY_DECAY_TIME_MS) - { - } - - NS_IMETHOD HandleCompletion(uint16_t aReason) - { - (void)AsyncStatementTelemetryTimer::HandleCompletion(aReason); - if (aReason == REASON_FINISHED) { - nsNavHistory *navHistory = nsNavHistory::GetHistoryService(); - NS_ENSURE_STATE(navHistory); - navHistory->NotifyManyFrecenciesChanged(); - } - return NS_OK; - } -}; - -} // anonymous namespace - nsresult nsNavHistory::DecayFrecency() { @@ -3251,7 +3115,8 @@ nsNavHistory::DecayFrecency() deleteAdaptive.get() }; nsCOMPtr ps; - nsRefPtr cb = new DecayFrecencyCallback(); + nsRefPtr cb = + new AsyncStatementTelemetryTimer(Telemetry::PLACES_IDLE_FRECENCY_DECAY_TIME_MS); rv = mDB->MainConn()->ExecuteAsync(stmts, ArrayLength(stmts), cb, getter_AddRefs(ps)); NS_ENSURE_SUCCESS(rv, rv); @@ -4447,9 +4312,7 @@ nsNavHistory::UpdateFrecency(int64_t aPlaceId) { nsCOMPtr updateFrecencyStmt = mDB->GetAsyncStatement( "UPDATE moz_places " - "SET frecency = NOTIFY_FRECENCY(" - "CALCULATE_FRECENCY(:page_id), url, guid, hidden, last_visit_date" - ") " + "SET frecency = CALCULATE_FRECENCY(:page_id) " "WHERE id = :page_id" ); NS_ENSURE_STATE(updateFrecencyStmt); @@ -4482,31 +4345,6 @@ nsNavHistory::UpdateFrecency(int64_t aPlaceId) } -namespace { - -class FixInvalidFrecenciesCallback : public AsyncStatementCallbackNotifier -{ -public: - FixInvalidFrecenciesCallback() - : AsyncStatementCallbackNotifier(TOPIC_FRECENCY_UPDATED) - { - } - - NS_IMETHOD HandleCompletion(uint16_t aReason) - { - nsresult rv = AsyncStatementCallbackNotifier::HandleCompletion(aReason); - NS_ENSURE_SUCCESS(rv, rv); - if (aReason == REASON_FINISHED) { - nsNavHistory *navHistory = nsNavHistory::GetHistoryService(); - NS_ENSURE_STATE(navHistory); - navHistory->NotifyManyFrecenciesChanged(); - } - return NS_OK; - } -}; - -} // anonymous namespace - nsresult nsNavHistory::FixInvalidFrecencies() { @@ -4517,8 +4355,8 @@ nsNavHistory::FixInvalidFrecencies() ); NS_ENSURE_STATE(stmt); - nsRefPtr callback = - new FixInvalidFrecenciesCallback(); + nsRefPtr callback = + new AsyncStatementCallbackNotifier(TOPIC_FRECENCY_UPDATED); nsCOMPtr ps; (void)stmt->ExecuteAsync(callback, getter_AddRefs(ps)); diff --git a/toolkit/components/places/nsNavHistory.h b/toolkit/components/places/nsNavHistory.h index b2ebcec72b6a..149ce1cc282d 100644 --- a/toolkit/components/places/nsNavHistory.h +++ b/toolkit/components/places/nsNavHistory.h @@ -418,29 +418,6 @@ public: const nsString& title, const nsACString& aGUID); - /** - * Fires onFrecencyChanged event to nsINavHistoryService observers - */ - void NotifyFrecencyChanged(nsIURI* aURI, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate); - - /** - * Fires onManyFrecenciesChanged event to nsINavHistoryService observers - */ - void NotifyManyFrecenciesChanged(); - - /** - * Posts a runnable to the main thread that calls NotifyFrecencyChanged. - */ - void DispatchFrecencyChangedNotification(const nsACString& aSpec, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate) const; - bool isBatching() { return mBatchLevel > 0; } diff --git a/toolkit/components/places/nsNavHistoryResult.cpp b/toolkit/components/places/nsNavHistoryResult.cpp index 817aa90d0cb9..aa7b9d48ee5e 100644 --- a/toolkit/components/places/nsNavHistoryResult.cpp +++ b/toolkit/components/places/nsNavHistoryResult.cpp @@ -2614,24 +2614,6 @@ nsNavHistoryQueryResultNode::OnTitleChanged(nsIURI* aURI, } -NS_IMETHODIMP -nsNavHistoryQueryResultNode::OnFrecencyChanged(nsIURI* aURI, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate) -{ - return NS_OK; -} - - -NS_IMETHODIMP -nsNavHistoryQueryResultNode::OnManyFrecenciesChanged() -{ - return NS_OK; -} - - /** * Here, we can always live update by just deleting all occurrences of * the given URI. @@ -4680,24 +4662,6 @@ nsNavHistoryResult::OnTitleChanged(nsIURI* aURI, } -NS_IMETHODIMP -nsNavHistoryResult::OnFrecencyChanged(nsIURI* aURI, - int32_t aNewFrecency, - const nsACString& aGUID, - bool aHidden, - PRTime aLastVisitDate) -{ - return NS_OK; -} - - -NS_IMETHODIMP -nsNavHistoryResult::OnManyFrecenciesChanged() -{ - return NS_OK; -} - - NS_IMETHODIMP nsNavHistoryResult::OnDeleteURI(nsIURI *aURI, const nsACString& aGUID, diff --git a/toolkit/components/places/nsNavHistoryResult.h b/toolkit/components/places/nsNavHistoryResult.h index bac24871bb41..21aff6528363 100644 --- a/toolkit/components/places/nsNavHistoryResult.h +++ b/toolkit/components/places/nsNavHistoryResult.h @@ -64,10 +64,6 @@ private: NS_DECL_NSINAVBOOKMARKOBSERVER \ NS_IMETHOD OnTitleChanged(nsIURI* aURI, const nsAString& aPageTitle, \ const nsACString& aGUID); \ - NS_IMETHOD OnFrecencyChanged(nsIURI* aURI, int32_t aNewFrecency, \ - const nsACString& aGUID, bool aHidden, \ - PRTime aLastVisitDate); \ - NS_IMETHOD OnManyFrecenciesChanged(); \ NS_IMETHOD OnDeleteURI(nsIURI *aURI, const nsACString& aGUID, \ uint16_t aReason); \ NS_IMETHOD OnClearHistory(); \ diff --git a/toolkit/components/places/tests/unit/test_frecency_observers.js b/toolkit/components/places/tests/unit/test_frecency_observers.js deleted file mode 100644 index f027e98e57cc..000000000000 --- a/toolkit/components/places/tests/unit/test_frecency_observers.js +++ /dev/null @@ -1,85 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -function run_test() { - run_next_test(); -} - -// Each of these tests a path that triggers a frecency update. Together they -// hit all sites that update a frecency. - -// InsertVisitedURIs::UpdateFrecency and History::InsertPlace -add_task(function test_InsertVisitedURIs_UpdateFrecency_and_History_InsertPlace() { - // InsertPlace is at the end of a path that UpdateFrecency is also on, so kill - // two birds with one stone and expect two notifications. Trigger the path by - // adding a download. - let uri = NetUtil.newURI("http://example.com/a"); - Cc["@mozilla.org/browser/download-history;1"]. - getService(Ci.nsIDownloadHistory). - addDownload(uri); - yield Promise.all([onFrecencyChanged(uri), onFrecencyChanged(uri)]); -}); - -// nsNavHistory::UpdateFrecency -add_task(function test_nsNavHistory_UpdateFrecency() { - let bm = PlacesUtils.bookmarks; - let uri = NetUtil.newURI("http://example.com/b"); - bm.insertBookmark(bm.unfiledBookmarksFolder, uri, - Ci.nsINavBookmarksService.DEFAULT_INDEX, "test"); - yield onFrecencyChanged(uri); -}); - -// nsNavHistory::invalidateFrecencies for particular pages -add_task(function test_nsNavHistory_invalidateFrecencies_somePages() { - let uri = NetUtil.newURI("http://test-nsNavHistory-invalidateFrecencies-somePages.com/"); - // Bookmarking the URI is enough to add it to moz_places, and importantly, it - // means that removePagesFromHost doesn't remove it from moz_places, so its - // frecency is able to be changed. - let bm = PlacesUtils.bookmarks; - bm.insertBookmark(bm.unfiledBookmarksFolder, uri, - Ci.nsINavBookmarksService.DEFAULT_INDEX, "test"); - PlacesUtils.history.removePagesFromHost(uri.host, false); - yield onFrecencyChanged(uri); -}); - -// nsNavHistory::invalidateFrecencies for all pages -add_task(function test_nsNavHistory_invalidateFrecencies_allPages() { - PlacesUtils.history.removeAllPages(); - yield onManyFrecenciesChanged(); -}); - -// nsNavHistory::DecayFrecency and nsNavHistory::FixInvalidFrecencies -add_task(function test_nsNavHistory_DecayFrecency_and_nsNavHistory_FixInvalidFrecencies() { - // FixInvalidFrecencies is at the end of a path that DecayFrecency is also on, - // so expect two notifications. Trigger the path by making nsNavHistory - // observe the idle-daily notification. - PlacesUtils.history.QueryInterface(Ci.nsIObserver). - observe(null, "idle-daily", ""); - yield Promise.all([onManyFrecenciesChanged(), onManyFrecenciesChanged()]); -}); - -function onFrecencyChanged(expectedURI) { - let deferred = Promise.defer(); - let obs = new NavHistoryObserver(); - obs.onFrecencyChanged = - (uri, newFrecency, guid, hidden, visitDate) => { - PlacesUtils.history.removeObserver(obs); - do_check_true(!!uri); - do_check_true(uri.equals(expectedURI)); - deferred.resolve(); - }; - PlacesUtils.history.addObserver(obs, false); - return deferred.promise; -} - -function onManyFrecenciesChanged() { - let deferred = Promise.defer(); - let obs = new NavHistoryObserver(); - obs.onManyFrecenciesChanged = () => { - PlacesUtils.history.removeObserver(obs); - do_check_true(true); - deferred.resolve(); - }; - PlacesUtils.history.addObserver(obs, false); - return deferred.promise; -} diff --git a/toolkit/components/places/tests/unit/xpcshell.ini b/toolkit/components/places/tests/unit/xpcshell.ini index 3165288b9b1c..2389aff76b49 100644 --- a/toolkit/components/places/tests/unit/xpcshell.ini +++ b/toolkit/components/places/tests/unit/xpcshell.ini @@ -113,7 +113,6 @@ skip-if = true [test_null_interfaces.js] [test_onItemChanged_tags.js] [test_pageGuid_bookmarkGuid.js] -[test_frecency_observers.js] [test_placeURIs.js] [test_PlacesUtils_asyncGetBookmarkIds.js] [test_PlacesUtils_lazyobservers.js] diff --git a/toolkit/modules/BinarySearch.jsm b/toolkit/modules/BinarySearch.jsm deleted file mode 100644 index b07879b78eab..000000000000 --- a/toolkit/modules/BinarySearch.jsm +++ /dev/null @@ -1,74 +0,0 @@ -/* 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/. */ - -"use strict"; - -this.EXPORTED_SYMBOLS = [ - "BinarySearch", -]; - -this.BinarySearch = Object.freeze({ - - /** - * Returns the index of the given target in the given array or -1 if the - * target is not found. - * - * See search() for a description of this function's parameters. - * - * @return The index of `target` in `array` or -1 if `target` is not found. - */ - indexOf: function (array, target, comparator) { - let [found, idx] = this.search(array, target, comparator); - return found ? idx : -1; - }, - - /** - * Returns the index within the given array where the given target may be - * inserted to keep the array ordered. - * - * See search() for a description of this function's parameters. - * - * @return The index in `array` where `target` may be inserted to keep `array` - * ordered. - */ - insertionIndexOf: function (array, target, comparator) { - return this.search(array, target, comparator)[1]; - }, - - /** - * Searches for the given target in the given array. - * - * @param array - * An array whose elements are ordered by `comparator`. - * @param target - * The value to search for. - * @param comparator - * A function that takes two arguments and compares them, returning a - * negative number if the first should be ordered before the second, - * zero if the first and second have the same ordering, or a positive - * number if the second should be ordered before the first. The first - * argument is always `target`, and the second argument is a value - * from the array. - * @return An array with two elements. If `target` is found, the first - * element is true, and the second element is its index in the array. - * If `target` is not found, the first element is false, and the - * second element is the index where it may be inserted to keep the - * array ordered. - */ - search: function (array, target, comparator) { - let low = 0; - let high = array.length - 1; - while (low <= high) { - let mid = Math.floor((low + high) / 2); - let cmp = comparator(target, array[mid]); - if (cmp == 0) - return [true, mid]; - if (cmp < 0) - high = mid - 1; - else - low = mid + 1; - } - return [false, low]; - }, -}); diff --git a/toolkit/modules/NewTabUtils.jsm b/toolkit/modules/NewTabUtils.jsm index 5fbc3119aa92..45a077db70db 100644 --- a/toolkit/modules/NewTabUtils.jsm +++ b/toolkit/modules/NewTabUtils.jsm @@ -19,13 +19,6 @@ XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils", XPCOMUtils.defineLazyModuleGetter(this, "PageThumbs", "resource://gre/modules/PageThumbs.jsm"); -XPCOMUtils.defineLazyModuleGetter(this, "BinarySearch", - "resource://gre/modules/BinarySearch.jsm"); - -XPCOMUtils.defineLazyGetter(this, "Timer", () => { - return Cu.import("resource://gre/modules/Timer.jsm", {}); -}); - XPCOMUtils.defineLazyGetter(this, "gPrincipal", function () { let uri = Services.io.newURI("about:newtab", null, null); return Services.scriptSecurityManager.getNoAppCodebasePrincipal(uri); @@ -51,18 +44,12 @@ const PREF_NEWTAB_ROWS = "browser.newtabpage.rows"; // The preference that tells the number of columns of the newtab grid. const PREF_NEWTAB_COLUMNS = "browser.newtabpage.columns"; -// The maximum number of results PlacesProvider retrieves from history. +// The maximum number of results we want to retrieve from history. const HISTORY_RESULTS_LIMIT = 100; -// The maximum number of links Links.getLinks will return. -const LINKS_GET_LINKS_LIMIT = 100; - // The gather telemetry topic. const TOPIC_GATHER_TELEMETRY = "gather-telemetry"; -// The amount of time we wait while coalescing updates for hidden pages. -const SCHEDULE_UPDATE_TIMEOUT_MS = 1000; - /** * Calculate the MD5 hash for a string. * @param aValue @@ -257,34 +244,14 @@ let AllPages = { /** * Updates all currently active pages but the given one. * @param aExceptPage The page to exclude from updating. - * @param aHiddenPagesOnly If true, only pages hidden in the preloader are - * updated. */ - update: function AllPages_update(aExceptPage, aHiddenPagesOnly=false) { + update: function AllPages_update(aExceptPage) { this._pages.forEach(function (aPage) { if (aExceptPage != aPage) - aPage.update(aHiddenPagesOnly); + aPage.update(); }); }, - /** - * Many individual link changes may happen in a small amount of time over - * multiple turns of the event loop. This method coalesces updates by waiting - * a small amount of time before updating hidden pages. - */ - scheduleUpdateForHiddenPages: function AllPages_scheduleUpdateForHiddenPages() { - if (!this._scheduleUpdateTimeout) { - this._scheduleUpdateTimeout = Timer.setTimeout(() => { - delete this._scheduleUpdateTimeout; - this.update(null, true); - }, SCHEDULE_UPDATE_TIMEOUT_MS); - } - }, - - get updateScheduledForHiddenPages() { - return !!this._scheduleUpdateTimeout; - }, - /** * Implements the nsIObserver interface to get notified when the preference * value changes or when a new copy of a page thumbnail is available. @@ -537,25 +504,13 @@ let BlockedLinks = { * the history to retrieve the most frequently visited sites. */ let PlacesProvider = { - /** - * Set this to change the maximum number of links the provider will provide. - */ - maxNumLinks: HISTORY_RESULTS_LIMIT, - - /** - * Must be called before the provider is used. - */ - init: function PlacesProvider_init() { - PlacesUtils.history.addObserver(this, true); - }, - /** * Gets the current set of links delivered by this provider. * @param aCallback The function that the array of links is passed to. */ getLinks: function PlacesProvider_getLinks(aCallback) { let options = PlacesUtils.history.getNewQueryOptions(); - options.maxResults = this.maxNumLinks; + options.maxResults = HISTORY_RESULTS_LIMIT; // Sort by frecency, descending. options.sortingMode = Ci.nsINavHistoryQueryOptions.SORT_BY_FRECENCY_DESCENDING @@ -570,14 +525,7 @@ let PlacesProvider = { let url = row.getResultByIndex(1); if (LinkChecker.checkLoadURI(url)) { let title = row.getResultByIndex(2); - let frecency = row.getResultByIndex(12); - let lastVisitDate = row.getResultByIndex(5); - links.push({ - url: url, - title: title, - frecency: frecency, - lastVisitDate: lastVisitDate, - }); + links.push({url: url, title: title}); } } }, @@ -588,26 +536,6 @@ let PlacesProvider = { }, handleCompletion: function (aReason) { - // The Places query breaks ties in frecency by place ID descending, but - // that's different from how Links.compareLinks breaks ties, because - // compareLinks doesn't have access to place IDs. It's very important - // that the initial list of links is sorted in the same order imposed by - // compareLinks, because Links uses compareLinks to perform binary - // searches on the list. So, ensure the list is so ordered. - let i = 1; - let outOfOrder = []; - while (i < links.length) { - if (Links.compareLinks(links[i - 1], links[i]) > 0) - outOfOrder.push(links.splice(i, 1)[0]); - else - i++; - } - for (let link of outOfOrder) { - i = BinarySearch.insertionIndexOf(links, link, - Links.compareLinks.bind(Links)); - links.splice(i, 0, link); - } - aCallback(links); } }; @@ -616,116 +544,28 @@ let PlacesProvider = { let query = PlacesUtils.history.getNewQuery(); let db = PlacesUtils.history.QueryInterface(Ci.nsPIPlacesDatabase); db.asyncExecuteLegacyQueries([query], 1, options, callback); - }, - - /** - * Registers an object that will be notified when the provider's links change. - * @param aObserver An object with the following optional properties: - * * onLinkChanged: A function that's called when a single link - * changes. It's passed the provider and the link object. Only the - * link's `url` property is guaranteed to be present. If its `title` - * property is present, then its title has changed, and the - * property's value is the new title. If any sort properties are - * present, then its position within the provider's list of links may - * have changed, and the properties' values are the new sort-related - * values. Note that this link may not necessarily have been present - * in the lists returned from any previous calls to getLinks. - * * onManyLinksChanged: A function that's called when many links - * change at once. It's passed the provider. You should call - * getLinks to get the provider's new list of links. - */ - addObserver: function PlacesProvider_addObserver(aObserver) { - this._observers.push(aObserver); - }, - - _observers: [], - - /** - * Called by the history service. - */ - onFrecencyChanged: function PlacesProvider_onFrecencyChanged(aURI, aNewFrecency, aGUID, aHidden, aLastVisitDate) { - // The implementation of the query in getLinks excludes hidden and - // unvisited pages, so it's important to exclude them here, too. - if (!aHidden && aLastVisitDate) { - this._callObservers("onLinkChanged", { - url: aURI.spec, - frecency: aNewFrecency, - lastVisitDate: aLastVisitDate, - }); - } - }, - - /** - * Called by the history service. - */ - onManyFrecenciesChanged: function PlacesProvider_onManyFrecenciesChanged() { - this._callObservers("onManyLinksChanged"); - }, - - /** - * Called by the history service. - */ - onTitleChanged: function PlacesProvider_onTitleChanged(aURI, aNewTitle, aGUID) { - this._callObservers("onLinkChanged", { - url: aURI.spec, - title: aNewTitle - }); - }, - - _callObservers: function PlacesProvider__callObservers(aMethodName, aArg) { - for (let obs of this._observers) { - if (obs[aMethodName]) { - try { - obs[aMethodName](this, aArg); - } catch (err) { - Cu.reportError(err); - } - } - } - }, - - QueryInterface: XPCOMUtils.generateQI([Ci.nsINavHistoryObserver, - Ci.nsISupportsWeakReference]), + } }; /** * Singleton that provides access to all links contained in the grid (including - * the ones that don't fit on the grid). A link is a plain object that looks - * like this: + * the ones that don't fit on the grid). A link is a plain object with title + * and url properties. * - * { - * url: "http://www.mozilla.org/", - * title: "Mozilla", - * frecency: 1337, - * lastVisitDate: 1394678824766431, - * } + * Example: + * + * {url: "http://www.mozilla.org/", title: "Mozilla"} */ let Links = { /** - * The maximum number of links returned by getLinks. + * The links cache. */ - maxNumLinks: LINKS_GET_LINKS_LIMIT, + _links: null, /** - * The link providers. + * The default provider for links. */ - _providers: new Set(), - - /** - * A mapping from each provider to an object { sortedLinks, linkMap }. - * sortedLinks is the cached, sorted array of links for the provider. linkMap - * is a Map from link URLs to link objects. - */ - _providerLinks: new Map(), - - /** - * The properties of link objects used to sort them. - */ - _sortProperties: [ - "frecency", - "lastVisitDate", - "url", - ], + _provider: PlacesProvider, /** * List of callbacks waiting for the cache to be populated. @@ -733,26 +573,7 @@ let Links = { _populateCallbacks: [], /** - * Adds a link provider. - * @param aProvider The link provider. - */ - addProvider: function Links_addProvider(aProvider) { - this._providers.add(aProvider); - aProvider.addObserver(this); - }, - - /** - * Removes a link provider. - * @param aProvider The link provider. - */ - removeProvider: function Links_removeProvider(aProvider) { - if (!this._providers.delete(aProvider)) - throw new Error("Unknown provider"); - this._providerLinks.delete(aProvider); - }, - - /** - * Populates the cache with fresh links from the providers. + * Populates the cache with fresh links from the current provider. * @param aCallback The callback to call when finished (optional). * @param aForce When true, populates the cache even when it's already filled. */ @@ -780,15 +601,16 @@ let Links = { } } - let numProvidersRemaining = this._providers.size; - for (let provider of this._providers) { - this._populateProviderCache(provider, () => { - if (--numProvidersRemaining == 0) - executeCallbacks(); - }, aForce); - } + if (this._links && !aForce) { + executeCallbacks(); + } else { + this._provider.getLinks(function (aLinks) { + this._links = aLinks; + executeCallbacks(); + }.bind(this)); - this._addObserver(); + this._addObserver(); + } }, /** @@ -797,10 +619,9 @@ let Links = { */ getLinks: function Links_getLinks() { let pinnedLinks = Array.slice(PinnedLinks.links); - let links = this._getMergedProviderLinks(); // Filter blocked and pinned links. - links = links.filter(function (link) { + let links = (this._links || []).filter(function (link) { return !BlockedLinks.isBlocked(link) && !PinnedLinks.isPinned(link); }); @@ -820,186 +641,7 @@ let Links = { * Resets the links cache. */ resetCache: function Links_resetCache() { - this._providerLinks.clear(); - }, - - /** - * Compares two links. - * @param aLink1 The first link. - * @param aLink2 The second link. - * @return A negative number if aLink1 is ordered before aLink2, zero if - * aLink1 and aLink2 have the same ordering, or a positive number if - * aLink1 is ordered after aLink2. - */ - compareLinks: function Links_compareLinks(aLink1, aLink2) { - for (let prop of this._sortProperties) { - if (!(prop in aLink1) || !(prop in aLink2)) - throw new Error("Comparable link missing required property: " + prop); - } - return aLink2.frecency - aLink1.frecency || - aLink2.lastVisitDate - aLink1.lastVisitDate || - aLink1.url.localeCompare(aLink2.url); - }, - - /** - * Calls getLinks on the given provider and populates our cache for it. - * @param aProvider The provider whose cache will be populated. - * @param aCallback The callback to call when finished. - * @param aForce When true, populates the provider's cache even when it's - * already filled. - */ - _populateProviderCache: function Links_populateProviderCache(aProvider, aCallback, aForce) { - if (this._providerLinks.has(aProvider) && !aForce) { - aCallback(); - } else { - aProvider.getLinks(links => { - // Filter out null and undefined links so we don't have to deal with - // them in getLinks when merging links from providers. - links = links.filter((link) => !!link); - this._providerLinks.set(aProvider, { - sortedLinks: links, - linkMap: links.reduce((map, link) => { - map.set(link.url, link); - return map; - }, new Map()), - }); - aCallback(); - }); - } - }, - - /** - * Merges the cached lists of links from all providers whose lists are cached. - * @return The merged list. - */ - _getMergedProviderLinks: function Links__getMergedProviderLinks() { - // Build a list containing a copy of each provider's sortedLinks list. - let linkLists = []; - for (let links of this._providerLinks.values()) { - linkLists.push(links.sortedLinks.slice()); - } - - function getNextLink() { - let minLinks = null; - for (let links of linkLists) { - if (links.length && - (!minLinks || Links.compareLinks(links[0], minLinks[0]) < 0)) - minLinks = links; - } - return minLinks ? minLinks.shift() : null; - } - - let finalLinks = []; - for (let nextLink = getNextLink(); - nextLink && finalLinks.length < this.maxNumLinks; - nextLink = getNextLink()) { - finalLinks.push(nextLink); - } - - return finalLinks; - }, - - /** - * Called by a provider to notify us when a single link changes. - * @param aProvider The provider whose link changed. - * @param aLink The link that changed. If the link is new, it must have all - * of the _sortProperties. Otherwise, it may have as few or as - * many as is convenient. - */ - onLinkChanged: function Links_onLinkChanged(aProvider, aLink) { - if (!("url" in aLink)) - throw new Error("Changed links must have a url property"); - - let links = this._providerLinks.get(aProvider); - if (!links) - // This is not an error, it just means that between the time the provider - // was added and the future time we call getLinks on it, it notified us of - // a change. - return; - - let { sortedLinks, linkMap } = links; - - // Nothing to do if the list is full and the link isn't in it and shouldn't - // be in it. - if (!linkMap.has(aLink.url) && - sortedLinks.length && - sortedLinks.length == aProvider.maxNumLinks) { - let lastLink = sortedLinks[sortedLinks.length - 1]; - if (this.compareLinks(lastLink, aLink) < 0) - return; - } - - let updatePages = false; - - // Update the title in O(1). - if ("title" in aLink) { - let link = linkMap.get(aLink.url); - if (link && link.title != aLink.title) { - link.title = aLink.title; - updatePages = true; - } - } - - // Update the link's position in O(lg n). - if (this._sortProperties.some((prop) => prop in aLink)) { - let link = linkMap.get(aLink.url); - if (link) { - // The link is already in the list. - let idx = this._indexOf(sortedLinks, link); - if (idx < 0) - throw new Error("Link should be in _sortedLinks if in _linkMap"); - sortedLinks.splice(idx, 1); - for (let prop of this._sortProperties) { - if (prop in aLink) - link[prop] = aLink[prop]; - } - } - else { - // The link is new. - for (let prop of this._sortProperties) { - if (!(prop in aLink)) - throw new Error("New link missing required sort property: " + prop); - } - // Copy the link object so that if the caller changes it, it doesn't - // screw up our bookkeeping. - link = {}; - for (let [prop, val] of Iterator(aLink)) { - link[prop] = val; - } - linkMap.set(link.url, link); - } - let idx = this._insertionIndexOf(sortedLinks, link); - sortedLinks.splice(idx, 0, link); - if (sortedLinks.length > aProvider.maxNumLinks) { - let lastLink = sortedLinks.pop(); - linkMap.delete(lastLink.url); - } - updatePages = true; - } - - if (updatePages) - AllPages.scheduleUpdateForHiddenPages(); - }, - - /** - * Called by a provider to notify us when many links change. - */ - onManyLinksChanged: function Links_onManyLinksChanged(aProvider) { - this._populateProviderCache(aProvider, () => { - AllPages.scheduleUpdateForHiddenPages(); - }, true); - }, - - _indexOf: function Links__indexOf(aArray, aLink) { - return this._binsearch(aArray, aLink, "indexOf"); - }, - - _insertionIndexOf: function Links__insertionIndexOf(aArray, aLink) { - return this._binsearch(aArray, aLink, "insertionIndexOf"); - }, - - _binsearch: function Links__binsearch(aArray, aLink, aMethod) { - return BinarySearch[aMethod](aArray, aLink, this.compareLinks.bind(this)); + this._links = null; }, /** @@ -1012,7 +654,7 @@ let Links = { if (AllPages.length && AllPages.enabled) this.populateCache(function () { AllPages.update() }, true); else - this.resetCache(); + this._links = null; }, /** @@ -1132,20 +774,11 @@ this.NewTabUtils = { _initialized: false, init: function NewTabUtils_init() { - if (this.initWithoutProviders()) { - PlacesProvider.init(); - Links.addProvider(PlacesProvider); - } - }, - - initWithoutProviders: function NewTabUtils_initWithoutProviders() { if (!this._initialized) { this._initialized = true; ExpirationFilter.init(); Telemetry.init(); - return true; } - return false; }, /** diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build index bd3028e51fe9..ce51fa079139 100644 --- a/toolkit/modules/moz.build +++ b/toolkit/modules/moz.build @@ -11,7 +11,6 @@ MOCHITEST_CHROME_MANIFESTS += ['tests/chrome/chrome.ini'] EXTRA_JS_MODULES += [ 'AsyncShutdown.jsm', - 'BinarySearch.jsm', 'BrowserUtils.jsm', 'CharsetMenu.jsm', 'debug.js', diff --git a/toolkit/modules/tests/xpcshell/test_BinarySearch.js b/toolkit/modules/tests/xpcshell/test_BinarySearch.js deleted file mode 100644 index 1601bffb194e..000000000000 --- a/toolkit/modules/tests/xpcshell/test_BinarySearch.js +++ /dev/null @@ -1,81 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - * http://creativecommons.org/publicdomain/zero/1.0/ */ - -Components.utils.import("resource://gre/modules/BinarySearch.jsm"); - -function run_test() { - // empty array - ok([], 1, false, 0); - - // one-element array - ok([2], 2, true, 0); - ok([2], 1, false, 0); - ok([2], 3, false, 1); - - // two-element array - ok([2, 4], 2, true, 0); - ok([2, 4], 4, true, 1); - ok([2, 4], 1, false, 0); - ok([2, 4], 3, false, 1); - ok([2, 4], 5, false, 2); - - // three-element array - ok([2, 4, 6], 2, true, 0); - ok([2, 4, 6], 4, true, 1); - ok([2, 4, 6], 6, true, 2); - ok([2, 4, 6], 1, false, 0); - ok([2, 4, 6], 3, false, 1); - ok([2, 4, 6], 5, false, 2); - ok([2, 4, 6], 7, false, 3); - - // duplicates - ok([2, 2], 2, true, 0); - ok([2, 2], 1, false, 0); - ok([2, 2], 3, false, 2); - - // duplicates on the left - ok([2, 2, 4], 2, true, 1); - ok([2, 2, 4], 4, true, 2); - ok([2, 2, 4], 1, false, 0); - ok([2, 2, 4], 3, false, 2); - ok([2, 2, 4], 5, false, 3); - - // duplicates on the right - ok([2, 4, 4], 2, true, 0); - ok([2, 4, 4], 4, true, 1); - ok([2, 4, 4], 1, false, 0); - ok([2, 4, 4], 3, false, 1); - ok([2, 4, 4], 5, false, 3); - - // duplicates in the middle - ok([2, 4, 4, 6], 2, true, 0); - ok([2, 4, 4, 6], 4, true, 1); - ok([2, 4, 4, 6], 6, true, 3); - ok([2, 4, 4, 6], 1, false, 0); - ok([2, 4, 4, 6], 3, false, 1); - ok([2, 4, 4, 6], 5, false, 3); - ok([2, 4, 4, 6], 7, false, 4); - - // duplicates all around - ok([2, 2, 4, 4, 6, 6], 2, true, 0); - ok([2, 2, 4, 4, 6, 6], 4, true, 2); - ok([2, 2, 4, 4, 6, 6], 6, true, 4); - ok([2, 2, 4, 4, 6, 6], 1, false, 0); - ok([2, 2, 4, 4, 6, 6], 3, false, 2); - ok([2, 2, 4, 4, 6, 6], 5, false, 4); - ok([2, 2, 4, 4, 6, 6], 7, false, 6); -} - -function ok(array, target, expectedFound, expectedIdx) { - let [found, idx] = BinarySearch.search(array, target, cmp); - do_check_eq(found, expectedFound); - do_check_eq(idx, expectedIdx); - - idx = expectedFound ? expectedIdx : -1; - do_check_eq(BinarySearch.indexOf(array, target, cmp), idx); - do_check_eq(BinarySearch.insertionIndexOf(array, target, cmp), expectedIdx); -} - -function cmp(num1, num2) { - return num1 - num2; -} diff --git a/toolkit/modules/tests/xpcshell/test_NewTabUtils.js b/toolkit/modules/tests/xpcshell/test_NewTabUtils.js deleted file mode 100644 index b8c6856c0ec4..000000000000 --- a/toolkit/modules/tests/xpcshell/test_NewTabUtils.js +++ /dev/null @@ -1,176 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -// See also browser/base/content/test/newtab/. - -const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components; -Cu.import("resource://gre/modules/NewTabUtils.jsm"); -Cu.import("resource://gre/modules/Promise.jsm"); - -function run_test() { - run_next_test(); -} - -add_test(function multipleProviders() { - // Make each provider generate NewTabUtils.links.maxNumLinks links to check - // that no more than maxNumLinks are actually returned in the merged list. - let evenLinks = makeLinks(0, 2 * NewTabUtils.links.maxNumLinks, 2); - let evenProvider = new TestProvider(done => done(evenLinks)); - let oddLinks = makeLinks(0, 2 * NewTabUtils.links.maxNumLinks - 1, 2); - let oddProvider = new TestProvider(done => done(oddLinks)); - - NewTabUtils.initWithoutProviders(); - NewTabUtils.links.addProvider(evenProvider); - NewTabUtils.links.addProvider(oddProvider); - - // This is sync since the providers' getLinks are sync. - NewTabUtils.links.populateCache(function () {}, false); - - let links = NewTabUtils.links.getLinks(); - let expectedLinks = makeLinks(NewTabUtils.links.maxNumLinks, - 2 * NewTabUtils.links.maxNumLinks, - 1); - do_check_eq(links.length, NewTabUtils.links.maxNumLinks); - do_check_links(links, expectedLinks); - - NewTabUtils.links.removeProvider(evenProvider); - NewTabUtils.links.removeProvider(oddProvider); - run_next_test(); -}); - -add_test(function changeLinks() { - let expectedLinks = makeLinks(0, 20, 2); - let provider = new TestProvider(done => done(expectedLinks)); - - NewTabUtils.initWithoutProviders(); - NewTabUtils.links.addProvider(provider); - - // This is sync since the provider's getLinks is sync. - NewTabUtils.links.populateCache(function () {}, false); - - do_check_links(NewTabUtils.links.getLinks(), expectedLinks); - - // Notify of a new link. - let newLink = { - url: "http://example.com/19", - title: "My frecency is 19", - frecency: 19, - lastVisitDate: 0, - }; - expectedLinks.splice(1, 0, newLink); - provider.notifyLinkChanged(newLink); - do_check_links(NewTabUtils.links.getLinks(), expectedLinks); - - // Notify of a link that's changed sort criteria. - newLink.frecency = 17; - expectedLinks.splice(1, 1); - expectedLinks.splice(2, 0, newLink); - provider.notifyLinkChanged({ - url: newLink.url, - frecency: 17, - }); - do_check_links(NewTabUtils.links.getLinks(), expectedLinks); - - // Notify of a link that's changed title. - newLink.title = "My frecency is now 17"; - provider.notifyLinkChanged({ - url: newLink.url, - title: newLink.title, - }); - do_check_links(NewTabUtils.links.getLinks(), expectedLinks); - - // Notify of a new link again, but this time make it overflow maxNumLinks. - provider.maxNumLinks = expectedLinks.length; - newLink = { - url: "http://example.com/21", - frecency: 21, - lastVisitDate: 0, - }; - expectedLinks.unshift(newLink); - expectedLinks.pop(); - do_check_eq(expectedLinks.length, provider.maxNumLinks); // Sanity check. - provider.notifyLinkChanged(newLink); - do_check_links(NewTabUtils.links.getLinks(), expectedLinks); - - // Notify of many links changed. - expectedLinks = makeLinks(0, 3, 1); - provider.notifyManyLinksChanged(); - // NewTabUtils.links will now repopulate its cache, which is sync since - // the provider's getLinks is sync. - do_check_links(NewTabUtils.links.getLinks(), expectedLinks); - - NewTabUtils.links.removeProvider(provider); - run_next_test(); -}); - -add_task(function oneProviderAlreadyCached() { - let links1 = makeLinks(0, 10, 1); - let provider1 = new TestProvider(done => done(links1)); - - NewTabUtils.initWithoutProviders(); - NewTabUtils.links.addProvider(provider1); - - // This is sync since the provider's getLinks is sync. - NewTabUtils.links.populateCache(function () {}, false); - do_check_links(NewTabUtils.links.getLinks(), links1); - - let links2 = makeLinks(10, 20, 1); - let provider2 = new TestProvider(done => done(links2)); - NewTabUtils.links.addProvider(provider2); - - NewTabUtils.links.populateCache(function () {}, false); - do_check_links(NewTabUtils.links.getLinks(), links2.concat(links1)); - - NewTabUtils.links.removeProvider(provider1); - NewTabUtils.links.removeProvider(provider2); -}); - -function TestProvider(getLinksFn) { - this.getLinks = getLinksFn; - this._observers = new Set(); -} - -TestProvider.prototype = { - addObserver: function (observer) { - this._observers.add(observer); - }, - notifyLinkChanged: function (link) { - this._notifyObservers("onLinkChanged", link); - }, - notifyManyLinksChanged: function () { - this._notifyObservers("onManyLinksChanged"); - }, - _notifyObservers: function (observerMethodName, arg) { - for (let obs of this._observers) { - if (obs[observerMethodName]) - obs[observerMethodName](this, arg); - } - }, -}; - -function do_check_links(actualLinks, expectedLinks) { - do_check_true(Array.isArray(actualLinks)); - do_check_eq(actualLinks.length, expectedLinks.length); - for (let i = 0; i < expectedLinks.length; i++) { - let expected = expectedLinks[i]; - let actual = actualLinks[i]; - do_check_eq(actual.url, expected.url); - do_check_eq(actual.title, expected.title); - do_check_eq(actual.frecency, expected.frecency); - do_check_eq(actual.lastVisitDate, expected.lastVisitDate); - } -} - -function makeLinks(frecRangeStart, frecRangeEnd, step) { - let links = []; - // Remember, links are ordered by frecency descending. - for (let i = frecRangeEnd; i > frecRangeStart; i -= step) { - links.push({ - url: "http://example.com/" + i, - title: "My frecency is " + i, - frecency: i, - lastVisitDate: 0, - }); - } - return links; -} diff --git a/toolkit/modules/tests/xpcshell/xpcshell.ini b/toolkit/modules/tests/xpcshell/xpcshell.ini index 7c85f29a1622..c4bd72cf2b1e 100644 --- a/toolkit/modules/tests/xpcshell/xpcshell.ini +++ b/toolkit/modules/tests/xpcshell/xpcshell.ini @@ -8,14 +8,12 @@ support-files = zips/zen.zip [test_AsyncShutdown.js] -[test_BinarySearch.js] [test_DeferredTask.js] [test_dict.js] [test_DirectoryLinksProvider.js] [test_FileUtils.js] [test_Http.js] [test_Log.js] -[test_NewTabUtils.js] [test_PermissionsUtils.js] [test_Preferences.js] [test_Promise.js]