Index: head/www/Makefile =================================================================== --- head/www/Makefile (revision 454948) +++ head/www/Makefile (revision 454949) @@ -1,2565 +1,2566 @@ # $FreeBSD$ # COMMENT = Ports related to the World Wide Web SUBDIR += R-cran-RgoogleMaps SUBDIR += R-cran-Rook SUBDIR += R-cran-downloader SUBDIR += R-cran-htmlwidgets SUBDIR += R-cran-httpuv SUBDIR += R-cran-httr SUBDIR += R-cran-rvest SUBDIR += R-cran-scrapeR SUBDIR += R-cran-selectr SUBDIR += R-cran-shiny SUBDIR += UniversalFeedCreator SUBDIR += WebMagick SUBDIR += ach SUBDIR += adzap SUBDIR += alef-webfont SUBDIR += amphetadesk SUBDIR += analog SUBDIR += anyremote2html SUBDIR += anyterm SUBDIR += apache-forrest SUBDIR += apache-mode.el SUBDIR += apache22 SUBDIR += apache24 SUBDIR += apercu SUBDIR += aria2 SUBDIR += aria2fe SUBDIR += asql SUBDIR += asterisk-stat SUBDIR += atutor SUBDIR += august SUBDIR += awffull SUBDIR += aws SUBDIR += aws-demos SUBDIR += awstats SUBDIR += axis SUBDIR += axis2 SUBDIR += b2evolution SUBDIR += bacula-web SUBDIR += baikal SUBDIR += bareos-webui SUBDIR += bblog SUBDIR += bigbluebutton SUBDIR += bins SUBDIR += bkmrkconv SUBDIR += blastbeat SUBDIR += blogsum SUBDIR += bluefish SUBDIR += boa SUBDIR += bolt SUBDIR += bookmarkbridge SUBDIR += bozohttpd SUBDIR += butterfly SUBDIR += c-icap SUBDIR += c-icap-modules SUBDIR += cadaver SUBDIR += caddy SUBDIR += calamaris SUBDIR += calamaris-devel SUBDIR += caldavzap SUBDIR += calendarserver SUBDIR += castget SUBDIR += caudium14 SUBDIR += cblog SUBDIR += cgi-lib SUBDIR += cgi-lib.pl SUBDIR += cgicc SUBDIR += cgichk SUBDIR += cgihtml SUBDIR += cgiparse SUBDIR += cgiwrap SUBDIR += checkbot SUBDIR += chems SUBDIR += cherokee SUBDIR += choqok SUBDIR += chpasswd SUBDIR += chromium SUBDIR += ckeditor SUBDIR += cl-lml SUBDIR += cl-lml-sbcl SUBDIR += claroline SUBDIR += clearsilver SUBDIR += clearsilver-python SUBDIR += closure-compiler SUBDIR += cmsmadesimple SUBDIR += cntlm SUBDIR += codeigniter SUBDIR += coppermine SUBDIR += cplanet SUBDIR += cppcms SUBDIR += crawl SUBDIR += crp SUBDIR += css-mode.el SUBDIR += cssed SUBDIR += csso SUBDIR += csstidy SUBDIR += ctemplate SUBDIR += cutycapt SUBDIR += dalbum SUBDIR += davical SUBDIR += dddbl SUBDIR += decss SUBDIR += deforaos-surfer SUBDIR += demoroniser SUBDIR += dfileserver SUBDIR += dhttpd SUBDIR += dillo2 SUBDIR += dojo SUBDIR += dojo-shrinksafe SUBDIR += dokuwiki SUBDIR += domoticz SUBDIR += dotproject SUBDIR += drood SUBDIR += drraw SUBDIR += drupal7 SUBDIR += drupal7-wysiwyg SUBDIR += drupal8 SUBDIR += drush SUBDIR += dtse SUBDIR += dummyflash SUBDIR += e107 SUBDIR += e2guardian SUBDIR += edbrowse SUBDIR += efront SUBDIR += elgg SUBDIR += elinks SUBDIR += elixir-html_entities SUBDIR += elixir-html_sanitize_ex SUBDIR += elixir-httpoison SUBDIR += elixir-httpotion SUBDIR += elixir-joken SUBDIR += elixir-maru SUBDIR += elixir-phoenix SUBDIR += elixir-phoenix_ecto SUBDIR += elixir-phoenix_html SUBDIR += elixir-phoenix_pubsub SUBDIR += elixir-webassembly SUBDIR += emacs-w3m SUBDIR += encode-explorer SUBDIR += entrans SUBDIR += ephemera SUBDIR += epiphany SUBDIR += erlang-cowboy SUBDIR += erlang-cowlib SUBDIR += erlang-hackney SUBDIR += erlang-ibrowse SUBDIR += erlang-mochiweb SUBDIR += erlang-mochiweb-basho SUBDIR += erlang-webmachine SUBDIR += erwn SUBDIR += eventum SUBDIR += extjs SUBDIR += fabio SUBDIR += fancybox SUBDIR += faup SUBDIR += fcgi SUBDIR += fcgiwrap SUBDIR += feedjack SUBDIR += ffproxy SUBDIR += fgallery SUBDIR += fira-webfont SUBDIR += firefox SUBDIR += firefox-esr SUBDIR += firefox-esr-i18n SUBDIR += firefox-i18n SUBDIR += flashplayer SUBDIR += flat-frog SUBDIR += flickcurl SUBDIR += flood SUBDIR += flot SUBDIR += fluxbb SUBDIR += fnord SUBDIR += formication SUBDIR += foswiki SUBDIR += fpc-fastcgi SUBDIR += fpc-googleapi SUBDIR += fpc-httpd22 SUBDIR += fpc-httpd24 SUBDIR += free-sa-devel SUBDIR += freeway SUBDIR += fswiki SUBDIR += ftasv SUBDIR += g-cows SUBDIR += g-gcl SUBDIR += gaeutilities SUBDIR += gallery2 SUBDIR += gallery3 SUBDIR += gatling SUBDIR += gecko-mediaplayer SUBDIR += geckodriver SUBDIR += geeklog SUBDIR += geeknote SUBDIR += geneweb SUBDIR += geolizer SUBDIR += geronimo SUBDIR += get_flash_videos SUBDIR += getleft SUBDIR += gist SUBDIR += gitea SUBDIR += gitlab SUBDIR += gitlab-workhorse SUBDIR += glassfish SUBDIR += glpi SUBDIR += gnome-user-share SUBDIR += gnome-web-photo SUBDIR += go-fasthttp SUBDIR += go-www SUBDIR += gohugo SUBDIR += google-appengine SUBDIR += google-sitemapgen SUBDIR += googlebook_dl SUBDIR += googler SUBDIR += goose SUBDIR += gotty SUBDIR += gpx2map SUBDIR += grafana SUBDIR += grafana2 SUBDIR += grafana3 SUBDIR += grafana4 SUBDIR += grails SUBDIR += gregarius SUBDIR += groupoffice SUBDIR += grr SUBDIR += gstreamer-plugins-neon SUBDIR += gstreamer1-plugins-neon SUBDIR += gtkhtml3 SUBDIR += gtkhtml4 SUBDIR += guacamole-client SUBDIR += guile-www SUBDIR += gurlchecker SUBDIR += h2o SUBDIR += habari SUBDIR += hastymail SUBDIR += hastymail2 SUBDIR += hastymail2-devel SUBDIR += havp SUBDIR += helma SUBDIR += hiawatha SUBDIR += hinventory-client SUBDIR += horde-ansel SUBDIR += horde-base SUBDIR += horde-passwd SUBDIR += horde-trean SUBDIR += horde-wicked SUBDIR += hotcrp SUBDIR += hs-DAV SUBDIR += hs-HTTP SUBDIR += hs-activehs SUBDIR += hs-authenticate SUBDIR += hs-cgi SUBDIR += hs-cookie SUBDIR += hs-css-text SUBDIR += hs-fastcgi SUBDIR += hs-gitit SUBDIR += hs-hS3 SUBDIR += hs-happstack SUBDIR += hs-happstack-server SUBDIR += hs-heist SUBDIR += hs-hjsmin SUBDIR += hs-http-api-data SUBDIR += hs-http-client SUBDIR += hs-http-client-tls SUBDIR += hs-http-conduit SUBDIR += hs-http-date SUBDIR += hs-http-reverse-proxy SUBDIR += hs-http-server SUBDIR += hs-http-types SUBDIR += hs-http2 SUBDIR += hs-multipart SUBDIR += hs-oeis SUBDIR += hs-path-pieces SUBDIR += hs-recaptcha SUBDIR += hs-shakespeare SUBDIR += hs-snap SUBDIR += hs-snap-core SUBDIR += hs-snap-server SUBDIR += hs-url SUBDIR += hs-wai SUBDIR += hs-wai-app-static SUBDIR += hs-wai-extra SUBDIR += hs-wai-logger SUBDIR += hs-warp SUBDIR += hs-warp-tls SUBDIR += hs-webkit SUBDIR += hs-xss-sanitize SUBDIR += hs-yesod SUBDIR += hs-yesod-auth SUBDIR += hs-yesod-auth-hashdb SUBDIR += hs-yesod-bin SUBDIR += hs-yesod-core SUBDIR += hs-yesod-form SUBDIR += hs-yesod-persistent SUBDIR += hs-yesod-static SUBDIR += hs-yesod-test SUBDIR += htdigest SUBDIR += htdump SUBDIR += html2hdml SUBDIR += html2wml SUBDIR += htmlcompressor SUBDIR += htmlcxx SUBDIR += htmlpp SUBDIR += httest SUBDIR += http-analyze SUBDIR += http_get SUBDIR += http_load SUBDIR += http_post SUBDIR += httpasyncclient SUBDIR += httpclient SUBDIR += httpcore SUBDIR += httptunnel SUBDIR += httrack SUBDIR += hypermail SUBDIR += igal2 SUBDIR += ikiwiki SUBDIR += ilias SUBDIR += imgsizer SUBDIR += impresscms SUBDIR += interchange SUBDIR += iridium SUBDIR += itop SUBDIR += iwebcal SUBDIR += jdresolve SUBDIR += jericho-html SUBDIR += jesred SUBDIR += jetty8 SUBDIR += jetty9 SUBDIR += jinzora SUBDIR += jmeter SUBDIR += joomla3 SUBDIR += jspwiki SUBDIR += jtoolkit SUBDIR += junkbuster SUBDIR += kanboard SUBDIR += kannel SUBDIR += kannel-sqlbox SUBDIR += kcgi SUBDIR += kdewebdev4 SUBDIR += kf5-kdewebkit SUBDIR += kf5-khtml SUBDIR += kf5-kjs SUBDIR += kf5-kjsembed SUBDIR += kohana SUBDIR += kpartsplugin SUBDIR += kplaylist SUBDIR += kwebkitpart SUBDIR += larbin SUBDIR += lessc SUBDIR += libapreq2 SUBDIR += libdom SUBDIR += libecap SUBDIR += libepc SUBDIR += libevhtp SUBDIR += libgtkhtml SUBDIR += libhpack SUBDIR += libhubbub SUBDIR += libjwt SUBDIR += libmicrohttpd SUBDIR += libnghttp2 SUBDIR += libresonic-standalone SUBDIR += libsocialweb SUBDIR += libwww SUBDIR += libxul SUBDIR += lightsquid SUBDIR += lighttpd SUBDIR += lighttpd-mod_h264_streaming SUBDIR += lilurl SUBDIR += limesurvey SUBDIR += linkcheck SUBDIR += linkchecker SUBDIR += linklint SUBDIR += links SUBDIR += links-hacked SUBDIR += links1 SUBDIR += linux-c6-qt47-webkit SUBDIR += linux-c7-qtwebkit SUBDIR += linux-flashplayer SUBDIR += linux-opera SUBDIR += lionwiki SUBDIR += litmus SUBDIR += ljdeps SUBDIR += ljdump SUBDIR += llgal SUBDIR += logtools SUBDIR += luakit SUBDIR += lynx SUBDIR += lynx-current SUBDIR += madsonic SUBDIR += madsonic-standalone SUBDIR += magento SUBDIR += mahara SUBDIR += man2web SUBDIR += mathjax SUBDIR += mathopd SUBDIR += mediawiki123 SUBDIR += mediawiki127 SUBDIR += mediawiki128 SUBDIR += mediawiki129 SUBDIR += mergelog SUBDIR += mgstat SUBDIR += mhonarc SUBDIR += micro_httpd SUBDIR += middleman SUBDIR += midori SUBDIR += mimetex SUBDIR += mini_httpd SUBDIR += miniminiweb SUBDIR += minio SUBDIR += minio-client SUBDIR += mitmproxy SUBDIR += mkapachepw SUBDIR += mknmz-wwwoffle SUBDIR += mnogosearch SUBDIR += mod_amazon_proxy SUBDIR += mod_antiloris SUBDIR += mod_asn SUBDIR += mod_auth_cas SUBDIR += mod_auth_cookie_mysql2 SUBDIR += mod_auth_external2 SUBDIR += mod_auth_gssapi SUBDIR += mod_auth_imap2 SUBDIR += mod_auth_kerb2 SUBDIR += mod_auth_mysql2 SUBDIR += mod_auth_mysql_another SUBDIR += mod_auth_openid SUBDIR += mod_auth_openidc SUBDIR += mod_auth_pam2 SUBDIR += mod_auth_pgsql2 SUBDIR += mod_auth_pubtkt SUBDIR += mod_auth_tkt SUBDIR += mod_auth_xradius SUBDIR += mod_authn_sasl SUBDIR += mod_authnz_crowd SUBDIR += mod_authnz_external24 SUBDIR += mod_backtrace SUBDIR += mod_bw SUBDIR += mod_cband SUBDIR += mod_cfg_ldap SUBDIR += mod_chroot SUBDIR += mod_clamav SUBDIR += mod_cloudflare SUBDIR += mod_cvs2 SUBDIR += mod_dav_svn SUBDIR += mod_dnssd SUBDIR += mod_domaintree SUBDIR += mod_encoding SUBDIR += mod_evasive SUBDIR += mod_extract_forwarded SUBDIR += mod_fastcgi SUBDIR += mod_fcgid SUBDIR += mod_fileiri SUBDIR += mod_flickr SUBDIR += mod_geoip2 SUBDIR += mod_gnutls SUBDIR += mod_gzip2 SUBDIR += mod_h264_streaming SUBDIR += mod_hosts_access SUBDIR += mod_http2-devel SUBDIR += mod_jk SUBDIR += mod_layout22 SUBDIR += mod_limitipconn2 SUBDIR += mod_line_edit SUBDIR += mod_log_config-st SUBDIR += mod_log_mysql SUBDIR += mod_log_sql2 SUBDIR += mod_log_sql2-dtc SUBDIR += mod_macro22 SUBDIR += mod_md-devel SUBDIR += mod_memcache SUBDIR += mod_memcache_block SUBDIR += mod_mono SUBDIR += mod_mpm_itk SUBDIR += mod_musicindex SUBDIR += mod_ntlm2 SUBDIR += mod_pagespeed SUBDIR += mod_perl2 SUBDIR += mod_php56 SUBDIR += mod_php70 SUBDIR += mod_php71 SUBDIR += mod_php72 SUBDIR += mod_proctitle SUBDIR += mod_proxy_html SUBDIR += mod_proxy_uwsgi SUBDIR += mod_proxy_xml SUBDIR += mod_python33 SUBDIR += mod_python35 SUBDIR += mod_qos SUBDIR += mod_realdoc SUBDIR += mod_remoteip SUBDIR += mod_reproxy SUBDIR += mod_rivet SUBDIR += mod_rpaf2 SUBDIR += mod_scgi SUBDIR += mod_security SUBDIR += mod_security-devel SUBDIR += mod_setenvifplus SUBDIR += mod_spdy SUBDIR += mod_tidy SUBDIR += mod_tsa SUBDIR += mod_uid SUBDIR += mod_umask SUBDIR += mod_vhost_ldap SUBDIR += mod_vhs SUBDIR += mod_webauth SUBDIR += mod_webkit SUBDIR += mod_whatkilledus SUBDIR += mod_wsgi4 SUBDIR += mod_xml2enc SUBDIR += mod_xmlns SUBDIR += mod_xsendfile SUBDIR += mohawk SUBDIR += moinmoin SUBDIR += monast SUBDIR += mongoose SUBDIR += mongrel2 SUBDIR += moodle31 SUBDIR += moodle32 SUBDIR += moodle33 SUBDIR += moodle34 SUBDIR += mozplugger SUBDIR += multisort SUBDIR += multiwatch SUBDIR += mybb SUBDIR += myfaces SUBDIR += mysar SUBDIR += mysqlphp2postgres SUBDIR += mythplugin-mythweb SUBDIR += nanoblogger SUBDIR += nanoblogger-extra SUBDIR += neon SUBDIR += netoffice SUBDIR += netrik SUBDIR += netstiff SUBDIR += netsurf SUBDIR += newsbeuter SUBDIR += newsboat SUBDIR += nextcloud SUBDIR += nextcloud-calendar SUBDIR += nextcloud-contacts SUBDIR += nghttp2 SUBDIR += nginx SUBDIR += nginx-devel SUBDIR += nginx-full SUBDIR += nginx-lite SUBDIR += nginx-naxsi SUBDIR += nibbleblog SUBDIR += node SUBDIR += node4 SUBDIR += node6 SUBDIR += node8 SUBDIR += nostromo SUBDIR += novnc SUBDIR += novnc-websockify SUBDIR += npapi-vlc SUBDIR += npapi-xine SUBDIR += npc SUBDIR += npm SUBDIR += npm-less-plugin-clean-css SUBDIR += npm-node4 SUBDIR += npm-node6 SUBDIR += npm-node8 SUBDIR += npm2 SUBDIR += npm3 SUBDIR += npm4 SUBDIR += nspluginwrapper SUBDIR += nuvolaplayer-8tracks SUBDIR += nuvolaplayer-all-services SUBDIR += nuvolaplayer-amazon-cloud-player SUBDIR += nuvolaplayer-bandcamp SUBDIR += nuvolaplayer-google-play-music SUBDIR += nuvolaplayer-groove SUBDIR += nuvolaplayer-jango SUBDIR += nuvolaplayer-kexp SUBDIR += nuvolaplayer-logitech-media-server SUBDIR += nuvolaplayer-mixcloud SUBDIR += nuvolaplayer-plex SUBDIR += nuvolaplayer-soundcloud SUBDIR += nuvolaplayer-spotify SUBDIR += nuvolaplayer-tunein SUBDIR += nuvolaplayer-yandex-music SUBDIR += nuvolaplayer-youtube SUBDIR += obhttpd SUBDIR += ocaml-net SUBDIR += opencart SUBDIR += openxmldir SUBDIR += opera SUBDIR += opera-linuxplugins SUBDIR += orangehrm SUBDIR += oscommerce SUBDIR += otrs SUBDIR += otter-browser SUBDIR += owncloud SUBDIR += p5-AMF-Perl SUBDIR += p5-Acme-Monta SUBDIR += p5-Amon2 SUBDIR += p5-Amon2-Lite SUBDIR += p5-Amon2-Plugin-LogDispatch SUBDIR += p5-Amon2-Plugin-Web-CSRFDefender SUBDIR += p5-Amon2-Plugin-Web-MobileAgent SUBDIR += p5-Any-Template SUBDIR += p5-Any-URI-Escape SUBDIR += p5-AnyEvent-HTTP SUBDIR += p5-AnyEvent-HTTP-LWP-UserAgent SUBDIR += p5-AnyEvent-HTTPD SUBDIR += p5-AnyEvent-Mojo SUBDIR += p5-AnyEvent-ReverseHTTP SUBDIR += p5-AnyEvent-SCGI SUBDIR += p5-Apache-ASP SUBDIR += p5-Apache-Admin-Config SUBDIR += p5-Apache-AuthCookie SUBDIR += p5-Apache-AuthTicket SUBDIR += p5-Apache-Clean2 SUBDIR += p5-Apache-ConfigFile SUBDIR += p5-Apache-ConfigParser SUBDIR += p5-Apache-DB SUBDIR += p5-Apache-DBI SUBDIR += p5-Apache-Gallery SUBDIR += p5-Apache-Htgroup SUBDIR += p5-Apache-LogFormat-Compiler SUBDIR += p5-Apache-MP3 SUBDIR += p5-Apache-ParseFormData SUBDIR += p5-Apache-Profiler SUBDIR += p5-Apache-Session SUBDIR += p5-Apache-Session-PHP SUBDIR += p5-Apache-Session-SQLite3 SUBDIR += p5-Apache-Session-SharedMem SUBDIR += p5-Apache-Session-Wrapper SUBDIR += p5-Apache-SessionX SUBDIR += p5-Apache-Singleton SUBDIR += p5-Apache2-SiteControl SUBDIR += p5-ApacheBench SUBDIR += p5-App-Nopaste SUBDIR += p5-App-gist SUBDIR += p5-Ark SUBDIR += p5-Bigtop SUBDIR += p5-Blog-Spam SUBDIR += p5-Browser-Open SUBDIR += p5-Business-PayPal SUBDIR += p5-CGI SUBDIR += p5-CGI-Ajax SUBDIR += p5-CGI-Application SUBDIR += p5-CGI-Application-Dispatch SUBDIR += p5-CGI-Application-Dispatch-Server SUBDIR += p5-CGI-Application-PSGI SUBDIR += p5-CGI-Application-Plugin-AnyTemplate SUBDIR += p5-CGI-Application-Plugin-Apache SUBDIR += p5-CGI-Application-Plugin-Authentication SUBDIR += p5-CGI-Application-Plugin-Authorization SUBDIR += p5-CGI-Application-Plugin-AutoRunmode SUBDIR += p5-CGI-Application-Plugin-Config-YAML SUBDIR += p5-CGI-Application-Plugin-ConfigAuto SUBDIR += p5-CGI-Application-Plugin-DBH SUBDIR += p5-CGI-Application-Plugin-DebugScreen SUBDIR += p5-CGI-Application-Plugin-DevPopup SUBDIR += p5-CGI-Application-Plugin-Forward SUBDIR += p5-CGI-Application-Plugin-HTDot SUBDIR += p5-CGI-Application-Plugin-HTMLPrototype SUBDIR += p5-CGI-Application-Plugin-HtmlTidy SUBDIR += p5-CGI-Application-Plugin-JSON SUBDIR += p5-CGI-Application-Plugin-LinkIntegrity SUBDIR += p5-CGI-Application-Plugin-LogDispatch SUBDIR += p5-CGI-Application-Plugin-MessageStack SUBDIR += p5-CGI-Application-Plugin-Redirect SUBDIR += p5-CGI-Application-Plugin-Session SUBDIR += p5-CGI-Application-Plugin-Stream SUBDIR += p5-CGI-Application-Plugin-TT SUBDIR += p5-CGI-Application-Plugin-ValidateRM SUBDIR += p5-CGI-Application-Plugin-ViewCode SUBDIR += p5-CGI-Application-Server SUBDIR += p5-CGI-ArgChecker SUBDIR += p5-CGI-Builder SUBDIR += p5-CGI-Builder-TT2 SUBDIR += p5-CGI-Cache SUBDIR += p5-CGI-Compile SUBDIR += p5-CGI-Compress-Gzip SUBDIR += p5-CGI-Cookie-Splitter SUBDIR += p5-CGI-Cookie-XS SUBDIR += p5-CGI-Deurl-XS SUBDIR += p5-CGI-Emulate-PSGI SUBDIR += p5-CGI-EncryptForm SUBDIR += p5-CGI-Enurl SUBDIR += p5-CGI-Ex SUBDIR += p5-CGI-Expand SUBDIR += p5-CGI-ExtDirect SUBDIR += p5-CGI-FCKeditor SUBDIR += p5-CGI-Fast SUBDIR += p5-CGI-FastTemplate SUBDIR += p5-CGI-FormBuilder SUBDIR += p5-CGI-Framework SUBDIR += p5-CGI-Kwiki SUBDIR += p5-CGI-Minimal SUBDIR += p5-CGI-PSGI SUBDIR += p5-CGI-Pager SUBDIR += p5-CGI-Prototype SUBDIR += p5-CGI-Response SUBDIR += p5-CGI-SSI SUBDIR += p5-CGI-Session SUBDIR += p5-CGI-Session-ExpireSessions SUBDIR += p5-CGI-Simple SUBDIR += p5-CGI-SpeedyCGI SUBDIR += p5-CGI-Struct SUBDIR += p5-CGI-Thin SUBDIR += p5-CGI-Untaint SUBDIR += p5-CGI-Untaint-date SUBDIR += p5-CGI-Untaint-email SUBDIR += p5-CGI-Upload SUBDIR += p5-CGI-Utils SUBDIR += p5-CGI-XMLApplication SUBDIR += p5-CGI.pm SUBDIR += p5-CGI_Lite SUBDIR += p5-CIF-Client SUBDIR += p5-CSS-DOM SUBDIR += p5-CSS-Inliner SUBDIR += p5-Catalyst-Action-REST SUBDIR += p5-Catalyst-Action-RenderView SUBDIR += p5-Catalyst-Action-Serialize-XML-Hash-LX SUBDIR += p5-Catalyst-ActionRole-ACL SUBDIR += p5-Catalyst-Authentication-Credential-HTTP SUBDIR += p5-Catalyst-Authentication-Credential-OpenID SUBDIR += p5-Catalyst-Authentication-Store-DBIx-Class SUBDIR += p5-Catalyst-Authentication-Store-LDAP SUBDIR += p5-Catalyst-Component-ACCEPT_CONTEXT SUBDIR += p5-Catalyst-Component-InstancePerContext SUBDIR += p5-Catalyst-Controller-ActionRole SUBDIR += p5-Catalyst-Controller-BindLex SUBDIR += p5-Catalyst-Controller-FormBuilder SUBDIR += p5-Catalyst-Controller-HTML-FormFu SUBDIR += p5-Catalyst-Controller-RateLimit SUBDIR += p5-Catalyst-Controller-RequestToken SUBDIR += p5-Catalyst-Controller-SOAP SUBDIR += p5-Catalyst-Devel SUBDIR += p5-Catalyst-DispatchType-Regex SUBDIR += p5-Catalyst-Engine-Apache SUBDIR += p5-Catalyst-Engine-HTTP-Prefork SUBDIR += p5-Catalyst-Engine-PSGI SUBDIR += p5-Catalyst-Enzyme SUBDIR += p5-Catalyst-Helper-Controller-Scaffold SUBDIR += p5-Catalyst-Manual SUBDIR += p5-Catalyst-Model-Adaptor SUBDIR += p5-Catalyst-Model-CDBI SUBDIR += p5-Catalyst-Model-CDBI-Plain SUBDIR += p5-Catalyst-Model-CDBI-Sweet SUBDIR += p5-Catalyst-Model-DBIC-Plain SUBDIR += p5-Catalyst-Model-DBIC-Schema SUBDIR += p5-Catalyst-Model-DynamicAdaptor SUBDIR += p5-Catalyst-Model-LDAP SUBDIR += p5-Catalyst-Model-Memcached SUBDIR += p5-Catalyst-Model-Oryx SUBDIR += p5-Catalyst-Model-Tarantool SUBDIR += p5-Catalyst-Model-XML-Feed SUBDIR += p5-Catalyst-Model-Xapian SUBDIR += p5-Catalyst-Model-Xapian10 SUBDIR += p5-Catalyst-Plugin-AtomServer SUBDIR += p5-Catalyst-Plugin-Authentication SUBDIR += p5-Catalyst-Plugin-Authentication-CDBI SUBDIR += p5-Catalyst-Plugin-Authentication-OpenID SUBDIR += p5-Catalyst-Plugin-Authentication-Store-Htpasswd SUBDIR += p5-Catalyst-Plugin-Authorization-ACL SUBDIR += p5-Catalyst-Plugin-Authorization-Roles SUBDIR += p5-Catalyst-Plugin-AutoCRUD SUBDIR += p5-Catalyst-Plugin-Browser SUBDIR += p5-Catalyst-Plugin-C3 SUBDIR += p5-Catalyst-Plugin-Cache SUBDIR += p5-Catalyst-Plugin-Cache-FastMmap SUBDIR += p5-Catalyst-Plugin-Cache-Memcached SUBDIR += p5-Catalyst-Plugin-Cache-Memcached-Fast SUBDIR += p5-Catalyst-Plugin-Captcha SUBDIR += p5-Catalyst-Plugin-ConfigLoader SUBDIR += p5-Catalyst-Plugin-ConfigLoader-Environment SUBDIR += p5-Catalyst-Plugin-CookiedSession SUBDIR += p5-Catalyst-Plugin-DateTime SUBDIR += p5-Catalyst-Plugin-DefaultEnd SUBDIR += p5-Catalyst-Plugin-Email SUBDIR += p5-Catalyst-Plugin-ErrorCatcher SUBDIR += p5-Catalyst-Plugin-FillInForm SUBDIR += p5-Catalyst-Plugin-FormBuilder SUBDIR += p5-Catalyst-Plugin-FormValidator SUBDIR += p5-Catalyst-Plugin-I18N SUBDIR += p5-Catalyst-Plugin-Log-Dispatch SUBDIR += p5-Catalyst-Plugin-Log-Handler SUBDIR += p5-Catalyst-Plugin-LogWarnings SUBDIR += p5-Catalyst-Plugin-PageCache SUBDIR += p5-Catalyst-Plugin-Params-Nested SUBDIR += p5-Catalyst-Plugin-Pluggable SUBDIR += p5-Catalyst-Plugin-Prototype SUBDIR += p5-Catalyst-Plugin-RunAfterRequest SUBDIR += p5-Catalyst-Plugin-Scheduler SUBDIR += p5-Catalyst-Plugin-Server SUBDIR += p5-Catalyst-Plugin-Session SUBDIR += p5-Catalyst-Plugin-Session-FastMmap SUBDIR += p5-Catalyst-Plugin-Session-PerUser SUBDIR += p5-Catalyst-Plugin-Session-State-Cookie SUBDIR += p5-Catalyst-Plugin-Session-State-URI SUBDIR += p5-Catalyst-Plugin-Session-Store-Cache SUBDIR += p5-Catalyst-Plugin-Session-Store-DBI SUBDIR += p5-Catalyst-Plugin-Session-Store-DBIC SUBDIR += p5-Catalyst-Plugin-Session-Store-Delegate SUBDIR += p5-Catalyst-Plugin-Session-Store-FastMmap SUBDIR += p5-Catalyst-Plugin-Session-Store-File SUBDIR += p5-Catalyst-Plugin-Session-Store-Memcached SUBDIR += p5-Catalyst-Plugin-Session-Store-Memcached-Fast SUBDIR += p5-Catalyst-Plugin-Setenv SUBDIR += p5-Catalyst-Plugin-SmartURI SUBDIR += p5-Catalyst-Plugin-StackTrace SUBDIR += p5-Catalyst-Plugin-Static SUBDIR += p5-Catalyst-Plugin-Static-Simple SUBDIR += p5-Catalyst-Plugin-StatusMessage SUBDIR += p5-Catalyst-Plugin-SubRequest SUBDIR += p5-Catalyst-Plugin-Textile SUBDIR += p5-Catalyst-Plugin-Unicode SUBDIR += p5-Catalyst-Plugin-XMLRPC SUBDIR += p5-Catalyst-Runtime SUBDIR += p5-Catalyst-TraitFor-Controller-DBIC-DoesPaging SUBDIR += p5-Catalyst-TraitFor-Request-BrowserDetect SUBDIR += p5-Catalyst-View-ClearSilver SUBDIR += p5-Catalyst-View-Email SUBDIR += p5-Catalyst-View-GraphViz SUBDIR += p5-Catalyst-View-HTML-Template SUBDIR += p5-Catalyst-View-HTML-Template-Compiled SUBDIR += p5-Catalyst-View-JSON SUBDIR += p5-Catalyst-View-Jemplate SUBDIR += p5-Catalyst-View-Mason SUBDIR += p5-Catalyst-View-REST-XML SUBDIR += p5-Catalyst-View-RRDGraph SUBDIR += p5-Catalyst-View-TT SUBDIR += p5-Catalyst-View-TT-Alloy SUBDIR += p5-Catalyst-View-TT-ControllerLocal SUBDIR += p5-Catalyst-View-Template-Declare SUBDIR += p5-Catalyst-View-Templated SUBDIR += p5-Catalyst-View-XML-Feed SUBDIR += p5-Catalyst-View-XML-Simple SUBDIR += p5-Catalyst-View-XSLT SUBDIR += p5-CatalystX-AppBuilder SUBDIR += p5-CatalystX-Component-Traits SUBDIR += p5-CatalystX-InjectComponent SUBDIR += p5-CatalystX-LeakChecker SUBDIR += p5-CatalystX-Profile SUBDIR += p5-CatalystX-REPL SUBDIR += p5-CatalystX-RoleApplicator SUBDIR += p5-CatalystX-SimpleLogin SUBDIR += p5-CatalystX-VirtualComponents SUBDIR += p5-Class-DBI-FromForm SUBDIR += p5-ClearSilver SUBDIR += p5-Compress-LeadingBlankSpaces SUBDIR += p5-Continuity SUBDIR += p5-Cookie-Baker SUBDIR += p5-Corona SUBDIR += p5-Dancer SUBDIR += p5-Dancer-Logger-Log4perl SUBDIR += p5-Dancer-Plugin-ExtDirect SUBDIR += p5-Dancer-Plugin-Feed SUBDIR += p5-Dancer-Plugin-FlashMessage SUBDIR += p5-Dancer-Plugin-Lexicon SUBDIR += p5-Dancer-Plugin-Memcached SUBDIR += p5-Dancer-Plugin-REST SUBDIR += p5-Dancer-Plugin-RPC SUBDIR += p5-Dancer-Plugin-SiteMap SUBDIR += p5-Dancer-Plugin-ValidationClass SUBDIR += p5-Dancer-Session-Cookie SUBDIR += p5-Dancer-Template-Xslate SUBDIR += p5-Dancer2 SUBDIR += p5-Dancer2-Plugin-Ajax SUBDIR += p5-Dancer2-Plugin-Deferred SUBDIR += p5-Dancer2-Plugin-Interchange6 SUBDIR += p5-Dancer2-Plugin-Path-Class SUBDIR += p5-Data-TreeDumper-Renderer-DHTML SUBDIR += p5-Data-Validate-URI SUBDIR += p5-Emplacken SUBDIR += p5-FAQ-OMatic SUBDIR += p5-FCGI SUBDIR += p5-FCGI-Async SUBDIR += p5-FCGI-Client SUBDIR += p5-FCGI-Engine SUBDIR += p5-FCGI-ProcManager SUBDIR += p5-FCGI-Spawn SUBDIR += p5-FEAR-API SUBDIR += p5-Facebook-Graph SUBDIR += p5-Feed-Find SUBDIR += p5-Feersum SUBDIR += p5-File-Mork SUBDIR += p5-Flea SUBDIR += p5-Flickr-API SUBDIR += p5-Flickr-Upload SUBDIR += p5-Fliggy SUBDIR += p5-Furl SUBDIR += p5-FurlX-Coro SUBDIR += p5-Gantry SUBDIR += p5-Geo-Caching SUBDIR += p5-Google-Search SUBDIR += p5-Gtk2-WebKit SUBDIR += p5-Gungho SUBDIR += p5-GunghoX-FollowLinks SUBDIR += p5-HTML-Adsense SUBDIR += p5-HTML-Breadcrumbs SUBDIR += p5-HTML-CalendarMonthSimple SUBDIR += p5-HTML-Chunks SUBDIR += p5-HTML-Clean SUBDIR += p5-HTML-ContentExtractor SUBDIR += p5-HTML-DOM SUBDIR += p5-HTML-Declare SUBDIR += p5-HTML-Defaultify SUBDIR += p5-HTML-Diff SUBDIR += p5-HTML-Display SUBDIR += p5-HTML-Element-Extended SUBDIR += p5-HTML-Element-Library SUBDIR += p5-HTML-Element-Replacer SUBDIR += p5-HTML-Encoding SUBDIR += p5-HTML-ExtractContent SUBDIR += p5-HTML-ExtractMain SUBDIR += p5-HTML-Field SUBDIR += p5-HTML-FillInForm SUBDIR += p5-HTML-FillInForm-ForceUTF8 SUBDIR += p5-HTML-FillInForm-Lite SUBDIR += p5-HTML-Form SUBDIR += p5-HTML-FormFu SUBDIR += p5-HTML-FormFu-Imager SUBDIR += p5-HTML-FormFu-Model-DBIC SUBDIR += p5-HTML-FormHandler SUBDIR += p5-HTML-FromANSI SUBDIR += p5-HTML-FromText SUBDIR += p5-HTML-GenToc SUBDIR += p5-HTML-GenerateUtil SUBDIR += p5-HTML-GoogleMaps SUBDIR += p5-HTML-Highlight SUBDIR += p5-HTML-LinkExtractor SUBDIR += p5-HTML-LinkList SUBDIR += p5-HTML-Lint SUBDIR += p5-HTML-Location SUBDIR += p5-HTML-Macro SUBDIR += p5-HTML-Mason SUBDIR += p5-HTML-Mason-PSGIHandler SUBDIR += p5-HTML-MobileConverter SUBDIR += p5-HTML-Pager SUBDIR += p5-HTML-Parser SUBDIR += p5-HTML-Parser-Simple SUBDIR += p5-HTML-Perlinfo SUBDIR += p5-HTML-PrettyPrinter SUBDIR += p5-HTML-Prototype SUBDIR += p5-HTML-Query SUBDIR += p5-HTML-QuickCheck SUBDIR += p5-HTML-RSSAutodiscovery SUBDIR += p5-HTML-ResolveLink SUBDIR += p5-HTML-Restrict SUBDIR += p5-HTML-RobotsMETA SUBDIR += p5-HTML-Scrubber SUBDIR += p5-HTML-Seamstress SUBDIR += p5-HTML-Selector-XPath SUBDIR += p5-HTML-Shakan SUBDIR += p5-HTML-SimpleLinkExtor SUBDIR += p5-HTML-SimpleParse SUBDIR += p5-HTML-StickyQuery SUBDIR += p5-HTML-StickyQuery-DoCoMoGUID SUBDIR += p5-HTML-Stream SUBDIR += p5-HTML-Strip SUBDIR += p5-HTML-StripScripts SUBDIR += p5-HTML-StripScripts-Parser SUBDIR += p5-HTML-Summary SUBDIR += p5-HTML-Table SUBDIR += p5-HTML-TableContentParser SUBDIR += p5-HTML-TableExtract SUBDIR += p5-HTML-TableLayout SUBDIR += p5-HTML-TableParser SUBDIR += p5-HTML-TableTiler SUBDIR += p5-HTML-TagCloud SUBDIR += p5-HTML-TagCloud-Extended SUBDIR += p5-HTML-TagParser SUBDIR += p5-HTML-Tagset SUBDIR += p5-HTML-Template SUBDIR += p5-HTML-Template-Associate SUBDIR += p5-HTML-Template-Compiled SUBDIR += p5-HTML-Template-Expr SUBDIR += p5-HTML-Template-HashWrapper SUBDIR += p5-HTML-Template-JIT SUBDIR += p5-HTML-Template-Pluggable SUBDIR += p5-HTML-Template-Pro SUBDIR += p5-HTML-Toc SUBDIR += p5-HTML-TokeParser-Simple SUBDIR += p5-HTML-Tree SUBDIR += p5-HTML-TreeBuilder-LibXML SUBDIR += p5-HTML-TreeBuilder-XPath SUBDIR += p5-HTML-Widgets-SelectLayers SUBDIR += p5-HTML-WikiConverter SUBDIR += p5-HTML-WikiConverter-DokuWiki SUBDIR += p5-HTML-WikiConverter-GoogleCode SUBDIR += p5-HTML-WikiConverter-Kwiki SUBDIR += p5-HTML-WikiConverter-Markdown SUBDIR += p5-HTML-WikiConverter-MediaWiki SUBDIR += p5-HTML-WikiConverter-MoinMoin SUBDIR += p5-HTML-WikiConverter-Oddmuse SUBDIR += p5-HTML-WikiConverter-PbWiki SUBDIR += p5-HTML-WikiConverter-PhpWiki SUBDIR += p5-HTML-WikiConverter-PmWiki SUBDIR += p5-HTML-WikiConverter-SnipSnap SUBDIR += p5-HTML-WikiConverter-Socialtext SUBDIR += p5-HTML-WikiConverter-TikiWiki SUBDIR += p5-HTML-WikiConverter-UseMod SUBDIR += p5-HTML-WikiConverter-WakkaWiki SUBDIR += p5-HTML-WikiConverter-WikkaWiki SUBDIR += p5-HTTP-Async SUBDIR += p5-HTTP-Body SUBDIR += p5-HTTP-BrowserDetect SUBDIR += p5-HTTP-Cache-Transparent SUBDIR += p5-HTTP-CookieJar SUBDIR += p5-HTTP-Cookies SUBDIR += p5-HTTP-Cookies-Mozilla SUBDIR += p5-HTTP-Cookies-iCab SUBDIR += p5-HTTP-Cookies-w3m SUBDIR += p5-HTTP-DAV SUBDIR += p5-HTTP-Daemon SUBDIR += p5-HTTP-Daemon-SSL SUBDIR += p5-HTTP-Date SUBDIR += p5-HTTP-Engine SUBDIR += p5-HTTP-Engine-Middleware SUBDIR += p5-HTTP-Exception SUBDIR += p5-HTTP-HeaderParser-XS SUBDIR += p5-HTTP-Headers-Fast SUBDIR += p5-HTTP-Link-Parser SUBDIR += p5-HTTP-Lite SUBDIR += p5-HTTP-MHTTP SUBDIR += p5-HTTP-Message SUBDIR += p5-HTTP-MobileAgent SUBDIR += p5-HTTP-MobileAgent-Plugin-Charset SUBDIR += p5-HTTP-MobileAgent-Plugin-Locator SUBDIR += p5-HTTP-Negotiate SUBDIR += p5-HTTP-Parser SUBDIR += p5-HTTP-Parser-XS SUBDIR += p5-HTTP-Proxy SUBDIR += p5-HTTP-ProxyPAC SUBDIR += p5-HTTP-Recorder SUBDIR += p5-HTTP-Request-AsCGI SUBDIR += p5-HTTP-Request-Params SUBDIR += p5-HTTP-Response-Encoding SUBDIR += p5-HTTP-Router SUBDIR += p5-HTTP-Server-Simple SUBDIR += p5-HTTP-Server-Simple-Authen SUBDIR += p5-HTTP-Server-Simple-Mason SUBDIR += p5-HTTP-Server-Simple-PSGI SUBDIR += p5-HTTP-Server-Simple-Recorder SUBDIR += p5-HTTP-Server-Simple-Static SUBDIR += p5-HTTP-Session SUBDIR += p5-HTTP-Session-State-MobileAgentID SUBDIR += p5-HTTP-Session-Store-DBI SUBDIR += p5-HTTP-Session2 SUBDIR += p5-HTTP-SimpleLinkChecker SUBDIR += p5-HTTP-Size SUBDIR += p5-HTTP-Thin SUBDIR += p5-HTTP-Tiny SUBDIR += p5-HTTP-Tiny-SPDY SUBDIR += p5-HTTP-WebTest SUBDIR += p5-HTTP-XSCookies SUBDIR += p5-HTTPD-Log-Filter SUBDIR += p5-HTTPD-User-Manage SUBDIR += p5-Hijk SUBDIR += p5-I18N-AcceptLanguage SUBDIR += p5-IMDB-Film SUBDIR += p5-Image-Delivery SUBDIR += p5-Interchange6 SUBDIR += p5-JE SUBDIR += p5-JSON-API SUBDIR += p5-Jemplate SUBDIR += p5-Jifty SUBDIR += p5-Kwiki SUBDIR += p5-LWP-Authen-Negotiate SUBDIR += p5-LWP-Authen-OAuth SUBDIR += p5-LWP-Authen-Wsse SUBDIR += p5-LWP-ConnCache-MaxKeepAliveRequests SUBDIR += p5-LWP-MediaTypes SUBDIR += p5-LWP-Online SUBDIR += p5-LWP-Protocol-PSGI SUBDIR += p5-LWP-Protocol-connect SUBDIR += p5-LWP-Protocol-http10 SUBDIR += p5-LWP-Protocol-https SUBDIR += p5-LWP-Protocol-socks SUBDIR += p5-LWP-UserAgent-Determined SUBDIR += p5-LWP-UserAgent-POE SUBDIR += p5-LWP-UserAgent-WithCache SUBDIR += p5-LWPx-ParanoidAgent SUBDIR += p5-LWPx-TimedHTTP SUBDIR += p5-Markup-Perl SUBDIR += p5-Mason SUBDIR += p5-MasonX-Interp-WithCallbacks SUBDIR += p5-MasonX-Profiler SUBDIR += p5-MasonX-Request-WithApacheSession SUBDIR += p5-MasonX-WebApp SUBDIR += p5-Maypole SUBDIR += p5-Maypole-Authentication-UserSessionCookie SUBDIR += p5-Maypole-Component SUBDIR += p5-McBain SUBDIR += p5-McBain-WithPSGI SUBDIR += p5-MediaWiki SUBDIR += p5-MediaWiki-API SUBDIR += p5-Mobile-UserAgent SUBDIR += p5-ModPerl-VersionUtil SUBDIR += p5-Mojo-IOLoop-ForkCall SUBDIR += p5-Mojo-Server-FastCGI SUBDIR += p5-MojoMojo SUBDIR += p5-MojoX-Log-Dispatch-Simple SUBDIR += p5-MojoX-Renderer-Xslate SUBDIR += p5-Mojolicious SUBDIR += p5-Mojolicious-Plugin-Authentication SUBDIR += p5-Mojolicious-Plugin-Database SUBDIR += p5-Mojolicious-Plugin-Mongodb SUBDIR += p5-Mojolicious-Plugin-SetUserGroup SUBDIR += p5-Mojolicious-Plugin-TtRenderer SUBDIR += p5-Mojolicious-Plugin-YamlConfig SUBDIR += p5-Monoceros SUBDIR += p5-Mozilla-CA SUBDIR += p5-Net-Akismet SUBDIR += p5-Net-Amazon-AWIS SUBDIR += p5-Net-Async-FastCGI SUBDIR += p5-Net-Async-HTTP SUBDIR += p5-Net-FastCGI SUBDIR += p5-Net-FireEagle SUBDIR += p5-Net-Flickr-API SUBDIR += p5-Net-Flickr-Backup SUBDIR += p5-Net-Flickr-RDF SUBDIR += p5-Net-FreshBooks-API SUBDIR += p5-Net-GeoPlanet SUBDIR += p5-Net-Plurk SUBDIR += p5-Net-STF-Client SUBDIR += p5-Net-Trac SUBDIR += p5-Net-UPS SUBDIR += p5-Net-YAP SUBDIR += p5-Net-eBay SUBDIR += p5-Newsletter SUBDIR += p5-Nginx-ReadBody SUBDIR += p5-Nginx-Simple SUBDIR += p5-PHP-Session SUBDIR += p5-POE-Component-Client-HTTP SUBDIR += p5-POE-Component-Client-UserAgent SUBDIR += p5-POE-Component-Server-HTTP SUBDIR += p5-POE-Component-Server-HTTPServer SUBDIR += p5-POE-Component-Server-PSGI SUBDIR += p5-POE-Component-Server-SOAP SUBDIR += p5-POE-Component-Server-SimpleHTTP SUBDIR += p5-POE-Filter-HTTP-Parser SUBDIR += p5-POEx-Role-PSGIServer SUBDIR += p5-PSGI SUBDIR += p5-ParallelUserAgent SUBDIR += p5-Parse-HTTP-UserAgent SUBDIR += p5-Path-Class-URI SUBDIR += p5-Perlanet SUBDIR += p5-Perlbal-Plugin-PSGI SUBDIR += p5-Plack SUBDIR += p5-Plack-App-Proxy SUBDIR += p5-Plack-Builder-Conditionals SUBDIR += p5-Plack-Handler-AnyEvent-HTTPD SUBDIR += p5-Plack-Handler-AnyEvent-ReverseHTTP SUBDIR += p5-Plack-Handler-AnyEvent-SCGI SUBDIR += p5-Plack-Handler-CLI SUBDIR += p5-Plack-Handler-SCGI SUBDIR += p5-Plack-Middleware-AMF SUBDIR += p5-Plack-Middleware-AddDefaultCharset SUBDIR += p5-Plack-Middleware-Auth-Digest SUBDIR += p5-Plack-Middleware-AutoRefresh SUBDIR += p5-Plack-Middleware-ConsoleLogger SUBDIR += p5-Plack-Middleware-CrossOrigin SUBDIR += p5-Plack-Middleware-Debug SUBDIR += p5-Plack-Middleware-Deflater SUBDIR += p5-Plack-Middleware-Expires SUBDIR += p5-Plack-Middleware-ExtDirect SUBDIR += p5-Plack-Middleware-File-Sass SUBDIR += p5-Plack-Middleware-FixMissingBodyInRedirect SUBDIR += p5-Plack-Middleware-ForceEnv SUBDIR += p5-Plack-Middleware-Header SUBDIR += p5-Plack-Middleware-IEnosniff SUBDIR += p5-Plack-Middleware-InteractiveDebugger SUBDIR += p5-Plack-Middleware-JSConcat SUBDIR += p5-Plack-Middleware-MemoryUsage SUBDIR += p5-Plack-Middleware-MethodOverride SUBDIR += p5-Plack-Middleware-NoMultipleSlashes SUBDIR += p5-Plack-Middleware-Precompressed SUBDIR += p5-Plack-Middleware-RemoveRedundantBody SUBDIR += p5-Plack-Middleware-Reproxy SUBDIR += p5-Plack-Middleware-ReverseProxy SUBDIR += p5-Plack-Middleware-Rewrite SUBDIR += p5-Plack-Middleware-ServerStatus-Lite SUBDIR += p5-Plack-Middleware-Session SUBDIR += p5-Plack-Middleware-SocketIO SUBDIR += p5-Plack-Middleware-Status SUBDIR += p5-Plack-Middleware-Test-StashWarnings SUBDIR += p5-Plack-Middleware-Throttle SUBDIR += p5-Plack-Middleware-XForwardedFor SUBDIR += p5-Plack-Server-Coro SUBDIR += p5-Plack-Server-POE SUBDIR += p5-Plack-Server-ReverseHTTP SUBDIR += p5-Plack-Test-ExternalServer SUBDIR += p5-PocketIO SUBDIR += p5-Pod-Site SUBDIR += p5-PodToHTML SUBDIR += p5-Protocol-HTTP2 SUBDIR += p5-Protocol-SocketIO SUBDIR += p5-Protocol-WebSocket SUBDIR += p5-Protocol-XMLRPC SUBDIR += p5-REST-Client SUBDIR += p5-REST-Google-Apps-Provisioning SUBDIR += p5-RPC-ExtDirect SUBDIR += p5-RT-Authen-ExternalAuth SUBDIR += p5-RT-Client-REST SUBDIR += p5-RT-Extension-CommandByMail SUBDIR += p5-RT-Extension-Gravatar SUBDIR += p5-RT-Extension-LDAPImport SUBDIR += p5-RT-Extension-MandatoryOnTransition SUBDIR += p5-RT-Extension-QuickAssign SUBDIR += p5-RT-Extension-SLA SUBDIR += p5-RTx-Calendar SUBDIR += p5-Reaction SUBDIR += p5-Reddit SUBDIR += p5-Reddit-Client SUBDIR += p5-Role-REST-Client SUBDIR += p5-Rose-HTML-Objects SUBDIR += p5-Router-Boom SUBDIR += p5-Router-Simple SUBDIR += p5-Router-Simple-Sinatraish SUBDIR += p5-SCGI SUBDIR += p5-SOAP-Transport-HTTP-Plack SUBDIR += p5-SRU SUBDIR += p5-STF-Dispatcher-PSGI SUBDIR += p5-SWF-Chart SUBDIR += p5-Scrappy SUBDIR += p5-Selenium-Remote-Driver SUBDIR += p5-Session-Storage-Secure SUBDIR += p5-Squatting SUBDIR += p5-Squatting-On-PSGI SUBDIR += p5-Starlet SUBDIR += p5-Starman SUBDIR += p5-Syntax-Highlight-HTML SUBDIR += p5-Syntax-Highlight-Shell SUBDIR += p5-Task-Catalyst SUBDIR += p5-Task-Plack SUBDIR += p5-Tatsumaki SUBDIR += p5-Template-Alloy SUBDIR += p5-Template-GD SUBDIR += p5-Template-Iterator-AlzaboWrapperCursor SUBDIR += p5-Template-Multilingual SUBDIR += p5-Template-Mustache SUBDIR += p5-Template-Plugin-Class SUBDIR += p5-Template-Plugin-Clickable SUBDIR += p5-Template-Plugin-Clickable-Email SUBDIR += p5-Template-Plugin-Comma SUBDIR += p5-Template-Plugin-FillInForm SUBDIR += p5-Template-Plugin-JSON SUBDIR += p5-Template-Plugin-JavaScript SUBDIR += p5-Template-Plugin-MP3 SUBDIR += p5-Template-Plugin-Markdown SUBDIR += p5-Template-Plugin-Monta SUBDIR += p5-Template-Plugin-Number-Format SUBDIR += p5-Template-Plugin-StripScripts SUBDIR += p5-Template-Plugin-Subst SUBDIR += p5-Template-Plugin-VMethods SUBDIR += p5-Template-Provider-Encoding SUBDIR += p5-Template-Provider-FromDATA SUBDIR += p5-Template-Simple SUBDIR += p5-Template-Stash-AutoEscape SUBDIR += p5-Template-Timer SUBDIR += p5-Template-Toolkit SUBDIR += p5-Template-Toolkit-Simple SUBDIR += p5-Tenjin SUBDIR += p5-Test-HTTP SUBDIR += p5-Test-HTTP-Server-Simple SUBDIR += p5-Test-LWP-UserAgent SUBDIR += p5-Test-Nginx SUBDIR += p5-TestGen4Web-Runner SUBDIR += p5-Text-MultiMarkdown-ApacheHandler SUBDIR += p5-Tie-TinyURL SUBDIR += p5-Toader SUBDIR += p5-Toadfarm SUBDIR += p5-Twiggy SUBDIR += p5-Twiggy-TLS SUBDIR += p5-URI-Encode SUBDIR += p5-URI-Escape-JavaScript SUBDIR += p5-URI-Escape-XS SUBDIR += p5-URI-Fetch SUBDIR += p5-URI-ParseSearchString SUBDIR += p5-URI-Sequin SUBDIR += p5-URI-Title SUBDIR += p5-URI-ToDisk SUBDIR += p5-URL-Encode SUBDIR += p5-URL-Encode-XS SUBDIR += p5-VUser-Google-ProvisioningAPI SUBDIR += p5-W3C-LinkChecker SUBDIR += p5-W3C-LogValidator SUBDIR += p5-WWW-AtMovies-TV SUBDIR += p5-WWW-Babelfish SUBDIR += p5-WWW-Baseball-NPB SUBDIR += p5-WWW-Comic SUBDIR += p5-WWW-Contact SUBDIR += p5-WWW-Curl SUBDIR += p5-WWW-DHL SUBDIR += p5-WWW-Dilbert SUBDIR += p5-WWW-Facebook-API SUBDIR += p5-WWW-Form-UrlEncoded SUBDIR += p5-WWW-FreeProxy SUBDIR += p5-WWW-GitHub-Gist SUBDIR += p5-WWW-Google-Calculator SUBDIR += p5-WWW-Google-News SUBDIR += p5-WWW-Google-News-TW SUBDIR += p5-WWW-Google-PageRank SUBDIR += p5-WWW-Google-Video SUBDIR += p5-WWW-HatenaDiary SUBDIR += p5-WWW-HatenaLogin SUBDIR += p5-WWW-HatenaStar SUBDIR += p5-WWW-IMDb SUBDIR += p5-WWW-Instapaper-Client SUBDIR += p5-WWW-LongURL SUBDIR += p5-WWW-Mechanize SUBDIR += p5-WWW-Mechanize-CGI SUBDIR += p5-WWW-Mechanize-DecodedContent SUBDIR += p5-WWW-Mechanize-FormFiller SUBDIR += p5-WWW-Mechanize-GZip SUBDIR += p5-WWW-Mechanize-Meta SUBDIR += p5-WWW-Mechanize-PhantomJS SUBDIR += p5-WWW-Mechanize-Pluggable SUBDIR += p5-WWW-Mechanize-Plugin-phpBB SUBDIR += p5-WWW-Mechanize-Shell SUBDIR += p5-WWW-Mechanize-SpamCop SUBDIR += p5-WWW-Mechanize-TreeBuilder SUBDIR += p5-WWW-Mediawiki-Client SUBDIR += p5-WWW-Mixi SUBDIR += p5-WWW-Mixi-Scraper SUBDIR += p5-WWW-Myspace SUBDIR += p5-WWW-NicoVideo-Download SUBDIR += p5-WWW-NioTV SUBDIR += p5-WWW-OpenSVN SUBDIR += p5-WWW-OpenSearch SUBDIR += p5-WWW-Pastebin-PastebinCom-Create SUBDIR += p5-WWW-Plurk SUBDIR += p5-WWW-Robot SUBDIR += p5-WWW-RobotRules SUBDIR += p5-WWW-RobotRules-Parser SUBDIR += p5-WWW-Salesforce SUBDIR += p5-WWW-Scraper-ISBN SUBDIR += p5-WWW-Scraper-ISBN-Amazon_Driver SUBDIR += p5-WWW-Scraper-ISBN-ORA_Driver SUBDIR += p5-WWW-Scripter SUBDIR += p5-WWW-Scripter-Plugin-Ajax SUBDIR += p5-WWW-Scripter-Plugin-JavaScript SUBDIR += p5-WWW-Search SUBDIR += p5-WWW-Search-AltaVista SUBDIR += p5-WWW-Search-Google SUBDIR += p5-WWW-Search-MSN SUBDIR += p5-WWW-Shorten SUBDIR += p5-WWW-Shorten-0rz SUBDIR += p5-WWW-Shorten-Bitly SUBDIR += p5-WWW-Shorten-Googl SUBDIR += p5-WWW-Shorten-KUSO SUBDIR += p5-WWW-Shorten-Yourls SUBDIR += p5-WWW-Shorten-isgd SUBDIR += p5-WWW-SourceForge SUBDIR += p5-WWW-Spinn3r SUBDIR += p5-WWW-TV SUBDIR += p5-WWW-TWSMS SUBDIR += p5-WWW-TinySong SUBDIR += p5-WWW-Tumblr SUBDIR += p5-WWW-VenusEnvy SUBDIR += p5-WWW-WebArchive SUBDIR += p5-WWW-Wikipedia SUBDIR += p5-WWW-Yandex-TIC SUBDIR += p5-WWW-iTunesConnect SUBDIR += p5-Web-Query SUBDIR += p5-Web-Scraper SUBDIR += p5-Web-Scraper-Config SUBDIR += p5-Web-Simple SUBDIR += p5-Web-oEmbed SUBDIR += p5-WebDAO SUBDIR += p5-WebDriver-Tiny SUBDIR += p5-WebService-Basecamp SUBDIR += p5-WebService-Bloglines SUBDIR += p5-WebService-BuzzurlAPI SUBDIR += p5-WebService-CIA SUBDIR += p5-WebService-GData SUBDIR += p5-WebService-Google-Reader SUBDIR += p5-WebService-Google-Sets SUBDIR += p5-WebService-IMDB SUBDIR += p5-WebService-ISBNDB SUBDIR += p5-WebService-Linode SUBDIR += p5-WebService-MoviePosterDB SUBDIR += p5-WebService-MusicBrainz SUBDIR += p5-WebService-MusicBrainz0 SUBDIR += p5-WebService-NoPaste SUBDIR += p5-WebService-Pushover SUBDIR += p5-WebService-Rakuten SUBDIR += p5-WebService-Redmine SUBDIR += p5-WebService-Simple SUBDIR += p5-WebService-Technorati SUBDIR += p5-WebService-YouTube SUBDIR += p5-WordPress-XMLRPC SUBDIR += p5-Yahoo-Lifestyle SUBDIR += p5-Yahoo-Search SUBDIR += p5-ZConf-RSS SUBDIR += p5-ZConf-RSS-GUI-GTK SUBDIR += p5-chklinks SUBDIR += p5-jQuery-File-Upload SUBDIR += p5-libapreq2 SUBDIR += p5-libservlet SUBDIR += p5-libwww SUBDIR += p5-pQuery SUBDIR += p5-webservice-validator-css-w3c SUBDIR += p5-webservice-validator-html-w3c SUBDIR += palemoon SUBDIR += paros SUBDIR += payara SUBDIR += pear-HTML_AJAX SUBDIR += pear-HTML_TagCloud SUBDIR += pear-HTTP SUBDIR += pear-HTTP_Client SUBDIR += pear-HTTP_Download SUBDIR += pear-HTTP_FloodControl SUBDIR += pear-HTTP_Header SUBDIR += pear-HTTP_Request SUBDIR += pear-HTTP_Request2 SUBDIR += pear-HTTP_Server SUBDIR += pear-HTTP_Session2 SUBDIR += pear-HTTP_Upload SUBDIR += pear-HTTP_WebDAV_Client SUBDIR += pear-HTTP_WebDAV_Server SUBDIR += pear-Horde_Browser SUBDIR += pear-Horde_Css_Parser SUBDIR += pear-Horde_Dav SUBDIR += pear-Horde_Editor SUBDIR += pear-Horde_Feed SUBDIR += pear-Horde_Form SUBDIR += pear-Horde_Http SUBDIR += pear-Horde_Routes SUBDIR += pear-Horde_Service_Facebook SUBDIR += pear-Horde_Service_Gravatar SUBDIR += pear-Horde_Service_Twitter SUBDIR += pear-Horde_Service_UrlShortener SUBDIR += pear-Horde_Service_Weather SUBDIR += pear-Horde_SessionHandler SUBDIR += pear-Horde_Template SUBDIR += pear-Services_Amazon SUBDIR += pear-Services_Amazon_S3 SUBDIR += pear-Services_Blogging SUBDIR += pear-Services_Compete SUBDIR += pear-Services_Delicious SUBDIR += pear-Services_Digg SUBDIR += pear-Services_Facebook SUBDIR += pear-Services_GeoNames SUBDIR += pear-Services_Google SUBDIR += pear-Services_OpenSearch SUBDIR += pear-Services_ShortURL SUBDIR += pear-Services_TinyURL SUBDIR += pear-Services_TwitPic SUBDIR += pear-Services_W3C_CSSValidator SUBDIR += pear-Services_W3C_HTMLValidator SUBDIR += pear-Services_Yadis SUBDIR += pear-Services_Yahoo SUBDIR += pear-Services_urlTea SUBDIR += pear-Structures_DataGrid_Renderer_Flexy SUBDIR += pear-Structures_DataGrid_Renderer_Pager SUBDIR += pear-Structures_DataGrid_Renderer_Smarty SUBDIR += pear-Text_Wiki SUBDIR += pear-UDDI SUBDIR += pear-XML_GRDDL SUBDIR += pear-twig SUBDIR += pebble SUBDIR += pecl-amfext SUBDIR += pecl-http SUBDIR += pecl-http1 SUBDIR += pecl-http2 SUBDIR += pecl-solr SUBDIR += pecl-sphinx SUBDIR += pecl-swish SUBDIR += pecl-twig SUBDIR += pecl-yaf SUBDIR += pecl-yaf2 SUBDIR += pecl-yar SUBDIR += pecl-yar1 SUBDIR += perlbal SUBDIR += pglogd SUBDIR += phalcon SUBDIR += photo_gallery SUBDIR += php-screw SUBDIR += php-templates SUBDIR += php56-opcache SUBDIR += php56-session SUBDIR += php56-tidy SUBDIR += php70-opcache SUBDIR += php70-session SUBDIR += php70-tidy SUBDIR += php71-opcache SUBDIR += php71-session SUBDIR += php71-tidy SUBDIR += php72-opcache SUBDIR += php72-session SUBDIR += php72-tidy SUBDIR += phpbb SUBDIR += phpbb3 SUBDIR += phpgroupware SUBDIR += phpmp SUBDIR += phpmustache SUBDIR += phpmyfaq SUBDIR += phprecipebook SUBDIR += phproxy SUBDIR += phpsysinfo SUBDIR += phpvirtualbox SUBDIR += phpwebapp SUBDIR += pivotx SUBDIR += piwigo SUBDIR += piwik SUBDIR += planet SUBDIR += plexwatchweb SUBDIR += plone SUBDIR += plugger SUBDIR += pmwiki SUBDIR += pnews SUBDIR += podcastamatic SUBDIR += polipo SUBDIR += pound SUBDIR += privatebin SUBDIR += privoxy SUBDIR += protovis SUBDIR += pserv SUBDIR += publicfile SUBDIR += punbb SUBDIR += pwebstats SUBDIR += py-HTMLgen SUBDIR += py-MechanicalSoup SUBDIR += py-Products.CMFPlone SUBDIR += py-Products.PloneLDAP SUBDIR += py-Products.TinyMCE SUBDIR += py-Tenjin SUBDIR += py-WebError SUBDIR += py-WebFlash SUBDIR += py-WebTest SUBDIR += py-aiohttp SUBDIR += py-aiohttp-wsgi SUBDIR += py-albatross SUBDIR += py-amf SUBDIR += py-apachelog SUBDIR += py-autobahn SUBDIR += py-aws-requests-auth SUBDIR += py-beaker SUBDIR += py-beautifulsoup SUBDIR += py-beautifulsoup32 SUBDIR += py-bjoern SUBDIR += py-bleach SUBDIR += py-blogofile SUBDIR += py-bokeh SUBDIR += py-boto3 SUBDIR += py-bottle SUBDIR += py-bottle-cork SUBDIR += py-buku SUBDIR += py-cachecontrol SUBDIR += py-caldav SUBDIR += py-cherrypy SUBDIR += py-cherrypy-old SUBDIR += py-clientform SUBDIR += py-collective.easytemplate SUBDIR += py-collective.templateengines SUBDIR += py-cookies SUBDIR += py-cssmin SUBDIR += py-cssselect SUBDIR += py-cssutils SUBDIR += py-django SUBDIR += py-django-allauth SUBDIR += py-django-annotations SUBDIR += py-django-annoying SUBDIR += py-django-appconf SUBDIR += py-django-appmedia SUBDIR += py-django-assets SUBDIR += py-django-auth-ldap SUBDIR += py-django-babel SUBDIR += py-django-bitfield SUBDIR += py-django-bootstrap-form SUBDIR += py-django-bulk-update SUBDIR += py-django-caching-app-plugins SUBDIR += py-django-classy-tags SUBDIR += py-django-cms SUBDIR += py-django-configurations SUBDIR += py-django-constance SUBDIR += py-django-contact-form SUBDIR += py-django-contrib-comments SUBDIR += py-django-cors-headers SUBDIR += py-django-countries SUBDIR += py-django-crispy-forms SUBDIR += py-django-datetime-widget SUBDIR += py-django-debug-toolbar SUBDIR += py-django-devel SUBDIR += py-django-dpaste SUBDIR += py-django-evolution SUBDIR += py-django-extensions SUBDIR += py-django-filer SUBDIR += py-django-formtools SUBDIR += py-django-guardian SUBDIR += py-django-happenings SUBDIR += py-django-haystack SUBDIR += py-django-hijack SUBDIR += py-django-htmlmin SUBDIR += py-django-json-rpc SUBDIR += py-django-jsonfield SUBDIR += py-django-keyedcache SUBDIR += py-django-ldapdb SUBDIR += py-django-livesettings SUBDIR += py-django-markdownx SUBDIR += py-django-markwhat SUBDIR += py-django-mezzanine SUBDIR += py-django-mezzanine-filebrowser SUBDIR += py-django-mezzanine-grappelli SUBDIR += py-django-mptt SUBDIR += py-django-openid-auth SUBDIR += py-django-otp SUBDIR += py-django-otp-yubikey SUBDIR += py-django-overextends SUBDIR += py-django-paging SUBDIR += py-django-photologue SUBDIR += py-django-picklefield SUBDIR += py-django-pipeline SUBDIR += py-django-post_office SUBDIR += py-django-profiles SUBDIR += py-django-pyscss SUBDIR += py-django-recaptcha SUBDIR += py-django-redis SUBDIR += py-django-registration SUBDIR += py-django-registration-defaults SUBDIR += py-django-registration-redux SUBDIR += py-django-reversion SUBDIR += py-django-sekizai SUBDIR += py-django-signals-ahoy SUBDIR += py-django-simple-captcha SUBDIR += py-django-simple-history SUBDIR += py-django-social-auth SUBDIR += py-django-sortedm2m SUBDIR += py-django-star-ratings SUBDIR += py-django-statici18n SUBDIR += py-django-storages SUBDIR += py-django-subdomains SUBDIR += py-django-sudo SUBDIR += py-django-tables2 SUBDIR += py-django-tagging SUBDIR += py-django-taggit SUBDIR += py-django-tastypie SUBDIR += py-django-templatetag-sugar SUBDIR += py-django-threaded-multihost SUBDIR += py-django-tinymce SUBDIR += py-django-voting SUBDIR += py-django110 SUBDIR += py-django111 SUBDIR += py-django18 SUBDIR += py-django_compressor SUBDIR += py-django_openstack_auth SUBDIR += py-django_polymorphic SUBDIR += py-djangorestframework SUBDIR += py-djangorestframework-csv SUBDIR += py-djangorestframework-filters SUBDIR += py-djangorestframework-xml SUBDIR += py-djangotoolbox SUBDIR += py-dojango SUBDIR += py-dtflickr SUBDIR += py-evernote SUBDIR += py-falcon SUBDIR += py-fcgi SUBDIR += py-fedex SUBDIR += py-feedgenerator SUBDIR += py-flask SUBDIR += py-flask-admin SUBDIR += py-flask-api SUBDIR += py-flask-assets SUBDIR += py-flask-bootstrap SUBDIR += py-flask-cache SUBDIR += py-flask-compress SUBDIR += py-flask-cors SUBDIR += py-flask-flatpages SUBDIR += py-flask-login SUBDIR += py-flask-oauthlib SUBDIR += py-flask-principal SUBDIR += py-flask-restful SUBDIR += py-flask-restplus SUBDIR += py-flask-socketio SUBDIR += py-flask-sockets SUBDIR += py-flask-uploads SUBDIR += py-flask-wtf SUBDIR += py-flexget SUBDIR += py-flup SUBDIR += py-formalchemy SUBDIR += py-formencode SUBDIR += py-frappe-bench SUBDIR += py-frozen-flask SUBDIR += py-funkload SUBDIR += py-gandi.cli SUBDIR += py-gevent-websocket SUBDIR += py-goobook SUBDIR += py-google SUBDIR += py-google-api-python-client SUBDIR += py-google-cloud-core SUBDIR += py-google-cloud-storage SUBDIR += py-google-resumable-media SUBDIR += py-graphite-api SUBDIR += py-graphite-web SUBDIR += py-grequests SUBDIR += py-gunicorn SUBDIR += py-h2 SUBDIR += py-horizon SUBDIR += py-hpack SUBDIR += py-html SUBDIR += py-html5-parser SUBDIR += py-html5lib SUBDIR += py-http-parser SUBDIR += py-httpie SUBDIR += py-httplib2 SUBDIR += py-hyper SUBDIR += py-hyperframe SUBDIR += py-hyperlink SUBDIR += py-imdbpy SUBDIR += py-jonpy SUBDIR += py-jsonfield SUBDIR += py-jswebkit SUBDIR += py-kallithea SUBDIR += py-libsass SUBDIR += py-mechanize SUBDIR += py-meld SUBDIR += py-meld3 SUBDIR += py-mt SUBDIR += py-multidict SUBDIR += py-nevow SUBDIR += py-notebook SUBDIR += py-octoprint SUBDIR += py-pafy SUBDIR += py-paste SUBDIR += py-pastedeploy SUBDIR += py-pastescript SUBDIR += py-pelican SUBDIR += py-planet SUBDIR += py-plone.alterego SUBDIR += py-plone.app.blob SUBDIR += py-plone.app.caching SUBDIR += py-plone.app.collection SUBDIR += py-plone.app.content SUBDIR += py-plone.app.contentlisting SUBDIR += py-plone.app.contentmenu SUBDIR += py-plone.app.contentrules SUBDIR += py-plone.app.controlpanel SUBDIR += py-plone.app.customerize SUBDIR += py-plone.app.dexterity SUBDIR += py-plone.app.discussion SUBDIR += py-plone.app.folder SUBDIR += py-plone.app.form SUBDIR += py-plone.app.i18n SUBDIR += py-plone.app.imaging SUBDIR += py-plone.app.iterate SUBDIR += py-plone.app.jquery SUBDIR += py-plone.app.jquerytools SUBDIR += py-plone.app.layout SUBDIR += py-plone.app.ldap SUBDIR += py-plone.app.linkintegrity SUBDIR += py-plone.app.locales SUBDIR += py-plone.app.portlets SUBDIR += py-plone.app.querystring SUBDIR += py-plone.app.redirector SUBDIR += py-plone.app.registry SUBDIR += py-plone.app.search SUBDIR += py-plone.app.testing SUBDIR += py-plone.app.textfield SUBDIR += py-plone.app.theming SUBDIR += py-plone.app.upgrade SUBDIR += py-plone.app.users SUBDIR += py-plone.app.uuid SUBDIR += py-plone.app.viewletmanager SUBDIR += py-plone.app.vocabularies SUBDIR += py-plone.app.workflow SUBDIR += py-plone.app.z3cform SUBDIR += py-plone.autoform SUBDIR += py-plone.batching SUBDIR += py-plone.behavior SUBDIR += py-plone.browserlayer SUBDIR += py-plone.cachepurging SUBDIR += py-plone.caching SUBDIR += py-plone.contentrules SUBDIR += py-plone.dexterity SUBDIR += py-plone.fieldsets SUBDIR += py-plone.folder SUBDIR += py-plone.formwidget.namedfile SUBDIR += py-plone.i18n SUBDIR += py-plone.indexer SUBDIR += py-plone.intelligenttext SUBDIR += py-plone.locking SUBDIR += py-plone.memoize SUBDIR += py-plone.namedfile SUBDIR += py-plone.outputfilters SUBDIR += py-plone.portlet.collection SUBDIR += py-plone.portlet.static SUBDIR += py-plone.portlets SUBDIR += py-plone.registry SUBDIR += py-plone.resource SUBDIR += py-plone.resourceeditor SUBDIR += py-plone.rfc822 SUBDIR += py-plone.scale SUBDIR += py-plone.schemaeditor SUBDIR += py-plone.stringinterp SUBDIR += py-plone.subrequest SUBDIR += py-plone.supermodel SUBDIR += py-plone.synchronize SUBDIR += py-plone.testing SUBDIR += py-plone.theme SUBDIR += py-plone.transformchain SUBDIR += py-plone.uuid SUBDIR += py-plone.z3cform SUBDIR += py-plonetheme.classic SUBDIR += py-plonetheme.sunburst SUBDIR += py-poster SUBDIR += py-praw SUBDIR += py-prewikka SUBDIR += py-puppetboard SUBDIR += py-puppetboard02 SUBDIR += py-py-restclient SUBDIR += py-pySmartDL SUBDIR += py-pyjwt SUBDIR += py-pylons SUBDIR += py-pyocclient SUBDIR += py-pyquery SUBDIR += py-pyramid SUBDIR += py-pyramid_rpc SUBDIR += py-pysearch SUBDIR += py-python-digitalocean SUBDIR += py-pywebdav SUBDIR += py-pyweblib SUBDIR += py-pywikibot SUBDIR += py-qp SUBDIR += py-qpy SUBDIR += py-qt4-webkit SUBDIR += py-qt5-webkit SUBDIR += py-qt5-webkitwidgets SUBDIR += py-rackspace-monitoring SUBDIR += py-recaptcha SUBDIR += py-requestbuilder SUBDIR += py-requests SUBDIR += py-requests-cache SUBDIR += py-requests-file SUBDIR += py-requests-futures SUBDIR += py-requests-mock SUBDIR += py-requests-oauthlib SUBDIR += py-requests-toolbelt SUBDIR += py-requests1 SUBDIR += py-restclient SUBDIR += py-rfc3986 SUBDIR += py-rfc3987 SUBDIR += py-rhodecode SUBDIR += py-rollbar SUBDIR += py-routes SUBDIR += py-scgi SUBDIR += py-scrapy SUBDIR += py-seafdav SUBDIR += py-seafobj SUBDIR += py-searx SUBDIR += py-selector SUBDIR += py-selenium SUBDIR += py-slimit SUBDIR += py-slimmer SUBDIR += py-slumber SUBDIR += py-sockjs-tornado SUBDIR += py-splinter SUBDIR += py-spyne SUBDIR += py-surl SUBDIR += py-textile SUBDIR += py-tmdb3 SUBDIR += py-tornado SUBDIR += py-trello SUBDIR += py-treq SUBDIR += py-turbogears2 SUBDIR += py-tvdb_api SUBDIR += py-txrequests SUBDIR += py-uliweb SUBDIR += py-urlgrabber SUBDIR += py-urlobject SUBDIR += py-user_agent SUBDIR += py-utidylib SUBDIR += py-w3lib SUBDIR += py-waitress SUBDIR += py-webassets SUBDIR += py-webhelpers SUBDIR += py-webkitgtk SUBDIR += py-webob SUBDIR += py-websocket-client SUBDIR += py-webunit SUBDIR += py-werkzeug SUBDIR += py-wikipedia SUBDIR += py-wikitools SUBDIR += py-ws4py SUBDIR += py-wsaccel SUBDIR += py-wsgiauth SUBDIR += py-wsgidav SUBDIR += py-yarl SUBDIR += py-zope.app.wsgi SUBDIR += py3-cssutils SUBDIR += py3-httplib2 SUBDIR += py3-requests SUBDIR += pyblosxom SUBDIR += pycarddav SUBDIR += pydio SUBDIR += pyjamas SUBDIR += qdecoder SUBDIR += qooxdoo SUBDIR += qt4-webkit SUBDIR += qt5-webchannel SUBDIR += qt5-webengine SUBDIR += qt5-webkit SUBDIR += qt5-websockets SUBDIR += qt5-websockets-qml SUBDIR += quickie SUBDIR += qupzilla-qt4 SUBDIR += qupzilla-qt5 SUBDIR += qutebrowser SUBDIR += radicale SUBDIR += red5 SUBDIR += redaxo SUBDIR += redmine SUBDIR += redmine-a_common_libs SUBDIR += redmine-backlogs SUBDIR += redmine-basecamp SUBDIR += redmine-default_assign SUBDIR += redmine-graphs SUBDIR += redmine-http-auth SUBDIR += redmine-issue_templates SUBDIR += redmine-knowledgebase SUBDIR += redmine-ldap_sync SUBDIR += redmine-qa_contact SUBDIR += redmine-redcarpet_formatter SUBDIR += redmine-sidebar_hide SUBDIR += redmine-single_auth SUBDIR += redmine-wiki_notes SUBDIR += rejik SUBDIR += rekonq SUBDIR += reportmagic SUBDIR += repos-style SUBDIR += resin3 SUBDIR += retawq SUBDIR += revive-adserver SUBDIR += rnews SUBDIR += roundup SUBDIR += rsskit SUBDIR += rssowl SUBDIR += rssroll SUBDIR += rsstail SUBDIR += rsstool SUBDIR += rt42 SUBDIR += rt44 SUBDIR += rtv SUBDIR += ruby-aws SUBDIR += rubygem-ace-rails-ap SUBDIR += rubygem-actioncable5 SUBDIR += rubygem-actioncable50 SUBDIR += rubygem-actionpack4 SUBDIR += rubygem-actionpack5 SUBDIR += rubygem-actionpack50 SUBDIR += rubygem-activeresource4 SUBDIR += rubygem-activeresource5 SUBDIR += rubygem-acts-as-taggable-on SUBDIR += rubygem-acts-as-taggable-on3 SUBDIR += rubygem-acts-as-taggable-on5 SUBDIR += rubygem-acts_as_taggable SUBDIR += rubygem-addressable SUBDIR += rubygem-adsf SUBDIR += rubygem-akami SUBDIR += rubygem-amazon-ecs SUBDIR += rubygem-anemone SUBDIR += rubygem-asana SUBDIR += rubygem-async_sinatra SUBDIR += rubygem-best_in_place SUBDIR += rubygem-best_in_place-rails5 SUBDIR += rubygem-bluecloth SUBDIR += rubygem-bootstrap-sass SUBDIR += rubygem-browser SUBDIR += rubygem-cal-heatmap-rails SUBDIR += rubygem-cal-heatmap-rails-rails4 SUBDIR += rubygem-carrierwave SUBDIR += rubygem-cgi_multipart_eof_fix SUBDIR += rubygem-chosen-rails SUBDIR += rubygem-cookiejar SUBDIR += rubygem-crass SUBDIR += rubygem-cuba SUBDIR += rubygem-d3_rails SUBDIR += rubygem-d3_rails-rails4 SUBDIR += rubygem-dashing SUBDIR += rubygem-davclient SUBDIR += rubygem-deckar01-task_list SUBDIR += rubygem-domainatrix SUBDIR += rubygem-dropzonejs-rails SUBDIR += rubygem-dropzonejs-rails07 SUBDIR += rubygem-em-http-request SUBDIR += rubygem-em-socksify SUBDIR += rubygem-em-twitter SUBDIR += rubygem-em-websocket SUBDIR += rubygem-emk-sinatra-url-for SUBDIR += rubygem-erubi SUBDIR += rubygem-erubis SUBDIR += rubygem-ethon SUBDIR += rubygem-eventmachine_httpserver SUBDIR += rubygem-faraday SUBDIR += rubygem-faraday_middleware SUBDIR += rubygem-faye SUBDIR += rubygem-faye-websocket SUBDIR += rubygem-fcgi SUBDIR += rubygem-feed-normalizer SUBDIR += rubygem-feedjira SUBDIR += rubygem-flowdock SUBDIR += rubygem-fuzzyurl SUBDIR += rubygem-geminabox SUBDIR += rubygem-gitlab-flowdock-git-hook SUBDIR += rubygem-gitlab-gollum-lib SUBDIR += rubygem-gitlab-grack SUBDIR += rubygem-gitlab-turbolinks-classic SUBDIR += rubygem-goldfinger SUBDIR += rubygem-gollum SUBDIR += rubygem-gollum-grit_adapter SUBDIR += rubygem-gollum-lib SUBDIR += rubygem-gollum-lib-gitlab SUBDIR += rubygem-gollum-rugged_adapter SUBDIR += rubygem-gon SUBDIR += rubygem-gon-rails4 SUBDIR += rubygem-hackpad-cli SUBDIR += rubygem-haml SUBDIR += rubygem-haml-coderay SUBDIR += rubygem-haml-contrib SUBDIR += rubygem-haml-rails-rails4 SUBDIR += rubygem-haml4 SUBDIR += rubygem-hamlit SUBDIR += rubygem-hamlit-rails SUBDIR += rubygem-hamlit-rails-rails5 SUBDIR += rubygem-hamlit-rails-rails50 SUBDIR += rubygem-hashicorp-checkpoint SUBDIR += rubygem-heroku SUBDIR += rubygem-heroku-api SUBDIR += rubygem-heroku-nav SUBDIR += rubygem-hpricot SUBDIR += rubygem-html2haml SUBDIR += rubygem-http SUBDIR += rubygem-http-cookie SUBDIR += rubygem-http-form_data SUBDIR += rubygem-http_router SUBDIR += rubygem-httparty SUBDIR += rubygem-httpclient SUBDIR += rubygem-httpi SUBDIR += rubygem-hurley SUBDIR += rubygem-innate SUBDIR += rubygem-jekyll SUBDIR += rubygem-jekyll-sanity SUBDIR += rubygem-jekyll-watch SUBDIR += rubygem-journey SUBDIR += rubygem-jquery-atwho-rails SUBDIR += rubygem-jquery-rails SUBDIR += rubygem-jquery-rails-rails5 SUBDIR += rubygem-jquery-rails-rails50 SUBDIR += rubygem-jquery-scrollto-rails SUBDIR += rubygem-jquery-turbolinks SUBDIR += rubygem-jquery-ui-rails-rails4 SUBDIR += rubygem-jruby-rack SUBDIR += rubygem-jsobfu SUBDIR += rubygem-json-jwt SUBDIR += rubygem-jwt SUBDIR += rubygem-kaminari SUBDIR += rubygem-kaminari-actionview SUBDIR += rubygem-kaminari-actionview-rails5 SUBDIR += rubygem-kaminari-actionview-rails50 SUBDIR += rubygem-kaminari-activerecord SUBDIR += rubygem-kaminari-activerecord-rails5 SUBDIR += rubygem-kaminari-activerecord-rails50 SUBDIR += rubygem-kaminari-core SUBDIR += rubygem-kaminari-rails4 SUBDIR += rubygem-kaminari-rails5 SUBDIR += rubygem-kaminari-rails50 SUBDIR += rubygem-kensa SUBDIR += rubygem-kubeclient SUBDIR += rubygem-layout_yullio_generator SUBDIR += rubygem-less SUBDIR += rubygem-lighthouse-api SUBDIR += rubygem-link_header SUBDIR += rubygem-lograge SUBDIR += rubygem-lograge-rails5 SUBDIR += rubygem-lograge-rails50 SUBDIR += rubygem-maruku SUBDIR += rubygem-mechanize SUBDIR += rubygem-merb-assets SUBDIR += rubygem-merb-core SUBDIR += rubygem-merb-haml SUBDIR += rubygem-merb-helpers SUBDIR += rubygem-merb-param-protection SUBDIR += rubygem-mousetrap-rails SUBDIR += rubygem-multipart-post SUBDIR += rubygem-nanoc SUBDIR += rubygem-nested_form SUBDIR += rubygem-net-http-digest_auth SUBDIR += rubygem-net-http-persistent SUBDIR += rubygem-net-http-persistent2 SUBDIR += rubygem-net-http-pipeline SUBDIR += rubygem-nicovideo SUBDIR += rubygem-ntlm-http SUBDIR += rubygem-octopress SUBDIR += rubygem-oembed SUBDIR += rubygem-ostatus2 SUBDIR += rubygem-pagerduty SUBDIR += rubygem-passenger SUBDIR += rubygem-puma SUBDIR += rubygem-puma2 SUBDIR += rubygem-pusher-client SUBDIR += rubygem-rabbirack SUBDIR += rubygem-rack SUBDIR += rubygem-rack_csrf SUBDIR += rubygem-rack-accept SUBDIR += rubygem-rack-attack SUBDIR += rubygem-rack-cache SUBDIR += rubygem-rack-contrib SUBDIR += rubygem-rack-cors SUBDIR += rubygem-rack-cors0 SUBDIR += rubygem-rack-mount SUBDIR += rubygem-rack-openid SUBDIR += rubygem-rack-protection SUBDIR += rubygem-rack-protection1 SUBDIR += rubygem-rack-proxy SUBDIR += rubygem-rack-ssl SUBDIR += rubygem-rack-test SUBDIR += rubygem-rack-timeout SUBDIR += rubygem-rack15 SUBDIR += rubygem-rack16 SUBDIR += rubygem-rails-settings-cached SUBDIR += rubygem-rails-settings-cached-rails5 SUBDIR += rubygem-rails-settings-cached-rails50 SUBDIR += rubygem-rails4 SUBDIR += rubygem-rails5 SUBDIR += rubygem-rails50 SUBDIR += rubygem-rails_12factor SUBDIR += rubygem-rails_autolink SUBDIR += rubygem-rails_serve_static_assets SUBDIR += rubygem-rails_stdout_logging SUBDIR += rubygem-railties4 SUBDIR += rubygem-railties5 SUBDIR += rubygem-railties50 SUBDIR += rubygem-raindrops SUBDIR += rubygem-ramaze SUBDIR += rubygem-raphael-rails SUBDIR += rubygem-rbovirt SUBDIR += rubygem-rdf SUBDIR += rubygem-rdf-normalize SUBDIR += rubygem-redcloth SUBDIR += rubygem-redis-rack SUBDIR += rubygem-redis-rack1 SUBDIR += rubygem-redis-rails SUBDIR += rubygem-redis-rails-rails5 SUBDIR += rubygem-redis-rails-rails50 SUBDIR += rubygem-redmine_acts_as_taggable_on SUBDIR += rubygem-responders SUBDIR += rubygem-responders-rails5 SUBDIR += rubygem-responders-rails50 SUBDIR += rubygem-rest-client SUBDIR += rubygem-rfacebook SUBDIR += rubygem-rfeedfinder SUBDIR += rubygem-rinku SUBDIR += rubygem-rkelly-remix SUBDIR += rubygem-robotex SUBDIR += rubygem-robots SUBDIR += rubygem-roda SUBDIR += rubygem-rqrcode SUBDIR += rubygem-rqrcode-rails3 SUBDIR += rubygem-rtlit SUBDIR += rubygem-ruby-oembed SUBDIR += rubygem-ruby-readability SUBDIR += rubygem-savon SUBDIR += rubygem-sawyer SUBDIR += rubygem-scrapi SUBDIR += rubygem-select2-rails SUBDIR += rubygem-select2-rails3 SUBDIR += rubygem-selenium-webdriver SUBDIR += rubygem-semantic-ui-sass SUBDIR += rubygem-simple-rss SUBDIR += rubygem-sinatra SUBDIR += rubygem-sinatra-contrib SUBDIR += rubygem-sinatra-r18n SUBDIR += rubygem-sinatra-respond_to SUBDIR += rubygem-sinatra1 SUBDIR += rubygem-socksify SUBDIR += rubygem-task_list SUBDIR += rubygem-thin SUBDIR += rubygem-tinyatom SUBDIR += rubygem-tinymce-rails SUBDIR += rubygem-toml-rb SUBDIR += rubygem-totoridipjp SUBDIR += rubygem-tumblr_client SUBDIR += rubygem-turbolinks SUBDIR += rubygem-turbolinks-classic SUBDIR += rubygem-turbolinks-rails5 SUBDIR += rubygem-turbolinks-rails50 SUBDIR += rubygem-turbolinks-source SUBDIR += rubygem-typhoeus SUBDIR += rubygem-uglifier SUBDIR += rubygem-underscore-rails SUBDIR += rubygem-unicorn SUBDIR += rubygem-unicorn-worker-killer SUBDIR += rubygem-url_escape SUBDIR += rubygem-url_mount SUBDIR += rubygem-vegas SUBDIR += rubygem-wasabi SUBDIR += rubygem-webkit-gtk SUBDIR += rubygem-webkit-gtk2 SUBDIR += rubygem-webmock SUBDIR += rubygem-webpack-rails SUBDIR += rubygem-webrobots SUBDIR += rubygem-websocket SUBDIR += rubygem-websocket-driver SUBDIR += rubygem-websocket-extensions SUBDIR += rubygem-yapra SUBDIR += sabredav SUBDIR += sahi SUBDIR += sakai SUBDIR += samidare SUBDIR += sams2 SUBDIR += sarg SUBDIR += scloader SUBDIR += script4rss SUBDIR += seahub SUBDIR += seamonkey SUBDIR += seamonkey-i18n SUBDIR += selenium SUBDIR += serendipity SUBDIR += serf SUBDIR += servlet-api SUBDIR += sfnt2woff SUBDIR += shellinabox SUBDIR += shttpd SUBDIR += sit SUBDIR += sitebar SUBDIR += sitecopy SUBDIR += skytemplate SUBDIR += slowcgi SUBDIR += smarty2 SUBDIR += smarty3 SUBDIR += smb_auth SUBDIR += snarf SUBDIR += sogo2 SUBDIR += sogo2-activesync SUBDIR += sogo3 SUBDIR += sogo3-activesync SUBDIR += spawn-fcgi SUBDIR += spdylay SUBDIR += spreadlogd SUBDIR += sqstat SUBDIR += squid SUBDIR += squid-devel SUBDIR += squid_radius_auth SUBDIR += squidanalyzer SUBDIR += squidclamav SUBDIR += squidguard SUBDIR += squidpurge SUBDIR += squidview SUBDIR += srg SUBDIR += stagit SUBDIR += subsonic SUBDIR += subsonic-standalone SUBDIR += suphp SUBDIR += surf SUBDIR += surfraw SUBDIR += swfdec-plugin SUBDIR += swiggle SUBDIR += swish++ SUBDIR += swish-e SUBDIR += sws SUBDIR += sxweb SUBDIR += syndigator SUBDIR += tclhttpd SUBDIR += tclwebtest SUBDIR += tdiary SUBDIR += tdom SUBDIR += template_ SUBDIR += templatelite SUBDIR += testlink SUBDIR += textpattern SUBDIR += thttpd SUBDIR += thumbnail_index SUBDIR += thundercache SUBDIR += thundersnarf SUBDIR += tickr SUBDIR += tidy SUBDIR += tidy-devel SUBDIR += tidy-html5 SUBDIR += tidy-lib SUBDIR += tikiwiki SUBDIR += tinymce SUBDIR += tinyproxy SUBDIR += tinytinyhttpd SUBDIR += tivoka SUBDIR += tntnet SUBDIR += tokyopromenade SUBDIR += tomcat-devel SUBDIR += tomcat-native SUBDIR += tomcat6 SUBDIR += tomcat7 SUBDIR += tomcat8 SUBDIR += tomcat85 SUBDIR += tomee SUBDIR += trac SUBDIR += trac-OhlohWidgetsMacro SUBDIR += trac-TracGoogleAnalytics SUBDIR += trac-accountmanager SUBDIR += trac-advancedticketworkflow SUBDIR += trac-attachmentpolicy SUBDIR += trac-autocomplete SUBDIR += trac-bzr SUBDIR += trac-ccselector SUBDIR += trac-childtickets SUBDIR += trac-customfieldadmin SUBDIR += trac-datefield SUBDIR += trac-defaultcc SUBDIR += trac-discussion SUBDIR += trac-downloads SUBDIR += trac-email2trac SUBDIR += trac-email2trac-postfix SUBDIR += trac-estimator SUBDIR += trac-fivestarvote SUBDIR += trac-fullblog SUBDIR += trac-fullblognotification SUBDIR += trac-gantt SUBDIR += trac-graphviz SUBDIR += trac-iniadmin SUBDIR += trac-keywords SUBDIR += trac-keywordsecretticket SUBDIR += trac-ldap SUBDIR += trac-ldapauthstore SUBDIR += trac-math SUBDIR += trac-mercurial SUBDIR += trac-navadd SUBDIR += trac-permredirect SUBDIR += trac-privatetickets SUBDIR += trac-pydotorgtheme SUBDIR += trac-scrumburndown SUBDIR += trac-spam-filter SUBDIR += trac-subtickets SUBDIR += trac-tags SUBDIR += trac-themeengine SUBDIR += trac-ticketimport SUBDIR += trac-tickettemplate SUBDIR += trac-timingandestimation SUBDIR += trac-tocmacro SUBDIR += trac-tracdragdrop SUBDIR += trac-tweakui SUBDIR += trac-vote SUBDIR += trac-watchlist SUBDIR += trac-wikigoodies SUBDIR += trac-wikinotification SUBDIR += trac-wikitemplates SUBDIR += trac-wikitopdf SUBDIR += trac-wysiwyg SUBDIR += trac-xmlrpc SUBDIR += trafficserver SUBDIR += transmission-web SUBDIR += transproxy SUBDIR += trytond28_google_maps SUBDIR += tt-rss SUBDIR += ttf2eot SUBDIR += twiki SUBDIR += twiki-BehaviourContrib SUBDIR += twiki-BlogAddOn SUBDIR += twiki-BugzillaLinkPlugin SUBDIR += twiki-ClassicSkin SUBDIR += twiki-CommentPlugin SUBDIR += twiki-EditTablePlugin SUBDIR += twiki-EmptyPlugin SUBDIR += twiki-GluePlugin SUBDIR += twiki-InterwikiPlugin SUBDIR += twiki-JSCalendarContrib SUBDIR += twiki-LDAPPasswordChangerPlugin SUBDIR += twiki-LdapContrib SUBDIR += twiki-LdapNgPlugin SUBDIR += twiki-MailerContrib SUBDIR += twiki-MathModePlugin SUBDIR += twiki-NewUserPlugin SUBDIR += twiki-PatternSkin SUBDIR += twiki-PreferencesPlugin SUBDIR += twiki-RenderListPlugin SUBDIR += twiki-SlideShowPlugin SUBDIR += twiki-SmiliesPlugin SUBDIR += twiki-SpreadSheetPlugin SUBDIR += twiki-SubscribePlugin SUBDIR += twiki-TWikiUserMappingContrib SUBDIR += twiki-TablePlugin SUBDIR += twiki-TagMePlugin SUBDIR += twiki-TinyMCEPlugin SUBDIR += twiki-TipsContrib SUBDIR += twiki-TopicVarsPlugin SUBDIR += twiki-TwistyContrib SUBDIR += twiki-TwistyPlugin SUBDIR += twiki-WysiwygPlugin SUBDIR += twill SUBDIR += twms SUBDIR += typo3-7 SUBDIR += typo3-8 SUBDIR += uchiwa SUBDIR += udmsearch SUBDIR += ufdbguard SUBDIR += uglifyjs SUBDIR += unit SUBDIR += usermanager SUBDIR += uwsgi SUBDIR += uwsgitop SUBDIR += uzbl SUBDIR += validator SUBDIR += varnish-libvmod-awsrest SUBDIR += varnish-libvmod-digest SUBDIR += varnish-libvmod-maxminddb SUBDIR += varnish-modules SUBDIR += varnish-nagios SUBDIR += varnish4 SUBDIR += varnish5 SUBDIR += vdr-plugin-live SUBDIR += vdradmin-am SUBDIR += vee SUBDIR += vertx SUBDIR += vimb-gtk2 SUBDIR += vimb-gtk3 SUBDIR += visitors SUBDIR += volta SUBDIR += w3m SUBDIR += w3m-img SUBDIR += w3mir SUBDIR += waccess SUBDIR += wadcomblog + SUBDIR += waterfox SUBDIR += web2ldap SUBDIR += webalizer SUBDIR += webbrowser SUBDIR += webcheck SUBDIR += webcopy SUBDIR += webcrawl SUBDIR += webfs SUBDIR += webgo SUBDIR += webgrind SUBDIR += webinject SUBDIR += webkit-gtk2 SUBDIR += webkit-gtk3 SUBDIR += webkit-sharp SUBDIR += webkit2-gtk3 SUBDIR += weblint SUBDIR += weblint++ SUBDIR += webpy SUBDIR += webreport SUBDIR += webresolve SUBDIR += websh SUBDIR += webstats SUBDIR += webstone SUBDIR += webstone-ssl SUBDIR += webtrees SUBDIR += wgetpaste SUBDIR += wikicalc SUBDIR += woof SUBDIR += wordpress SUBDIR += wsdlpull SUBDIR += wsmake SUBDIR += wt SUBDIR += www6to4 SUBDIR += wwwoffle SUBDIR += xapian-omega SUBDIR += xapian-omega12 SUBDIR += xaraya SUBDIR += xcache SUBDIR += xfce4-smartbookmark-plugin SUBDIR += xist SUBDIR += xombrero SUBDIR += xoops SUBDIR += xpi-adblock SUBDIR += xpi-adblock_plus SUBDIR += xpi-clear_cache_button SUBDIR += xpi-close-all-tabs SUBDIR += xpi-colorfultabs SUBDIR += xpi-conkeror SUBDIR += xpi-cssviewer SUBDIR += xpi-cutemenus-crystalsvg SUBDIR += xpi-default_full_zoom_level SUBDIR += xpi-delicious SUBDIR += xpi-downthemall SUBDIR += xpi-errorzilla SUBDIR += xpi-firebug SUBDIR += xpi-firefox-showcase SUBDIR += xpi-firemobilesimulator SUBDIR += xpi-fission SUBDIR += xpi-flagfox SUBDIR += xpi-flashblock SUBDIR += xpi-flashgot SUBDIR += xpi-flatbmark SUBDIR += xpi-forecastfox SUBDIR += xpi-formfox SUBDIR += xpi-foxmarks SUBDIR += xpi-foxyproxy SUBDIR += xpi-gdata_provider SUBDIR += xpi-ghostery SUBDIR += xpi-gmail-manager SUBDIR += xpi-google-notebook SUBDIR += xpi-google_shortcuts SUBDIR += xpi-grab_and_drag SUBDIR += xpi-greasemonkey SUBDIR += xpi-httpfox SUBDIR += xpi-imagezoom SUBDIR += xpi-imdbpreview SUBDIR += xpi-imglikeopera SUBDIR += xpi-infolister SUBDIR += xpi-informenter SUBDIR += xpi-inline-google-definitions SUBDIR += xpi-it_s_all_text SUBDIR += xpi-jslib SUBDIR += xpi-jsview SUBDIR += xpi-jv SUBDIR += xpi-leechblock SUBDIR += xpi-linkification SUBDIR += xpi-live_http_headers SUBDIR += xpi-live_pagerank SUBDIR += xpi-menueditor SUBDIR += xpi-modify_headers SUBDIR += xpi-mrtech-local-install SUBDIR += xpi-neo-diggler SUBDIR += xpi-no-referrer SUBDIR += xpi-noscript SUBDIR += xpi-passwordmaker SUBDIR += xpi-pdf_download SUBDIR += xpi-permatabs SUBDIR += xpi-quick-locale-switcher SUBDIR += xpi-quickproxy SUBDIR += xpi-resurrectpages SUBDIR += xpi-sameplace SUBDIR += xpi-scrapbook SUBDIR += xpi-searchstatus SUBDIR += xpi-server_spy SUBDIR += xpi-server_switcher SUBDIR += xpi-sessionmanager SUBDIR += xpi-showip SUBDIR += xpi-speed-dial SUBDIR += xpi-splash SUBDIR += xpi-stumbleupon SUBDIR += xpi-stylish SUBDIR += xpi-table2clipboard SUBDIR += xpi-tabmixplus SUBDIR += xpi-tagzilla SUBDIR += xpi-togglewordwrap SUBDIR += xpi-torbutton SUBDIR += xpi-twitterfox SUBDIR += xpi-u2f4moz SUBDIR += xpi-uBlock_origin SUBDIR += xpi-unplug SUBDIR += xpi-urllink SUBDIR += xpi-user_agent_switcher SUBDIR += xpi-vimperator SUBDIR += xpi-web_developer SUBDIR += xpi-wmlbrowser SUBDIR += xpi-xhtml-ruby-support SUBDIR += xpi-xmpp4moz SUBDIR += xpi-yslow SUBDIR += xshttpd SUBDIR += xshttpd-devel SUBDIR += xsp SUBDIR += yabb SUBDIR += yanopaste SUBDIR += yarn SUBDIR += yaws SUBDIR += yii SUBDIR += you-get SUBDIR += yourls SUBDIR += youtube_dl SUBDIR += yuicompressor SUBDIR += zen-cart SUBDIR += zend-framework SUBDIR += zend-framework1 SUBDIR += zenphoto SUBDIR += zerowait-httpd SUBDIR += zikula SUBDIR += zope213 .include Index: head/www/waterfox/Makefile =================================================================== --- head/www/waterfox/Makefile (nonexistent) +++ head/www/waterfox/Makefile (revision 454949) @@ -0,0 +1,73 @@ +# $FreeBSD$ + +PORTNAME= waterfox +DISTVERSION= 56.0.s20171122 +CATEGORIES= www ipv6 + +MAINTAINER= jbeich@FreeBSD.org +COMMENT= Distilled fork of Firefox ${MOZILLA_VER:R:R} + +DEPRECATED= Temporary experiment +EXPIRATION_DATE=2017-12-12 + +BUILD_DEPENDS= nspr>=4.16:devel/nspr \ + nss>=3.32.1:security/nss \ + icu>=59.1,1:devel/icu \ + libevent>=2.1.8:devel/libevent \ + harfbuzz>=1.4.7:print/harfbuzz \ + graphite2>=1.3.10:graphics/graphite2 \ + png>=1.6.31:graphics/png \ + libvorbis>=1.3.5,3:audio/libvorbis \ + libvpx>=1.5.0:multimedia/libvpx \ + sqlite3>=3.19.3:databases/sqlite3 \ + ${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3 \ + v4l_compat>0:multimedia/v4l_compat \ + autoconf-2.13:devel/autoconf213 \ + yasm:devel/yasm \ + zip:archivers/zip +# soundtouch>=1.9.0:audio/soundtouch \ + +LIB_DEPENDS= libv4l2.so:multimedia/libv4l + +USE_GITHUB= yes +GH_ACCOUNT= MrAlex94 +GH_PROJECT= Waterfox +GH_TAGNAME= 224e688d8ddf + +USE_GECKO= gecko +MOZ_PKGCONFIG_FILES= # empty +USE_MOZILLA= -soundtouch +MOZILLA_NAME= Waterfox + +USE_GL= gl + +WATERFOX_ICON= ${MOZILLA}.png +WATERFOX_ICON_SRC= ${PREFIX}/lib/${MOZILLA}/browser/chrome/icons/default/default256.png +WATERFOX_DESKTOP= ${MOZSRC}/taskcluster/docker/firefox-snap/firefox.desktop +MOZ_OPTIONS= --enable-application=browser \ + --with-app-name=${MOZILLA} \ + --with-app-basename=${MOZILLA_NAME} \ + --with-distribution-id=org.${MOZILLA}project + +OPTIONS_DEFAULT= BUNDLED_CAIRO + +.include "${.CURDIR}/../../www/firefox/Makefile.options" + +post-patch: + @${REINPLACE_CMD} -e 's/%u/%U/' -e '/X-MultipleArgs/d' \ + -e 's/Firefox/${MOZILLA_NAME}/' \ + ${WATERFOX_DESKTOP} + @${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \ + ${WRKSRC}/browser/app/nsBrowserApp.cpp + +pre-configure: + (cd ${WRKSRC} && ${LOCALBASE}/bin/autoconf-2.13) + (cd ${WRKSRC}/js/src/ && ${LOCALBASE}/bin/autoconf-2.13) + +post-install: + ${INSTALL_DATA} ${WATERFOX_DESKTOP} \ + ${STAGEDIR}${PREFIX}/share/applications/${MOZILLA}.desktop + ${MKDIR} ${STAGEDIR}${PREFIX}/share/pixmaps + ${LN} -sf ${WATERFOX_ICON_SRC} ${STAGEDIR}${PREFIX}/share/pixmaps/${WATERFOX_ICON} + +.include Property changes on: head/www/waterfox/Makefile ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/distinfo =================================================================== --- head/www/waterfox/distinfo (nonexistent) +++ head/www/waterfox/distinfo (revision 454949) @@ -0,0 +1,3 @@ +TIMESTAMP = 1511372895 +SHA256 (MrAlex94-Waterfox-56.0.s20171122-224e688d8ddf_GH0.tar.gz) = f9d62e1f1d4379304e688dcd895bc1dded49fb7ed99d03419662db08ffc84a13 +SIZE (MrAlex94-Waterfox-56.0.s20171122-224e688d8ddf_GH0.tar.gz) = 394181158 Property changes on: head/www/waterfox/distinfo ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1377587 =================================================================== --- head/www/waterfox/files/patch-bug1377587 (nonexistent) +++ head/www/waterfox/files/patch-bug1377587 (revision 454949) @@ -0,0 +1,929 @@ +commit 2b68b38709b1 +Author: Andrew McCreight +Date: Tue Aug 22 14:24:11 2017 -0700 + + Bug 1377587, part 1 - Always act like __exposedProps__ is missing. r=krizsa + + This patch gently removes support for __exposedProps__ by changing + ExposedPropertiesOnly::check() to always return false, while still + failing silently in deny for some kinds of access. + + The tests that I changed all involve testing the behavior with + __exposedProps__. I adjusted them to expect it to fail, or to adjust + the error message they get when they fail. That seemed better than + deleting them entirely. + + Note that test_bug1065185.html had a bug, so that it never executed + the first case. I fixed that, and then fixed up the test to work when + __exposedProps__ is not supported. + + This also removes various bits of the test framework that use + __exposedProps__, but don't actually need to. + + MozReview-Commit-ID: 8fvkAmITmXY + + --HG-- + extra : rebase_source : ef7e2c55adc12511f17f3865ebb46c343875f0b3 +--- + addon-sdk/source/lib/sdk/console/plain-text.js | 10 -- + addon-sdk/source/lib/sdk/test/loader.js | 5 - + .../addons/e10s-content/lib/test-content-script.js | 6 +- + addon-sdk/source/test/test-content-script.js | 6 +- + devtools/server/tests/unit/test_objectgrips-17.js | 4 - + dom/base/nsDeprecatedOperationList.h | 1 - + dom/base/test/chrome/cpows_child.js | 12 +- + dom/locales/en-US/chrome/dom/dom.properties | 2 - + js/xpconnect/src/XPCJSRuntime.cpp | 1 - + js/xpconnect/src/xpcprivate.h | 1 - + js/xpconnect/tests/chrome/test_bug1065185.html | 6 +- + js/xpconnect/tests/chrome/test_cows.xul | 80 +++------ + js/xpconnect/tests/chrome/test_exposeInDerived.xul | 13 +- + js/xpconnect/tests/unit/test_bug1082450.js | 20 +-- + js/xpconnect/tests/unit/test_bug780370.js | 7 +- + js/xpconnect/tests/unit/test_bug813901.js | 2 +- + js/xpconnect/tests/unit/test_bug853709.js | 4 +- + js/xpconnect/tests/unit/test_bug854558.js | 2 +- + js/xpconnect/tests/unit/test_bug930091.js | 2 +- + js/xpconnect/wrappers/AccessCheck.cpp | 179 --------------------- + js/xpconnect/wrappers/AccessCheck.h | 11 +- + js/xpconnect/wrappers/ChromeObjectWrapper.h | 6 +- + js/xpconnect/wrappers/WrapperFactory.cpp | 4 +- + js/xpconnect/wrappers/XrayWrapper.cpp | 2 +- + testing/mochitest/tests/SimpleTest/ChromePowers.js | 9 -- + .../specialpowers/content/MockPermissionPrompt.jsm | 12 -- + .../components/addoncompat/RemoteAddonsParent.jsm | 2 +- + 27 files changed, 74 insertions(+), 335 deletions(-) + +diff --git addon-sdk/source/lib/sdk/console/plain-text.js addon-sdk/source/lib/sdk/console/plain-text.js +index 0e44cf106d52..07b8eb629e12 100644 +--- addon-sdk/source/lib/sdk/console/plain-text.js ++++ addon-sdk/source/lib/sdk/console/plain-text.js +@@ -62,16 +62,6 @@ function PlainTextConsole(print, innerID) { + } + }); + +- // We defined the `__exposedProps__` in our console chrome object. +- // +- // Meanwhile we're investigating with the platform team if `__exposedProps__` +- // are needed, or are just a left-over. +- +- console.__exposedProps__ = Object.keys(ConsoleAPI.prototype).reduce(function(exposed, prop) { +- exposed[prop] = "r"; +- return exposed; +- }, {}); +- + Object.freeze(console); + return console; + }; +diff --git addon-sdk/source/lib/sdk/test/loader.js addon-sdk/source/lib/sdk/test/loader.js +index 33ba2ca5a029..b555de63f02a 100644 +--- addon-sdk/source/lib/sdk/test/loader.js ++++ addon-sdk/source/lib/sdk/test/loader.js +@@ -53,11 +53,6 @@ function HookedPlainTextConsole(hook, print, innerID) { + this.exception = hook.bind(null, "exception", innerID); + this.time = hook.bind(null, "time", innerID); + this.timeEnd = hook.bind(null, "timeEnd", innerID); +- +- this.__exposedProps__ = { +- log: "rw", info: "rw", warn: "rw", error: "rw", debug: "rw", +- exception: "rw", time: "rw", timeEnd: "rw" +- }; + } + + // Creates a custom loader instance whose console module is hooked in order +diff --git addon-sdk/source/test/addons/e10s-content/lib/test-content-script.js addon-sdk/source/test/addons/e10s-content/lib/test-content-script.js +index 477895e40481..3dccfec618d3 100644 +--- addon-sdk/source/test/addons/e10s-content/lib/test-content-script.js ++++ addon-sdk/source/test/addons/e10s-content/lib/test-content-script.js +@@ -444,7 +444,7 @@ exports["test Highlight toString Behavior"] = createProxyTest("", function (help + let strToString = helper.rawWindow.Object.prototype.toString.call(""); + assert.ok(/\[object String.*\]/.test(strToString), "strings are strings"); + +- let o = {__exposedProps__:{}}; ++ let o = {}; + let objToString = helper.rawWindow.Object.prototype.toString.call(o); + assert.ok(/\[object Object.*\]/.test(objToString), "objects are objects"); + +@@ -622,10 +622,6 @@ exports["test Functions"] = createProxyTest("", function (helper) { + helper.rawWindow.isEqual = function isEqual(a, b) { + return a == b; + }; +- // bug 784116: workaround in order to allow proxy code to cache proxies on +- // these functions: +- helper.rawWindow.callFunction.__exposedProps__ = {__proxy: 'rw'}; +- helper.rawWindow.isEqual.__exposedProps__ = {__proxy: 'rw'}; + + helper.createWorker( + 'new ' + function ContentScriptScope() { +diff --git addon-sdk/source/test/test-content-script.js addon-sdk/source/test/test-content-script.js +index 709fb5a3aa91..a02e66f65eea 100644 +--- addon-sdk/source/test/test-content-script.js ++++ addon-sdk/source/test/test-content-script.js +@@ -444,7 +444,7 @@ exports["test Highlight toString Behavior"] = createProxyTest("", function (help + let strToString = helper.rawWindow.Object.prototype.toString.call(""); + assert.ok(/\[object String.*\]/.test(strToString), "strings are strings"); + +- let o = {__exposedProps__:{}}; ++ let o = {}; + let objToString = helper.rawWindow.Object.prototype.toString.call(o); + assert.ok(/\[object Object.*\]/.test(objToString), "objects are objects"); + +@@ -622,10 +622,6 @@ exports["test Functions"] = createProxyTest("", function (helper) { + helper.rawWindow.isEqual = function isEqual(a, b) { + return a == b; + }; +- // bug 784116: workaround in order to allow proxy code to cache proxies on +- // these functions: +- helper.rawWindow.callFunction.__exposedProps__ = {__proxy: 'rw'}; +- helper.rawWindow.isEqual.__exposedProps__ = {__proxy: 'rw'}; + + helper.createWorker( + 'new ' + function ContentScriptScope() { +diff --git dom/base/nsDeprecatedOperationList.h dom/base/nsDeprecatedOperationList.h +index 2523187c63a7..adcf4d9d8202 100644 +--- dom/base/nsDeprecatedOperationList.h ++++ dom/base/nsDeprecatedOperationList.h +@@ -21,7 +21,6 @@ DEPRECATED_OPERATION(NodeValue) + DEPRECATED_OPERATION(TextContent) + DEPRECATED_OPERATION(EnablePrivilege) + DEPRECATED_OPERATION(DOMExceptionCode) +-DEPRECATED_OPERATION(NoExposedProps) + DEPRECATED_OPERATION(MutationEvent) + DEPRECATED_OPERATION(Components) + DEPRECATED_OPERATION(PrefixedVisibilityAPI) +diff --git dom/base/test/chrome/cpows_child.js dom/base/test/chrome/cpows_child.js +index 6d240a7eaa51..fc7e3f2c9d0f 100644 +--- dom/base/test/chrome/cpows_child.js ++++ dom/base/test/chrome/cpows_child.js +@@ -105,7 +105,13 @@ function parent_test(finish) + + addMessageListener("cpows:from_parent", (msg) => { + let obj = msg.objects.obj; +- ok(obj.a == 1, "correct value from parent"); ++ if (is_remote) { ++ ok(obj.a == undefined, "__exposedProps__ should not work"); ++ } else { ++ // The same process test is not run as content, so the field can ++ // be accessed even though __exposedProps__ has been removed. ++ ok(obj.a == 1, "correct value from parent"); ++ } + + // Test that a CPOW reference to a function in the chrome process + // is callable from unprivileged content. Greasemonkey uses this +@@ -260,11 +266,11 @@ function lifetime_test(finish) + var obj = {"will_die": {"f": 1}}; + let [result] = sendRpcMessage("cpows:lifetime_test_1", {}, {obj: obj}); + ok(result == 10, "got sync result"); +- ok(obj.wont_die.f == 2, "got reverse CPOW"); ++ ok(obj.wont_die.f == undefined, "got reverse CPOW"); + obj.will_die = null; + Components.utils.schedulePreciseGC(function() { + addMessageListener("cpows:lifetime_test_3", (msg) => { +- ok(obj.wont_die.f == 2, "reverse CPOW still works"); ++ ok(obj.wont_die.f == undefined, "reverse CPOW still works"); + finish(); + }); + sendRpcMessage("cpows:lifetime_test_2"); +diff --git dom/locales/en-US/chrome/dom/dom.properties dom/locales/en-US/chrome/dom/dom.properties +index 5c94a580287a..ac9dbed58e08 100644 +--- dom/locales/en-US/chrome/dom/dom.properties ++++ dom/locales/en-US/chrome/dom/dom.properties +@@ -154,8 +154,6 @@ MediaEMENoCapabilitiesDeprecatedWarning=Calling navigator.requestMediaKeySystemA + MediaEMENoCodecsDeprecatedWarning=Calling navigator.requestMediaKeySystemAccess() (at %S) passing a candidate MediaKeySystemConfiguration containing audioCapabilities or videoCapabilities without a contentType with a “codecs” string is deprecated and will soon become unsupported. + # LOCALIZATION NOTE: Do not translate "DOMException", "code" and "name" + DOMExceptionCodeWarning=Use of DOMException’s code attribute is deprecated. Use name instead. +-# LOCALIZATION NOTE: Do not translate "__exposedProps__" +-NoExposedPropsWarning=Exposing chrome JS objects to content without __exposedProps__ is insecure and deprecated. See https://developer.mozilla.org/en/XPConnect_wrappers for more information. + # LOCALIZATION NOTE: Do not translate "Mutation Event" and "MutationObserver" + MutationEventWarning=Use of Mutation Events is deprecated. Use MutationObserver instead. + # LOCALIZATION NOTE: Do not translate "Components" +diff --git js/xpconnect/src/XPCJSRuntime.cpp js/xpconnect/src/XPCJSRuntime.cpp +index 455b9f8e963f..ff9aea0a41eb 100644 +--- js/xpconnect/src/XPCJSRuntime.cpp ++++ js/xpconnect/src/XPCJSRuntime.cpp +@@ -93,7 +93,6 @@ const char* const XPCJSRuntime::mStrings[] = { + "item", // IDX_ITEM + "__proto__", // IDX_PROTO + "__iterator__", // IDX_ITERATOR +- "__exposedProps__", // IDX_EXPOSEDPROPS + "eval", // IDX_EVAL + "controllers", // IDX_CONTROLLERS + "Controllers", // IDX_CONTROLLERS_CLASS +diff --git js/xpconnect/src/xpcprivate.h js/xpconnect/src/xpcprivate.h +index fb7e43c22cd0..5d877f09d301 100644 +--- js/xpconnect/src/xpcprivate.h ++++ js/xpconnect/src/xpcprivate.h +@@ -460,7 +460,6 @@ public: + IDX_ITEM , + IDX_PROTO , + IDX_ITERATOR , +- IDX_EXPOSEDPROPS , + IDX_EVAL , + IDX_CONTROLLERS , + IDX_CONTROLLERS_CLASS , +diff --git js/xpconnect/tests/chrome/test_bug1065185.html js/xpconnect/tests/chrome/test_bug1065185.html +index cdd65326f9c8..7ea81fc8aa6f 100644 +--- js/xpconnect/tests/chrome/test_bug1065185.html ++++ js/xpconnect/tests/chrome/test_bug1065185.html +@@ -25,11 +25,11 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1065185 + + var gLoadCount = 0; + function loaded() { +- switch(++gLoadCount) { ++ switch(gLoadCount++) { + case 0: +- doMonitor([]); ++ doMonitor([/access to property "a"/i]); + window[0].wrappedJSObject.probe = { a: 2, __exposedProps__: { 'a': 'r' } }; +- is(window[0].eval('probe.a'), 2, "Accessed exposed prop"); ++ is(window[0].eval('probe.a'), undefined, "Accessed exposed prop"); + endMonitor(); + break; + case 1: +diff --git js/xpconnect/tests/chrome/test_cows.xul js/xpconnect/tests/chrome/test_cows.xul +index 75c5250dd150..adfdd686540b 100644 +--- js/xpconnect/tests/chrome/test_cows.xul ++++ js/xpconnect/tests/chrome/test_cows.xul +@@ -49,13 +49,6 @@ sandbox.getCOW = getCOW; + const TEST_API = ['is', 'isnot', 'ok', 'todo_is', 'todo_isnot', 'todo']; + TEST_API.forEach(function(name) { sandbox[name] = window[name]; }); + +-sandbox.alienObject = { +- __exposedProps__: {funProp: 'r'}, +- funProp: function foo(x) { +- return x + 1; +- } +-}; +- + sandbox.chromeGet = function (obj, prop) { return obj[prop]; }; + + function COWTests() { +@@ -74,17 +67,6 @@ function COWTests() { + // functions like assertIsWritable(myObj, 'someproperty') might + // be useful. + +- function isProp(obj, propName, value, desc) { +- try { +- is(obj[propName], value, "getting " + propName + " on " + desc); +- ok(propName in obj, +- propName + " on " + desc + " should exist"); +- ok(Object.hasOwnProperty.call(obj, propName), +- propName + " on " + desc + " should exist"); +- } catch (e) { +- ok(false, "getting " + propName + " on " + desc + " threw " + e); +- } +- } + function isPropHidden(obj, propName, desc) { + try { + is(obj[propName], undefined, +@@ -103,7 +85,7 @@ function COWTests() { + var empty = {}; + var nonempty = {foo: 42, bar: 33}; + is(getCOW(empty).foo, undefined, +- "shouldn't throw when accessing exposed properties that doesn't exist"); ++ "shouldn't throw when accessing exposed properties that don't exist"); + + PROPS_TO_TEST.forEach(function(name) { + isPropHidden(getCOW(nonempty), name, "object without exposedProps"); +@@ -135,18 +117,12 @@ function COWTests() { + var strict = { __exposedProps__: { foo: "r" }, foo: "foo property" }; + var strictCOWr = getCOW(strict); + PROPS_TO_TEST.forEach(function(name) { +- if (name == "foo") { +- isProp(strictCOWr, name, "foo property", +- "object with exposed 'foo'"); +- } +- else { +- isPropHidden(strictCOW, name, "object with exposed 'foo'"); +- } ++ isPropHidden(strictCOW, name, "object with exposed 'foo'"); + }); +- is(getNames(strictCOWr).length, 1, +- "object with exposedProps only enumerate exposed props"); +- is(getNames(strictCOWr)[0], "foo", +- "object with exposedProps only enumerate exposed props"); ++ is(getNames(strictCOWr).length, 0, ++ "exposed props does not enumerate anything"); ++ is(getNames(strictCOWr)[0], undefined, ++ "exposed props does not enumerate anything"); + + // Test writable property + var writable = getCOW({ __exposedProps__: {foo: 'w'}}); +@@ -154,25 +130,18 @@ function COWTests() { + ok(!("foo" in writable), + "non-existing write-only property shouldn't exist"); + writable.foo = 5; +- is(chromeGet(writable, "foo"), 5, "writing to a write-only exposed prop works"); +- todo("foo" in writable, +- "existing write-only property should exist"); +- } catch (e) { +- ok(false, "writing to a write-only exposed prop shouldn't throw " + e); +- } +- try { +- writable.foo; +- todo(false, "reading from a write-only exposed prop should throw"); ++ ok(false, "writing to a write-only exposed prop should throw"); + } catch (e) { +- todo(/Permission denied/.test(e), +- "reading from a write-only exposed prop should throw"); ++ ok(/Permission denied/.test(e), ++ "writing to a write-only exposed prop should throw the right error"); + } ++ is(writable.foo, undefined, ++ "reading from a write-only exposed prop should return undefined"); + try { + delete writable.foo; +- is(chromeGet(writable, "foo"), undefined, +- "deleting a write-only exposed prop works"); ++ ok(false, "deleting a write-only exposed prop should throw"); + } catch (e) { +- ok(false, "deleting a write-only exposed prop shouldn't throw " + e); ++ ok(true, "deleting a write-only exposed prop should throw " + e); + } + + // Test readable property +@@ -180,8 +149,8 @@ function COWTests() { + foo: 5, + bar: 6 }; + try { +- isProp(getCOW(readable), "foo", 5, +- "reading from a readable exposed prop works"); ++ isPropHidden(getCOW(readable), "foo", undefined, ++ "reading from a readable exposed prop shouldn't work"); + } catch (e) { + ok(false, "reading from a readable exposed prop shouldn't throw " + e); + } +@@ -202,8 +171,7 @@ function COWTests() { + + try { + var props = getNames(getCOW(readable)); +- is(props.length, 1, "COW w/ one exposed prop should enumerate once"); +- is(props[0], 'foo', "COW w/ one exposed prop should enumerate it"); ++ is(props.length, 0, "COW w/ one exposed prop should not enumerate"); + } catch (e) { + ok(false, "COW w/ a readable prop should not raise exc " + + "on enumeration: " + e); +@@ -215,21 +183,17 @@ function COWTests() { + ok(!("foo" in readwrite), + "non-existing readwrite property shouldn't exist"); + readwrite.foo = 5; +- is(readwrite.foo, 5, "writing to a readwrite exposed prop looks like it worked"); +- is(chromeGet(readwrite, "foo"), 5, "writing to a readwrite exposed prop works"); +- ok("foo" in readwrite, +- "existing readwrite property should exist"); ++ ok(false, "writing to a readwrite exposed prop should throw"); + } catch (e) { +- ok(false, "writing to a readwrite exposed prop shouldn't throw " + e); ++ ok(/Permission denied/.test(e), ++ "writing to a readwrite exposed prop should throw the right error"); + } + try { + delete readwrite.foo; +- is(readwrite.foo, undefined, "deleting readwrite prop looks like it worked"); +- ok(!("foo" in readwrite), "deleting readwrite prop looks like it really worked"); +- is(chromeGet(readwrite, "foo"), undefined, +- "deleting a readwrite exposed prop works"); ++ ok(false, "deleting a readwrite prop should throw"); + } catch (e) { +- ok(false, "deleting a readwrite exposed prop shouldn't throw " + e); ++ ok(/Permission denied/.test(e), ++ "deleting a readwrite exposed prop should throw the right error"); + } + + // Readables and functions +diff --git js/xpconnect/tests/chrome/test_exposeInDerived.xul js/xpconnect/tests/chrome/test_exposeInDerived.xul +index 2ed3bb91e7fd..7e6c24e56db1 100644 +--- js/xpconnect/tests/chrome/test_exposeInDerived.xul ++++ js/xpconnect/tests/chrome/test_exposeInDerived.xul +@@ -17,7 +17,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=804630 + + +diff --git js/xpconnect/tests/unit/test_bug1082450.js js/xpconnect/tests/unit/test_bug1082450.js +index 07f45f06beef..5880fcbcd4e6 100644 +--- js/xpconnect/tests/unit/test_bug1082450.js ++++ js/xpconnect/tests/unit/test_bug1082450.js +@@ -5,9 +5,9 @@ function run_test() { + function checkThrows(str, rgxp) { + try { + sb.eval(str); +- do_check_true(false); ++ do_check_true(false, "eval should have thrown"); + } catch (e) { +- do_check_true(rgxp.test(e)); ++ do_check_true(rgxp.test(e), "error message should match"); + } + } + +@@ -29,12 +29,12 @@ function run_test() { + chromeCallableValueProp: 'r' } + }; + +- do_check_eq(sb.eval('exposed.simpleValueProp'), 42); +- do_check_eq(sb.eval('exposed.objectValueProp.val'), 42); +- checkThrows('exposed.getterProp;', /privileged accessor/i); +- checkThrows('exposed.setterProp = 42;', /privileged accessor/i); +- checkThrows('exposed.getterSetterProp;', /privileged accessor/i); +- checkThrows('exposed.getterSetterProp = 42;', /privileged accessor/i); +- do_check_eq(sb.eval('exposed.contentCallableValueProp()'), 42); +- checkThrows('exposed.chromeCallableValueProp();', /privileged or cross-origin callable/i); ++ do_check_eq(sb.eval('exposed.simpleValueProp'), undefined); ++ do_check_eq(sb.eval('exposed.objectValueProp'), undefined); ++ do_check_eq(sb.eval('exposed.getterProp;'), undefined); ++ do_check_eq(sb.eval('exposed.getterSetterProp;'), undefined); ++ checkThrows('exposed.setterProp = 42;', /Permission denied/i); ++ checkThrows('exposed.getterSetterProp = 42;', /Permission denied/i); ++ do_check_eq(sb.eval('exposed.contentCallableValueProp'), undefined); ++ checkThrows('exposed.chromeCallableValueProp();', /is not a function/i); + } +diff --git js/xpconnect/tests/unit/test_bug780370.js js/xpconnect/tests/unit/test_bug780370.js +index 40d6f9748015..7ae757f0cd01 100644 +--- js/xpconnect/tests/unit/test_bug780370.js ++++ js/xpconnect/tests/unit/test_bug780370.js +@@ -14,10 +14,5 @@ function run_test() + var sb = Cu.Sandbox("http://www.example.com"); + sb.obj = { foo: 42, __exposedProps__: { hasOwnProperty: 'r' } }; + do_check_eq(Cu.evalInSandbox('typeof obj.foo', sb), 'undefined', "COW works as expected"); +- try { +- Cu.evalInSandbox('obj.hasOwnProperty', sb); +- do_check_true(false); +- } catch (e) { +- do_check_true(/privileged or cross-origin callable/i.test(e)); +- } ++ do_check_eq(Cu.evalInSandbox('obj.hasOwnProperty', sb), undefined); + } +diff --git js/xpconnect/tests/unit/test_bug813901.js js/xpconnect/tests/unit/test_bug813901.js +index 42f981581b51..2efc6539e879 100644 +--- js/xpconnect/tests/unit/test_bug813901.js ++++ js/xpconnect/tests/unit/test_bug813901.js +@@ -21,5 +21,5 @@ function run_test() { + checkThrows('obj.foo = 3;', sb, /denied/); + Cu.evalInSandbox("var p = {__exposedProps__: {foo: 'rw'}};", sb); + sb.obj.__proto__ = sb.p; +- checkThrows('obj.foo = 4;', sb, /__exposedProps__/); ++ checkThrows('obj.foo = 4;', sb, /denied/); + } +diff --git js/xpconnect/tests/unit/test_bug853709.js js/xpconnect/tests/unit/test_bug853709.js +index c7e51757dc63..1667d2241f93 100644 +--- js/xpconnect/tests/unit/test_bug853709.js ++++ js/xpconnect/tests/unit/test_bug853709.js +@@ -8,7 +8,7 @@ function setupChromeSandbox() { + function checkDefineThrows(sb, obj, prop, desc) { + var result = Cu.evalInSandbox('(function() { try { Object.defineProperty(' + obj + ', "' + prop + '", ' + desc.toSource() + '); return "nothrow"; } catch (e) { return e.toString(); }})();', sb); + do_check_neq(result, 'nothrow'); +- do_check_true(!!/denied/.exec(result)); ++ do_check_true(!!/denied|prohibited/.exec(result)); + do_check_true(result.indexOf(prop) != -1); // Make sure the prop name is in the error message. + } + +@@ -19,7 +19,7 @@ function run_test() { + contentSB.chromeObj = chromeSB.chromeObj; + contentSB.chromeArr = chromeSB.chromeArr; + +- do_check_eq(Cu.evalInSandbox('chromeObj.a', contentSB), 2); ++ do_check_eq(Cu.evalInSandbox('chromeObj.a', contentSB), undefined); + try { + Cu.evalInSandbox('chromeArr[1]', contentSB); + do_check_true(false); +diff --git js/xpconnect/tests/unit/test_bug854558.js js/xpconnect/tests/unit/test_bug854558.js +index d60d23a5baf8..574194dc3f52 100644 +--- js/xpconnect/tests/unit/test_bug854558.js ++++ js/xpconnect/tests/unit/test_bug854558.js +@@ -7,5 +7,5 @@ function run_test() { + contentSB.foo = chromeSB.foo; + do_check_eq(Cu.evalInSandbox('foo.a', contentSB), undefined, "Default deny with no __exposedProps__"); + Cu.evalInSandbox('this.foo.__exposedProps__ = {a: "r"}', chromeSB); +- do_check_eq(Cu.evalInSandbox('foo.a', contentSB), 2, "works with __exposedProps__"); ++ do_check_eq(Cu.evalInSandbox('foo.a', contentSB), undefined, "Still not allowed with __exposedProps__"); + } +diff --git js/xpconnect/tests/unit/test_bug930091.js js/xpconnect/tests/unit/test_bug930091.js +index aa11d5db2640..ecb2a60aed11 100644 +--- js/xpconnect/tests/unit/test_bug930091.js ++++ js/xpconnect/tests/unit/test_bug930091.js +@@ -5,7 +5,7 @@ function checkThrows(fn) { + fn(); + ok(false, "Should have thrown"); + } catch (e) { +- do_check_true(/denied|insecure/.test(e)); ++ do_check_true(/denied|insecure|prohibited/.test(e)); + } + } + +diff --git js/xpconnect/wrappers/AccessCheck.cpp js/xpconnect/wrappers/AccessCheck.cpp +index 07599ce7906a..b730310731e2 100644 +--- js/xpconnect/wrappers/AccessCheck.cpp ++++ js/xpconnect/wrappers/AccessCheck.cpp +@@ -252,20 +252,6 @@ AccessCheck::checkPassToPrivilegedCode(JSContext* cx, HandleObject wrapper, Hand + return true; + } + +- // COWs are fine to pass to chrome if and only if they have __exposedProps__, +- // since presumably content should never have a reason to pass an opaque +- // object back to chrome. +- if (AccessCheck::isChrome(js::UncheckedUnwrap(wrapper)) && WrapperFactory::IsCOW(obj)) { +- RootedObject target(cx, js::UncheckedUnwrap(obj)); +- JSAutoCompartment ac(cx, target); +- RootedId id(cx, GetJSIDByIndex(cx, XPCJSContext::IDX_EXPOSEDPROPS)); +- bool found = false; +- if (!JS_HasPropertyById(cx, target, id, &found)) +- return false; +- if (found) +- return true; +- } +- + // Same-origin wrappers are fine. + if (AccessCheck::wrapperSubsumes(obj)) + return true; +@@ -323,171 +309,6 @@ AccessCheck::reportCrossOriginDenial(JSContext* cx, JS::HandleId id, + MOZ_ALWAYS_TRUE(rv.MaybeSetPendingException(cx)); + } + +-enum Access { READ = (1<<0), WRITE = (1<<1), NO_ACCESS = 0 }; +- +-static void +-EnterAndThrowASCII(JSContext* cx, JSObject* wrapper, const char* msg) +-{ +- JSAutoCompartment ac(cx, wrapper); +- JS_ReportErrorASCII(cx, "%s", msg); +-} +- +-bool +-ExposedPropertiesOnly::check(JSContext* cx, HandleObject wrapper, HandleId id, Wrapper::Action act) +-{ +- RootedObject wrappedObject(cx, Wrapper::wrappedObject(wrapper)); +- +- if (act == Wrapper::CALL) +- return false; +- +- // For the case of getting a property descriptor, we allow if either GET or SET +- // is allowed, and rely on FilteringWrapper to filter out any disallowed accessors. +- if (act == Wrapper::GET_PROPERTY_DESCRIPTOR) { +- return check(cx, wrapper, id, Wrapper::GET) || +- check(cx, wrapper, id, Wrapper::SET); +- } +- +- RootedId exposedPropsId(cx, GetJSIDByIndex(cx, XPCJSContext::IDX_EXPOSEDPROPS)); +- +- // We need to enter the wrappee's compartment to look at __exposedProps__, +- // but we want to be in the wrapper's compartment if we call Deny(). +- // +- // Unfortunately, |cx| can be in either compartment when we call ::check. :-( +- JSAutoCompartment ac(cx, wrappedObject); +- +- bool found = false; +- if (!JS_HasPropertyById(cx, wrappedObject, exposedPropsId, &found)) +- return false; +- +- // If no __exposedProps__ existed, deny access. +- if (!found) { +- // Previously we automatically granted access to indexed properties and +- // .length for Array COWs. We're not doing that anymore, so make sure to +- // let people know what's going on. +- bool isArray; +- if (!JS_IsArrayObject(cx, wrappedObject, &isArray)) +- return false; +- if (!isArray) +- isArray = JS_IsTypedArrayObject(wrappedObject); +- bool isIndexedAccessOnArray = isArray && JSID_IS_INT(id) && JSID_TO_INT(id) >= 0; +- bool isLengthAccessOnArray = isArray && JSID_IS_STRING(id) && +- JS_FlatStringEqualsAscii(JSID_TO_FLAT_STRING(id), "length"); +- if (isIndexedAccessOnArray || isLengthAccessOnArray) { +- JSAutoCompartment ac2(cx, wrapper); +- ReportWrapperDenial(cx, id, WrapperDenialForCOW, +- "Access to elements and length of privileged Array not permitted"); +- } +- +- return false; +- } +- +- if (id == JSID_VOID) +- return true; +- +- Rooted desc(cx); +- if (!JS_GetPropertyDescriptorById(cx, wrappedObject, exposedPropsId, &desc)) +- return false; +- +- if (!desc.object()) +- return false; +- +- if (desc.hasGetterOrSetter()) { +- EnterAndThrowASCII(cx, wrapper, "__exposedProps__ must be a value property"); +- return false; +- } +- +- RootedValue exposedProps(cx, desc.value()); +- if (exposedProps.isNullOrUndefined()) +- return false; +- +- if (!exposedProps.isObject()) { +- EnterAndThrowASCII(cx, wrapper, "__exposedProps__ must be undefined, null, or an Object"); +- return false; +- } +- +- RootedObject hallpass(cx, &exposedProps.toObject()); +- +- if (!AccessCheck::subsumes(js::UncheckedUnwrap(hallpass), wrappedObject)) { +- EnterAndThrowASCII(cx, wrapper, "Invalid __exposedProps__"); +- return false; +- } +- +- Access access = NO_ACCESS; +- +- if (!JS_GetPropertyDescriptorById(cx, hallpass, id, &desc)) { +- return false; // Error +- } +- if (!desc.object() || !desc.enumerable()) +- return false; +- +- if (!desc.value().isString()) { +- EnterAndThrowASCII(cx, wrapper, "property must be a string"); +- return false; +- } +- +- JSFlatString* flat = JS_FlattenString(cx, desc.value().toString()); +- if (!flat) +- return false; +- +- size_t length = JS_GetStringLength(JS_FORGET_STRING_FLATNESS(flat)); +- +- for (size_t i = 0; i < length; ++i) { +- char16_t ch = JS_GetFlatStringCharAt(flat, i); +- switch (ch) { +- case 'r': +- if (access & READ) { +- EnterAndThrowASCII(cx, wrapper, "duplicate 'readable' property flag"); +- return false; +- } +- access = Access(access | READ); +- break; +- +- case 'w': +- if (access & WRITE) { +- EnterAndThrowASCII(cx, wrapper, "duplicate 'writable' property flag"); +- return false; +- } +- access = Access(access | WRITE); +- break; +- +- default: +- EnterAndThrowASCII(cx, wrapper, "properties can only be readable or read and writable"); +- return false; +- } +- } +- +- if (access == NO_ACCESS) { +- EnterAndThrowASCII(cx, wrapper, "specified properties must have a permission bit set"); +- return false; +- } +- +- if ((act == Wrapper::SET && !(access & WRITE)) || +- (act != Wrapper::SET && !(access & READ))) { +- return false; +- } +- +- // Inspect the property on the underlying object to check for red flags. +- if (!JS_GetPropertyDescriptorById(cx, wrappedObject, id, &desc)) +- return false; +- +- // Reject accessor properties. +- if (desc.hasGetterOrSetter()) { +- EnterAndThrowASCII(cx, wrapper, "Exposing privileged accessor properties is prohibited"); +- return false; +- } +- +- // Reject privileged or cross-origin callables. +- if (desc.value().isObject()) { +- RootedObject maybeCallable(cx, js::UncheckedUnwrap(&desc.value().toObject())); +- if (JS::IsCallable(maybeCallable) && !AccessCheck::subsumes(wrapper, maybeCallable)) { +- EnterAndThrowASCII(cx, wrapper, "Exposing privileged or cross-origin callable is prohibited"); +- return false; +- } +- } +- +- return true; +-} +- + bool + ExposedPropertiesOnly::deny(JSContext* cx, js::Wrapper::Action act, HandleId id, + bool mayThrow) +diff --git js/xpconnect/wrappers/AccessCheck.h js/xpconnect/wrappers/AccessCheck.h +index 678dce3e0b81..c4873760ab7a 100644 +--- js/xpconnect/wrappers/AccessCheck.h ++++ js/xpconnect/wrappers/AccessCheck.h +@@ -104,10 +104,15 @@ struct CrossOriginAccessiblePropertiesOnly : public Policy { + } + }; + +-// This policy only permits access to properties if they appear in the +-// objects exposed properties list. ++// This class used to support permitting access to properties if they ++// appeared in an access list on the object, but now it acts like an ++// Opaque wrapper, with the exception that it fails silently for GET, ++// ENUMERATE, and GET_PROPERTY_DESCRIPTOR. This is done for backwards ++// compatibility. See bug 1397513. + struct ExposedPropertiesOnly : public Policy { +- static bool check(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id, js::Wrapper::Action act); ++ static bool check(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id, js::Wrapper::Action act) { ++ return false; ++ } + + static bool deny(JSContext* cx, js::Wrapper::Action act, JS::HandleId id, + bool mayThrow); +diff --git js/xpconnect/wrappers/ChromeObjectWrapper.h js/xpconnect/wrappers/ChromeObjectWrapper.h +index 8b273e470814..c17feed10b9a 100644 +--- js/xpconnect/wrappers/ChromeObjectWrapper.h ++++ js/xpconnect/wrappers/ChromeObjectWrapper.h +@@ -16,9 +16,9 @@ namespace xpc { + struct ExposedPropertiesOnly; + + // When a vanilla chrome JS object is exposed to content, we use a wrapper that +-// supports __exposedProps__ for legacy reasons. For extra security, we override +-// the traps that allow content to pass an object to chrome, and perform extra +-// security checks on them. ++// fails silently on GET, ENUMERATE, and GET_PROPERTY_DESCRIPTOR for legacy ++// reasons. For extra security, we override the traps that allow content to pass ++// an object to chrome, and perform extra security checks on them. + #define ChromeObjectWrapperBase \ + FilteringWrapper + +diff --git js/xpconnect/wrappers/WrapperFactory.cpp js/xpconnect/wrappers/WrapperFactory.cpp +index 6296f69fbea4..760d2c9afda8 100644 +--- js/xpconnect/wrappers/WrapperFactory.cpp ++++ js/xpconnect/wrappers/WrapperFactory.cpp +@@ -514,8 +514,8 @@ WrapperFactory::Rewrap(JSContext* cx, HandleObject existing, HandleObject obj) + wrapper = &FilteringWrapper::singleton; + } + +- // For Vanilla JSObjects exposed from chrome to content, we use a wrapper +- // that supports __exposedProps__. We'd like to get rid of these eventually, ++ // For vanilla JSObjects exposed from chrome to content, we use a wrapper ++ // that fails silently in a few cases. We'd like to get rid of this eventually, + // but in their current form they don't cause much trouble. + else if (IdentifyStandardInstance(obj) == JSProto_Object) { + wrapper = &ChromeObjectWrapper::singleton; +diff --git js/xpconnect/wrappers/XrayWrapper.cpp js/xpconnect/wrappers/XrayWrapper.cpp +index 44dd7cb47146..28e29ea13d93 100644 +--- js/xpconnect/wrappers/XrayWrapper.cpp ++++ js/xpconnect/wrappers/XrayWrapper.cpp +@@ -291,7 +291,7 @@ ReportWrapperDenial(JSContext* cx, HandleId id, WrapperDenialType type, const ch + MOZ_ASSERT(type == WrapperDenialForCOW); + errorMessage.emplace("Security wrapper denied access to property %s on privileged " + "Javascript object. Support for exposing privileged objects " +- "to untrusted content via __exposedProps__ is being gradually " ++ "to untrusted content via __exposedProps__ has been " + "removed - use WebIDL bindings or Components.utils.cloneInto " + "instead. Note that only the first denied property access from a " + "given global object will be reported.", +diff --git testing/mochitest/tests/SimpleTest/ChromePowers.js testing/mochitest/tests/SimpleTest/ChromePowers.js +index 97de578157c0..7fbf66e2fd00 100644 +--- testing/mochitest/tests/SimpleTest/ChromePowers.js ++++ testing/mochitest/tests/SimpleTest/ChromePowers.js +@@ -104,15 +104,6 @@ ChromePowers.prototype.executeAfterFlushingMessageQueue = function(aCallback) { + aCallback(); + }; + +-// Expose everything but internal APIs (starting with underscores) to +-// web content. We cannot use Object.keys to view SpecialPowers.prototype since +-// we are using the functions from SpecialPowersAPI.prototype +-ChromePowers.prototype.__exposedProps__ = {}; +-for (var i in ChromePowers.prototype) { +- if (i.charAt(0) != "_") +- ChromePowers.prototype.__exposedProps__[i] = "r"; +-} +- + if ((window.parent !== null) && + (window.parent !== undefined) && + (window.parent.wrappedJSObject.SpecialPowers) && +diff --git testing/specialpowers/content/MockPermissionPrompt.jsm testing/specialpowers/content/MockPermissionPrompt.jsm +index 71d0f5d2768a..1d86cc00e360 100644 +--- testing/specialpowers/content/MockPermissionPrompt.jsm ++++ testing/specialpowers/content/MockPermissionPrompt.jsm +@@ -83,15 +83,3 @@ MockPermissionPromptInstance.prototype = { + request.allow(); + } + }; +- +-// Expose everything to content. We call reset() here so that all of the relevant +-// lazy expandos get added. +-MockPermissionPrompt.reset(); +-function exposeAll(obj) { +- var props = {}; +- for (var prop in obj) +- props[prop] = "rw"; +- obj.__exposedProps__ = props; +-} +-exposeAll(MockPermissionPrompt); +-exposeAll(MockPermissionPromptInstance.prototype); +diff --git toolkit/components/addoncompat/RemoteAddonsParent.jsm toolkit/components/addoncompat/RemoteAddonsParent.jsm +index 1adbc0397729..d640c47d31f8 100644 +--- toolkit/components/addoncompat/RemoteAddonsParent.jsm ++++ toolkit/components/addoncompat/RemoteAddonsParent.jsm +@@ -735,7 +735,7 @@ var SandboxParent = { + if (rest.length) { + // Do a shallow copy of the options object into the child + // process. This way we don't have to access it through a Chrome +- // object wrapper, which would require __exposedProps__. ++ // object wrapper, which would not let us access any properties. + // + // The only object property here is sandboxPrototype. We assume + // it's a child process object (since that's what Greasemonkey +commit f89c72edb79e +Author: Andrew McCreight +Date: Thu Sep 7 11:17:16 2017 -0700 + + Bug 1377587, part 2 - Rename ExposedPropertiesOnly to OpaqueWithSilentFailing. r=krizsa + + This class doesn't have anything to do with __exposedProps__ any more, + so give it a more descriptive name. We'd still like to remove it + entirely eventually. + + MozReview-Commit-ID: 87KCpG6f8rI + + --HG-- + extra : rebase_source : 98a51a6af0fc8446dbcd8efa083d6c79286279d3 +--- + js/xpconnect/wrappers/AccessCheck.cpp | 4 ++-- + js/xpconnect/wrappers/AccessCheck.h | 2 +- + js/xpconnect/wrappers/ChromeObjectWrapper.h | 4 ++-- + 3 files changed, 5 insertions(+), 5 deletions(-) + +diff --git js/xpconnect/wrappers/AccessCheck.cpp js/xpconnect/wrappers/AccessCheck.cpp +index b730310731e2..620f1f678f51 100644 +--- js/xpconnect/wrappers/AccessCheck.cpp ++++ js/xpconnect/wrappers/AccessCheck.cpp +@@ -310,8 +310,8 @@ AccessCheck::reportCrossOriginDenial(JSContext* cx, JS::HandleId id, + } + + bool +-ExposedPropertiesOnly::deny(JSContext* cx, js::Wrapper::Action act, HandleId id, +- bool mayThrow) ++OpaqueWithSilentFailing::deny(JSContext* cx, js::Wrapper::Action act, HandleId id, ++ bool mayThrow) + { + // Fail silently for GET, ENUMERATE, and GET_PROPERTY_DESCRIPTOR. + if (act == js::Wrapper::GET || act == js::Wrapper::ENUMERATE || +diff --git js/xpconnect/wrappers/AccessCheck.h js/xpconnect/wrappers/AccessCheck.h +index c4873760ab7a..6783258f8d94 100644 +--- js/xpconnect/wrappers/AccessCheck.h ++++ js/xpconnect/wrappers/AccessCheck.h +@@ -109,7 +109,7 @@ struct CrossOriginAccessiblePropertiesOnly : public Policy { + // Opaque wrapper, with the exception that it fails silently for GET, + // ENUMERATE, and GET_PROPERTY_DESCRIPTOR. This is done for backwards + // compatibility. See bug 1397513. +-struct ExposedPropertiesOnly : public Policy { ++struct OpaqueWithSilentFailing : public Policy { + static bool check(JSContext* cx, JS::HandleObject wrapper, JS::HandleId id, js::Wrapper::Action act) { + return false; + } +diff --git js/xpconnect/wrappers/ChromeObjectWrapper.h js/xpconnect/wrappers/ChromeObjectWrapper.h +index c17feed10b9a..da4870237501 100644 +--- js/xpconnect/wrappers/ChromeObjectWrapper.h ++++ js/xpconnect/wrappers/ChromeObjectWrapper.h +@@ -13,14 +13,14 @@ + + namespace xpc { + +-struct ExposedPropertiesOnly; ++struct OpaqueWithSilentFailing; + + // When a vanilla chrome JS object is exposed to content, we use a wrapper that + // fails silently on GET, ENUMERATE, and GET_PROPERTY_DESCRIPTOR for legacy + // reasons. For extra security, we override the traps that allow content to pass + // an object to chrome, and perform extra security checks on them. + #define ChromeObjectWrapperBase \ +- FilteringWrapper ++ FilteringWrapper + + class ChromeObjectWrapper : public ChromeObjectWrapperBase + { + Property changes on: head/www/waterfox/files/patch-bug1377587 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1381761 =================================================================== --- head/www/waterfox/files/patch-bug1381761 (nonexistent) +++ head/www/waterfox/files/patch-bug1381761 (revision 454949) @@ -0,0 +1,362 @@ +commit 256e249566d8 +Author: Christoph Kerschbaumer +Date: Fri Aug 4 14:11:17 2017 +0200 + + Bug 1381761 - Treating 'data:' documents as unique, opaque origins should still inherit the CSP. r=smaug,dveditz +--- + caps/moz.build | 1 + + caps/nsScriptSecurityManager.cpp | 96 +++++++++++++++++++++++++--------------- + 2 files changed, 62 insertions(+), 35 deletions(-) + +diff --git caps/moz.build caps/moz.build +index 46331e93f097..af369e3268e0 100644 +--- caps/moz.build ++++ caps/moz.build +@@ -56,6 +56,7 @@ LOCAL_INCLUDES += [ + '/docshell/base', + '/dom/base', + '/js/xpconnect/src', ++ '/netwerk/base', + ] + + if CONFIG['ENABLE_TESTS']: +diff --git caps/nsScriptSecurityManager.cpp caps/nsScriptSecurityManager.cpp +index a930b324a6a2..90695ebd126f 100644 +--- caps/nsScriptSecurityManager.cpp ++++ caps/nsScriptSecurityManager.cpp +@@ -45,6 +45,7 @@ + #include "nsIWindowWatcher.h" + #include "nsIConsoleService.h" + #include "nsIObserverService.h" ++#include "nsIOService.h" + #include "nsIContent.h" + #include "nsDOMJSUtils.h" + #include "nsAboutProtocolUtils.h" +@@ -265,6 +266,61 @@ nsScriptSecurityManager::GetChannelResultPrincipalIfNotSandboxed(nsIChannel* aCh + /*aIgnoreSandboxing*/ true); + } + ++static void ++InheritAndSetCSPOnPrincipalIfNeeded(nsIChannel* aChannel, nsIPrincipal* aPrincipal) ++{ ++ // loading a data: URI into an iframe, or loading frame[srcdoc] need ++ // to inherit the CSP (see Bug 1073952, 1381761). ++ MOZ_ASSERT(aChannel && aPrincipal, "need a valid channel and principal"); ++ if (!aChannel) { ++ return; ++ } ++ ++ nsCOMPtr loadInfo = aChannel->GetLoadInfo(); ++ if (!loadInfo || ++ loadInfo->GetExternalContentPolicyType() != nsIContentPolicy::TYPE_SUBDOCUMENT) { ++ return; ++ } ++ ++ nsCOMPtr uri; ++ nsresult rv = aChannel->GetURI(getter_AddRefs(uri)); ++ NS_ENSURE_SUCCESS_VOID(rv); ++ nsAutoCString URISpec; ++ rv = uri->GetSpec(URISpec); ++ NS_ENSURE_SUCCESS_VOID(rv); ++ ++ bool isSrcDoc = URISpec.EqualsLiteral("about:srcdoc"); ++ bool isData = (NS_SUCCEEDED(uri->SchemeIs("data", &isData)) && isData); ++ ++ if (!isSrcDoc && !isData) { ++ return; ++ } ++ ++ nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); ++ if (!principalToInherit) { ++ principalToInherit = loadInfo->TriggeringPrincipal(); ++ } ++ nsCOMPtr originalCSP; ++ principalToInherit->GetCsp(getter_AddRefs(originalCSP)); ++ if (!originalCSP) { ++ return; ++ } ++ ++ // if the principalToInherit had a CSP, add it to the before ++ // created NullPrincipal (unless it already has one) ++ MOZ_ASSERT(aPrincipal->GetIsNullPrincipal(), ++ "inheriting the CSP only valid for NullPrincipal"); ++ nsCOMPtr nullPrincipalCSP; ++ aPrincipal->GetCsp(getter_AddRefs(nullPrincipalCSP)); ++ if (nullPrincipalCSP) { ++ MOZ_ASSERT(nullPrincipalCSP == originalCSP, ++ "There should be no other CSP here."); ++ // CSPs are equal, no need to set it again. ++ return; ++ } ++ aPrincipal->SetCsp(originalCSP); ++} ++ + nsresult + nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel, + nsIPrincipal** aPrincipal, +@@ -295,40 +351,7 @@ nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel, + if (!aIgnoreSandboxing && loadInfo->GetLoadingSandboxed()) { + MOZ_ALWAYS_TRUE(NS_SUCCEEDED(loadInfo->GetSandboxedLoadingPrincipal(aPrincipal))); + MOZ_ASSERT(*aPrincipal); +- // if the new NullPrincipal (above) loads an iframe[srcdoc], we +- // need to inherit an existing CSP to avoid bypasses (bug 1073952). +- // We continue inheriting for nested frames with e.g., data: URLs. +- if (loadInfo->GetExternalContentPolicyType() == nsIContentPolicy::TYPE_SUBDOCUMENT) { +- nsCOMPtr uri; +- aChannel->GetURI(getter_AddRefs(uri)); +- nsAutoCString URISpec; +- uri->GetSpec(URISpec); +- bool isData = (NS_SUCCEEDED(uri->SchemeIs("data", &isData)) && isData); +- if (URISpec.EqualsLiteral("about:srcdoc") || isData) { +- nsCOMPtr principalToInherit = loadInfo->PrincipalToInherit(); +- if (!principalToInherit) { +- principalToInherit = loadInfo->TriggeringPrincipal(); +- } +- nsCOMPtr originalCSP; +- principalToInherit->GetCsp(getter_AddRefs(originalCSP)); +- if (originalCSP) { +- // if the principalToInherit had a CSP, +- // add it to the newly created NullPrincipal +- // (unless it already has one) +- nsCOMPtr nullPrincipalCSP; +- (*aPrincipal)->GetCsp(getter_AddRefs(nullPrincipalCSP)); +- if (nullPrincipalCSP) { +- MOZ_ASSERT(nullPrincipalCSP == originalCSP, +- "There should be no other CSP here."); +- // CSPs are equal, no need to set it again. +- return NS_OK; +- } else { +- nsresult rv = (*aPrincipal)->SetCsp(originalCSP); +- NS_ENSURE_SUCCESS(rv, rv); +- } +- } +- } +- } ++ InheritAndSetCSPOnPrincipalIfNeeded(aChannel, *aPrincipal); + return NS_OK; + } + +@@ -376,7 +399,10 @@ nsScriptSecurityManager::GetChannelResultPrincipal(nsIChannel* aChannel, + } + } + } +- return GetChannelURIPrincipal(aChannel, aPrincipal); ++ nsresult rv = GetChannelURIPrincipal(aChannel, aPrincipal); ++ NS_ENSURE_SUCCESS(rv, rv); ++ InheritAndSetCSPOnPrincipalIfNeeded(aChannel, *aPrincipal); ++ return NS_OK; + } + + /* The principal of the URI that this channel is loading. This is never + +commit 9427f1bbd826 +Author: Christoph Kerschbaumer +Date: Fri Aug 4 14:10:21 2017 +0200 + + Bug 1381761 - Convert test browser_911547.js to comply with new data: URI inheritance model. r=dveditz +--- + .../components/sessionstore/test/browser_911547.js | 47 ++++++++++++++++------ + .../sessionstore/test/browser_911547_sample.html | 6 +-- + 2 files changed, 37 insertions(+), 16 deletions(-) + +diff --git browser/components/sessionstore/test/browser_911547.js browser/components/sessionstore/test/browser_911547.js +index f0da70ed8f8c..cb95ddad7f2a 100644 +--- browser/components/sessionstore/test/browser_911547.js ++++ browser/components/sessionstore/test/browser_911547.js +@@ -1,11 +1,17 @@ + /* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +-// This tests that session restore component does restore the right content +-// security policy with the document. +-// The policy being tested disallows inline scripts ++// This test is two fold: ++// a) if security.data_uri.unique_opaque_origin == false, then ++// this tests that session restore component does restore the right ++// content security policy with the document. (The policy being ++// tested disallows inline scripts). ++// b) if security.data_uri.unique_opaque_origin == true, then ++// this tests that data: URIs do not inherit the CSP from ++// it's enclosing context. + + add_task(async function test() { ++ let dataURIPref = Services.prefs.getBoolPref("security.data_uri.unique_opaque_origin"); + // create a tab that has a CSP + let testURL = "http://mochi.test:8888/browser/browser/components/sessionstore/test/browser_911547_sample.html"; + let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, testURL); +@@ -16,23 +22,33 @@ add_task(async function test() { + + // this is a baseline to ensure CSP is active + // attempt to inject and run a script via inline (pre-restore, allowed) +- await injectInlineScript(browser, `document.getElementById("test_id").value = "fail";`); ++ await injectInlineScript(browser, `document.getElementById("test_id1").value = "id1_modified";`); + + let loadedPromise = promiseBrowserLoaded(browser); + await ContentTask.spawn(browser, null, function() { +- is(content.document.getElementById("test_id").value, "ok", ++ is(content.document.getElementById("test_id1").value, "id1_initial", + "CSP should block the inline script that modifies test_id"); + +- // attempt to click a link to a data: URI (will inherit the CSP of the +- // origin document) and navigate to the data URI in the link. ++ ++ // (a) if security.data_uri.unique_opaque_origin == false: ++ // attempt to click a link to a data: URI (will inherit the CSP of ++ // the origin document) and navigate to the data URI in the link. ++ // (b) if security.data_uri.unique_opaque_origin == true: ++ // attempt to click a link to a data: URI (will *not* inherit the CSP of ++ // the origin document) and navigate to the data URI in the link. + content.document.getElementById("test_data_link").click(); + }); + + await loadedPromise; + +- await ContentTask.spawn(browser, null, function() { +- is(content.document.getElementById("test_id2").value, "ok", +- "CSP should block the script loaded by the clicked data URI"); ++ await ContentTask.spawn(browser, {dataURIPref}, function( {dataURIPref}) { // eslint-disable-line ++ if (dataURIPref) { ++ is(content.document.getElementById("test_id2").value, "id2_modified", ++ "data: URI should *not* inherit the CSP of the enclosing context"); ++ } else { ++ is(content.document.getElementById("test_id2").value, "id2_initial", ++ "CSP should block the script loaded by the clicked data URI"); ++ } + }); + + // close the tab +@@ -43,9 +59,14 @@ add_task(async function test() { + await promiseTabRestored(tab); + browser = tab.linkedBrowser; + +- await ContentTask.spawn(browser, null, function() { +- is(content.document.getElementById("test_id2").value, "ok", +- "CSP should block the script loaded by the clicked data URI after restore"); ++ await ContentTask.spawn(browser, {dataURIPref}, function({dataURIPref}) { // eslint-disable-line ++ if (dataURIPref) { ++ is(content.document.getElementById("test_id2").value, "id2_modified", ++ "data: URI should *not* inherit the CSP of the enclosing context"); ++ } else { ++ is(content.document.getElementById("test_id2").value, "id2_initial", ++ "CSP should block the script loaded by the clicked data URI after restore"); ++ } + }); + + // clean up +diff --git browser/components/sessionstore/test/browser_911547_sample.html browser/components/sessionstore/test/browser_911547_sample.html +index ccc2011593d4..73cb99ee41f1 100644 +--- browser/components/sessionstore/test/browser_911547_sample.html ++++ browser/components/sessionstore/test/browser_911547_sample.html +@@ -8,12 +8,12 @@ + + +- ++ + +- Test Link ++ Test Link + + + + +commit 8b999864f0bb +Author: Christoph Kerschbaumer +Date: Fri Aug 4 14:10:38 2017 +0200 + + Bug 1381761 - Test data: URIs inherit the CSP even if treated as unique, opaque origins. r=dveditz +--- + .../test/csp/file_data_csp_inheritance.html | 21 +++++++++++++ + dom/security/test/csp/mochitest.ini | 2 ++ + .../test/csp/test_data_csp_inheritance.html | 34 ++++++++++++++++++++++ + 3 files changed, 57 insertions(+) + +diff --git dom/security/test/csp/file_data_csp_inheritance.html dom/security/test/csp/file_data_csp_inheritance.html +new file mode 100644 +index 000000000000..299c30255aa6 +--- /dev/null ++++ dom/security/test/csp/file_data_csp_inheritance.html +@@ -0,0 +1,21 @@ ++ ++ ++ ++ Bug 1381761 - Treating 'data:' documents as unique, opaque origins should still inherit the CSP ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git dom/security/test/csp/mochitest.ini dom/security/test/csp/mochitest.ini +index ba391ad59799..09f80b2969d7 100644 +--- dom/security/test/csp/mochitest.ini ++++ dom/security/test/csp/mochitest.ini +@@ -217,6 +217,7 @@ support-files = + file_ignore_xfo.html^headers^ + file_ro_ignore_xfo.html + file_ro_ignore_xfo.html^headers^ ++ file_data_csp_inheritance.html + file_report_font_cache-1.html + file_report_font_cache-2.html + file_report_font_cache-2.html^headers^ +@@ -308,4 +309,5 @@ tags = mcb + [test_websocket_self.html] + skip-if = toolkit == 'android' + [test_ignore_xfo.html] ++[test_data_csp_inheritance.html] + [test_data_csp_merge.html] +diff --git dom/security/test/csp/test_data_csp_inheritance.html dom/security/test/csp/test_data_csp_inheritance.html +new file mode 100644 +index 000000000000..3afc4f7c02bc +--- /dev/null ++++ dom/security/test/csp/test_data_csp_inheritance.html +@@ -0,0 +1,34 @@ ++ ++ ++ ++ Bug 1381761 - Treating 'data:' documents as unique, opaque origins should still inherit the CSP ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Property changes on: head/www/waterfox/files/patch-bug1381761 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1384121 =================================================================== --- head/www/waterfox/files/patch-bug1384121 (nonexistent) +++ head/www/waterfox/files/patch-bug1384121 (revision 454949) @@ -0,0 +1,218 @@ +commit 485ed2f2b015 +Author: Jan de Mooij +Date: Mon Sep 18 15:08:44 2017 +0200 + + Bug 1384121 part 1 - Don't sweep ObjectGroups under IC helper functions. r=bhackett +--- + js/src/jit/IonCacheIRCompiler.cpp | 4 ++-- + js/src/vm/ObjectGroup.h | 2 ++ + js/src/vm/TypeInference-inl.h | 29 ++++++++++++++++++++++------- + js/src/vm/UnboxedObject.cpp | 2 +- + 4 files changed, 27 insertions(+), 10 deletions(-) + +diff --git js/src/jit/IonCacheIRCompiler.cpp js/src/jit/IonCacheIRCompiler.cpp +index b11aed7966b6..bbfbdae57b12 100644 +--- js/src/jit/IonCacheIRCompiler.cpp ++++ js/src/jit/IonCacheIRCompiler.cpp +@@ -1324,9 +1324,9 @@ IonCacheIRCompiler::emitCallStringSplitResult() + static bool + GroupHasPropertyTypes(ObjectGroup* group, jsid* id, Value* v) + { +- if (group->unknownProperties()) ++ if (group->unknownPropertiesDontCheckGeneration()) + return true; +- HeapTypeSet* propTypes = group->maybeGetProperty(*id); ++ HeapTypeSet* propTypes = group->maybeGetPropertyDontCheckGeneration(*id); + if (!propTypes) + return true; + if (!propTypes->nonConstantProperty()) +diff --git js/src/vm/ObjectGroup.h js/src/vm/ObjectGroup.h +index 237b5a152576..0eba71ee084f 100644 +--- js/src/vm/ObjectGroup.h ++++ js/src/vm/ObjectGroup.h +@@ -390,6 +390,7 @@ class ObjectGroup : public gc::TenuredCell + + /* Get a property only if it already exists. */ + MOZ_ALWAYS_INLINE HeapTypeSet* maybeGetProperty(jsid id); ++ MOZ_ALWAYS_INLINE HeapTypeSet* maybeGetPropertyDontCheckGeneration(jsid id); + + /* + * Iterate through the group's properties. getPropertyCount overapproximates +@@ -471,6 +472,7 @@ class ObjectGroup : public gc::TenuredCell + } + + inline uint32_t basePropertyCount(); ++ inline uint32_t basePropertyCountDontCheckGeneration(); + + private: + inline void setBasePropertyCount(uint32_t count); +diff --git js/src/vm/TypeInference-inl.h js/src/vm/TypeInference-inl.h +index f7cd3459ef19..f2b0b9a52fbc 100644 +--- js/src/vm/TypeInference-inl.h ++++ js/src/vm/TypeInference-inl.h +@@ -369,10 +369,10 @@ TypeMonitorCall(JSContext* cx, const js::CallArgs& args, bool constructing) + MOZ_ALWAYS_INLINE bool + TrackPropertyTypes(JSObject* obj, jsid id) + { +- if (obj->hasLazyGroup() || obj->group()->unknownProperties()) ++ if (obj->hasLazyGroup() || obj->group()->unknownPropertiesDontCheckGeneration()) + return false; + +- if (obj->isSingleton() && !obj->group()->maybeGetProperty(id)) ++ if (obj->isSingleton() && !obj->group()->maybeGetPropertyDontCheckGeneration(id)) + return false; + + return true; +@@ -410,7 +410,7 @@ HasTrackedPropertyType(JSObject* obj, jsid id, TypeSet::Type type) + MOZ_ASSERT(id == IdToTypeId(id)); + MOZ_ASSERT(TrackPropertyTypes(obj, id)); + +- if (HeapTypeSet* types = obj->group()->maybeGetProperty(id)) { ++ if (HeapTypeSet* types = obj->group()->maybeGetPropertyDontCheckGeneration(id)) { + if (!types->hasType(type)) + return false; + // Non-constant properties are only relevant for singleton objects. +@@ -1074,10 +1074,18 @@ TypeSet::getObjectClass(unsigned i) const + // ObjectGroup + ///////////////////////////////////////////////////////////////////// + ++inline uint32_t ++ObjectGroup::basePropertyCountDontCheckGeneration() ++{ ++ uint32_t flags = flagsDontCheckGeneration(); ++ return (flags & OBJECT_FLAG_PROPERTY_COUNT_MASK) >> OBJECT_FLAG_PROPERTY_COUNT_SHIFT; ++} ++ + inline uint32_t + ObjectGroup::basePropertyCount() + { +- return (flags() & OBJECT_FLAG_PROPERTY_COUNT_MASK) >> OBJECT_FLAG_PROPERTY_COUNT_SHIFT; ++ maybeSweep(nullptr); ++ return basePropertyCountDontCheckGeneration(); + } + + inline void +@@ -1134,14 +1142,14 @@ ObjectGroup::getProperty(JSContext* cx, JSObject* obj, jsid id) + } + + MOZ_ALWAYS_INLINE HeapTypeSet* +-ObjectGroup::maybeGetProperty(jsid id) ++ObjectGroup::maybeGetPropertyDontCheckGeneration(jsid id) + { + MOZ_ASSERT(JSID_IS_VOID(id) || JSID_IS_EMPTY(id) || JSID_IS_STRING(id) || JSID_IS_SYMBOL(id)); + MOZ_ASSERT_IF(!JSID_IS_EMPTY(id), id == IdToTypeId(id)); +- MOZ_ASSERT(!unknownProperties()); ++ MOZ_ASSERT(!unknownPropertiesDontCheckGeneration()); + + Property* prop = TypeHashSet::Lookup +- (propertySet, basePropertyCount(), id); ++ (propertySet, basePropertyCountDontCheckGeneration(), id); + + if (!prop) + return nullptr; +@@ -1150,6 +1158,13 @@ ObjectGroup::maybeGetProperty(jsid id) + return &prop->types; + } + ++MOZ_ALWAYS_INLINE HeapTypeSet* ++ObjectGroup::maybeGetProperty(jsid id) ++{ ++ maybeSweep(nullptr); ++ return maybeGetPropertyDontCheckGeneration(id); ++} ++ + inline unsigned + ObjectGroup::getPropertyCount() + { +diff --git js/src/vm/UnboxedObject.cpp js/src/vm/UnboxedObject.cpp +index c155b7dc47c9..4e007489a67e 100644 +--- js/src/vm/UnboxedObject.cpp ++++ js/src/vm/UnboxedObject.cpp +@@ -363,7 +363,7 @@ UnboxedPlainObject::ensureExpando(JSContext* cx, Handle obj + bool + UnboxedPlainObject::containsUnboxedOrExpandoProperty(JSContext* cx, jsid id) const + { +- if (layout().lookup(id)) ++ if (layoutDontCheckGeneration().lookup(id)) + return true; + + if (maybeExpando() && maybeExpando()->containsShapeOrElement(cx, id)) +commit e240cf665f74 +Author: Jan de Mooij +Date: Wed Sep 20 12:13:54 2017 +0200 + + Bug 1384121 part 2 - Add asserts to catch similar bugs and fix some false positives. r=nbp +--- + js/src/jit/Bailouts.cpp | 4 ---- + js/src/jit/JSJitFrameIter.cpp | 2 ++ + js/src/jit/VMFunctions.cpp | 1 - + js/src/jit/arm/Trampoline-arm.cpp | 9 ++++++--- + js/src/jit/arm64/Trampoline-arm64.cpp | 9 ++++++--- + js/src/jit/mips32/Trampoline-mips32.cpp | 9 ++++++--- + js/src/jit/mips64/Trampoline-mips64.cpp | 9 ++++++--- + js/src/jit/x64/Trampoline-x64.cpp | 9 ++++++--- + js/src/jit/x86/Trampoline-x86.cpp | 9 ++++++--- + js/src/vm/ObjectGroup-inl.h | 1 + + js/src/vm/Stack.cpp | 2 ++ + js/src/vm/TypeInference.cpp | 3 +++ + 12 files changed, 44 insertions(+), 23 deletions(-) + +diff --git js/src/jit/JSJitFrameIter.cpp js/src/jit/JSJitFrameIter.cpp +index 3774b327d21c..ae76bc2abaf0 100644 +--- js/src/jit/JitFrameIterator.cpp ++++ js/src/jit/JitFrameIterator.cpp +@@ -25,6 +25,8 @@ JSJitFrameIter::JSJitFrameIter(const JitActivation* activation) + current_ = activation_->bailoutData()->fp(); + frameSize_ = activation_->bailoutData()->topFrameSize(); + type_ = JitFrame_Bailout; ++ } else { ++ MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI); + } + } + +diff --git js/src/vm/ObjectGroup-inl.h js/src/vm/ObjectGroup-inl.h +index 7e023ecbad8e..d7caa63d8725 100644 +--- js/src/vm/ObjectGroup-inl.h ++++ js/src/vm/ObjectGroup-inl.h +@@ -16,6 +16,7 @@ ObjectGroup::needsSweep() + { + // Note: this can be called off thread during compacting GCs, in which case + // nothing will be running on the active thread. ++ MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI); + return generation() != zoneFromAnyThread()->types.generation; + } + +diff --git js/src/vm/Stack.cpp js/src/vm/Stack.cpp +index d3c0038db5ca..0406195abd56 100644 +--- js/src/vm/Stack.cpp ++++ js/src/vm/Stack.cpp +@@ -605,6 +605,8 @@ FrameIter::popInterpreterFrame() + void + FrameIter::settleOnActivation() + { ++ MOZ_ASSERT(!data_.cx_->inUnsafeCallWithABI); ++ + while (true) { + if (data_.activations_.done()) { + data_.state_ = DONE; +diff --git js/src/vm/TypeInference.cpp js/src/vm/TypeInference.cpp +index f0562a4355f8..eba18e34397e 100644 +--- js/src/vm/TypeInference.cpp ++++ js/src/vm/TypeInference.cpp +@@ -4428,6 +4428,8 @@ ObjectGroup::sweep(AutoClearTypeInferenceStateOnOOM* oom) + /* static */ void + JSScript::maybeSweepTypes(AutoClearTypeInferenceStateOnOOM* oom) + { ++ MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI); ++ + if (!types_ || typesGeneration() == zone()->types.generation) + return; + +@@ -4611,6 +4613,7 @@ AutoClearTypeInferenceStateOnOOM::AutoClearTypeInferenceStateOnOOM(Zone* zone) + : zone(zone), oom(false) + { + MOZ_RELEASE_ASSERT(CurrentThreadCanAccessZone(zone)); ++ MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI); + zone->types.setSweepingTypes(true); + } + Property changes on: head/www/waterfox/files/patch-bug1384121 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1387811 =================================================================== --- head/www/waterfox/files/patch-bug1387811 (nonexistent) +++ head/www/waterfox/files/patch-bug1387811 (revision 454949) @@ -0,0 +1,42 @@ +commit a1341ccf6d63 +Author: Christoph Kerschbaumer +Date: Sun Aug 6 11:37:09 2017 +0200 + + Bug 1387811 - Follow up for Test within Bug 1381761: CSP JSON is never null, hence it's better to check actual contents of JSON for testing. r=dveditz +--- + dom/security/test/csp/file_data_csp_inheritance.html | 6 ++++-- + dom/security/test/csp/test_data_csp_inheritance.html | 4 +++- + 2 files changed, 7 insertions(+), 3 deletions(-) + +diff --git dom/security/test/csp/file_data_csp_inheritance.html dom/security/test/csp/file_data_csp_inheritance.html +index 299c30255aa6..cbb4865343db 100644 +--- dom/security/test/csp/file_data_csp_inheritance.html ++++ dom/security/test/csp/file_data_csp_inheritance.html +@@ -13,8 +13,10 @@ + var frame = document.getElementById("dataFrame"); + var principal = SpecialPowers.wrap(frame.contentDocument).nodePrincipal; + var cspJSON = principal.cspJSON; +- var result = principal.cspJSON ? "dataInheritsCSP" : "dataDoesNotInheritCSP"; +- window.parent.postMessage({result}, "*"); ++ var cspOBJ = JSON.parse(principal.cspJSON); ++ // make sure we got >>one<< policy ++ var policies = cspOBJ["csp-policies"]; ++ window.parent.postMessage({result: policies.length}, "*"); + + + +diff --git dom/security/test/csp/test_data_csp_inheritance.html dom/security/test/csp/test_data_csp_inheritance.html +index 3afc4f7c02bc..bde2f5617e65 100644 +--- dom/security/test/csp/test_data_csp_inheritance.html ++++ dom/security/test/csp/test_data_csp_inheritance.html +@@ -22,7 +22,9 @@ SimpleTest.waitForExplicitFinish(); + window.addEventListener("message", receiveMessage); + function receiveMessage(event) { + window.removeEventListener("message", receiveMessage); +- is(event.data.result, "dataInheritsCSP", ++ // toplevel CSP should apply to data: URI iframe hence resulting ++ // in 1 applied policy. ++ is(event.data.result, 1, + "data: URI iframe inherits CSP from including context"); + SimpleTest.finish(); + } Property changes on: head/www/waterfox/files/patch-bug1387811 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1402966 =================================================================== --- head/www/waterfox/files/patch-bug1402966 (nonexistent) +++ head/www/waterfox/files/patch-bug1402966 (revision 454949) @@ -0,0 +1,51 @@ +commit 6149574dc0f9 +Author: Gabriele Svelto +Date: Tue Sep 26 09:35:03 2017 +0200 + + Bug 1402966 - Search for libcurl in more paths to support various *BSDs. r=Dexter, a=sledru + + MozReview-Commit-ID: J4ykuSVEa0y + + --HG-- + extra : source : 4741b93cfdf29517ff8eae863825fdc2ab5bd7bd +--- + .../telemetry/pingsender/pingsender_unix_common.cpp | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +diff --git toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp +index ae20f4114193..7817e93e3d1f 100644 +--- toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp ++++ toolkit/components/telemetry/pingsender/pingsender_unix_common.cpp +@@ -88,10 +88,19 @@ CurlWrapper::Init() + "/usr/lib/i386-linux-gnu", // Debian 32-bit x86 + "/usr/lib/x86_64-linux-gnu", // Debian 64-bit x86 + #endif // XP_LINUX ++#if !defined(XP_MACOSX) && !defined(XP_LINUX) // Various BSDs ++ "/usr/local/lib", // FreeBSD, OpenBSD ++ "/usr/pkg/lib", // NetBSD ++#endif // !defined(XP_MACOSX) && !defined(XP_LINUX) + }; + + const char* libcurlNames[] = { +-#ifdef XP_LINUX ++#if defined(XP_MACOSX) ++ // macOS ++ "libcurl.dylib", ++ "libcurl.4.dylib", ++ "libcurl.3.dylib", ++#else // Linux, *BSD, ... + "libcurl.so", + "libcurl.so.4", + // Debian gives libcurl a different name when it is built against GnuTLS +@@ -100,11 +109,6 @@ CurlWrapper::Init() + // Older versions in case we find nothing better + "libcurl.so.3", + "libcurl-gnutls.so.3", // See above for Debian +-#elif defined(XP_MACOSX) +- // macOS +- "libcurl.dylib", +- "libcurl.4.dylib", +- "libcurl.3.dylib", + #endif + }; + Property changes on: head/www/waterfox/files/patch-bug1402966 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1343147 =================================================================== --- head/www/waterfox/files/patch-bug1343147 (nonexistent) +++ head/www/waterfox/files/patch-bug1343147 (revision 454949) @@ -0,0 +1,117 @@ +commit e215b167b9b9 +Author: cku +Date: Tue Oct 3 11:29:19 2017 +0800 + + Bug 1343147 - Do not double applying transform vector of the root frame in a glyph mask into the target context. r=mstange, a=ritu + + When we generate the glyph mask for a transformed frame in + GenerateAndPushTextMask, the transform vector had been applied into aContext[1], + so we should find a way to prevent applying the vector again when painting the + glyph mask. + + In bug 1299715, I tried to prevent double apply at [2], it caused two problems: + 1. We only skip generating nsDisplayTransform, but we may still create a + nsDisplayPerspactive bellow. Since the parent of a nsDisplayPerspective must be + a nsDisplayTransform, which have been ignored, so we hit this assertion. + 2. We skip all transform for all frames while painting the glyph mask, which is + not correct. We should only skip double applying transform vector of the root + frame. + + This patch fixes both of these issues: + a. We will still create a nsDisplayTransform for the root frame if need. But + the transform matrix we apply into the target context will be an identity + matrix, so we fix #1 above. + b. In #a, we change the transform matrix to an identity matrix only for the root + frame of the glyph mask, so we fix #2. + + [1] + https://hg.mozilla.org/mozilla-central/file/59e5ec5729db/layout/painting/nsDisplayList.cpp#l752 + [2] + https://hg.mozilla.org/mozilla-central/file/ce2c129f0a87/layout/generic/nsFrame.cpp#l2806 + + MozReview-Commit-ID: 973lkQQxLB6 + + --HG-- + extra : source : 84451d723686bc47b81c44ed2ddf6c61f3e35915 +--- + layout/generic/nsFrame.cpp | 13 +++++-------- + layout/painting/nsDisplayList.cpp | 9 ++++++++- + 2 files changed, 13 insertions(+), 9 deletions(-) + +diff --git layout/generic/nsFrame.cpp layout/generic/nsFrame.cpp +index 37f2e2801220..dbfd61b7e142 100644 +--- layout/generic/nsFrame.cpp ++++ layout/generic/nsFrame.cpp +@@ -2803,14 +2803,11 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, + buildingDisplayList.SetReferenceFrameAndCurrentOffset(outerReferenceFrame, + GetOffsetToCrossDoc(outerReferenceFrame)); + +- if (!aBuilder->IsForGenerateGlyphMask() && +- !aBuilder->IsForPaintingSelectionBG()) { +- nsDisplayTransform *transformItem = +- new (aBuilder) nsDisplayTransform(aBuilder, this, +- &resultList, dirtyRect, 0, +- allowAsyncAnimation); +- resultList.AppendNewToTop(transformItem); +- } ++ nsDisplayTransform *transformItem = ++ new (aBuilder) nsDisplayTransform(aBuilder, this, ++ &resultList, dirtyRect, 0, ++ allowAsyncAnimation); ++ resultList.AppendNewToTop(transformItem); + + if (hasPerspective) { + if (clipCapturedBy == ContainerItemType::ePerspective) { +diff --git layout/painting/nsDisplayList.cpp layout/painting/nsDisplayList.cpp +index 801e1ea2fb4d..6477bda52f01 100644 +--- layout/painting/nsDisplayList.cpp ++++ layout/painting/nsDisplayList.cpp +@@ -7976,11 +7976,18 @@ already_AddRefed nsDisplayTransform::BuildLayer(nsDisplayListBuilder *aBu + LayerManager *aManager, + const ContainerLayerParameters& aContainerParameters) + { ++ // While generating a glyph mask, the transform vector of the root frame had ++ // been applied into the target context, so stop applying it again here. ++ const bool shouldSkipTransform = ++ (aBuilder->RootReferenceFrame() == mFrame) && ++ (aBuilder->IsForGenerateGlyphMask() || aBuilder->IsForPaintingSelectionBG()); ++ + /* For frames without transform, it would not be removed for + * backface hidden here. But, it would be removed by the init + * function of nsDisplayTransform. + */ +- const Matrix4x4& newTransformMatrix = GetTransformForRendering(); ++ const Matrix4x4 newTransformMatrix = ++ shouldSkipTransform ? Matrix4x4(): GetTransformForRendering(); + + uint32_t flags = FrameLayerBuilder::CONTAINER_ALLOW_PULL_BACKGROUND_COLOR; + RefPtr container = aManager->GetLayerBuilder()-> +diff --git dom/svg/crashtests/1343147.svg dom/svg/crashtests/1343147.svg +new file mode 100644 +index 000000000000..d9c2611ca822 +--- /dev/null ++++ dom/svg/crashtests/1343147.svg +@@ -0,0 +1,13 @@ ++ ++ ++ hello ++ +diff --git dom/svg/crashtests/crashtests.list dom/svg/crashtests/crashtests.list +index 1727a206ec4f..57ab320161e2 100644 +--- dom/svg/crashtests/crashtests.list ++++ dom/svg/crashtests/crashtests.list +@@ -90,4 +90,5 @@ load 1329849-5.svg + load 1329849-6.svg + load 1329093-1.html + load 1329093-2.html ++load 1343147.svg + load 1402798.html Property changes on: head/www/waterfox/files/patch-bug1343147 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1355576 =================================================================== --- head/www/waterfox/files/patch-bug1355576 (nonexistent) +++ head/www/waterfox/files/patch-bug1355576 (revision 454949) @@ -0,0 +1,262 @@ +commit e530ba4d4394 +Author: Thomas Wisniewski +Date: Tue Jul 4 20:59:26 2017 -0400 + + Bug 1355576 - Add ability to clear all localStorage with the browsingData API; r=bsilverberg,janv + + MozReview-Commit-ID: 4UUqg62yIo9 + + --HG-- + extra : rebase_source : 9c6154bbe878fc3921d22027fdc90dbdaed05be9 +--- + browser/components/extensions/ext-browsingData.js | 10 +++ + .../extensions/schemas/browsing_data.json | 1 - + .../extensions/test/browser/browser-common.ini | 1 + + .../browser_ext_browsingData_localStorage.js | 93 ++++++++++++++++++++++ + .../test/xpcshell/test_ext_browsingData.js | 4 +- + dom/storage/LocalStorageManager.cpp | 3 +- + dom/storage/StorageObserver.cpp | 12 +++ + .../extensions/schemas/browsing_data.json | 1 - + 8 files changed, 120 insertions(+), 5 deletions(-) + +diff --git browser/components/extensions/ext-browsingData.js browser/components/extensions/ext-browsingData.js +index fd59141dd15d..109ec9601487 100644 +--- browser/components/extensions/ext-browsingData.js ++++ browser/components/extensions/ext-browsingData.js +@@ -83,6 +83,10 @@ const clearHistory = options => { + return sanitizer.items.history.clear(makeRange(options)); + }; + ++const clearLocalStorage = async function(options) { ++ Services.obs.notifyObservers(null, "extension:purge-localStorage"); ++}; ++ + const clearPasswords = async function(options) { + let loginManager = Services.logins; + let yieldCounter = 0; +@@ -152,6 +156,9 @@ const doRemoval = (options, dataToRemove, extension) => { + case "history": + removalPromises.push(clearHistory(options)); + break; ++ case "localStorage": ++ removalPromises.push(clearLocalStorage(options)); ++ break; + case "passwords": + removalPromises.push(clearPasswords(options)); + break; +@@ -225,6 +232,9 @@ this.browsingData = class extends ExtensionAPI { + removeHistory(options) { + return doRemoval(options, {history: true}); + }, ++ removeLocalStorage(options) { ++ return doRemoval(options, {localStorage: true}); ++ }, + removePasswords(options) { + return doRemoval(options, {passwords: true}); + }, +diff --git browser/components/extensions/schemas/browsing_data.json browser/components/extensions/schemas/browsing_data.json +index a780f5640c8f..7755714eb898 100644 +--- browser/components/extensions/schemas/browsing_data.json ++++ browser/components/extensions/schemas/browsing_data.json +@@ -341,7 +341,6 @@ + "description": "Clears websites' local storage data.", + "type": "function", + "async": "callback", +- "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", +diff --git browser/components/extensions/test/browser/browser-common.ini browser/components/extensions/test/browser/browser-common.ini +index 464b8ba18f37..e3f7700f3939 100644 +--- browser/components/extensions/test/browser/browser-common.ini ++++ browser/components/extensions/test/browser/browser-common.ini +@@ -46,6 +46,7 @@ skip-if = (os == 'win' && !debug) # bug 1352668 + [browser_ext_browserAction_theme_icons.js] + [browser_ext_browsingData_formData.js] + [browser_ext_browsingData_history.js] ++[browser_ext_browsingData_localStorage.js] + [browser_ext_browsingData_pluginData.js] + [browser_ext_browsingData_serviceWorkers.js] + [browser_ext_commands_execute_browser_action.js] +diff --git browser/components/extensions/test/browser/browser_ext_browsingData_localStorage.js browser/components/extensions/test/browser/browser_ext_browsingData_localStorage.js +new file mode 100644 +index 000000000000..215f26d1fcb6 +--- /dev/null ++++ browser/components/extensions/test/browser/browser_ext_browsingData_localStorage.js +@@ -0,0 +1,93 @@ ++/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ ++/* vim: set sts=2 sw=2 et tw=80: */ ++"use strict"; ++ ++add_task(async function testLocalStorage() { ++ async function background() { ++ function openTabs() { ++ let promise = new Promise(resolve => { ++ let tabURLs = [ ++ "http://example.com/", ++ "http://example.net/", ++ ]; ++ ++ let tabs; ++ let waitingCount = tabURLs.length; ++ ++ let listener = async msg => { ++ if (msg !== "content-script-ready" || --waitingCount) { ++ return; ++ } ++ browser.runtime.onMessage.removeListener(listener); ++ resolve(Promise.all(tabs)); ++ }; ++ ++ browser.runtime.onMessage.addListener(listener); ++ ++ tabs = tabURLs.map(url => { ++ return browser.tabs.create({url: url}); ++ }); ++ }); ++ ++ return promise; ++ } ++ ++ function sendMessageToTabs(tabs, message) { ++ return Promise.all( ++ tabs.map(tab => { return browser.tabs.sendMessage(tab.id, message); })); ++ } ++ ++ let tabs = await openTabs(); ++ ++ await sendMessageToTabs(tabs, "resetLocalStorage"); ++ await sendMessageToTabs(tabs, "checkLocalStorageSet"); ++ await browser.browsingData.removeLocalStorage({}); ++ await sendMessageToTabs(tabs, "checkLocalStorageCleared"); ++ ++ await sendMessageToTabs(tabs, "resetLocalStorage"); ++ await sendMessageToTabs(tabs, "checkLocalStorageSet"); ++ await browser.browsingData.remove({}, {localStorage: true}); ++ await sendMessageToTabs(tabs, "checkLocalStorageCleared"); ++ ++ browser.tabs.remove(tabs.map(tab => tab.id)); ++ ++ browser.test.notifyPass("done"); ++ } ++ ++ function contentScript() { ++ browser.runtime.onMessage.addListener(msg => { ++ if (msg === "resetLocalStorage") { ++ localStorage.clear(); ++ localStorage.setItem("test", "test"); ++ } else if (msg === "checkLocalStorageSet") { ++ browser.test.assertEq("test", localStorage.getItem("test")); ++ } else if (msg === "checkLocalStorageCleared") { ++ browser.test.assertEq(null, localStorage.getItem("test")); ++ } ++ }); ++ browser.runtime.sendMessage("content-script-ready"); ++ } ++ ++ let extension = ExtensionTestUtils.loadExtension({ ++ background, ++ manifest: { ++ "permissions": ["browsingData"], ++ "content_scripts": [{ ++ "matches": [ ++ "http://example.com/", ++ "http://example.net/", ++ ], ++ "js": ["content-script.js"], ++ "run_at": "document_start", ++ }], ++ }, ++ files: { ++ "content-script.js": contentScript, ++ }, ++ }); ++ ++ await extension.startup(); ++ await extension.awaitFinish("done"); ++ await extension.unload(); ++}); ++ +diff --git browser/components/extensions/test/xpcshell/test_ext_browsingData.js browser/components/extensions/test/xpcshell/test_ext_browsingData.js +index 0c1c4874ca44..0b8972058e64 100644 +--- browser/components/extensions/test/xpcshell/test_ext_browsingData.js ++++ browser/components/extensions/test/xpcshell/test_ext_browsingData.js +@@ -44,7 +44,7 @@ add_task(async function testInvalidArguments() { + + add_task(async function testUnimplementedDataType() { + function background() { +- browser.browsingData.remove({}, {localStorage: true}); ++ browser.browsingData.remove({}, {indexedDB: true}); + browser.test.sendMessage("finished"); + } + +@@ -61,6 +61,6 @@ add_task(async function testUnimplementedDataType() { + await extension.unload(); + }); + +- let warningObserved = messages.find(line => /Firefox does not support dataTypes: localStorage/.test(line)); ++ let warningObserved = messages.find(line => /Firefox does not support dataTypes: indexedDB/.test(line)); + ok(warningObserved, "Warning issued when calling remove with an unimplemented dataType."); + }); +diff --git dom/storage/LocalStorageManager.cpp dom/storage/LocalStorageManager.cpp +index a161de2bc596..f366e7874a90 100644 +--- dom/storage/LocalStorageManager.cpp ++++ dom/storage/LocalStorageManager.cpp +@@ -386,7 +386,8 @@ LocalStorageManager::Observe(const char* aTopic, + } + + // Clear everything, caches + database +- if (!strcmp(aTopic, "cookie-cleared")) { ++ if (!strcmp(aTopic, "cookie-cleared") || ++ !strcmp(aTopic, "extension:purge-localStorage-caches")) { + ClearCaches(LocalStorageCache::kUnloadComplete, pattern, EmptyCString()); + return NS_OK; + } +diff --git dom/storage/StorageObserver.cpp dom/storage/StorageObserver.cpp +index e5b010f88c7b..48d484748209 100644 +--- dom/storage/StorageObserver.cpp ++++ dom/storage/StorageObserver.cpp +@@ -66,6 +66,7 @@ StorageObserver::Init() + obs->AddObserver(sSelf, "browser:purge-domain-data", true); + obs->AddObserver(sSelf, "last-pb-context-exited", true); + obs->AddObserver(sSelf, "clear-origin-attributes-data", true); ++ obs->AddObserver(sSelf, "extension:purge-localStorage", true); + + // Shutdown + obs->AddObserver(sSelf, "profile-after-change", true); +@@ -270,6 +271,23 @@ StorageObserver::Observe(nsISupports* aSubject, + + Notify("session-only-cleared", NS_ConvertUTF8toUTF16(originSuffix), + originScope); ++ ++ return NS_OK; ++ } ++ ++ if (!strcmp(aTopic, "extension:purge-localStorage")) { ++ StorageDBChild* storageChild = StorageDBChild::GetOrCreate(); ++ if (NS_WARN_IF(!storageChild)) { ++ return NS_ERROR_FAILURE; ++ } ++ ++ storageChild->AsyncClearAll(); ++ ++ if (XRE_IsParentProcess()) { ++ storageChild->SendClearAll(); ++ } ++ ++ Notify("extension:purge-localStorage-caches"); + + return NS_OK; + } +diff --git mobile/android/components/extensions/schemas/browsing_data.json mobile/android/components/extensions/schemas/browsing_data.json +index 483a462d422c..1019c1a23953 100644 +--- mobile/android/components/extensions/schemas/browsing_data.json ++++ mobile/android/components/extensions/schemas/browsing_data.json +@@ -345,7 +345,6 @@ + "description": "Clears websites' local storage data.", + "type": "function", + "async": "callback", +- "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", Property changes on: head/www/waterfox/files/patch-bug1355576 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1402442 =================================================================== --- head/www/waterfox/files/patch-bug1402442 (nonexistent) +++ head/www/waterfox/files/patch-bug1402442 (revision 454949) @@ -0,0 +1,181 @@ +commit 44b4458e2d21 +Author: Emilio Cobos Álvarez +Date: Mon Sep 25 18:25:29 2017 +0200 + + Bug 1402442 - Properly remove display: contents pseudo-frames. r=mats, a=ritu + + MozReview-Commit-ID: 4pjVLQfv3YR + Signed-off-by: Emilio Cobos Álvarez + + --HG-- + extra : source : faa69ac1c14b79838cc0aac842b470a110542ebd + extra : amend_source : 3a76e0123bf3f7d10295000cc44fd8bdddf700df +--- + layout/base/nsCSSFrameConstructor.cpp | 26 +++++++++++++++------- + testing/web-platform/meta/MANIFEST.json | 25 +++++++++++++++++++++ + ...dynamic-generated-content-fieldset-001.html.ini | 4 ++++ + ...dynamic-generated-content-fieldset-001-ref.html | 16 +++++++++++++ + ...nts-dynamic-generated-content-fieldset-001.html | 26 ++++++++++++++++++++++ + 5 files changed, 89 insertions(+), 8 deletions(-) + +diff --git layout/base/nsCSSFrameConstructor.cpp layout/base/nsCSSFrameConstructor.cpp +index 99b1211b399b..4fce3fb381a7 100644 +--- layout/base/nsCSSFrameConstructor.cpp ++++ layout/base/nsCSSFrameConstructor.cpp +@@ -1698,6 +1698,17 @@ nsCSSFrameConstructor::NotifyDestroyingFrame(nsIFrame* aFrame) + nsFrameManager::NotifyDestroyingFrame(aFrame); + } + ++static bool ++HasGeneratedContent(const nsIContent* aChild) ++{ ++ if (!aChild->MayHaveAnonymousChildren()) { ++ return false; ++ } ++ ++ return nsLayoutUtils::GetBeforeFrame(aChild) || ++ nsLayoutUtils::GetAfterFrame(aChild); ++} ++ + struct nsGenConInitializer { + nsAutoPtr mNode; + nsGenConList* mList; +@@ -8642,16 +8653,15 @@ nsCSSFrameConstructor::ContentRemoved(nsIContent* aCo + MOZ_ASSERT(!childFrame || !GetDisplayContentsStyleFor(aChild), + "display:contents nodes shouldn't have a frame"); + if (!childFrame && GetDisplayContentsStyleFor(aChild)) { +- nsIContent* ancestor = aContainer; +- MOZ_ASSERT(ancestor, "display: contents on the root?"); +- while (!ancestor->GetPrimaryFrame()) { +- // FIXME(emilio): Should this use the flattened tree parent instead? +- ancestor = ancestor->GetParent(); +- MOZ_ASSERT(ancestor, "we can't have a display: contents subtree root!"); +- } ++ if (HasGeneratedContent(aChild)) { ++ nsIContent* ancestor = aContainer; ++ MOZ_ASSERT(ancestor, "display: contents on the root?"); ++ while (!ancestor->GetPrimaryFrame()) { ++ // FIXME(emilio): Should this use the flattened tree parent instead? ++ ancestor = ancestor->GetParent(); ++ MOZ_ASSERT(ancestor, "we can't have a display: contents subtree root!"); ++ } + +- nsIFrame* ancestorFrame = ancestor->GetPrimaryFrame(); +- if (ancestorFrame->GetProperty(nsIFrame::GenConProperty())) { + *aDidReconstruct = true; + LAYOUT_PHASE_TEMP_EXIT(); + +diff --git testing/web-platform/meta/MANIFEST.json testing/web-platform/meta/MANIFEST.json +index 5f05321c5a70..8aed4a4b5078 100644 +--- testing/web-platform/meta/MANIFEST.json ++++ testing/web-platform/meta/MANIFEST.json +@@ -102975,6 +102975,18 @@ + {} + ] + ], ++ "css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html": [ ++ [ ++ "/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html", ++ [ ++ [ ++ "/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html", ++ "==" ++ ] ++ ], ++ {} ++ ] ++ ], + "css/css-display-3/display-contents-dynamic-inline-flex-001-inline.html": [ + [ + "/css/css-display-3/display-contents-dynamic-inline-flex-001-inline.html", +@@ -227658,6 +227670,11 @@ + {} + ] + ], ++ "css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html": [ ++ [ ++ {} ++ ] ++ ], + "css/css-display-3/display-contents-flex-001-ref.html": [ + [ + {} +@@ -502880,6 +502897,14 @@ + "a2d7c9368ed8c01ca06c36646666270e85aee070", + "reftest" + ], ++ "css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html": [ ++ "30ec5c8ddacfbfef8434c37ca7a0a766f2bbc89a", ++ "support" ++ ], ++ "css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html": [ ++ "984bebb3c3b8661aedef4a229848dfa818bb1f4a", ++ "reftest" ++ ], + "css/css-display-3/display-contents-dynamic-inline-flex-001-inline.html": [ + "40fb07e8ada1530e6835ff2d4e49c5571ffb0baa", + "reftest" +diff --git testing/web-platform/meta/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html.ini testing/web-platform/meta/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html.ini +new file mode 100644 +index 000000000000..63c7442a2362 +--- /dev/null ++++ testing/web-platform/meta/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html.ini +@@ -0,0 +1,4 @@ ++[display-contents-dynamic-generated-content-fieldset-001.html] ++ type: reftest ++ expected: ++ if not stylo: FAIL +diff --git testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html +new file mode 100644 +index 000000000000..651bc19b83e9 +--- /dev/null ++++ testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001-ref.html +@@ -0,0 +1,16 @@ ++ ++ ++CSS Reftest Reference ++ ++ ++

++ Test passes if there is no red text and no red border. ++

++
++
++
+diff --git testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html +new file mode 100644 +index 000000000000..8f8a0ba47971 +--- /dev/null ++++ testing/web-platform/tests/css/css-display-3/display-contents-dynamic-generated-content-fieldset-001.html +@@ -0,0 +1,26 @@ ++ ++ ++CSS Test: Dynamic changes to display: contents generated content in fieldsets. ++ ++ ++ ++ ++

++ Test passes if there is no red text and no red border. ++

++
++
++
++ Property changes on: head/www/waterfox/files/patch-bug1402442 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1404324 =================================================================== --- head/www/waterfox/files/patch-bug1404324 (nonexistent) +++ head/www/waterfox/files/patch-bug1404324 (revision 454949) @@ -0,0 +1,299 @@ +commit 5647dde295f4 +Author: Emilio Cobos Álvarez +Date: Wed Oct 4 11:36:20 2017 +0200 + + Bug 1404324 - Use the placeholder state to remove out-of-flows that aren't real descendants of the destruction root. r=bz, a=ritu + + Using the style of the frame can mess things up when we reparent them due to + ::first-line before removing them. + + MozReview-Commit-ID: 3Dt0wF2XRAH + + --HG-- + extra : source : 5a034cdb513208dd19adf0babf30ee734968a78f + extra : histedit_source : 4cd958939c5a76e013695e931d721454268a0dc7%2C96bdeda302c567493c7db5105f306595d25332e1 +--- + layout/base/nsCSSFrameConstructor.cpp | 8 +++--- + layout/base/nsLayoutUtils.cpp | 46 +++------------------------------ + layout/generic/nsPlaceholderFrame.cpp | 27 ++++++++++++++++--- + layout/generic/nsPlaceholderFrame.h | 21 ++++++++------- + layout/style/crashtests/1404324-1.html | 12 +++++++++ + layout/style/crashtests/1404324-2.html | 10 +++++++ + layout/style/crashtests/1404324-3.html | 14 ++++++++++ + layout/style/crashtests/crashtests.list | 3 +++ + 8 files changed, 83 insertions(+), 58 deletions(-) + +diff --git layout/base/nsCSSFrameConstructor.cpp layout/base/nsCSSFrameConstructor.cpp +index c840416fd6a7..99b1211b399b 100644 +--- layout/base/nsCSSFrameConstructor.cpp ++++ layout/base/nsCSSFrameConstructor.cpp +@@ -1260,8 +1260,10 @@ nsFrameConstructorState::GetOutOfFlowFrameItems(nsIFrame* aNewFrame, + if (disp->mTopLayer != NS_STYLE_TOP_LAYER_NONE) { + *aPlaceholderType = PLACEHOLDER_FOR_TOPLAYER; + if (disp->mPosition == NS_STYLE_POSITION_FIXED) { ++ *aPlaceholderType |= PLACEHOLDER_FOR_FIXEDPOS; + return &mTopLayerFixedItems; + } ++ *aPlaceholderType |= PLACEHOLDER_FOR_ABSPOS; + return &mTopLayerAbsoluteItems; + } + if (disp->mPosition == NS_STYLE_POSITION_ABSOLUTE) { +@@ -1303,11 +1305,11 @@ nsFrameConstructorState::ConstructBackdropFrameFor(nsIContent* aContent, + nsAbsoluteItems* frameItems = GetOutOfFlowFrameItems(backdropFrame, + true, true, false, + &placeholderType); +- MOZ_ASSERT(placeholderType == PLACEHOLDER_FOR_TOPLAYER); ++ MOZ_ASSERT(placeholderType & PLACEHOLDER_FOR_TOPLAYER); + + nsIFrame* placeholder = nsCSSFrameConstructor:: + CreatePlaceholderFrameFor(mPresShell, aContent, backdropFrame, +- frame, nullptr, PLACEHOLDER_FOR_TOPLAYER); ++ frame, nullptr, placeholderType); + nsFrameList temp(placeholder, placeholder); + frame->SetInitialChildList(nsIFrame::kBackdropList, temp); + +@@ -1361,7 +1363,7 @@ nsFrameConstructorState::AddChild(nsIFrame* aNewFrame, + // Add the placeholder frame to the flow + aFrameItems.AddChild(placeholderFrame); + +- if (placeholderType == PLACEHOLDER_FOR_TOPLAYER) { ++ if (placeholderType & PLACEHOLDER_FOR_TOPLAYER) { + ConstructBackdropFrameFor(aContent, aNewFrame); + } + } +diff --git layout/base/nsLayoutUtils.cpp layout/base/nsLayoutUtils.cpp +index cb010c0a1a80..94ead9830c25 100644 +--- layout/base/nsLayoutUtils.cpp ++++ layout/base/nsLayoutUtils.cpp +@@ -1525,6 +1525,8 @@ nsLayoutUtils::GetChildListNameFor(nsIFrame* aChildFrame) + { + nsIFrame::ChildListID id = nsIFrame::kPrincipalList; + ++ MOZ_DIAGNOSTIC_ASSERT(!(aChildFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW)); ++ + if (aChildFrame->GetStateBits() & NS_FRAME_IS_OVERFLOW_CONTAINER) { + nsIFrame* pif = aChildFrame->GetPrevInFlow(); + if (pif->GetParent() == aChildFrame->GetParent()) { +@@ -1533,35 +1535,6 @@ nsLayoutUtils::GetChildListNameFor(nsIFrame* aChildFrame) + else { + id = nsIFrame::kOverflowContainersList; + } +- } +- // See if the frame is moved out of the flow +- else if (aChildFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW) { +- // Look at the style information to tell +- const nsStyleDisplay* disp = aChildFrame->StyleDisplay(); +- +- if (NS_STYLE_POSITION_ABSOLUTE == disp->mPosition) { +- id = nsIFrame::kAbsoluteList; +- } else if (NS_STYLE_POSITION_FIXED == disp->mPosition) { +- if (nsLayoutUtils::IsReallyFixedPos(aChildFrame)) { +- id = nsIFrame::kFixedList; +- } else { +- id = nsIFrame::kAbsoluteList; +- } +-#ifdef MOZ_XUL +- } else if (StyleDisplay::MozPopup == disp->mDisplay) { +- // Out-of-flows that are DISPLAY_POPUP must be kids of the root popup set +-#ifdef DEBUG +- nsIFrame* parent = aChildFrame->GetParent(); +- NS_ASSERTION(parent && parent->IsPopupSetFrame(), "Unexpected parent"); +-#endif // DEBUG +- +- id = nsIFrame::kPopupList; +-#endif // MOZ_XUL +- } else { +- NS_ASSERTION(aChildFrame->IsFloating(), "not a floated frame"); +- id = nsIFrame::kFloatList; +- } +- + } else { + LayoutFrameType childType = aChildFrame->Type(); + if (LayoutFrameType::MenuPopup == childType) { +@@ -1596,19 +1569,8 @@ nsLayoutUtils::GetChildListNameFor(nsIFrame* aChildFrame) + nsContainerFrame* parent = aChildFrame->GetParent(); + bool found = parent->GetChildList(id).ContainsFrame(aChildFrame); + if (!found) { +- if (!(aChildFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW)) { +- found = parent->GetChildList(nsIFrame::kOverflowList) +- .ContainsFrame(aChildFrame); +- } +- else if (aChildFrame->IsFloating()) { +- found = parent->GetChildList(nsIFrame::kOverflowOutOfFlowList) +- .ContainsFrame(aChildFrame); +- if (!found) { +- found = parent->GetChildList(nsIFrame::kPushedFloatsList) +- .ContainsFrame(aChildFrame); +- } +- } +- // else it's positioned and should have been on the 'id' child list. ++ found = parent->GetChildList(nsIFrame::kOverflowList) ++ .ContainsFrame(aChildFrame); + NS_POSTCONDITION(found, "not in child list"); + } + #endif +diff --git layout/generic/nsPlaceholderFrame.cpp layout/generic/nsPlaceholderFrame.cpp +index 7da2582ae526..4b2e1bf84b36 100644 +--- layout/generic/nsPlaceholderFrame.cpp ++++ layout/generic/nsPlaceholderFrame.cpp +@@ -25,9 +25,9 @@ using namespace mozilla::gfx; + + nsIFrame* + NS_NewPlaceholderFrame(nsIPresShell* aPresShell, nsStyleContext* aContext, +- nsFrameState aTypeBit) ++ nsFrameState aTypeBits) + { +- return new (aPresShell) nsPlaceholderFrame(aContext, aTypeBit); ++ return new (aPresShell) nsPlaceholderFrame(aContext, aTypeBits); + } + + NS_IMPL_FRAMEARENA_HELPERS(nsPlaceholderFrame) +@@ -155,6 +155,26 @@ nsPlaceholderFrame::Reflow(nsPresContext* aPresContext, + NS_FRAME_SET_TRUNCATION(aStatus, aReflowInput, aDesiredSize); + } + ++static nsIFrame::ChildListID ++ChildListIDForOutOfFlow(nsFrameState aPlaceholderState, nsIFrame* aChild) ++{ ++ if (aPlaceholderState & PLACEHOLDER_FOR_FLOAT) { ++ return nsIFrame::kFloatList; ++ } ++ if (aPlaceholderState & PLACEHOLDER_FOR_POPUP) { ++ return nsIFrame::kPopupList; ++ } ++ if (aPlaceholderState & PLACEHOLDER_FOR_FIXEDPOS) { ++ return nsLayoutUtils::IsReallyFixedPos(aChild) ++ ? nsIFrame::kFixedList : nsIFrame::kAbsoluteList; ++ } ++ if (aPlaceholderState & PLACEHOLDER_FOR_ABSPOS) { ++ return nsIFrame::kAbsoluteList; ++ } ++ MOZ_DIAGNOSTIC_ASSERT(false, "unknown list"); ++ return nsIFrame::kFloatList; ++} ++ + void + nsPlaceholderFrame::DestroyFrom(nsIFrame* aDestructRoot) + { +@@ -162,12 +182,13 @@ nsPlaceholderFrame::DestroyFrom(nsIFrame* aDestructRoot) + if (oof) { + mOutOfFlowFrame = nullptr; + oof->DeleteProperty(nsIFrame::PlaceholderFrameProperty()); ++ + // If aDestructRoot is not an ancestor of the out-of-flow frame, + // then call RemoveFrame on it here. + // Also destroy it here if it's a popup frame. (Bug 96291) + if ((GetStateBits() & PLACEHOLDER_FOR_POPUP) || + !nsLayoutUtils::IsProperAncestorFrame(aDestructRoot, oof)) { +- ChildListID listId = nsLayoutUtils::GetChildListNameFor(oof); ++ ChildListID listId = ChildListIDForOutOfFlow(GetStateBits(), oof); + nsFrameManager* fm = PresContext()->GetPresShell()->FrameManager(); + fm->RemoveFrame(listId, oof); + } +diff --git layout/generic/nsPlaceholderFrame.h layout/generic/nsPlaceholderFrame.h +index e270c76cdd31..2af9b4ccbc93 100644 +--- layout/generic/nsPlaceholderFrame.h ++++ layout/generic/nsPlaceholderFrame.h +@@ -40,7 +40,7 @@ + + nsIFrame* NS_NewPlaceholderFrame(nsIPresShell* aPresShell, + nsStyleContext* aContext, +- nsFrameState aTypeBit); ++ nsFrameState aTypeBits); + + #define PLACEHOLDER_TYPE_MASK (PLACEHOLDER_FOR_FLOAT | \ + PLACEHOLDER_FOR_ABSPOS | \ +@@ -65,18 +65,19 @@ public: + */ + friend nsIFrame* NS_NewPlaceholderFrame(nsIPresShell* aPresShell, + nsStyleContext* aContext, +- nsFrameState aTypeBit); +- nsPlaceholderFrame(nsStyleContext* aContext, nsFrameState aTypeBit) ++ nsFrameState aTypeBits); ++ nsPlaceholderFrame(nsStyleContext* aContext, nsFrameState aTypeBits) + : nsFrame(aContext, kClassID) + , mOutOfFlowFrame(nullptr) + { +- NS_PRECONDITION(aTypeBit == PLACEHOLDER_FOR_FLOAT || +- aTypeBit == PLACEHOLDER_FOR_ABSPOS || +- aTypeBit == PLACEHOLDER_FOR_FIXEDPOS || +- aTypeBit == PLACEHOLDER_FOR_POPUP || +- aTypeBit == PLACEHOLDER_FOR_TOPLAYER, +- "Unexpected type bit"); +- AddStateBits(aTypeBit); ++ MOZ_ASSERT(aTypeBits == PLACEHOLDER_FOR_FLOAT || ++ aTypeBits == PLACEHOLDER_FOR_ABSPOS || ++ aTypeBits == PLACEHOLDER_FOR_FIXEDPOS || ++ aTypeBits == PLACEHOLDER_FOR_POPUP || ++ aTypeBits == (PLACEHOLDER_FOR_TOPLAYER | PLACEHOLDER_FOR_ABSPOS) || ++ aTypeBits == (PLACEHOLDER_FOR_TOPLAYER | PLACEHOLDER_FOR_FIXEDPOS), ++ "Unexpected type bit"); ++ AddStateBits(aTypeBits); + } + + // Get/Set the associated out of flow frame +diff --git layout/style/crashtests/1404324-1.html layout/style/crashtests/1404324-1.html +new file mode 100644 +index 000000000000..574a5437cb1b +--- /dev/null ++++ layout/style/crashtests/1404324-1.html +@@ -0,0 +1,12 @@ ++ ++ +diff --git layout/style/crashtests/1404324-2.html layout/style/crashtests/1404324-2.html +new file mode 100644 +index 000000000000..797347d5c058 +--- /dev/null ++++ layout/style/crashtests/1404324-2.html +@@ -0,0 +1,10 @@ ++ ++ ++ +diff --git layout/style/crashtests/1404324-3.html layout/style/crashtests/1404324-3.html +new file mode 100644 +index 000000000000..3b06f12a2bf6 +--- /dev/null ++++ layout/style/crashtests/1404324-3.html +@@ -0,0 +1,14 @@ ++ ++ ++ +diff --git layout/style/crashtests/crashtests.list layout/style/crashtests/crashtests.list +index be9a46c52bfa..5eaba6935ee2 100644 +--- layout/style/crashtests/crashtests.list ++++ layout/style/crashtests/crashtests.list +@@ -238,3 +238,6 @@ load 1403615.html + load 1387481-1.html + load 1387499.html + load 1391577.html ++asserts-if(stylo,1) load 1404324-1.html # bug 1405605 ++load 1404324-2.html ++load 1404324-3.html Property changes on: head/www/waterfox/files/patch-bug1404324 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1404910 =================================================================== --- head/www/waterfox/files/patch-bug1404910 (nonexistent) +++ head/www/waterfox/files/patch-bug1404910 (revision 454949) @@ -0,0 +1,170 @@ +commit 2c8bf0ecbc5d +Author: Andrea Marchesini +Date: Wed Oct 4 14:18:19 2017 +0200 + + Bug 1404910 - WebSocket should consider the corrent top-level window principal. r=smaug, a=ritu + + --HG-- + extra : source : c543c0a50db700883b57c052710c97b5ef731e1f +--- + dom/base/WebSocket.cpp | 15 ++++--- + dom/base/test/iframe_webSocket_sandbox.html | 65 +++++++++++++++++++++++++++++ + dom/base/test/mochitest.ini | 3 ++ + dom/base/test/test_webSocket_sandbox.html | 34 +++++++++++++++ + 4 files changed, 109 insertions(+), 8 deletions(-) + +diff --git dom/base/WebSocket.cpp dom/base/WebSocket.cpp +index dc2c1c70107b..982c67cd2abd 100644 +--- dom/base/WebSocket.cpp ++++ dom/base/WebSocket.cpp +@@ -1666,18 +1666,17 @@ WebSocketImpl::Init(JSContext* aCx, + nsCOMPtr innerWindow; + + while (true) { +- if (principal) { +- bool isNullPrincipal = true; +- isNullPrincipal = principal->GetIsNullPrincipal(); +- if (isNullPrincipal || nsContentUtils::IsSystemPrincipal(principal)) { +- break; +- } ++ if (principal && !principal->GetIsNullPrincipal()) { ++ break; + } + + if (!innerWindow) { + innerWindow = do_QueryInterface(globalObject); +- if (NS_WARN_IF(!innerWindow)) { +- return NS_ERROR_DOM_SECURITY_ERR; ++ if (!innerWindow) { ++ // If we are in a XPConnect sandbox or in a JS component, ++ // innerWindow will be null. There is nothing on top of this to be ++ // considered. ++ break; + } + } + +diff --git dom/base/test/iframe_webSocket_sandbox.html dom/base/test/iframe_webSocket_sandbox.html +new file mode 100644 +index 000000000000..d889a79b05da +--- /dev/null ++++ dom/base/test/iframe_webSocket_sandbox.html +@@ -0,0 +1,65 @@ ++ ++ ++ ++ +diff --git dom/base/test/mochitest.ini dom/base/test/mochitest.ini +index 670dd5ae0a06..5d59fe1ea7b8 100644 +--- dom/base/test/mochitest.ini ++++ dom/base/test/mochitest.ini +@@ -804,6 +804,9 @@ skip-if = toolkit == 'android' + skip-if = toolkit == 'android' + [test_websocket_permessage_deflate.html] + skip-if = toolkit == 'android' ++[test_webSocket_sandbox.html] ++skip-if = toolkit == 'android' ++support-files = iframe_webSocket_sandbox.html + [test_websocket1.html] + skip-if = toolkit == 'android' + [test_websocket2.html] +diff --git dom/base/test/test_webSocket_sandbox.html dom/base/test/test_webSocket_sandbox.html +new file mode 100644 +index 000000000000..b343fa784f39 +--- /dev/null ++++ dom/base/test/test_webSocket_sandbox.html +@@ -0,0 +1,34 @@ ++ ++ ++ ++ Bug 1252751 ++ ++ ++ ++ ++
++ ++ ++ ++ Property changes on: head/www/waterfox/files/patch-bug1404910 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1408990 =================================================================== --- head/www/waterfox/files/patch-bug1408990 (nonexistent) +++ head/www/waterfox/files/patch-bug1408990 (revision 454949) @@ -0,0 +1,34 @@ +commit 53a3958e0a76 +Author: Valentin Gosu +Date: Sat Oct 28 00:15:01 2017 +0200 + + Bug 1408990 - Only add the entry to the performance object if the loading document's principal is the same as the triggering principal. r=bz, r=dragana, a=lizzard + + MozReview-Commit-ID: 7o8XKHioP1p + + --HG-- + extra : rebase_source : 33d4044b4901cee460cc69a0bae1fe0e84dab2aa + extra : source : ff9e841ff8544053f184d2e425500d5dd13ee14d +--- + netwerk/protocol/http/HttpBaseChannel.cpp | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git netwerk/protocol/http/HttpBaseChannel.cpp netwerk/protocol/http/HttpBaseChannel.cpp +index 8a5c4d8d9f45..16e59241e2fc 100644 +--- netwerk/protocol/http/HttpBaseChannel.cpp ++++ netwerk/protocol/http/HttpBaseChannel.cpp +@@ -4088,6 +4088,14 @@ HttpBaseChannel::GetPerformance() + return nullptr; + } + ++ // We only add to the document's performance object if it has the same ++ // principal as the one triggering the load. This is to prevent navigations ++ // triggered _by_ the iframe from showing up in the parent document's ++ // performance entries if they have different origins. ++ if (!mLoadInfo->TriggeringPrincipal()->Equals(loadingDocument->NodePrincipal())) { ++ return nullptr; ++ } ++ + nsCOMPtr innerWindow = loadingDocument->GetInnerWindow(); + if (!innerWindow) { + return nullptr; Property changes on: head/www/waterfox/files/patch-bug1408990 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1414440 =================================================================== --- head/www/waterfox/files/patch-bug1414440 (nonexistent) +++ head/www/waterfox/files/patch-bug1414440 (revision 454949) @@ -0,0 +1,108 @@ +Always build libyuv x86 optimizations with Clang. + +diff --git media/libyuv/libyuv/include/libyuv/compare_row.h media/libyuv/libyuv/include/libyuv/compare_row.h +index 7abc2d4aef8f..542df1ef504b 100644 +--- media/libyuv/libyuv/include/libyuv/compare_row.h ++++ media/libyuv/libyuv/include/libyuv/compare_row.h +@@ -19,7 +19,7 @@ extern "C" { + #endif + + #if defined(__pnacl__) || defined(__CLR_VER) || \ +- (defined(__i386__) && !defined(__SSE2__)) ++ (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) + #define LIBYUV_DISABLE_X86 + #endif + // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +diff --git media/libyuv/libyuv/include/libyuv/planar_functions.h media/libyuv/libyuv/include/libyuv/planar_functions.h +index 040839c211b1..5f6a8034d209 100644 +--- media/libyuv/libyuv/include/libyuv/planar_functions.h ++++ media/libyuv/libyuv/include/libyuv/planar_functions.h +@@ -720,7 +720,7 @@ int I420Interpolate(const uint8* src0_y, + int interpolation); + + #if defined(__pnacl__) || defined(__CLR_VER) || \ +- (defined(__i386__) && !defined(__SSE2__)) ++ (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) + #define LIBYUV_DISABLE_X86 + #endif + // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +diff --git media/libyuv/libyuv/include/libyuv/rotate_row.h media/libyuv/libyuv/include/libyuv/rotate_row.h +index 2c51584eee8b..8e60a713c4cf 100644 +--- media/libyuv/libyuv/include/libyuv/rotate_row.h ++++ media/libyuv/libyuv/include/libyuv/rotate_row.h +@@ -19,7 +19,7 @@ extern "C" { + #endif + + #if defined(__pnacl__) || defined(__CLR_VER) || \ +- (defined(__i386__) && !defined(__SSE2__)) ++ (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) + #define LIBYUV_DISABLE_X86 + #endif + // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +diff --git media/libyuv/libyuv/include/libyuv/row.h media/libyuv/libyuv/include/libyuv/row.h +index f74bd9f7d17a..b8f674ba124d 100644 +--- media/libyuv/libyuv/include/libyuv/row.h ++++ media/libyuv/libyuv/include/libyuv/row.h +@@ -31,7 +31,7 @@ extern "C" { + var = 0 + + #if defined(__pnacl__) || defined(__CLR_VER) || \ +- (defined(__i386__) && !defined(__SSE2__)) ++ (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) + #define LIBYUV_DISABLE_X86 + #endif + // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +diff --git media/libyuv/libyuv/include/libyuv/scale_row.h media/libyuv/libyuv/include/libyuv/scale_row.h +index edb46cc8c647..2b2c7a0700ef 100644 +--- media/libyuv/libyuv/include/libyuv/scale_row.h ++++ media/libyuv/libyuv/include/libyuv/scale_row.h +@@ -20,7 +20,7 @@ extern "C" { + #endif + + #if defined(__pnacl__) || defined(__CLR_VER) || \ +- (defined(__i386__) && !defined(__SSE2__)) ++ (defined(__i386__) && !defined(__SSE__) && !defined(__clang__)) + #define LIBYUV_DISABLE_X86 + #endif + // MemorySanitizer does not support assembly code yet. http://crbug.com/344505 +diff --git media/libyuv/libyuv/linux.mk media/libyuv/libyuv/linux.mk +index 923345ae4d12..9e555e303913 100644 +--- media/libyuv/libyuv/linux.mk ++++ media/libyuv/libyuv/linux.mk +@@ -80,4 +80,4 @@ cpuid: util/cpuid.c libyuv.a + $(CC) $(CFLAGS) -o $@ util/cpuid.c libyuv.a + + clean: +- /bin/rm -f source/*.o *.ii *.s libyuv.a convert cpuid psnr ++ /bin/rm -f source/*.o *.ii *.s libyuv.a yuvconvert cpuid psnr +diff --git media/libyuv/libyuv/source/row_gcc.cc media/libyuv/libyuv/source/row_gcc.cc +index 8735070b619d..9df8c6a627db 100644 +--- media/libyuv/libyuv/source/row_gcc.cc ++++ media/libyuv/libyuv/source/row_gcc.cc +@@ -5479,7 +5479,7 @@ void HalfFloatRow_SSE2(const uint16* src, uint16* dst, float scale, int width) { + : "+r"(src), // %0 + "+r"(dst), // %1 + "+r"(width) // %2 +- : "x"(scale * kScaleBias) // %3 ++ : "mx"(scale * kScaleBias) // %3 + : "memory", "cc", + "xmm2", "xmm3", "xmm4", "xmm5" + ); +@@ -5515,7 +5515,7 @@ void HalfFloatRow_AVX2(const uint16* src, uint16* dst, float scale, int width) { + : "+r"(src), // %0 + "+r"(dst), // %1 + "+r"(width) // %2 +- : "x"(scale * kScaleBias) // %3 ++ : "mx"(scale * kScaleBias) // %3 + : "memory", "cc", + "xmm2", "xmm3", "xmm4", "xmm5" + ); +@@ -5548,7 +5548,7 @@ void HalfFloatRow_F16C(const uint16* src, uint16* dst, float scale, int width) { + : "+r"(src), // %0 + "+r"(dst), // %1 + "+r"(width) // %2 +- : "x"(scale) // %3 ++ : "mx"(scale) // %3 + : "memory", "cc", + "xmm2", "xmm3", "xmm4" + ); Property changes on: head/www/waterfox/files/patch-bug1414440 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1384701 =================================================================== --- head/www/waterfox/files/patch-bug1384701 (nonexistent) +++ head/www/waterfox/files/patch-bug1384701 (revision 454949) @@ -0,0 +1,796 @@ +diff --git widget/gtk/nsLookAndFeel.cpp widget/gtk/nsLookAndFeel.cpp +index 6bb3e27c6653..f4c35d82200a 100644 +--- widget/gtk/nsLookAndFeel.cpp ++++ widget/gtk/nsLookAndFeel.cpp +@@ -29,11 +29,9 @@ + + #include "mozilla/gfx/2D.h" + +-#if MOZ_WIDGET_GTK != 2 + #include + #include "WidgetStyleCache.h" + #include "prenv.h" +-#endif + + using mozilla::LookAndFeel; + +@@ -49,9 +47,6 @@ using mozilla::LookAndFeel; + + nsLookAndFeel::nsLookAndFeel() + : nsXPLookAndFeel(), +-#if (MOZ_WIDGET_GTK == 2) +- mStyle(nullptr), +-#endif + mDefaultFontCached(false), mButtonFontCached(false), + mFieldFontCached(false), mMenuFontCached(false), + mInitialized(false) +@@ -66,12 +61,8 @@ nsLookAndFeel::NativeInit() + + nsLookAndFeel::~nsLookAndFeel() + { +-#if (MOZ_WIDGET_GTK == 2) +- g_object_unref(mStyle); +-#endif + } + +-#if MOZ_WIDGET_GTK != 2 + // Modifies color |*aDest| as if a pattern of color |aSource| was painted with + // CAIRO_OPERATOR_OVER to a surface with color |*aDest|. + static void +@@ -228,42 +219,19 @@ GetBorderColors(GtkStyleContext* aContext, + *aDarkColor = GDK_RGBA_TO_NS_RGBA(darkColor); + return ret; + } +-#endif + + nsresult + nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + { + EnsureInit(); + +-#if (MOZ_WIDGET_GTK == 3) + GdkRGBA gdk_color; +-#endif + nsresult res = NS_OK; + + switch (aID) { + // These colors don't seem to be used for anything anymore in Mozilla + // (except here at least TextSelectBackground and TextSelectForeground) + // The CSS2 colors below are used. +-#if (MOZ_WIDGET_GTK == 2) +- case eColorID_WindowBackground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]); +- break; +- case eColorID_WindowForeground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); +- break; +- case eColorID_WidgetBackground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_WidgetForeground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); +- break; +- case eColorID_WidgetSelectBackground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]); +- break; +- case eColorID_WidgetSelectForeground: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_SELECTED]); +- break; +-#else + case eColorID_WindowBackground: + case eColorID_WidgetBackground: + case eColorID_TextBackground: +@@ -303,35 +271,12 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + case eColorID__moz_html_cellhighlighttext: + aColor = sTextSelectedText; + break; +-#endif + case eColorID_Widget3DHighlight: + aColor = NS_RGB(0xa0,0xa0,0xa0); + break; + case eColorID_Widget3DShadow: + aColor = NS_RGB(0x40,0x40,0x40); + break; +-#if (MOZ_WIDGET_GTK == 2) +- case eColorID_TextBackground: +- // not used? +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]); +- break; +- case eColorID_TextForeground: +- // not used? +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); +- break; +- case eColorID_TextSelectBackground: +- case eColorID_IMESelectedRawTextBackground: +- case eColorID_IMESelectedConvertedTextBackground: +- // still used +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_SELECTED]); +- break; +- case eColorID_TextSelectForeground: +- case eColorID_IMESelectedRawTextForeground: +- case eColorID_IMESelectedConvertedTextForeground: +- // still used +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_SELECTED]); +- break; +-#endif + case eColorID_IMERawInputBackground: + case eColorID_IMEConvertedTextBackground: + aColor = NS_TRANSPARENT; +@@ -352,53 +297,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + aColor = NS_RGB(0xff, 0, 0); + break; + +-#if (MOZ_WIDGET_GTK == 2) +- // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors +- case eColorID_activeborder: +- // active window border +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_activecaption: +- // active window caption background +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_appworkspace: +- // MDI background color +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_background: +- // desktop background +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_captiontext: +- // text in active window caption, size box, and scrollbar arrow box (!) +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); +- break; +- case eColorID_graytext: +- // disabled text in windows, menus, etc. +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]); +- break; +- case eColorID_highlight: +- // background of selected item +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_SELECTED]); +- break; +- case eColorID_highlighttext: +- // text of selected item +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_SELECTED]); +- break; +- case eColorID_inactiveborder: +- // inactive window border +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID_inactivecaption: +- // inactive window caption +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_INSENSITIVE]); +- break; +- case eColorID_inactivecaptiontext: +- // text in inactive window caption +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]); +- break; +-#else + // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors + case eColorID_activeborder: { + // active window border +@@ -433,7 +331,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + ReleaseStyleContext(style); + break; + } +-#endif + case eColorID_infobackground: + // tooltip background color + aColor = sInfoBackground; +@@ -452,11 +349,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + break; + case eColorID_scrollbar: + // scrollbar gray area +-#if (MOZ_WIDGET_GTK == 2) +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_ACTIVE]); +-#else + aColor = sMozScrollbar; +-#endif + break; + + case eColorID_threedlightshadow: +@@ -465,11 +358,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + case eColorID_threedface: + case eColorID_buttonface: + // 3-D face color +-#if (MOZ_WIDGET_GTK == 3) + aColor = sMozWindowBackground; +-#else +- aColor = sButtonBackground; +-#endif + break; + + case eColorID_buttontext: +@@ -491,56 +380,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + aColor = sFrameInnerDarkBorder; + break; + +-#if (MOZ_WIDGET_GTK == 2) +- case eColorID_threeddarkshadow: +- // 3-D shadow outer edge color +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->black); +- break; +- +- case eColorID_window: +- case eColorID_windowframe: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- +- case eColorID_windowtext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); +- break; +- +- case eColorID__moz_eventreerow: +- case eColorID__moz_field: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]); +- break; +- case eColorID__moz_fieldtext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]); +- break; +- case eColorID__moz_dialog: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]); +- break; +- case eColorID__moz_dialogtext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]); +- break; +- case eColorID__moz_dragtargetzone: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]); +- break; +- case eColorID__moz_buttondefault: +- // default button border color +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->black); +- break; +- case eColorID__moz_buttonhoverface: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_PRELIGHT]); +- break; +- case eColorID__moz_buttonhovertext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_PRELIGHT]); +- break; +- case eColorID__moz_cellhighlight: +- case eColorID__moz_html_cellhighlight: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_ACTIVE]); +- break; +- case eColorID__moz_cellhighlighttext: +- case eColorID__moz_html_cellhighlighttext: +- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_ACTIVE]); +- break; +-#else + case eColorID_threeddarkshadow: + // Hardcode to black + aColor = NS_RGB(0x00,0x00,0x00); +@@ -574,7 +413,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + case eColorID__moz_buttonhovertext: + aColor = sButtonHoverText; + break; +-#endif + case eColorID__moz_menuhover: + aColor = sMenuHover; + break; +@@ -590,11 +428,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + case eColorID__moz_comboboxtext: + aColor = sComboBoxText; + break; +-#if (MOZ_WIDGET_GTK == 2) +- case eColorID__moz_combobox: +- aColor = sComboBoxBackground; +- break; +-#endif + case eColorID__moz_menubartext: + aColor = sMenuBarText; + break; +@@ -602,11 +435,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + aColor = sMenuBarHoverText; + break; + case eColorID__moz_gtk_info_bar_text: +-#if (MOZ_WIDGET_GTK == 3) + aColor = sInfoBarText; +-#else +- aColor = sInfoText; +-#endif + break; + default: + /* default color is BLACK */ +@@ -618,27 +447,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + return res; + } + +-#if (MOZ_WIDGET_GTK == 2) +-static void darken_gdk_color(GdkColor *src, GdkColor *dest) +-{ +- gdouble red; +- gdouble green; +- gdouble blue; +- +- red = (gdouble) src->red / 65535.0; +- green = (gdouble) src->green / 65535.0; +- blue = (gdouble) src->blue / 65535.0; +- +- red *= 0.93; +- green *= 0.93; +- blue *= 0.93; +- +- dest->red = red * 65535.0; +- dest->green = green * 65535.0; +- dest->blue = blue * 65535.0; +-} +-#endif +- + static int32_t CheckWidgetStyle(GtkWidget* aWidget, const char* aStyle, int32_t aResult) { + gboolean value = FALSE; + gtk_widget_style_get(aWidget, aStyle, &value, nullptr); +@@ -826,14 +634,8 @@ nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult) + res = NS_ERROR_NOT_IMPLEMENTED; + break; + case eIntID_TouchEnabled: +-#if MOZ_WIDGET_GTK == 3 + aResult = mozilla::widget::WidgetUtils::IsTouchDeviceSupportPresent(); + break; +-#else +- aResult = 0; +- res = NS_ERROR_NOT_IMPLEMENTED; +-#endif +- break; + case eIntID_MacGraphiteTheme: + aResult = 0; + res = NS_ERROR_NOT_IMPLEMENTED; +@@ -905,24 +707,20 @@ nsLookAndFeel::GetFloatImpl(FloatID aID, float &aResult) + } + + static void +-GetSystemFontInfo(GtkWidget *aWidget, ++GetSystemFontInfo(GtkStyleContext *aStyle, + nsString *aFontName, + gfxFontStyle *aFontStyle) + { +- GtkSettings *settings = gtk_widget_get_settings(aWidget); +- + aFontStyle->style = NS_FONT_STYLE_NORMAL; + +- gchar *fontname; +- g_object_get(settings, "gtk-font-name", &fontname, nullptr); +- ++ // As in ++ // https://git.gnome.org/browse/gtk+/tree/gtk/gtkwidget.c?h=3.22.19#n10333 + PangoFontDescription *desc; +- desc = pango_font_description_from_string(fontname); ++ gtk_style_context_get(aStyle, gtk_style_context_get_state(aStyle), ++ "font", &desc, nullptr); + + aFontStyle->systemFont = true; + +- g_free(fontname); +- + NS_NAMED_LITERAL_STRING(quote, "\""); + NS_ConvertUTF8toUTF16 family(pango_font_description_get_family(desc)); + *aFontName = quote + family + quote; +@@ -953,96 +751,28 @@ GetSystemFontInfo(GtkWidget *aWidget, + pango_font_description_free(desc); + } + +-static void +-GetSystemFontInfo(LookAndFeel::FontID aID, +- nsString *aFontName, +- gfxFontStyle *aFontStyle) +-{ +- if (aID == LookAndFeel::eFont_Widget) { +- GtkWidget *label = gtk_label_new("M"); +- GtkWidget *parent = gtk_fixed_new(); +- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); +- +- gtk_container_add(GTK_CONTAINER(parent), label); +- gtk_container_add(GTK_CONTAINER(window), parent); +- +- gtk_widget_ensure_style(label); +- GetSystemFontInfo(label, aFontName, aFontStyle); +- gtk_widget_destroy(window); // no unref, windows are different +- +- } else if (aID == LookAndFeel::eFont_Button) { +- GtkWidget *label = gtk_label_new("M"); +- GtkWidget *parent = gtk_fixed_new(); +- GtkWidget *button = gtk_button_new(); +- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); +- +- gtk_container_add(GTK_CONTAINER(button), label); +- gtk_container_add(GTK_CONTAINER(parent), button); +- gtk_container_add(GTK_CONTAINER(window), parent); +- +- gtk_widget_ensure_style(label); +- GetSystemFontInfo(label, aFontName, aFontStyle); +- gtk_widget_destroy(window); // no unref, windows are different +- +- } else if (aID == LookAndFeel::eFont_Field) { +- GtkWidget *entry = gtk_entry_new(); +- GtkWidget *parent = gtk_fixed_new(); +- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); +- +- gtk_container_add(GTK_CONTAINER(parent), entry); +- gtk_container_add(GTK_CONTAINER(window), parent); +- +- gtk_widget_ensure_style(entry); +- GetSystemFontInfo(entry, aFontName, aFontStyle); +- gtk_widget_destroy(window); // no unref, windows are different +- +- } else { +- MOZ_ASSERT(aID == LookAndFeel::eFont_Menu, "unexpected font ID"); +- GtkWidget *accel_label = gtk_accel_label_new("M"); +- GtkWidget *menuitem = gtk_menu_item_new(); +- GtkWidget *menu = gtk_menu_new(); +- g_object_ref_sink(menu); +- +- gtk_container_add(GTK_CONTAINER(menuitem), accel_label); +- gtk_menu_shell_append((GtkMenuShell *)GTK_MENU(menu), menuitem); +- +- gtk_widget_ensure_style(accel_label); +- GetSystemFontInfo(accel_label, aFontName, aFontStyle); +- g_object_unref(menu); +- } +-} +- + bool + nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName, + gfxFontStyle& aFontStyle, + float aDevPixPerCSSPixel) + { +- nsString *cachedFontName = nullptr; +- gfxFontStyle *cachedFontStyle = nullptr; +- bool *isCached = nullptr; +- + switch (aID) { + case eFont_Menu: // css2 + case eFont_PullDownMenu: // css3 +- cachedFontName = &mMenuFontName; +- cachedFontStyle = &mMenuFontStyle; +- isCached = &mMenuFontCached; +- aID = eFont_Menu; +- break; ++ aFontName = mMenuFontName; ++ aFontStyle = mMenuFontStyle; ++ return true; + + case eFont_Field: // css3 + case eFont_List: // css3 +- cachedFontName = &mFieldFontName; +- cachedFontStyle = &mFieldFontStyle; +- isCached = &mFieldFontCached; +- aID = eFont_Field; +- break; ++ aFontName = mFieldFontName; ++ aFontStyle = mFieldFontStyle; ++ return true; + + case eFont_Button: // css3 +- cachedFontName = &mButtonFontName; +- cachedFontStyle = &mButtonFontStyle; +- isCached = &mButtonFontCached; +- break; ++ aFontName = mButtonFontName; ++ aFontStyle = mButtonFontStyle; ++ return true; + + case eFont_Caption: // css2 + case eFont_Icon: // css2 +@@ -1057,21 +787,11 @@ nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName, + case eFont_Dialog: // css3 + case eFont_Tooltips: // moz + case eFont_Widget: // moz +- cachedFontName = &mDefaultFontName; +- cachedFontStyle = &mDefaultFontStyle; +- isCached = &mDefaultFontCached; +- aID = eFont_Widget; +- break; +- } +- +- if (!*isCached) { +- GetSystemFontInfo(aID, cachedFontName, cachedFontStyle); +- *isCached = true; ++ default: ++ aFontName = mDefaultFontName; ++ aFontStyle = mDefaultFontStyle; ++ return true; + } +- +- aFontName = *cachedFontName; +- aFontStyle = *cachedFontStyle; +- return true; + } + + void +@@ -1087,70 +807,6 @@ nsLookAndFeel::EnsureInit() + // gtk does non threadsafe refcounting + MOZ_ASSERT(NS_IsMainThread()); + +-#if (MOZ_WIDGET_GTK == 2) +- NS_ASSERTION(!mStyle, "already initialized"); +- // GtkInvisibles come with a refcount that is not floating +- // (since their initialization code calls g_object_ref_sink) and +- // their destroy code releases that reference (which means they +- // have to be explicitly destroyed, since calling unref enough +- // to cause destruction would lead to *another* unref). +- // However, this combination means that it's actually still ok +- // to use the normal pattern, which is to g_object_ref_sink +- // after construction, and then destroy *and* unref when we're +- // done. (Though we could skip the g_object_ref_sink and the +- // corresponding g_object_unref, but that's particular to +- // GtkInvisibles and GtkWindows.) +- GtkWidget *widget = gtk_invisible_new(); +- g_object_ref_sink(widget); // effectively g_object_ref (see above) +- +- gtk_widget_ensure_style(widget); +- mStyle = gtk_style_copy(gtk_widget_get_style(widget)); +- +- gtk_widget_destroy(widget); +- g_object_unref(widget); +- +- // tooltip foreground and background +- GtkStyle *style = gtk_rc_get_style_by_paths(gtk_settings_get_default(), +- "gtk-tooltips", "GtkWindow", +- GTK_TYPE_WINDOW); +- if (style) { +- sInfoBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); +- sInfoText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- } +- +- // menu foreground & menu background +- GtkWidget *accel_label = gtk_accel_label_new("M"); +- GtkWidget *menuitem = gtk_menu_item_new(); +- GtkWidget *menu = gtk_menu_new(); +- +- g_object_ref_sink(menu); +- +- gtk_container_add(GTK_CONTAINER(menuitem), accel_label); +- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); +- +- gtk_widget_set_style(accel_label, nullptr); +- gtk_widget_set_style(menu, nullptr); +- gtk_widget_realize(menu); +- gtk_widget_realize(accel_label); +- +- style = gtk_widget_get_style(accel_label); +- if (style) { +- sMenuText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- } +- +- style = gtk_widget_get_style(menu); +- if (style) { +- sMenuBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); +- } +- +- style = gtk_widget_get_style(menuitem); +- if (style) { +- sMenuHover = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_PRELIGHT]); +- sMenuHoverText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_PRELIGHT]); +- } +- +- g_object_unref(menu); +-#else + GdkRGBA color; + GtkStyleContext *style; + +@@ -1195,6 +851,12 @@ nsLookAndFeel::EnsureInit() + } + } + ++ // The label is not added to a parent widget, but shared for constructing ++ // different style contexts. The node hierarchy is constructed only on ++ // the label style context. ++ GtkWidget *labelWidget = gtk_label_new("M"); ++ g_object_ref_sink(labelWidget); ++ + // Scrollbar colors + style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL); + gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); +@@ -1208,6 +870,13 @@ nsLookAndFeel::EnsureInit() + gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); + sMozWindowText = GDK_RGBA_TO_NS_RGBA(color); + ReleaseStyleContext(style); ++ style = ClaimStyleContext(MOZ_GTK_WINDOW_CONTAINER); ++ { ++ GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style); ++ GetSystemFontInfo(labelStyle, &mDefaultFontName, &mDefaultFontStyle); ++ g_object_unref(labelStyle); ++ } ++ ReleaseStyleContext(style); + + // tooltip foreground and background + style = ClaimStyleContext(MOZ_GTK_TOOLTIP); +@@ -1224,6 +893,9 @@ nsLookAndFeel::EnsureInit() + { + GtkStyleContext* accelStyle = + CreateStyleForWidget(gtk_accel_label_new("M"), style); ++ ++ GetSystemFontInfo(accelStyle, &mMenuFontName, &mMenuFontStyle); ++ + gtk_style_context_get_color(accelStyle, GTK_STATE_FLAG_NORMAL, &color); + sMenuText = GDK_RGBA_TO_NS_RGBA(color); + gtk_style_context_get_color(accelStyle, GTK_STATE_FLAG_INSENSITIVE, &color); +@@ -1243,17 +915,8 @@ nsLookAndFeel::EnsureInit() + gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); + sMenuHoverText = GDK_RGBA_TO_NS_RGBA(color); + ReleaseStyleContext(style); +-#endif + +- // button styles + GtkWidget *parent = gtk_fixed_new(); +- GtkWidget *button = gtk_button_new(); +- GtkWidget *label = gtk_label_new("M"); +-#if (MOZ_WIDGET_GTK == 2) +- GtkWidget *combobox = gtk_combo_box_new(); +- GtkWidget *comboboxLabel = gtk_label_new("M"); +- gtk_container_add(GTK_CONTAINER(combobox), comboboxLabel); +-#endif + GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); + GtkWidget *treeView = gtk_tree_view_new(); + GtkWidget *linkButton = gtk_link_button_new("http://example.com/"); +@@ -1262,94 +925,14 @@ nsLookAndFeel::EnsureInit() + GtkWidget *entry = gtk_entry_new(); + GtkWidget *textView = gtk_text_view_new(); + +- gtk_container_add(GTK_CONTAINER(button), label); +- gtk_container_add(GTK_CONTAINER(parent), button); + gtk_container_add(GTK_CONTAINER(parent), treeView); + gtk_container_add(GTK_CONTAINER(parent), linkButton); +-#if (MOZ_WIDGET_GTK == 2) +- gtk_container_add(GTK_CONTAINER(parent), combobox); +-#endif + gtk_container_add(GTK_CONTAINER(parent), menuBar); + gtk_menu_shell_append(GTK_MENU_SHELL(menuBar), menuBarItem); + gtk_container_add(GTK_CONTAINER(window), parent); + gtk_container_add(GTK_CONTAINER(parent), entry); + gtk_container_add(GTK_CONTAINER(parent), textView); + +-#if (MOZ_WIDGET_GTK == 2) +- gtk_widget_set_style(button, nullptr); +- gtk_widget_set_style(label, nullptr); +- gtk_widget_set_style(treeView, nullptr); +- gtk_widget_set_style(linkButton, nullptr); +- gtk_widget_set_style(combobox, nullptr); +- gtk_widget_set_style(comboboxLabel, nullptr); +- gtk_widget_set_style(menuBar, nullptr); +- gtk_widget_set_style(entry, nullptr); +- +- gtk_widget_realize(button); +- gtk_widget_realize(label); +- gtk_widget_realize(treeView); +- gtk_widget_realize(linkButton); +- gtk_widget_realize(combobox); +- gtk_widget_realize(comboboxLabel); +- gtk_widget_realize(menuBar); +- gtk_widget_realize(entry); +- +- style = gtk_widget_get_style(label); +- if (style) { +- sButtonText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- } +- +- style = gtk_widget_get_style(comboboxLabel); +- if (style) { +- sComboBoxText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- } +- style = gtk_widget_get_style(combobox); +- if (style) { +- sComboBoxBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); +- } +- +- style = gtk_widget_get_style(menuBar); +- if (style) { +- sMenuBarText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]); +- sMenuBarHoverText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_SELECTED]); +- } +- +- // GTK's guide to fancy odd row background colors: +- // 1) Check if a theme explicitly defines an odd row color +- // 2) If not, check if it defines an even row color, and darken it +- // slightly by a hardcoded value (gtkstyle.c) +- // 3) If neither are defined, take the base background color and +- // darken that by a hardcoded value +- colorValuePtr = nullptr; +- gtk_widget_style_get(treeView, +- "odd-row-color", &colorValuePtr, +- nullptr); +- +- if (colorValuePtr) { +- colorValue = *colorValuePtr; +- } else { +- gtk_widget_style_get(treeView, +- "even-row-color", &colorValuePtr, +- nullptr); +- if (colorValuePtr) +- darken_gdk_color(colorValuePtr, &colorValue); +- else +- darken_gdk_color(&treeView->style->base[GTK_STATE_NORMAL], &colorValue); +- } +- +- sOddCellBackground = GDK_COLOR_TO_NS_RGB(colorValue); +- if (colorValuePtr) +- gdk_color_free(colorValuePtr); +- +- style = gtk_widget_get_style(button); +- if (style) { +- sButtonBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]); +- sFrameOuterLightBorder = +- GDK_COLOR_TO_NS_RGB(style->light[GTK_STATE_NORMAL]); +- sFrameInnerDarkBorder = +- GDK_COLOR_TO_NS_RGB(style->dark[GTK_STATE_NORMAL]); +- } +-#else + // Text colors + GdkRGBA bgColor; + // If the text window background is translucent, then the background of +@@ -1381,8 +964,10 @@ nsLookAndFeel::EnsureInit() + // Button text color + style = ClaimStyleContext(MOZ_GTK_BUTTON); + { +- GtkStyleContext* labelStyle = +- CreateStyleForWidget(gtk_label_new("M"), style); ++ GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style); ++ ++ GetSystemFontInfo(labelStyle, &mButtonFontName, &mButtonFontStyle); ++ + gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_NORMAL, &color); + sButtonText = GDK_RGBA_TO_NS_RGBA(color); + gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_PRELIGHT, &color); +@@ -1446,7 +1031,6 @@ nsLookAndFeel::EnsureInit() + gtk_style_context_add_class(style, GTK_STYLE_CLASS_INFO); + gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); + sInfoBarText = GDK_RGBA_TO_NS_RGBA(color); +-#endif + // Some themes have a unified menu bar, and support window dragging on it + gboolean supports_menubar_drag = FALSE; + GParamSpec *param_spec = +@@ -1493,7 +1074,11 @@ nsLookAndFeel::EnsureInit() + "cursor-aspect-ratio", &sCaretRatio, + nullptr); + ++ GetSystemFontInfo(gtk_widget_get_style_context(entry), ++ &mFieldFontName, &mFieldFontStyle); ++ + gtk_widget_destroy(window); ++ g_object_unref(labelWidget); + } + + // virtual +@@ -1515,11 +1100,6 @@ nsLookAndFeel::RefreshImpl() + mFieldFontCached = false; + mMenuFontCached = false; + +-#if (MOZ_WIDGET_GTK == 2) +- g_object_unref(mStyle); +- mStyle = nullptr; +-#endif +- + mInitialized = false; + } + +diff --git widget/gtk/nsLookAndFeel.h widget/gtk/nsLookAndFeel.h +index 9a4015e95415..38cd51c056d6 100644 +--- widget/gtk/nsLookAndFeel.h ++++ widget/gtk/nsLookAndFeel.h +@@ -33,9 +33,6 @@ public: + virtual bool GetEchoPasswordImpl(); + + protected: +-#if (MOZ_WIDGET_GTK == 2) +- struct _GtkStyle *mStyle; +-#endif + + // Cached fonts + bool mDefaultFontCached; +@@ -63,7 +60,6 @@ protected: + nscolor sMenuHoverText; + nscolor sButtonText; + nscolor sButtonHoverText; +- nscolor sButtonBackground; + nscolor sFrameOuterLightBorder; + nscolor sFrameInnerDarkBorder; + nscolor sOddCellBackground; +@@ -77,9 +73,7 @@ protected: + nscolor sTextSelectedText; + nscolor sTextSelectedBackground; + nscolor sMozScrollbar; +-#if (MOZ_WIDGET_GTK == 3) + nscolor sInfoBarText; +-#endif + char16_t sInvisibleCharacter; + float sCaretRatio; + bool sMenuSupportsDrag; Property changes on: head/www/waterfox/files/patch-bug1384701 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1412558 =================================================================== --- head/www/waterfox/files/patch-bug1412558 (nonexistent) +++ head/www/waterfox/files/patch-bug1412558 (revision 454949) @@ -0,0 +1,83 @@ +diff --git dom/media/flac/FlacDecoder.cpp dom/media/flac/FlacDecoder.cpp +index 53fc3c9937f7..b23771ab80fa 100644 +--- dom/media/flac/FlacDecoder.cpp ++++ dom/media/flac/FlacDecoder.cpp +@@ -7,6 +7,7 @@ + #include "FlacDecoder.h" + #include "MediaContainerType.h" + #include "MediaPrefs.h" ++#include "PDMFactory.h" + + namespace mozilla { + +@@ -15,6 +16,10 @@ FlacDecoder::IsEnabled() + { + #ifdef MOZ_FFVPX + return MediaPrefs::FlacEnabled(); ++#elif defined(MOZ_FFMPEG) ++ RefPtr platform = new PDMFactory(); ++ return MediaPrefs::FlacEnabled() && platform->SupportsMimeType(NS_LITERAL_CSTRING("audio/flac"), ++ /* DecoderDoctorDiagnostics* */ nullptr); + #else + // Until bug 1295886 is fixed. + return false; +diff --git media/ffvpx/README_MOZILLA media/ffvpx/README_MOZILLA +index 5d3a6037efe0..43144b726a92 100644 +--- media/ffvpx/README_MOZILLA ++++ media/ffvpx/README_MOZILLA +@@ -17,14 +17,6 @@ configuration files were generated as follow using the configure script: + config*: + replace: /HAVE_(MALLOC_H|ARC4RANDOM|LOCALTIME_R|MEMALIGN|POSIX_MEMALIGN)/d + +-config_darwin32.h: +-add to configure command: --disable-asm --disable-yasm --cc='clang -m32' +- +-config_unix32.h: +-add to configure command: --disable-asm --disable-yasm --cc='clang -m32' +-replace: s/HAVE_SYSCTL 1/HAVE_SYSCTL 0/ and s/HAVE_MEMALIGN 1/HAVE_MEMALIGN 0/ and s/HAVE_POSIX_MEMALIGN 1/HAVE_POSIX_MEMALIGN 0/ +- +- + config_unix64.h/config_unix64.asm: + replace: s/HAVE_SYSCTL 1/HAVE_SYSCTL 0 + +diff --git media/ffvpx/config.h media/ffvpx/config.h +index dab01e05cd65..26ebe529bd98 100644 +--- media/ffvpx/config.h ++++ media/ffvpx/config.h +@@ -27,17 +27,9 @@ + #define HAVE_LIBC_MSVCRT 0 + #endif + #elif defined(XP_DARWIN) +-#if defined(HAVE_64BIT_BUILD) + #include "config_darwin64.h" +-#else +-#include "config_darwin32.h" +-#endif + #elif defined(XP_UNIX) +-#if defined(HAVE_64BIT_BUILD) + #include "config_unix64.h" +-#else +-#include "config_unix32.h" +-#endif + #endif + #include "config_common.h" + #endif // MOZ_FFVPX_CONFIG_H +diff --git old-configure.in old-configure.in +index b8ce71278548..410be683c2f6 100644 +--- old-configure.in ++++ old-configure.in +@@ -3279,11 +3279,11 @@ dnl = FFmpeg's ffvpx configuration + dnl ======================================================== + + MOZ_FFVPX= +-case "$CPU_ARCH" in +- x86) ++case "$OS_ARCH:$CPU_ARCH" in ++ WINNT:x86) + MOZ_FFVPX=1 + ;; +- x86_64) ++ *:x86_64) + MOZ_FFVPX=1 + ;; + esac Property changes on: head/www/waterfox/files/patch-bug1412558 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1186967 =================================================================== --- head/www/waterfox/files/patch-bug1186967 (nonexistent) +++ head/www/waterfox/files/patch-bug1186967 (revision 454949) @@ -0,0 +1,41 @@ +commit 64bb4e051b50 +Author: Martin Stransky +Date: Tue Oct 17 09:50:18 2017 +0200 + + Bug 1186967 - ignore double-click on WM without _NET_WM_MOVERESIZE support, r=jhorak + + MozReview-Commit-ID: 2Vs6i5leero + + --HG-- + extra : rebase_source : d8f2bbaf9ef9b2025478f029a68ee7e87e07de79 +--- + widget/gtk/nsWindow.cpp | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git widget/gtk/nsWindow.cpp widget/gtk/nsWindow.cpp +index eb2f0e5e95cd..955327297ac9 100644 +--- widget/gtk/nsWindow.cpp ++++ widget/gtk/nsWindow.cpp +@@ -6444,6 +6444,22 @@ nsWindow::GetDragInfo(WidgetMouseEvent* aMouseEvent, + return false; + } + ++ if (mIsX11Display) { ++ // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=789054 ++ // To avoid crashes disable double-click on WM without _NET_WM_MOVERESIZE. ++ // See _should_perform_ewmh_drag() at gdkwindow-x11.c ++ GdkScreen* screen = gdk_window_get_screen(gdk_window); ++ GdkAtom atom = gdk_atom_intern("_NET_WM_MOVERESIZE", FALSE); ++ if (!gdk_x11_screen_supports_net_wm_hint(screen, atom)) { ++ static unsigned int lastTimeStamp = 0; ++ if (lastTimeStamp != aMouseEvent->mTime) { ++ lastTimeStamp = aMouseEvent->mTime; ++ } else { ++ return false; ++ } ++ } ++ } ++ + // FIXME: It would be nice to have the widget position at the time + // of the event, but it's relatively unlikely that the widget has + // moved since the mousedown. (On the other hand, it's quite likely Property changes on: head/www/waterfox/files/patch-bug1186967 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1401573 =================================================================== --- head/www/waterfox/files/patch-bug1401573 (nonexistent) +++ head/www/waterfox/files/patch-bug1401573 (revision 454949) @@ -0,0 +1,27 @@ +commit d0ed05261f20 +Author: jason laster +Date: Wed Sep 20 10:52:54 2017 -0400 + + Bug 1401573 - Fix PoE, Link, and linux issue. r=nchevobbe + + MozReview-Commit-ID: 35TA6bhW1Wr +--- + devtools/client/debugger/new/debugger.js | 68 +++++++++++++++++----- + devtools/client/debugger/new/panel.js | 27 ++++++++- + .../new/test/mochitest/browser_dbg-expressions.js | 2 +- + 3 files changed, 79 insertions(+), 18 deletions(-) + +diff --git devtools/client/debugger/new/debugger.js devtools/client/debugger/new/debugger.js +index f52a3e380ab6..c1213180cb13 100644 +--- devtools/client/debugger/new/debugger.js ++++ devtools/client/debugger/new/debugger.js +@@ -29493,7 +29493,8 @@ return /******/ (function(modules) { // webpackBootstr + } + + function getKeyForOS(os, action) { +- return KEYS[os][action]; ++ var osActions = KEYS[os] || KEYS.Linux; ++ return osActions[action]; + } + + function formatKey(action) { Property changes on: head/www/waterfox/files/patch-bug1401573 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1366201 =================================================================== --- head/www/waterfox/files/patch-bug1366201 (nonexistent) +++ head/www/waterfox/files/patch-bug1366201 (revision 454949) @@ -0,0 +1,40 @@ +commit 139967a109c1 +Author: Jean-Yves Avenard +Date: Wed Oct 25 18:25:37 2017 +0200 + + Bug 1366201 - P5. Get around FFmpeg bug with corrupted data. r=gerald + + According to FFmpeg documentation, the out parameter is "set to size of parsed buffer or zero if not yet finished. " however this is only the case if no error occurred; otherwise it is left untouched. + + We want the invalid content to generate a decoding error, so we set size to inputSize to ensure decoding failed later. + + MozReview-Commit-ID: FZeiZUdUtLG +--- + dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp +index 6acc8fef4dd8..fdee880c9e3b 100644 +--- dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp ++++ dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp +@@ -212,18 +212,18 @@ FFmpegVideoDecoder::DoDecode(MediaRawData* aSample, bool* aGotFrame, + + #if LIBAVCODEC_VERSION_MAJOR >= 54 + if (inputSize && mCodecParser && (mCodecID == AV_CODEC_ID_VP8 + #if LIBAVCODEC_VERSION_MAJOR >= 55 + || mCodecID == AV_CODEC_ID_VP9 + #endif + )) { + while (inputSize) { +- uint8_t* data; +- int size; ++ uint8_t* data = inputData; ++ int size = inputSize; + int len = mLib->av_parser_parse2( + mCodecParser, mCodecContext, &data, &size, inputData, inputSize, + aSample->mTime.ToMicroseconds(), aSample->mTimecode.ToMicroseconds(), + aSample->mOffset); + if (size_t(len) > inputSize) { + return NS_ERROR_DOM_MEDIA_DECODE_ERR; + } + inputData += len; Property changes on: head/www/waterfox/files/patch-bug1366201 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1393283 =================================================================== --- head/www/waterfox/files/patch-bug1393283 (nonexistent) +++ head/www/waterfox/files/patch-bug1393283 (revision 454949) @@ -0,0 +1,144 @@ +commit d20c7d929c84 +Author: Ethan +Date: Fri Sep 1 17:29:44 2017 +0800 + + Bug 1393283 - Use the last ESR version as the spoofed Firefox version. r=tihuang, r=mcmanus +--- + .../test/browser/browser_navigator.js | 2 +- + netwerk/protocol/http/nsHttpHandler.cpp | 16 +++---- + .../resistfingerprinting/nsRFPService.cpp | 56 ++++++++++++++++++++++ + .../components/resistfingerprinting/nsRFPService.h | 3 ++ + 4 files changed, 66 insertions(+), 11 deletions(-) + +diff --git browser/components/resistfingerprinting/test/browser/browser_navigator.js browser/components/resistfingerprinting/test/browser/browser_navigator.js +index 25c393d8bb2a..9f52e34a9451 100644 +--- browser/components/resistfingerprinting/test/browser/browser_navigator.js ++++ browser/components/resistfingerprinting/test/browser/browser_navigator.js +@@ -91,7 +91,7 @@ add_task(async function setup() { + + let appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo); + let appVersion = parseInt(appInfo.version); +- let spoofedVersion = appVersion - (appVersion % 10); ++ let spoofedVersion = appVersion - ((appVersion - 3) % 7); + spoofedUserAgent = `Mozilla/5.0 (${SPOOFED_OSCPU}; rv:${spoofedVersion}.0) Gecko/20100101 Firefox/${spoofedVersion}.0`; + }); + +diff --git netwerk/protocol/http/nsHttpHandler.cpp netwerk/protocol/http/nsHttpHandler.cpp +index 31d0f8832732..b957d835b52f 100644 +--- netwerk/protocol/http/nsHttpHandler.cpp ++++ netwerk/protocol/http/nsHttpHandler.cpp +@@ -461,16 +461,12 @@ nsHttpHandler::Init() + mAppVersion.AssignLiteral(MOZ_APP_UA_VERSION); + } + +- // Generating the spoofed userAgent for fingerprinting resistance. +- // The browser version will be rounded down to a multiple of 10. +- // By doing so, the anonymity group will cover more versions instead of one +- // version. +- uint32_t spoofedVersion = mAppVersion.ToInteger(&rv); +- if (NS_SUCCEEDED(rv)) { +- spoofedVersion = spoofedVersion - (spoofedVersion % 10); +- mSpoofedUserAgent.Assign(nsPrintfCString( +- "Mozilla/5.0 (%s; rv:%d.0) Gecko/%s Firefox/%d.0", +- SPOOFED_OSCPU, spoofedVersion, LEGACY_BUILD_ID, spoofedVersion)); ++ // Generating the spoofed User Agent for fingerprinting resistance. ++ rv = nsRFPService::GetSpoofedUserAgent(mSpoofedUserAgent); ++ if (NS_FAILED(rv)) { ++ // Empty mSpoofedUserAgent to make sure the unsuccessful spoofed UA string ++ // will not be used anywhere. ++ mSpoofedUserAgent.Truncate(); + } + + mSessionStartTime = NowInSeconds(); +diff --git toolkit/components/resistfingerprinting/nsRFPService.cpp toolkit/components/resistfingerprinting/nsRFPService.cpp +index 94554200c3b8..96a2940c04a0 100644 +--- toolkit/components/resistfingerprinting/nsRFPService.cpp ++++ toolkit/components/resistfingerprinting/nsRFPService.cpp +@@ -18,10 +18,13 @@ + #include "nsServiceManagerUtils.h" + #include "nsString.h" + #include "nsXULAppAPI.h" ++#include "nsPrintfCString.h" + + #include "nsIObserverService.h" + #include "nsIPrefBranch.h" + #include "nsIPrefService.h" ++#include "nsIXULAppInfo.h" ++#include "nsIXULRuntime.h" + #include "nsJSUtils.h" + + #include "prenv.h" +@@ -162,6 +165,59 @@ nsRFPService::GetSpoofedPresentedFrames(double aTime, uint32_t aWidth, uint32_t + return NSToIntFloor(time * sVideoFramesPerSec * ((100 - boundedDroppedRatio) / 100.0)); + } + ++/* static */ ++nsresult ++nsRFPService::GetSpoofedUserAgent(nsACString &userAgent) ++{ ++ // This function generates the spoofed value of User Agent. ++ // We spoof the values of the platform and Firefox version, which could be ++ // used as fingerprinting sources to identify individuals. ++ // Reference of the format of User Agent: ++ // https://developer.mozilla.org/en-US/docs/Web/API/NavigatorID/userAgent ++ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent ++ ++ nsresult rv; ++ nsCOMPtr appInfo = ++ do_GetService("@mozilla.org/xre/app-info;1", &rv); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ nsAutoCString appVersion; ++ rv = appInfo->GetVersion(appVersion); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ // The browser version will be spoofed as the last ESR version. ++ // By doing so, the anonymity group will cover more versions instead of one ++ // version. ++ uint32_t firefoxVersion = appVersion.ToInteger(&rv); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ // Starting from Firefox 10, Firefox ESR was released once every seven ++ // Firefox releases, e.g. Firefox 10, 17, 24, 31, and so on. ++ // We infer the last and closest ESR version based on this rule. ++ nsCOMPtr runtime = ++ do_GetService("@mozilla.org/xre/runtime;1", &rv); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ nsAutoCString updateChannel; ++ rv = runtime->GetDefaultUpdateChannel(updateChannel); ++ NS_ENSURE_SUCCESS(rv, rv); ++ ++ // If we are running in Firefox ESR, determine whether the formula of ESR ++ // version has changed. Once changed, we must update the formula in this ++ // function. ++ if (updateChannel.Equals("esr")) { ++ MOZ_ASSERT(((firefoxVersion % 7) == 3), ++ "Please udpate ESR version formula in nsRFPService.cpp"); ++ } ++ ++ uint32_t spoofedVersion = firefoxVersion - ((firefoxVersion - 3) % 7); ++ userAgent.Assign(nsPrintfCString( ++ "Mozilla/5.0 (%s; rv:%d.0) Gecko/%s Firefox/%d.0", ++ SPOOFED_OSCPU, spoofedVersion, LEGACY_BUILD_ID, spoofedVersion)); ++ ++ return rv; ++} ++ + nsresult + nsRFPService::Init() + { +diff --git toolkit/components/resistfingerprinting/nsRFPService.h toolkit/components/resistfingerprinting/nsRFPService.h +index cf1f688bb992..bad80383883b 100644 +--- toolkit/components/resistfingerprinting/nsRFPService.h ++++ toolkit/components/resistfingerprinting/nsRFPService.h +@@ -49,6 +49,9 @@ public: + static uint32_t GetSpoofedDroppedFrames(double aTime, uint32_t aWidth, uint32_t aHeight); + static uint32_t GetSpoofedPresentedFrames(double aTime, uint32_t aWidth, uint32_t aHeight); + ++ // This method generates the spoofed value of User Agent. ++ static nsresult GetSpoofedUserAgent(nsACString &userAgent); ++ + private: + nsresult Init(); + Property changes on: head/www/waterfox/files/patch-bug1393283 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1386887 =================================================================== --- head/www/waterfox/files/patch-bug1386887 (nonexistent) +++ head/www/waterfox/files/patch-bug1386887 (revision 454949) @@ -0,0 +1,89 @@ +commit efbe3a9af876 +Author: Manish Goregaokar +Date: Wed Aug 2 11:24:35 2017 -0700 + + Bug 1386887 - Clean up FFI lifetimes to work on nightly; r=emilio + + MozReview-Commit-ID: 5WAIVd6p2du +--- + layout/style/ServoBindingList.h | 4 ++-- + layout/style/ServoBindingTypes.h | 2 ++ + layout/style/ServoBindings.h | 4 ++-- + layout/style/ServoBindings.toml | 4 +++- + 4 files changed, 9 insertions(+), 5 deletions(-) + +diff --git layout/style/ServoBindingList.h layout/style/ServoBindingList.h +index 6c669ebb3d3e..87ade14ea4de 100644 +--- layout/style/ServoBindingList.h ++++ layout/style/ServoBindingList.h +@@ -379,10 +379,10 @@ SERVO_BINDING_FUNC(Servo_DeclarationBlock_HasCSSWideKeyword, bool, + nsCSSPropertyID property) + // Compose animation value for a given property. + // |base_values| is nsRefPtrHashtable. +-// We use void* to avoid exposing nsRefPtrHashtable in FFI. ++// We use RawServoAnimationValueTableBorrowed to avoid exposing nsRefPtrHashtable in FFI. + SERVO_BINDING_FUNC(Servo_AnimationCompose, void, + RawServoAnimationValueMapBorrowedMut animation_values, +- void* base_values, ++ RawServoAnimationValueTableBorrowed base_values, + nsCSSPropertyID property, + RawGeckoAnimationPropertySegmentBorrowed animation_segment, + RawGeckoAnimationPropertySegmentBorrowed last_segment, +diff --git layout/style/ServoBindingTypes.h layout/style/ServoBindingTypes.h +index aaf4fc27e1b9..69be15ee9f51 100644 +--- layout/style/ServoBindingTypes.h ++++ layout/style/ServoBindingTypes.h +@@ -54,6 +54,8 @@ class nsXBLBinding; + using mozilla::dom::StyleChildrenIterator; + using mozilla::ServoElementSnapshot; + ++typedef void* RawServoAnimationValueTableBorrowed; ++ + typedef nsINode RawGeckoNode; + typedef mozilla::dom::Element RawGeckoElement; + typedef nsIDocument RawGeckoDocument; +diff --git layout/style/ServoBindings.h layout/style/ServoBindings.h +index 493ca63f932b..c6ced6d1fedb 100644 +--- layout/style/ServoBindings.h ++++ layout/style/ServoBindings.h +@@ -268,9 +268,9 @@ double Gecko_GetPositionInSegment( + // Get servo's AnimationValue for |aProperty| from the cached base style + // |aBaseStyles|. + // |aBaseStyles| is nsRefPtrHashtable. +-// We use void* to avoid exposing nsRefPtrHashtable in FFI. ++// We use RawServoAnimationValueTableBorrowed to avoid exposing nsRefPtrHashtable in FFI. + RawServoAnimationValueBorrowedOrNull Gecko_AnimationGetBaseStyle( +- void* aBaseStyles, ++ RawServoAnimationValueTableBorrowed aBaseStyles, + nsCSSPropertyID aProperty); + void Gecko_StyleTransition_SetUnsupportedProperty( + mozilla::StyleTransition* aTransition, +diff --git layout/style/ServoBindings.toml layout/style/ServoBindings.toml +index 11e372541235..3c3902beea80 100644 +--- layout/style/ServoBindings.toml ++++ layout/style/ServoBindings.toml +@@ -357,6 +357,7 @@ raw-lines = [ + "pub type ServoStyleContextBorrowed<'a> = &'a ::properties::ComputedValues;", + "pub type ServoStyleContextBorrowedOrNull<'a> = Option<&'a ::properties::ComputedValues>;", + "pub type ServoComputedDataBorrowed<'a> = &'a ServoComputedData;", ++ "pub type RawServoAnimationValueTableBorrowed<'a> = &'a ();" + ] + whitelist-functions = ["Servo_.*", "Gecko_.*"] + structs-types = [ +@@ -389,7 +390,7 @@ structs-types = [ + "RawGeckoPresContext", + "RawGeckoPresContextOwned", + "RawGeckoStyleAnimationList", +- "RawGeckoStyleChildrenIteratorBorrowedMut", ++ "RawGeckoStyleChildrenIterator", + "RawGeckoServoStyleRuleList", + "RawGeckoURLExtraData", + "RawGeckoXBLBinding", +@@ -526,6 +527,7 @@ servo-borrow-types = [ + "RawGeckoFontFaceRuleList", + "RawGeckoServoStyleRuleList", + "RawGeckoServoAnimationValueList", ++ "RawGeckoStyleChildrenIterator", + ] + fixups = [ + # hack for gecko-owned string Property changes on: head/www/waterfox/files/patch-bug1386887 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-servo17934 =================================================================== --- head/www/waterfox/files/patch-servo17934 (nonexistent) +++ head/www/waterfox/files/patch-servo17934 (revision 454949) @@ -0,0 +1,53 @@ +commit 4cbdfa028752 +Author: Manish Goregaokar +Date: Tue Aug 1 12:57:42 2017 -0500 + + servo: Merge #17934 - Remove doc comment on statement (from Manishearth:doc-comment); r=canaltinova + + rustc warns about these now + + Source-Repo: https://github.com/servo/servo + Source-Revision: b49311c65a083a9b8eb03741bf7ea980b64f1e03 + + --HG-- + extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear + extra : subtree_revision : 6b3c7d7f4ffeb9e271c52d418cda42cac5dd378d +--- + servo/components/style/values/specified/image.rs | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git servo/components/style/values/specified/image.rs servo/components/style/values/specified/image.rs +index 37ed00ccf443..687c6f17d432 100644 +--- servo/components/style/values/specified/image.rs ++++ servo/components/style/values/specified/image.rs +@@ -686,14 +686,14 @@ impl LineDirection { + input.try(|i| { + let to_ident = i.try(|i| i.expect_ident_matching("to")); + match *compat_mode { +- /// `to` keyword is mandatory in modern syntax. ++ // `to` keyword is mandatory in modern syntax. + CompatMode::Modern => to_ident?, + // Fall back to Modern compatibility mode in case there is a `to` keyword. + // According to Gecko, `-moz-linear-gradient(to ...)` should serialize like + // `linear-gradient(to ...)`. + CompatMode::Moz if to_ident.is_ok() => *compat_mode = CompatMode::Modern, +- /// There is no `to` keyword in webkit prefixed syntax. If it's consumed, +- /// parsing should throw an error. ++ // There is no `to` keyword in webkit prefixed syntax. If it's consumed, ++ // parsing should throw an error. + CompatMode::WebKit if to_ident.is_ok() => { + return Err(SelectorParseError::UnexpectedIdent("to".into()).into()) + }, +diff --git servo/components/style/properties/gecko.mako.rs servo/components/style/properties/gecko.mako.rs +index 37ed00ccf443..687c6f17d432 100644 +--- servo/components/style/properties/gecko.mako.rs ++++ servo/components/style/properties/gecko.mako.rs +@@ -2081,7 +2081,7 @@ fn static_assert() { + return (parent_size, parent_unconstrained_size) + } + +- /// XXXManishearth this should also handle text zoom ++ // XXXManishearth this should also handle text zoom + let min = Au(parent.gecko.mScriptMinSize); + + let scale = (parent.gecko.mScriptSizeMultiplier as f32).powi(delta as i32); Property changes on: head/www/waterfox/files/patch-servo17934 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-servo17969 =================================================================== --- head/www/waterfox/files/patch-servo17969 (nonexistent) +++ head/www/waterfox/files/patch-servo17969 (revision 454949) @@ -0,0 +1,110 @@ +commit 9f5c1f2e4b5b +Author: Manish Goregaokar +Date: Thu Aug 3 16:27:12 2017 -0500 + + servo: Merge #17969 - Update stylo code to work on nightly (from Manishearth:rustup); r=emilio + + r=emilio https://bugzilla.mozilla.org/show_bug.cgi?id=1386887 + + Source-Repo: https://github.com/servo/servo + Source-Revision: 7cee7d7fcc4194e410fa8a308a77d37ac452778a + + --HG-- + extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear + extra : subtree_revision : d9c874ebcfa1e64c86265d0ed2e5cff65d9133be +--- + servo/components/style/gecko/generated/bindings.rs | 12 +++++++++--- + servo/components/style/gecko/wrapper.rs | 7 ++++++- + servo/ports/geckolib/glue.rs | 3 ++- + 3 files changed, 17 insertions(+), 5 deletions(-) + +diff --git servo/components/style/gecko/generated/bindings.rs servo/components/style/gecko/generated/bindings.rs +index e46bdfe1e1ea..b6703ab95bf7 100644 +--- servo/components/style/gecko/generated/bindings.rs ++++ servo/components/style/gecko/generated/bindings.rs +@@ -8,6 +8,7 @@ type nsAString_internal = nsAString; + pub type ServoStyleContextBorrowed<'a> = &'a ::properties::ComputedValues; + pub type ServoStyleContextBorrowedOrNull<'a> = Option<&'a ::properties::ComputedValues>; + pub type ServoComputedDataBorrowed<'a> = &'a ServoComputedData; ++pub type RawServoAnimationValueTableBorrowed<'a> = &'a (); + use gecko_bindings::structs::mozilla::css::GridTemplateAreasValue; + use gecko_bindings::structs::mozilla::css::ErrorReporter; + use gecko_bindings::structs::mozilla::css::ImageValue; +@@ -37,7 +38,7 @@ use gecko_bindings::structs::RawServoStyleRule; + use gecko_bindings::structs::RawGeckoPresContext; + use gecko_bindings::structs::RawGeckoPresContextOwned; + use gecko_bindings::structs::RawGeckoStyleAnimationList; +-use gecko_bindings::structs::RawGeckoStyleChildrenIteratorBorrowedMut; ++use gecko_bindings::structs::RawGeckoStyleChildrenIterator; + use gecko_bindings::structs::RawGeckoServoStyleRuleList; + use gecko_bindings::structs::RawGeckoURLExtraData; + use gecko_bindings::structs::RawGeckoXBLBinding; +@@ -320,6 +321,10 @@ pub type RawGeckoServoAnimationValueListBorrowed<'a> = &'a RawGeckoServoAnimatio + pub type RawGeckoServoAnimationValueListBorrowedOrNull<'a> = Option<&'a RawGeckoServoAnimationValueList>; + pub type RawGeckoServoAnimationValueListBorrowedMut<'a> = &'a mut RawGeckoServoAnimationValueList; + pub type RawGeckoServoAnimationValueListBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoServoAnimationValueList>; ++pub type RawGeckoStyleChildrenIteratorBorrowed<'a> = &'a RawGeckoStyleChildrenIterator; ++pub type RawGeckoStyleChildrenIteratorBorrowedOrNull<'a> = Option<&'a RawGeckoStyleChildrenIterator>; ++pub type RawGeckoStyleChildrenIteratorBorrowedMut<'a> = &'a mut RawGeckoStyleChildrenIterator; ++pub type RawGeckoStyleChildrenIteratorBorrowedMutOrNull<'a> = Option<&'a mut RawGeckoStyleChildrenIterator>; + pub type ServoCssRulesStrong = ::gecko_bindings::sugar::ownership::Strong; + pub type ServoCssRulesBorrowed<'a> = &'a ServoCssRules; + pub type ServoCssRulesBorrowedOrNull<'a> = Option<&'a ServoCssRules>; +@@ -840,7 +845,7 @@ extern "C" { + } + extern "C" { + pub fn Gecko_AnimationGetBaseStyle(aBaseStyles: +- *mut ::std::os::raw::c_void, ++ RawServoAnimationValueTableBorrowed, + aProperty: nsCSSPropertyID) + -> RawServoAnimationValueBorrowedOrNull; + } +@@ -2602,7 +2607,8 @@ extern "C" { + extern "C" { + pub fn Servo_AnimationCompose(animation_values: + RawServoAnimationValueMapBorrowedMut, +- base_values: *mut ::std::os::raw::c_void, ++ base_values: ++ RawServoAnimationValueTableBorrowed, + property: nsCSSPropertyID, + animation_segment: + RawGeckoAnimationPropertySegmentBorrowed, +diff --git servo/components/style/gecko/wrapper.rs servo/components/style/gecko/wrapper.rs +index dae898692313..6d62f54951cc 100644 +--- servo/components/style/gecko/wrapper.rs ++++ servo/components/style/gecko/wrapper.rs +@@ -387,7 +387,12 @@ impl<'a> Iterator for GeckoChildrenIterator<'a> { + curr + }, + GeckoChildrenIterator::GeckoIterator(ref mut it) => unsafe { +- Gecko_GetNextStyleChild(it).map(GeckoNode) ++ // We do this unsafe lengthening of the lifetime here because ++ // structs::StyleChildrenIterator is actually StyleChildrenIterator<'a>, ++ // however we can't express this easily with bindgen, and it would ++ // introduce functions with two input lifetimes into bindgen, ++ // which would be out of scope for elision. ++ Gecko_GetNextStyleChild(&mut * (it as *mut _)).map(GeckoNode) + } + } + } +diff --git servo/ports/geckolib/glue.rs servo/ports/geckolib/glue.rs +index 367d24ff87b2..e69959f3710b 100644 +--- servo/ports/geckolib/glue.rs ++++ servo/ports/geckolib/glue.rs +@@ -59,6 +59,7 @@ use style::gecko_bindings::bindings::RawGeckoServoStyleRuleListBorrowedMut; + use style::gecko_bindings::bindings::RawServoAnimationValueBorrowed; + use style::gecko_bindings::bindings::RawServoAnimationValueMapBorrowedMut; + use style::gecko_bindings::bindings::RawServoAnimationValueStrong; ++use style::gecko_bindings::bindings::RawServoAnimationValueTableBorrowed; + use style::gecko_bindings::bindings::RawServoStyleRuleBorrowed; + use style::gecko_bindings::bindings::ServoStyleContextBorrowedOrNull; + use style::gecko_bindings::bindings::nsTArrayBorrowed_uintptr_t; +@@ -374,7 +375,7 @@ pub extern "C" fn Servo_AnimationValues_ComputeDistance(from: RawServoAnimationV + + #[no_mangle] + pub extern "C" fn Servo_AnimationCompose(raw_value_map: RawServoAnimationValueMapBorrowedMut, +- base_values: *mut ::std::os::raw::c_void, ++ base_values: RawServoAnimationValueTableBorrowed, + css_property: nsCSSPropertyID, + segment: RawGeckoAnimationPropertySegmentBorrowed, + last_segment: RawGeckoAnimationPropertySegmentBorrowed, Property changes on: head/www/waterfox/files/patch-servo17969 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-servo18046 =================================================================== --- head/www/waterfox/files/patch-servo18046 (nonexistent) +++ head/www/waterfox/files/patch-servo18046 (revision 454949) @@ -0,0 +1,763 @@ +commit ea9c8db790e4 +Author: Simon Sapin +Date: Tue Aug 15 07:31:04 2017 -0500 + + servo: Merge #18046 - Upgrade to rustc 1.21.0-nightly (13d94d5fa 2017-08-10) (from servo:rustup); r=emilio + + Source-Repo: https://github.com/servo/servo + Source-Revision: 7d9b82b9efa7b10a2e34d93df5ac535d99518f7a + + --HG-- + extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear + extra : subtree_revision : e1b3d113c3edaea3c4c07f8b206f2e02922e3caf +--- + servo/Cargo.lock | 6 +++--- + servo/components/devtools/lib.rs | 2 +- + servo/components/layout/animation.rs | 2 +- + servo/components/layout/construct.rs | 6 +++--- + servo/components/layout/display_list_builder.rs | 2 +- + servo/components/layout/flex.rs | 6 +++--- + servo/components/layout/inline.rs | 4 ++-- + servo/components/layout/sequential.rs | 2 +- + servo/components/layout/table_cell.rs | 2 +- + servo/components/layout/text.rs | 2 +- + servo/components/net/cookie_storage.rs | 2 +- + servo/components/profile/heartbeats.rs | 4 ++-- + servo/components/script/dom/bindings/js.rs | 4 ++-- + servo/components/script/dom/cssstyledeclaration.rs | 8 ++++---- + servo/components/script/dom/cssstylerule.rs | 2 +- + servo/components/script/dom/document.rs | 12 ++++++------ + servo/components/script/dom/medialist.rs | 4 ++-- + servo/components/script/dom/range.rs | 4 ++-- + .../script/dom/servoparser/async_html.rs | 4 ++-- + servo/components/script/dom/url.rs | 4 ++-- + servo/components/script/dom/vrdisplay.rs | 2 +- + .../components/script/dom/webglrenderingcontext.rs | 2 +- + servo/components/script/dom/xmlhttprequest.rs | 2 +- + servo/components/script/lib.rs | 1 - + .../script_plugins/unrooted_must_root.rs | 22 +++++++++++++++------- + servo/components/selectors/matching.rs | 2 +- + servo/components/selectors/parser.rs | 2 +- + .../style/invalidation/element/invalidator.rs | 2 +- + servo/components/style/matching.rs | 2 +- + .../components/style/properties/properties.mako.rs | 2 +- + servo/components/style/style_adjuster.rs | 2 +- + servo/components/style/style_resolver.rs | 2 +- + servo/components/style/stylesheets/rule_list.rs | 2 +- + servo/components/style/stylesheets/rule_parser.rs | 2 +- + .../components/style/stylesheets/rules_iterator.rs | 2 +- + servo/components/style/values/animated/color.rs | 2 +- + servo/components/style/values/computed/border.rs | 2 +- + servo/components/webdriver_server/lib.rs | 2 +- + servo/rust-commit-hash | 2 +- + servo/tests/unit/style/stylist.rs | 13 ------------- + 40 files changed, 73 insertions(+), 79 deletions(-) + +diff --git servo/Cargo.lock servo/Cargo.lock +index 50dd6e1a785a..2aa7bd8ea3dd 100644 +--- servo/Cargo.lock ++++ servo/Cargo.lock +@@ -3577,7 +3577,7 @@ version = "0.1.4" + source = "registry+https://github.com/rust-lang/crates.io-index" + dependencies = [ + "error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", +- "xcb 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", ++ "xcb 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)", + ] + + [[package]] +@@ -3592,7 +3592,7 @@ dependencies = [ + + [[package]] + name = "xcb" +-version = "0.7.6" ++version = "0.7.7" + source = "registry+https://github.com/rust-lang/crates.io-index" + dependencies = [ + "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", +@@ -3918,7 +3918,7 @@ dependencies = [ + "checksum x11 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db27c597c187da52194a4b8232e7d869503911aab9ff726fefb76d7a830f78ed" + "checksum x11-clipboard 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "731230b8edcbb9d99247105e4c9ec0a538594d50ad68d2afa8662195f9db2973" + "checksum x11-dl 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "326c500cdc166fd7c70dd8c8a829cd5c0ce7be5a5d98c25817de2b9bdc67faf8" +-"checksum xcb 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "63e3a849b73e4e1905e4f4d48f1750429bc86ea9f473632ab382a6f69ecb6b33" ++"checksum xcb 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "7cede38417fcdf2f0a9d8abf1cea1c1b066320a8a316e9583a0d717c334fafb2" + "checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61" + "checksum xi-unicode 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "12ea8eda4b1eb72f02d148402e23832d56a33f55d8c1b2d5bcdde91d79d47cb1" + "checksum xml-rs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7ec6c39eaa68382c8e31e35239402c0a9489d4141a8ceb0c716099a0b515b562" +diff --git servo/components/devtools/lib.rs servo/components/devtools/lib.rs +index d5a2764a7102..6a25696eaed7 100644 +--- servo/components/devtools/lib.rs ++++ servo/components/devtools/lib.rs +@@ -306,7 +306,7 @@ fn run_server(sender: Sender, + columnNumber: console_message.columnNumber, + }, + }; +- for mut stream in &mut *console_actor.streams.borrow_mut() { ++ for stream in &mut *console_actor.streams.borrow_mut() { + stream.write_json_packet(&msg); + } + } +diff --git servo/components/layout/animation.rs servo/components/layout/animation.rs +index e4a2782c1271..ebbba82fcc6a 100644 +--- servo/components/layout/animation.rs ++++ servo/components/layout/animation.rs +@@ -39,7 +39,7 @@ pub fn update_animation_state(constellation_chan: &IpcSender, + // run. + if let Some(ref mut animations) = running_animations.get_mut(node) { + // TODO: This being linear is probably not optimal. +- for mut anim in animations.iter_mut() { ++ for anim in animations.iter_mut() { + if let Animation::Keyframes(_, ref anim_name, ref mut anim_state) = *anim { + if *name == *anim_name { + debug!("update_animation_state: Found other animation {}", name); +diff --git servo/components/layout/construct.rs servo/components/layout/construct.rs +index c863219941e4..7ef391b42183 100644 +--- servo/components/layout/construct.rs ++++ servo/components/layout/construct.rs +@@ -1921,7 +1921,7 @@ impl Legalizer { + /// true for anonymous block children of flex flows. + fn try_to_add_child(&mut self, context: &SharedStyleContext, parent: &mut FlowRef, child: &mut FlowRef) + -> bool { +- let mut parent = self.stack.last_mut().unwrap_or(parent); ++ let parent = self.stack.last_mut().unwrap_or(parent); + let (parent_class, child_class) = (parent.class(), child.class()); + match (parent_class, child_class) { + (FlowClass::TableWrapper, FlowClass::Table) | +@@ -1962,7 +1962,7 @@ impl Legalizer { + } else { + IS_BLOCK_FLEX_ITEM + }; +- let mut block = FlowRef::deref_mut(&mut block_wrapper).as_mut_block(); ++ let block = FlowRef::deref_mut(&mut block_wrapper).as_mut_block(); + block.base.flags.insert(MARGINS_CANNOT_COLLAPSE); + block.fragment.flags.insert(flag); + } +@@ -1979,7 +1979,7 @@ impl Legalizer { + } else { + IS_BLOCK_FLEX_ITEM + }; +- let mut block = FlowRef::deref_mut(child).as_mut_block(); ++ let block = FlowRef::deref_mut(child).as_mut_block(); + block.base.flags.insert(MARGINS_CANNOT_COLLAPSE); + block.fragment.flags.insert(flag); + } +diff --git servo/components/layout/display_list_builder.rs servo/components/layout/display_list_builder.rs +index f8b26899b57d..783574afd2a3 100644 +--- servo/components/layout/display_list_builder.rs ++++ servo/components/layout/display_list_builder.rs +@@ -2718,7 +2718,7 @@ impl InlineFlowDisplayListBuilding for InlineFlow { + self.base.scroll_root_id = Some(state.current_scroll_root_id); + self.base.clip = state.clip_stack.last().cloned().unwrap_or_else(max_rect); + +- for mut fragment in self.fragments.fragments.iter_mut() { ++ for fragment in self.fragments.fragments.iter_mut() { + let previous_containing_block_scroll_root_id = state.containing_block_scroll_root_id; + if establishes_containing_block_for_absolute(fragment.style.get_box().position) { + state.containing_block_scroll_root_id = state.current_scroll_root_id; +diff --git servo/components/layout/flex.rs servo/components/layout/flex.rs +index 353c939f58b9..d79580f8cd0d 100644 +--- servo/components/layout/flex.rs ++++ servo/components/layout/flex.rs +@@ -415,7 +415,7 @@ impl FlexFlow { + + let items = &mut self.items[start..]; + let mut children = self.block_flow.base.children.random_access_mut(); +- for mut item in items { ++ for item in items { + let kid = children.get(item.index); + item.init_sizes(kid, container_size, self.main_mode); + let outer_main_size = item.outer_main_size(kid, self.main_mode); +@@ -607,7 +607,7 @@ impl FlexFlow { + + let mut children = self.block_flow.base.children.random_access_mut(); + for item in items.iter_mut() { +- let mut block = children.get(item.index).as_mut_block(); ++ let block = children.get(item.index).as_mut_block(); + + block.base.block_container_writing_mode = container_mode; + block.base.block_container_inline_size = inline_size; +@@ -659,7 +659,7 @@ impl FlexFlow { + + let mut children = self.block_flow.base.children.random_access_mut(); + for item in &mut self.items { +- let mut base = flow::mut_base(children.get(item.index)); ++ let base = flow::mut_base(children.get(item.index)); + if !self.main_reverse { + base.position.start.b = cur_b; + cur_b = cur_b + base.position.size.block; +diff --git servo/components/layout/inline.rs servo/components/layout/inline.rs +index d5813d9bea22..10e091c3c66d 100644 +--- servo/components/layout/inline.rs ++++ servo/components/layout/inline.rs +@@ -435,7 +435,7 @@ impl LineBreaker { + return + } + let last_fragment_index = self.pending_line.range.end() - FragmentIndex(1); +- let mut fragment = &mut self.new_fragments[last_fragment_index.get() as usize]; ++ let fragment = &mut self.new_fragments[last_fragment_index.get() as usize]; + + let old_fragment_inline_size = fragment.border_box.size.inline; + +@@ -1047,7 +1047,7 @@ impl InlineFlow { + let space_per_expansion_opportunity = slack_inline_size / expansion_opportunities as i32; + for fragment_index in line.range.each_index() { + let fragment = fragments.get_mut(fragment_index.to_usize()); +- let mut scanned_text_fragment_info = match fragment.specific { ++ let scanned_text_fragment_info = match fragment.specific { + SpecificFragmentInfo::ScannedText(ref mut info) if !info.range.is_empty() => info, + _ => continue + }; +diff --git servo/components/layout/sequential.rs servo/components/layout/sequential.rs +index f6f8ce429e4f..4986ebb6c852 100644 +--- servo/components/layout/sequential.rs ++++ servo/components/layout/sequential.rs +@@ -133,7 +133,7 @@ pub fn store_overflow(layout_context: &LayoutContext, flow: &mut Flow) { + return; + } + +- for mut kid in flow::mut_base(flow).child_iter_mut() { ++ for kid in flow::mut_base(flow).child_iter_mut() { + store_overflow(layout_context, kid); + } + +diff --git servo/components/layout/table_cell.rs servo/components/layout/table_cell.rs +index 7ef02e28db65..fd807989b463 100644 +--- servo/components/layout/table_cell.rs ++++ servo/components/layout/table_cell.rs +@@ -136,7 +136,7 @@ impl TableCellFlow { + } + + for kid in flow::mut_base(self).children.iter_mut() { +- let mut kid_base = flow::mut_base(kid); ++ let kid_base = flow::mut_base(kid); + if !kid_base.flags.contains(IS_ABSOLUTELY_POSITIONED) { + kid_base.position.start.b += offset + } +diff --git servo/components/layout/text.rs servo/components/layout/text.rs +index 6e1c7b2a43a1..9a207a2bb84e 100644 +--- servo/components/layout/text.rs ++++ servo/components/layout/text.rs +@@ -460,7 +460,7 @@ fn split_first_fragment_at_newline_if_necessary(fragments: &mut LinkedList { + roots.remove(idx); +diff --git servo/components/script/dom/cssstyledeclaration.rs servo/components/script/dom/cssstyledeclaration.rs +index 0732c9af9e45..ddf085b34913 100644 +--- servo/components/script/dom/cssstyledeclaration.rs ++++ servo/components/script/dom/cssstyledeclaration.rs +@@ -238,7 +238,7 @@ impl CSSStyleDeclaration { + return Err(Error::NoModificationAllowed); + } + +- self.owner.mutate_associated_block(|ref mut pdb, mut changed| { ++ self.owner.mutate_associated_block(|pdb, changed| { + if value.is_empty() { + // Step 3 + *changed = pdb.remove_property(&id); +@@ -360,7 +360,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration { + _ => return Ok(()), + }; + +- self.owner.mutate_associated_block(|ref mut pdb, mut changed| { ++ self.owner.mutate_associated_block(|pdb, changed| { + // Step 5 & 6 + *changed = pdb.set_importance(&id, importance); + }); +@@ -388,7 +388,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration { + }; + + let mut string = String::new(); +- self.owner.mutate_associated_block(|mut pdb, mut changed| { ++ self.owner.mutate_associated_block(|pdb, changed| { + pdb.property_value_to_css(&id, &mut string).unwrap(); + *changed = pdb.remove_property(&id); + }); +@@ -438,7 +438,7 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration { + } + + let quirks_mode = window.Document().quirks_mode(); +- self.owner.mutate_associated_block(|mut pdb, mut _changed| { ++ self.owner.mutate_associated_block(|pdb, _changed| { + // Step 3 + *pdb = parse_style_attribute(&value, + &self.owner.base_url(), +diff --git servo/components/script/dom/cssstylerule.rs servo/components/script/dom/cssstylerule.rs +index ea121ef900a9..12e9cdcc8694 100644 +--- servo/components/script/dom/cssstylerule.rs ++++ servo/components/script/dom/cssstylerule.rs +@@ -99,7 +99,7 @@ impl CSSStyleRuleMethods for CSSStyleRule { + if let Ok(mut s) = SelectorList::parse(&parser, &mut css_parser) { + // This mirrors what we do in CSSStyleOwner::mutate_associated_block. + let mut guard = self.cssrule.shared_lock().write(); +- let mut stylerule = self.stylerule.write_with(&mut guard); ++ let stylerule = self.stylerule.write_with(&mut guard); + mem::swap(&mut stylerule.selectors, &mut s); + // It seems like we will want to avoid having to invalidate all + // stylesheets eventually! +diff --git servo/components/script/dom/document.rs servo/components/script/dom/document.rs +index 90ea06fbe7b4..71bb02eaa364 100644 +--- servo/components/script/dom/document.rs ++++ servo/components/script/dom/document.rs +@@ -633,7 +633,7 @@ impl Document { + // reset_form_owner_for_listeners -> reset_form_owner -> GetElementById + { + let mut id_map = self.id_map.borrow_mut(); +- let mut elements = id_map.entry(id.clone()).or_insert(Vec::new()); ++ let elements = id_map.entry(id.clone()).or_insert(Vec::new()); + elements.insert_pre_order(element, root.r().upcast::()); + } + self.reset_form_owner_for_listeners(&id); +@@ -642,7 +642,7 @@ impl Document { + pub fn register_form_id_listener(&self, id: DOMString, listener: &T) { + let mut map = self.form_id_listener_map.borrow_mut(); + let listener = listener.to_element(); +- let mut set = map.entry(Atom::from(id)).or_insert(HashSet::new()); ++ let set = map.entry(Atom::from(id)).or_insert(HashSet::new()); + set.insert(JS::from_ref(listener)); + } + +@@ -1572,7 +1572,7 @@ impl Document { + /// https://html.spec.whatwg.org/multipage/#dom-window-cancelanimationframe + pub fn cancel_animation_frame(&self, ident: u32) { + let mut list = self.animation_frame_list.borrow_mut(); +- if let Some(mut pair) = list.iter_mut().find(|pair| pair.0 == ident) { ++ if let Some(pair) = list.iter_mut().find(|pair| pair.0 == ident) { + pair.1 = None; + } + } +@@ -2399,7 +2399,7 @@ impl Document { + if entry.snapshot.is_none() { + entry.snapshot = Some(Snapshot::new(el.html_element_in_html_document())); + } +- let mut snapshot = entry.snapshot.as_mut().unwrap(); ++ let snapshot = entry.snapshot.as_mut().unwrap(); + if snapshot.state.is_none() { + snapshot.state = Some(el.state()); + } +@@ -2426,7 +2426,7 @@ impl Document { + entry.hint.insert(RESTYLE_SELF); + } + +- let mut snapshot = entry.snapshot.as_mut().unwrap(); ++ let snapshot = entry.snapshot.as_mut().unwrap(); + if attr.local_name() == &local_name!("id") { + snapshot.id_changed = true; + } else if attr.local_name() == &local_name!("class") { +@@ -4028,7 +4028,7 @@ impl PendingInOrderScriptVec { + + fn loaded(&self, element: &HTMLScriptElement, result: ScriptResult) { + let mut scripts = self.scripts.borrow_mut(); +- let mut entry = scripts.iter_mut().find(|entry| &*entry.element == element).unwrap(); ++ let entry = scripts.iter_mut().find(|entry| &*entry.element == element).unwrap(); + entry.loaded(result); + } + +diff --git servo/components/script/dom/medialist.rs servo/components/script/dom/medialist.rs +index 0064d0445095..ae20f5aa0422 100644 +--- servo/components/script/dom/medialist.rs ++++ servo/components/script/dom/medialist.rs +@@ -63,7 +63,7 @@ impl MediaListMethods for MediaList { + // https://drafts.csswg.org/cssom/#dom-medialist-mediatext + fn SetMediaText(&self, value: DOMString) { + let mut guard = self.shared_lock().write(); +- let mut media_queries = self.media_queries.write_with(&mut guard); ++ let media_queries = self.media_queries.write_with(&mut guard); + // Step 2 + if value.is_empty() { + // Step 1 +@@ -154,7 +154,7 @@ impl MediaListMethods for MediaList { + // Step 3 + let m_serialized = m.unwrap().to_css_string(); + let mut guard = self.shared_lock().write(); +- let mut media_list = self.media_queries.write_with(&mut guard); ++ let media_list = self.media_queries.write_with(&mut guard); + let new_vec = media_list.media_queries.drain(..) + .filter(|q| m_serialized != q.to_css_string()) + .collect(); +diff --git servo/components/script/dom/range.rs servo/components/script/dom/range.rs +index fa849a0fc1a2..1e65caedc9dd 100644 +--- servo/components/script/dom/range.rs ++++ servo/components/script/dom/range.rs +@@ -1049,7 +1049,7 @@ impl WeakRangeVec { + let offset = context.index(); + let parent = context.parent; + unsafe { +- let mut ranges = &mut *self.cell.get(); ++ let ranges = &mut *self.cell.get(); + + ranges.update(|entry| { + let range = entry.root().unwrap(); +@@ -1076,7 +1076,7 @@ impl WeakRangeVec { + } + + unsafe { +- let mut ranges = &mut *self.cell.get(); ++ let ranges = &mut *self.cell.get(); + + ranges.update(|entry| { + let range = entry.root().unwrap(); +diff --git servo/components/script/dom/servoparser/async_html.rs servo/components/script/dom/servoparser/async_html.rs +index 59411fda1c73..70d2008f49f6 100644 +--- servo/components/script/dom/servoparser/async_html.rs ++++ servo/components/script/dom/servoparser/async_html.rs +@@ -568,7 +568,7 @@ impl TreeSink for Sink { + } + let node = self.new_parse_node(); + { +- let mut data = self.get_parse_node_data_mut(&target.id); ++ let data = self.get_parse_node_data_mut(&target.id); + data.contents = Some(node.clone()); + } + self.send_op(ParseOperation::GetTemplateContents { target: target.id, contents: node.id }); +@@ -596,7 +596,7 @@ impl TreeSink for Sink { + let mut node = self.new_parse_node(); + node.qual_name = Some(name.clone()); + { +- let mut node_data = self.get_parse_node_data_mut(&node.id); ++ let node_data = self.get_parse_node_data_mut(&node.id); + node_data.is_integration_point = html_attrs.iter() + .any(|attr| { + let attr_value = &String::from(attr.value.clone()); +diff --git servo/components/script/dom/url.rs servo/components/script/dom/url.rs +index a02a735638fc..41de4dcc0c72 100644 +--- servo/components/script/dom/url.rs ++++ servo/components/script/dom/url.rs +@@ -96,8 +96,8 @@ impl URL { + + // https://w3c.github.io/FileAPI/#dfn-createObjectURL + pub fn CreateObjectURL(global: &GlobalScope, blob: &Blob) -> DOMString { +- /// XXX: Second field is an unicode-serialized Origin, it is a temporary workaround +- /// and should not be trusted. See issue https://github.com/servo/servo/issues/11722 ++ // XXX: Second field is an unicode-serialized Origin, it is a temporary workaround ++ // and should not be trusted. See issue https://github.com/servo/servo/issues/11722 + let origin = get_blob_origin(&global.get_url()); + + let id = blob.get_blob_url_id(); +diff --git servo/components/script/dom/vrdisplay.rs servo/components/script/dom/vrdisplay.rs +index 3f73a577fad7..54f06fb928f2 100644 +--- servo/components/script/dom/vrdisplay.rs ++++ servo/components/script/dom/vrdisplay.rs +@@ -268,7 +268,7 @@ impl VRDisplayMethods for VRDisplay { + fn CancelAnimationFrame(&self, handle: u32) { + if self.presenting.get() { + let mut list = self.raf_callback_list.borrow_mut(); +- if let Some(mut pair) = list.iter_mut().find(|pair| pair.0 == handle) { ++ if let Some(pair) = list.iter_mut().find(|pair| pair.0 == handle) { + pair.1 = None; + } + } else { +diff --git servo/components/script/dom/webglrenderingcontext.rs servo/components/script/dom/webglrenderingcontext.rs +index 73d4ddba1b90..62c92b42785c 100644 +--- servo/components/script/dom/webglrenderingcontext.rs ++++ servo/components/script/dom/webglrenderingcontext.rs +@@ -2434,7 +2434,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { + } + + typedarray!(in(cx) let mut pixels_data: ArrayBufferView = pixels); +- let (array_type, mut data) = match { pixels_data.as_mut() } { ++ let (array_type, data) = match { pixels_data.as_mut() } { + Ok(data) => (data.get_array_type(), data.as_mut_slice()), + Err(_) => return Err(Error::Type("Not an ArrayBufferView".to_owned())), + }; +diff --git servo/components/script/dom/xmlhttprequest.rs servo/components/script/dom/xmlhttprequest.rs +index 6ed2dda1851f..e6652d79d706 100644 +--- servo/components/script/dom/xmlhttprequest.rs ++++ servo/components/script/dom/xmlhttprequest.rs +@@ -627,7 +627,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { + + if !content_type_set { + let ct = request.headers.get_mut::(); +- if let Some(mut ct) = ct { ++ if let Some(ct) = ct { + if let Some(encoding) = encoding { + for param in &mut (ct.0).2 { + if param.0 == MimeAttr::Charset { +diff --git servo/components/script/lib.rs servo/components/script/lib.rs +index e1a1ab592cb7..5824d6f2e490 100644 +--- servo/components/script/lib.rs ++++ servo/components/script/lib.rs +@@ -9,7 +9,6 @@ + #![feature(mpsc_select)] + #![feature(nonzero)] + #![feature(on_unimplemented)] +-#![feature(option_entry)] + #![feature(plugin)] + #![feature(proc_macro)] + #![feature(stmt_expr_attributes)] +diff --git servo/components/script_plugins/unrooted_must_root.rs servo/components/script_plugins/unrooted_must_root.rs +index 5dbd2b1a3bdd..f3f5e60ab62a 100644 +--- servo/components/script_plugins/unrooted_must_root.rs ++++ servo/components/script_plugins/unrooted_must_root.rs +@@ -182,7 +182,7 @@ impl<'a, 'b, 'tcx> visit::Visitor<'tcx> for FnDefVisitor<'a, 'b, 'tcx> { + } + + match expr.node { +- /// Trait casts from #[must_root] types are not allowed ++ // Trait casts from #[must_root] types are not allowed + hir::ExprCast(ref subexpr, _) => require_rooted(cx, self.in_new_function, &*subexpr), + // This catches assignments... the main point of this would be to catch mutable + // references to `JS`. +@@ -206,13 +206,21 @@ impl<'a, 'b, 'tcx> visit::Visitor<'tcx> for FnDefVisitor<'a, 'b, 'tcx> { + fn visit_pat(&mut self, pat: &'tcx hir::Pat) { + let cx = self.cx; + +- if let hir::PatKind::Binding(hir::BindingMode::BindByValue(_), _, _, _) = pat.node { +- let ty = cx.tables.pat_ty(pat); +- if is_unrooted_ty(cx, ty, self.in_new_function) { +- cx.span_lint(UNROOTED_MUST_ROOT, +- pat.span, +- &format!("Expression of type {:?} must be rooted", ty)) ++ // We want to detect pattern bindings that move a value onto the stack. ++ // When "default binding modes" https://github.com/rust-lang/rust/issues/42640 ++ // are implemented, the `Unannotated` case could cause false-positives. ++ // These should be fixable by adding an explicit `ref`. ++ match pat.node { ++ hir::PatKind::Binding(hir::BindingAnnotation::Unannotated, _, _, _) | ++ hir::PatKind::Binding(hir::BindingAnnotation::Mutable, _, _, _) => { ++ let ty = cx.tables.pat_ty(pat); ++ if is_unrooted_ty(cx, ty, self.in_new_function) { ++ cx.span_lint(UNROOTED_MUST_ROOT, ++ pat.span, ++ &format!("Expression of type {:?} must be rooted", ty)) ++ } + } ++ _ => {} + } + + visit::walk_pat(self, pat); +diff --git servo/components/selectors/matching.rs servo/components/selectors/matching.rs +index 7bd9814d26fb..8f6b2fa6aa54 100644 +--- servo/components/selectors/matching.rs ++++ servo/components/selectors/matching.rs +@@ -458,7 +458,7 @@ where + /// Matches a complex selector. + pub fn matches_complex_selector(mut iter: SelectorIter, + element: &E, +- mut context: &mut LocalMatchingContext, ++ context: &mut LocalMatchingContext, + flags_setter: &mut F) + -> bool + where E: Element, +diff --git servo/components/selectors/parser.rs servo/components/selectors/parser.rs +index 490399ce38ce..6b2c1f2b4e86 100644 +--- servo/components/selectors/parser.rs ++++ servo/components/selectors/parser.rs +@@ -1464,7 +1464,7 @@ fn parse_negation<'i, 't, P, E, Impl>(parser: &P, + fn parse_compound_selector<'i, 't, P, E, Impl>( + parser: &P, + input: &mut CssParser<'i, 't>, +- mut builder: &mut SelectorBuilder) ++ builder: &mut SelectorBuilder) + -> Result>> + where P: Parser<'i, Impl=Impl, Error=E>, Impl: SelectorImpl + { +diff --git servo/components/style/invalidation/element/invalidator.rs servo/components/style/invalidation/element/invalidator.rs +index 848c5cd13dc8..b8510ba3169b 100644 +--- servo/components/style/invalidation/element/invalidator.rs ++++ servo/components/style/invalidation/element/invalidator.rs +@@ -154,7 +154,7 @@ impl<'a, 'b: 'a, E> TreeStyleInvalidator<'a, 'b, E> + trace!(" > visitedness change, force subtree restyle"); + // We can't just return here because there may also be attribute + // changes as well that imply additional hints. +- let mut data = self.data.as_mut().unwrap(); ++ let data = self.data.as_mut().unwrap(); + data.restyle.hint.insert(RestyleHint::restyle_subtree()); + } + +diff --git servo/components/style/matching.rs servo/components/style/matching.rs +index b62bc54bf768..f58d7cd123e6 100644 +--- servo/components/style/matching.rs ++++ servo/components/style/matching.rs +@@ -440,7 +440,7 @@ pub trait MatchMethods : TElement { + fn finish_restyle( + &self, + context: &mut StyleContext, +- mut data: &mut ElementData, ++ data: &mut ElementData, + mut new_styles: ElementStyles, + important_rules_changed: bool, + ) -> ChildCascadeRequirement { +diff --git servo/components/style/properties/properties.mako.rs servo/components/style/properties/properties.mako.rs +index d98e173db5ba..81ff00fb6d5e 100644 +--- servo/components/style/properties/properties.mako.rs ++++ servo/components/style/properties/properties.mako.rs +@@ -3364,7 +3364,7 @@ pub fn modify_border_style_for_inline_sides(style: &mut Arc, + return; + } + } +- let mut style = Arc::make_mut(style); ++ let style = Arc::make_mut(style); + let border = Arc::make_mut(&mut style.border); + match side { + PhysicalSide::Left => { +diff --git servo/components/style/style_adjuster.rs servo/components/style/style_adjuster.rs +index 366641ebe0bc..6e51fa74072a 100644 +--- servo/components/style/style_adjuster.rs ++++ servo/components/style/style_adjuster.rs +@@ -269,7 +269,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> { + + if overflow_x != original_overflow_x || + overflow_y != original_overflow_y { +- let mut box_style = self.style.mutate_box(); ++ let box_style = self.style.mutate_box(); + box_style.set_overflow_x(overflow_x); + box_style.set_overflow_y(overflow_y); + } +diff --git servo/components/style/style_resolver.rs servo/components/style/style_resolver.rs +index cf512c4fbdd2..3fc1d57cc8f7 100644 +--- servo/components/style/style_resolver.rs ++++ servo/components/style/style_resolver.rs +@@ -247,7 +247,7 @@ where + Some(&*primary_style.style) + }; + +- for (i, mut inputs) in pseudo_array.iter_mut().enumerate() { ++ for (i, inputs) in pseudo_array.iter_mut().enumerate() { + if let Some(inputs) = inputs.take() { + let pseudo = PseudoElement::from_eager_index(i); + pseudo_styles.set( +diff --git servo/components/style/stylesheets/rule_list.rs servo/components/style/stylesheets/rule_list.rs +index 82e78015400d..14b3dc5e7696 100644 +--- servo/components/style/stylesheets/rule_list.rs ++++ servo/components/style/stylesheets/rule_list.rs +@@ -150,7 +150,7 @@ impl CssRulesHelpers for RawOffsetArc> { + + { + let mut write_guard = lock.write(); +- let mut rules = self.write_with(&mut write_guard); ++ let rules = self.write_with(&mut write_guard); + // Step 5 + // Computes the maximum allowed parser state at a given index. + let rev_state = rules.0.get(index).map_or(State::Body, CssRule::rule_state); +diff --git servo/components/style/stylesheets/rule_parser.rs servo/components/style/stylesheets/rule_parser.rs +index 007d7e11026e..f0d224e498a7 100644 +--- servo/components/style/stylesheets/rule_parser.rs ++++ servo/components/style/stylesheets/rule_parser.rs +@@ -209,7 +209,7 @@ impl<'a, 'i> AtRuleParser<'i> for TopLevelRuleParser<'a> { + let id = register_namespace(&url) + .map_err(|()| StyleParseError::UnspecifiedError)?; + +- let mut namespaces = self.namespaces.as_mut().unwrap(); ++ let namespaces = self.namespaces.as_mut().unwrap(); + + let opt_prefix = if let Ok(prefix) = prefix_result { + let prefix = Prefix::from(prefix.as_ref()); +diff --git servo/components/style/stylesheets/rules_iterator.rs servo/components/style/stylesheets/rules_iterator.rs +index 95a3ab8b3885..65e1b637ae52 100644 +--- servo/components/style/stylesheets/rules_iterator.rs ++++ servo/components/style/stylesheets/rules_iterator.rs +@@ -70,7 +70,7 @@ impl<'a, 'b, C> Iterator for RulesIterator<'a, 'b, C> + + let rule; + let sub_iter = { +- let mut nested_iter = self.stack.last_mut().unwrap(); ++ let nested_iter = self.stack.last_mut().unwrap(); + rule = match nested_iter.next() { + Some(r) => r, + None => { +diff --git servo/components/webdriver_server/lib.rs servo/components/webdriver_server/lib.rs +index bd2f667f9892..28a4885f0d41 100644 +--- servo/components/webdriver_server/lib.rs ++++ servo/components/webdriver_server/lib.rs +@@ -702,7 +702,7 @@ impl Handler { + fn handle_set_timeouts(&mut self, + parameters: &TimeoutsParameters) + -> WebDriverResult { +- let mut session = self.session ++ let session = self.session + .as_mut() + .ok_or(WebDriverError::new(ErrorStatus::SessionNotCreated, ""))?; + +diff --git servo/rust-commit-hash servo/rust-commit-hash +index d4f08fe97644..a08d23cd1a71 100644 +--- servo/rust-commit-hash ++++ servo/rust-commit-hash +@@ -1 +1 @@ +-599be0d18f4c6ddf36366d2a5a2ca6dc65886896 ++13d94d5fa8129a34f5c77a1bcd76983f5aed2434 +diff --git servo/tests/unit/style/stylist.rs servo/tests/unit/style/stylist.rs +index da9a9478957a..52067b501788 100644 +--- servo/tests/unit/style/stylist.rs ++++ servo/tests/unit/style/stylist.rs +@@ -51,19 +51,6 @@ fn get_mock_rules(css_selectors: &[&str]) -> (Vec>, SharedRwLock) { + }).collect(), shared_lock) + } + +-fn get_mock_map(selectors: &[&str]) -> (SelectorMap, SharedRwLock) { +- let mut map = SelectorMap::::new(); +- let (selector_rules, shared_lock) = get_mock_rules(selectors); +- +- for rules in selector_rules.into_iter() { +- for rule in rules.into_iter() { +- map.insert(rule, QuirksMode::NoQuirks) +- } +- } +- +- (map, shared_lock) +-} +- + fn parse_selectors(selectors: &[&str]) -> Vec> { + selectors.iter() + .map(|x| SelectorParser::parse_author_origin_no_namespace(x).unwrap().0 Property changes on: head/www/waterfox/files/patch-servo18046 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-servo18126 =================================================================== --- head/www/waterfox/files/patch-servo18126 (nonexistent) +++ head/www/waterfox/files/patch-servo18126 (revision 454949) @@ -0,0 +1,232 @@ +commit f0acf27d189d +Author: Simon Sapin +Date: Thu Aug 17 11:05:32 2017 -0500 + + servo: Merge #18126 - geckolib: Fix some warnings (treated as error) new in Rust Nigthly (from servo:glow-fox); r=emilio + + Source-Repo: https://github.com/servo/servo + Source-Revision: cc86ca2bcdec5e89ee5279085ea38db63ef41af9 + + --HG-- + extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear + extra : subtree_revision : 0586dbc81f1411c89821605a6dae4ebd0af8f0d5 +--- + servo/components/style/gecko/conversions.rs | 2 +- + servo/components/style/gecko/wrapper.rs | 2 +- + .../style/gecko_bindings/sugar/ns_t_array.rs | 4 ++-- + servo/components/style/properties/gecko.mako.rs | 18 +++++++++--------- + servo/components/style/style_adjuster.rs | 4 ++-- + servo/ports/geckolib/glue.rs | 12 ++++++------ + 6 files changed, 21 insertions(+), 21 deletions(-) + +diff --git servo/components/style/gecko/conversions.rs servo/components/style/gecko/conversions.rs +index 8f3fb6bf2d0f..51015997c5c1 100644 +--- servo/components/style/gecko/conversions.rs ++++ servo/components/style/gecko/conversions.rs +@@ -348,7 +348,7 @@ impl nsStyleImage { + // NB: stops are guaranteed to be none in the gecko side by + // default. + +- let mut gecko_stop = unsafe { ++ let gecko_stop = unsafe { + &mut (*gecko_gradient).mStops[index] + }; + let mut coord = nsStyleCoord::null(); +diff --git servo/components/style/gecko/wrapper.rs servo/components/style/gecko/wrapper.rs +index 034dd94590e2..c402ddaf15bd 100644 +--- servo/components/style/gecko/wrapper.rs ++++ servo/components/style/gecko/wrapper.rs +@@ -424,7 +424,7 @@ impl<'lb> GeckoXBLBinding<'lb> { + } + } + +- fn each_xbl_stylist(self, mut f: &mut F) ++ fn each_xbl_stylist(self, f: &mut F) + where + F: FnMut(&Stylist), + { +diff --git servo/components/style/gecko_bindings/sugar/ns_t_array.rs servo/components/style/gecko_bindings/sugar/ns_t_array.rs +index 6bc389702f54..068e10ddea1b 100644 +--- servo/components/style/gecko_bindings/sugar/ns_t_array.rs ++++ servo/components/style/gecko_bindings/sugar/ns_t_array.rs +@@ -90,7 +90,7 @@ impl nsTArray { + // this can leak + debug_assert!(len >= self.len() as u32); + self.ensure_capacity(len as usize); +- let mut header = self.header_mut(); ++ let header = self.header_mut(); + header.mLength = len; + } + +@@ -99,7 +99,7 @@ impl nsTArray { + /// This will not leak since it only works on POD types (and thus doesn't assert) + pub unsafe fn set_len_pod(&mut self, len: u32) where T: Copy { + self.ensure_capacity(len as usize); +- let mut header = unsafe { self.header_mut() }; ++ let header = unsafe { self.header_mut() }; + header.mLength = len; + } + } +diff --git servo/components/style/properties/gecko.mako.rs servo/components/style/properties/gecko.mako.rs +index 9a2ab2135fc5..bc41ef139af5 100644 +--- servo/components/style/properties/gecko.mako.rs ++++ servo/components/style/properties/gecko.mako.rs +@@ -4136,14 +4136,14 @@ fn static_assert() { + fn init_shadow(filter: &mut nsStyleFilter) -> &mut nsCSSShadowArray { + unsafe { + let ref mut union = filter.__bindgen_anon_1; +- let mut shadow_array: &mut *mut nsCSSShadowArray = union.mDropShadow.as_mut(); ++ let shadow_array: &mut *mut nsCSSShadowArray = union.mDropShadow.as_mut(); + *shadow_array = Gecko_NewCSSShadowArray(1); + + &mut **shadow_array + } + } + +- let mut gecko_shadow = init_shadow(gecko_filter); ++ let gecko_shadow = init_shadow(gecko_filter); + gecko_shadow.mArray[0].set_from_simple_shadow(shadow); + }, + Url(ref url) => { +@@ -4665,14 +4665,14 @@ fn static_assert() { + unsafe { + // We have to be very careful to avoid a copy here! + let ref mut union = ${ident}.__bindgen_anon_1; +- let mut shape: &mut *mut StyleBasicShape = union.mBasicShape.as_mut(); ++ let shape: &mut *mut StyleBasicShape = union.mBasicShape.as_mut(); + *shape = Gecko_NewBasicShape(ty); + &mut **shape + } + } + match servo_shape { + BasicShape::Inset(inset) => { +- let mut shape = init_shape(${ident}, StyleBasicShapeType::Inset); ++ let shape = init_shape(${ident}, StyleBasicShapeType::Inset); + unsafe { shape.mCoordinates.set_len(4) }; + + // set_len() can't call constructors, so the coordinates +@@ -4694,7 +4694,7 @@ fn static_assert() { + set_corners_from_radius(inset.round, &mut shape.mRadius); + } + BasicShape::Circle(circ) => { +- let mut shape = init_shape(${ident}, StyleBasicShapeType::Circle); ++ let shape = init_shape(${ident}, StyleBasicShapeType::Circle); + unsafe { shape.mCoordinates.set_len(1) }; + shape.mCoordinates[0].leaky_set_null(); + circ.radius.to_gecko_style_coord(&mut shape.mCoordinates[0]); +@@ -4702,7 +4702,7 @@ fn static_assert() { + shape.mPosition = circ.position.into(); + } + BasicShape::Ellipse(el) => { +- let mut shape = init_shape(${ident}, StyleBasicShapeType::Ellipse); ++ let shape = init_shape(${ident}, StyleBasicShapeType::Ellipse); + unsafe { shape.mCoordinates.set_len(2) }; + shape.mCoordinates[0].leaky_set_null(); + el.semiaxis_x.to_gecko_style_coord(&mut shape.mCoordinates[0]); +@@ -4712,7 +4712,7 @@ fn static_assert() { + shape.mPosition = el.position.into(); + } + BasicShape::Polygon(poly) => { +- let mut shape = init_shape(${ident}, StyleBasicShapeType::Polygon); ++ let shape = init_shape(${ident}, StyleBasicShapeType::Polygon); + unsafe { + shape.mCoordinates.set_len(poly.coordinates.len() as u32 * 2); + } +@@ -4797,7 +4797,7 @@ clip-path + bindings::Gecko_nsStyleSVG_SetDashArrayLength(&mut self.gecko, v.len() as u32); + } + +- for (mut gecko, servo) in self.gecko.mStrokeDasharray.iter_mut().zip(v) { ++ for (gecko, servo) in self.gecko.mStrokeDasharray.iter_mut().zip(v) { + match servo { + Either::First(number) => gecko.set_value(CoordDataValue::Factor(number)), + Either::Second(lop) => gecko.set(lop), +@@ -4885,7 +4885,7 @@ clip-path + } + + self.gecko.mContextPropsBits = 0; +- for (mut gecko, servo) in self.gecko.mContextProps.iter_mut().zip(v) { ++ for (gecko, servo) in self.gecko.mContextProps.iter_mut().zip(v) { + if servo.0 == atom!("fill") { + self.gecko.mContextPropsBits |= structs::NS_STYLE_CONTEXT_PROPERTY_FILL as u8; + } else if servo.0 == atom!("stroke") { +diff --git servo/components/style/style_adjuster.rs servo/components/style/style_adjuster.rs +index 03b15916b237..366641ebe0bc 100644 +--- servo/components/style/style_adjuster.rs ++++ servo/components/style/style_adjuster.rs +@@ -167,7 +167,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> { + // When 'contain: paint', update overflow from 'visible' to 'clip'. + if self.style.get_box().clone_contain().contains(contain::PAINT) { + if self.style.get_box().clone_overflow_x() == overflow::visible { +- let mut box_style = self.style.mutate_box(); ++ let box_style = self.style.mutate_box(); + box_style.set_overflow_x(overflow::_moz_hidden_unscrollable); + box_style.set_overflow_y(overflow::_moz_hidden_unscrollable); + } +@@ -182,7 +182,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> { + use properties::longhands::font_style::computed_value::T as font_style; + use properties::longhands::font_weight::computed_value::T as font_weight; + if self.style.get_font().clone__moz_math_variant() != moz_math_variant::none { +- let mut font_style = self.style.mutate_font(); ++ let font_style = self.style.mutate_font(); + // Sadly we don't have a nice name for the computed value + // of "font-weight: normal". + font_style.set_font_weight(font_weight::normal()); +diff --git servo/ports/geckolib/glue.rs servo/ports/geckolib/glue.rs +index 977728286fc3..fa09bee29553 100644 +--- servo/ports/geckolib/glue.rs ++++ servo/ports/geckolib/glue.rs +@@ -815,7 +815,7 @@ pub extern "C" fn Servo_StyleSet_AppendStyleSheet( + ) { + let global_style_data = &*GLOBAL_STYLE_DATA; + let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut(); +- let mut data = &mut *data; ++ let data = &mut *data; + let guard = global_style_data.shared_lock.read(); + data.stylesheets.append_stylesheet( + &data.stylist, +@@ -867,7 +867,7 @@ pub extern "C" fn Servo_StyleSet_PrependStyleSheet( + ) { + let global_style_data = &*GLOBAL_STYLE_DATA; + let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut(); +- let mut data = &mut *data; ++ let data = &mut *data; + let guard = global_style_data.shared_lock.read(); + data.stylesheets.prepend_stylesheet( + &data.stylist, +@@ -885,7 +885,7 @@ pub extern "C" fn Servo_StyleSet_InsertStyleSheetBefore( + ) { + let global_style_data = &*GLOBAL_STYLE_DATA; + let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut(); +- let mut data = &mut *data; ++ let data = &mut *data; + let guard = global_style_data.shared_lock.read(); + data.stylesheets.insert_stylesheet_before( + &data.stylist, +@@ -903,7 +903,7 @@ pub extern "C" fn Servo_StyleSet_RemoveStyleSheet( + ) { + let global_style_data = &*GLOBAL_STYLE_DATA; + let mut data = PerDocumentStyleData::from_ffi(raw_data).borrow_mut(); +- let mut data = &mut *data; ++ let data = &mut *data; + let guard = global_style_data.shared_lock.read(); + data.stylesheets.remove_stylesheet( + &data.stylist, +@@ -1274,7 +1274,7 @@ pub extern "C" fn Servo_StyleRule_GetSpecificityAtIndex( + specificity: *mut u64 + ) { + read_locked_arc(rule, |rule: &StyleRule| { +- let mut specificity = unsafe { specificity.as_mut().unwrap() }; ++ let specificity = unsafe { specificity.as_mut().unwrap() }; + let index = index as usize; + if index >= rule.selectors.0.len() { + *specificity = 0; +@@ -2775,7 +2775,7 @@ pub extern "C" fn Servo_NoteExplicitHints(element: RawGeckoElementBorrowed, + pub extern "C" fn Servo_TakeChangeHint(element: RawGeckoElementBorrowed, + was_restyled: *mut bool) -> nsChangeHint + { +- let mut was_restyled = unsafe { was_restyled.as_mut().unwrap() }; ++ let was_restyled = unsafe { was_restyled.as_mut().unwrap() }; + let element = GeckoElement(element); + + let damage = match element.mutate_data() { Property changes on: head/www/waterfox/files/patch-servo18126 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1409680 =================================================================== --- head/www/waterfox/files/patch-bug1409680 (nonexistent) +++ head/www/waterfox/files/patch-bug1409680 (revision 454949) @@ -0,0 +1,27 @@ +Bug 1409680 - Extend --disable-debug-symbols to Rust code. + +This reduces disk I/O and memory usage during build that already lacks +debugging symbols from C++ code, allowing to use more jobs on 32bit hosts. + +--disable-debug-symbols build on FreeBSD 10.3 i386 (8 cores) host: +Max RSS before: libxul - 612 Mb, libgkrust - 1908 Mb +Max RSS after: libxul - 444 Mb, libgkrust - 1471 Mb +Binary before: libxul - 203 Mb, libgkrust - 732 Mb +Binary after: libxul - 123 Mb, libgkrust - 301 Mb + +--- config/rules.mk.orig 2017-09-14 20:15:53 UTC ++++ config/rules.mk +@@ -906,11 +906,13 @@ ifdef MOZ_USING_SCCACHE + sccache_wrap := RUSTC_WRAPPER='$(CCACHE)' + endif + ++ifdef MOZ_DEBUG_SYMBOLS + # XXX hack to work around dsymutil failing on cross-OSX builds (bug 1380381) + ifeq ($(HOST_OS_ARCH)-$(OS_ARCH),Linux-Darwin) + default_rustflags += -C debuginfo=1 + else + default_rustflags += -C debuginfo=2 ++endif + endif + + # We use the + prefix to pass down the jobserver fds to cargo, but we Property changes on: head/www/waterfox/files/patch-bug1409680 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1144632 =================================================================== --- head/www/waterfox/files/patch-bug1144632 (nonexistent) +++ head/www/waterfox/files/patch-bug1144632 (revision 454949) @@ -0,0 +1,23 @@ +Revert bug 1323303 to unbreak build on big-endian architectures. + +diff --git toolkit/moz.configure toolkit/moz.configure +index 67fcbc39d075..c117fd11a358 100644 +--- toolkit/moz.configure ++++ toolkit/moz.configure +@@ -1032,11 +1032,11 @@ add_old_configure_assignment('NECKO_PROTOCOLS', necko_protocols) + # ============================================================== + option('--disable-skia', help='Disable use of Skia') + +-@depends('--disable-skia') +-def skia(value): +- if not value: +- die('--disable-skia is not supported anymore') +- else: ++@depends('--disable-skia', target) ++def skia(value, target): ++ if value.origin == 'default' and target.endianness == 'big': ++ return None ++ if value: + return True + + set_config('MOZ_ENABLE_SKIA', skia) Property changes on: head/www/waterfox/files/patch-bug1144632 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug826985 =================================================================== --- head/www/waterfox/files/patch-bug826985 (nonexistent) +++ head/www/waterfox/files/patch-bug826985 (revision 454949) @@ -0,0 +1,171 @@ +commit 8024d93 +Author: Henrik Gulbrandsen +Date: Fri Jan 4 13:49:22 2013 +0100 + + Bug 826985 - Support more video formats for WebRTC via libv4l2 on Linux. +--- + config/system-headers | 1 + + old-configure.in | 7 +++++++ + media/webrtc/signaling/test/Makefile.in | 1 + + .../modules/video_capture/linux/device_info_linux.cc | 17 +++++++++++++++++ + .../modules/video_capture/linux/video_capture_linux.cc | 16 +++++++++++++++- + .../webrtc/modules/video_capture/video_capture.gypi | 11 +++++++++++ + toolkit/library/Makefile.in | 1 + + 6 files changed, 52 insertions(+), 1 deletion(-) + +diff --git config/system-headers config/system-headers +index 55e4cd1..76567b3 100644 +--- config/system-headers ++++ config/system-headers +@@ -624,6 +624,7 @@ libgnome/libgnome.h + libgnomeui/gnome-icon-lookup.h + libgnomeui/gnome-icon-theme.h + libgnomeui/gnome-ui-init.h ++libv4l2.h + limits.h + link.h + #ifdef ANDROID +diff --git old-configure.in configure.in +index 55e4cd1..76567b3 100644 +--- old-configure.in ++++ old-configure.in +@@ -5309,6 +5309,9 @@ if test -n "$MOZ_WEBRTC"; then + MOZ_VP8_ENCODER=1 + MOZ_VP8_ERROR_CONCEALMENT=1 + ++ dnl with libv4l2 we can support more cameras ++ PKG_CHECK_MODULES(MOZ_LIBV4L2, libv4l2) ++ + dnl enable once Signaling lands + MOZ_WEBRTC_SIGNALING=1 + AC_DEFINE(MOZ_WEBRTC_SIGNALING) +diff --git build/gyp.mozbuild build/gyp.mozbuild +index b483cd1..f1dd1f0 100644 +--- build/gyp.mozbuild ++++ build/gyp.mozbuild +@@ -11,6 +11,7 @@ gyp_vars = { + 'have_ethtool_cmd_speed_hi': 1 if CONFIG['MOZ_WEBRTC_HAVE_ETHTOOL_SPEED_HI'] else 0, + 'include_alsa_audio': 1 if CONFIG['MOZ_ALSA'] else 0, + 'include_pulse_audio': 1 if CONFIG['MOZ_PULSEAUDIO'] else 0, ++ 'use_libv4l2': 1 if CONFIG['MOZ_LIBV4L2_LIBS'] else 0, + # basic stuff for everything + 'include_internal_video_render': 0, + 'clang_use_chrome_plugins': 0, +diff --git media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc +index 239a292..bab496c 100644 +--- media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc ++++ media/webrtc/trunk/webrtc/modules/video_capture/linux/device_info_linux.cc +@@ -25,6 +25,9 @@ + #else + #include + #endif ++#ifdef HAVE_LIBV4L2 ++#include ++#endif + + #include "webrtc/system_wrappers/interface/ref_count.h" + #include "webrtc/system_wrappers/interface/trace.h" +@@ -34,6 +37,15 @@ + #define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) ) + #endif + ++#ifdef HAVE_LIBV4L2 ++#define open v4l2_open ++#define close v4l2_close ++#define dup v4l2_dup ++#define ioctl v4l2_ioctl ++#define mmap v4l2_mmap ++#define munmap v4l2_munmap ++#endif ++ + namespace webrtc + { + namespace videocapturemodule +@@ -274,6 +286,11 @@ int32_t DeviceInfoLinux::GetDeviceName( + memset(deviceNameUTF8, 0, deviceNameLength); + memcpy(cameraName, cap.card, sizeof(cap.card)); + ++ if (cameraName[0] == '\0') ++ { ++ sprintf(cameraName, "Camera at /dev/video%d", deviceNumber); ++ } ++ + if (deviceNameLength >= strlen(cameraName)) + { + memcpy(deviceNameUTF8, cameraName, strlen(cameraName)); +diff --git media/webrtc/trunk/webrtc/modules/video_capture/linux/video_capture_linux.cc media/webrtc/trunk/webrtc/modules/video_capture/linux/video_capture_linux.cc +index 12df1b3..e9863ba 100644 +--- media/webrtc/trunk/webrtc/modules/video_capture/linux/video_capture_linux.cc ++++ media/webrtc/trunk/webrtc/modules/video_capture/linux/video_capture_linux.cc +@@ -25,6 +25,9 @@ + #else + #include + #endif ++#ifdef HAVE_LIBV4L2 ++#include ++#endif + + #include + +@@ -32,6 +35,15 @@ + #include "webrtc/modules/video_capture/linux/video_capture_linux.h" + #include "webrtc/system_wrappers/include/critical_section_wrapper.h" + #include "webrtc/system_wrappers/include/trace.h" ++ ++#ifdef HAVE_LIBV4L2 ++#define open v4l2_open ++#define close v4l2_close ++#define dup v4l2_dup ++#define ioctl v4l2_ioctl ++#define mmap v4l2_mmap ++#define munmap v4l2_munmap ++#endif + + namespace webrtc { + namespace videocapturemodule { +diff --git media/webrtc/trunk/webrtc/modules/video_capture/video_capture.gypi media/webrtc/trunk/webrtc/modules/video_capture/video_capture.gypi +index d46b5aa..e452223 100644 +--- media/webrtc/trunk/webrtc/modules/video_capture/video_capture.gypi ++++ media/webrtc/trunk/webrtc/modules/video_capture/video_capture.gypi +@@ -7,6 +7,9 @@ + # be found in the AUTHORS file in the root of the source tree. + + { ++ 'variables': { ++ 'use_libv4l2%': 0, ++ }, + 'targets': [ + { + 'target_name': 'video_capture_module', +@@ -76,6 +76,19 @@ + 'linux/video_capture_linux.cc', + 'linux/video_capture_linux.h', + ], ++ 'conditions': [ ++ ['use_libv4l2==1', { ++ 'defines': [ ++ 'HAVE_LIBV4L2', ++ ], ++ 'cflags_mozilla': [ ++ '$(MOZ_LIBV4L2_CFLAGS)', ++ ], ++ 'libraries': [ ++ '-lv4l2', ++ ], ++ }], ++ ], + }], + ['OS=="mac"', { + 'sources': [ +diff --git toolkit/library/moz.build toolkit/library/moz.build +index 9c16ffa..1db3794 100644 +--- toolkit/library/moz.build ++++ toolkit/library/moz.build +@@ -163,6 +163,7 @@ if CONFIG['OS_ARCH'] == 'Linux' and CONF + ] + + OS_LIBS += CONFIG['MOZ_CAIRO_OSLIBS'] ++OS_LIBS += CONFIG['MOZ_LIBV4L2_LIBS'] + OS_LIBS += CONFIG['MOZ_WEBRTC_X11_LIBS'] + OS_LIBS += CONFIG['MOZ_APP_EXTRA_LIBS'] + Property changes on: head/www/waterfox/files/patch-bug826985 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug847568 =================================================================== --- head/www/waterfox/files/patch-bug847568 (nonexistent) +++ head/www/waterfox/files/patch-bug847568 (revision 454949) @@ -0,0 +1,271 @@ +# Allow building against system-wide graphite2/harfbuzz. + +diff --git config/Makefile.in config/Makefile.in +index e2e11dc0e27e..a6206bb0ff30 100644 +--- config/Makefile.in ++++ config/Makefile.in +@@ -41,6 +41,8 @@ export:: $(export-preqs) + $(PYTHON) -m mozbuild.action.preprocessor $(DEFINES) $(ACDEFINES) \ + -DMOZ_TREE_CAIRO=$(MOZ_TREE_CAIRO) \ + -DMOZ_TREE_PIXMAN=$(MOZ_TREE_PIXMAN) \ ++ -DMOZ_SYSTEM_GRAPHITE2=$(MOZ_SYSTEM_GRAPHITE2) \ ++ -DMOZ_SYSTEM_HARFBUZZ=$(MOZ_SYSTEM_HARFBUZZ) \ + -DMOZ_SYSTEM_HUNSPELL=$(MOZ_SYSTEM_HUNSPELL) \ + -DMOZ_SYSTEM_BZ2=$(MOZ_SYSTEM_BZ2) \ + -DMOZ_SYSTEM_ZLIB=$(MOZ_SYSTEM_ZLIB) \ +diff --git config/system-headers config/system-headers +index a0c53c651a3e..5ee7f71f9634 100644 +--- config/system-headers ++++ config/system-headers +@@ -1269,6 +1269,15 @@ libsn/sn-launcher.h + libsn/sn-monitor.h + libsn/sn-util.h + #endif ++#if MOZ_SYSTEM_GRAPHITE2==1 ++graphite2/Font.h ++graphite2/Segment.h ++#endif ++#if MOZ_SYSTEM_HARFBUZZ==1 ++harfbuzz/hb-glib.h ++harfbuzz/hb-ot.h ++harfbuzz/hb.h ++#endif + #if MOZ_SYSTEM_HUNSPELL==1 + hunspell.hxx + #endif +diff --git dom/base/moz.build dom/base/moz.build +index 8e19020315ae..2fcdbb6f7b42 100644 +--- dom/base/moz.build ++++ dom/base/moz.build +@@ -464,6 +464,9 @@ if CONFIG['MOZ_BUILD_APP'] in ['browser', 'mobile/android', 'xulrunner']: + if CONFIG['MOZ_X11']: + CXXFLAGS += CONFIG['TK_CFLAGS'] + ++if CONFIG['MOZ_SYSTEM_HARFBUZZ']: ++ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] ++ + GENERATED_FILES += [ + 'PropertyUseCounterMap.inc', + 'UseCounterList.h', +diff --git gfx/graphite2/moz-gr-update.sh gfx/graphite2/moz-gr-update.sh +index faaab1b17971..04eff5f09882 100644 +--- gfx/graphite2/moz-gr-update.sh ++++ gfx/graphite2/moz-gr-update.sh +@@ -1,6 +1,7 @@ + #!/bin/bash + + # Script used to update the Graphite2 library in the mozilla source tree ++# and bump version for --with-system-graphite2 + + # This script lives in gfx/graphite2, along with the library source, + # but must be run from the top level of the mozilla-central tree. +@@ -37,12 +38,16 @@ echo "See" $0 "for update procedure." >> gfx/graphite2/README.mozilla + #find gfx/graphite2/ -name "*.cpp" -exec perl -p -i -e "s///;s/Windows.h/windows.h/;" {} \; + #find gfx/graphite2/ -name "*.h" -exec perl -p -i -e "s///;s/Windows.h/windows.h/;" {} \; + ++# chase version for --with-system-graphite2 ++perl -p -i -e "s/[0-9]+\,[0-9]+\,[0-9]+/$RELEASE/ and tr/./,/ \ ++ if /GR2_VERSION_REQUIRE/" old-configure.in ++ + # summarize what's been touched + echo Updated to $RELEASE. + echo Here is what changed in the gfx/graphite2 directory: + echo + +-hg stat gfx/graphite2 ++hg stat old-configure.in gfx/graphite2 + + echo + echo If gfx/graphite2/src/files.mk has changed, please make corresponding +diff --git gfx/harfbuzz/README-mozilla gfx/harfbuzz/README-mozilla +index 22c76a7df020..a01490bd49ee 100644 +--- gfx/harfbuzz/README-mozilla ++++ gfx/harfbuzz/README-mozilla +@@ -19,3 +19,8 @@ the mozilla tree. + + If the collection of source files changes, manual updates to moz.build may be + needed, as we don't use the upstream makefiles. ++ ++The in-tree copy may be omitted during build by --with-system-harfbuzz. ++Make sure to keep pkg-config version check within toolkit/moz.configure in sync ++with checkout version or increment latest tag by one if it's not based ++on upstream release. +diff --git gfx/moz.build gfx/moz.build +index 771f652e837a..3b358d84e384 100644 +--- gfx/moz.build ++++ gfx/moz.build +@@ -10,6 +10,12 @@ with Files('**'): + if CONFIG['MOZ_TREE_CAIRO']: + DIRS += ['cairo'] + ++if not CONFIG['MOZ_SYSTEM_GRAPHITE2']: ++ DIRS += ['graphite2/src' ] ++ ++if not CONFIG['MOZ_SYSTEM_HARFBUZZ']: ++ DIRS += ['harfbuzz/src'] ++ + DIRS += [ + '2d', + 'ycbcr', +@@ -18,8 +24,6 @@ DIRS += [ + 'qcms', + 'gl', + 'layers', +- 'graphite2/src', +- 'harfbuzz/src', + 'ots/src', + 'thebes', + 'ipc', +diff --git gfx/skia/generate_mozbuild.py gfx/skia/generate_mozbuild.py +index e06ae3457a47..93faa61594a3 100755 +--- gfx/skia/generate_mozbuild.py ++++ gfx/skia/generate_mozbuild.py +@@ -143,6 +143,9 @@ if CONFIG['CLANG_CXX'] or CONFIG['CLANG_CL']: + '-Wno-unused-private-field', + ] + ++if CONFIG['MOZ_SYSTEM_HARFBUZZ']: ++ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] ++ + if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android'): + CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS'] + CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS'] +diff --git gfx/skia/moz.build gfx/skia/moz.build +index 2118677ca3a8..e4978b413784 100644 +--- gfx/skia/moz.build ++++ gfx/skia/moz.build +@@ -753,6 +753,9 @@ if CONFIG['CLANG_CXX'] or CONFIG['CLANG_CL']: + '-Wno-unused-private-field', + ] + ++if CONFIG['MOZ_SYSTEM_HARFBUZZ']: ++ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] ++ + if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android'): + CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS'] + CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS'] +diff --git gfx/thebes/moz.build gfx/thebes/moz.build +index 56f1b9fe3f4b..0ac1100b0df3 100644 +--- gfx/thebes/moz.build ++++ gfx/thebes/moz.build +@@ -269,7 +269,13 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3'): + + LOCAL_INCLUDES += CONFIG['SKIA_INCLUDES'] + +-DEFINES['GRAPHITE2_STATIC'] = True ++if CONFIG['MOZ_SYSTEM_GRAPHITE2']: ++ CXXFLAGS += CONFIG['MOZ_GRAPHITE2_CFLAGS'] ++else: ++ DEFINES['GRAPHITE2_STATIC'] = True ++ ++if CONFIG['MOZ_SYSTEM_HARFBUZZ']: ++ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] + + if CONFIG['CLANG_CXX']: + # Suppress warnings from Skia header files. +diff --git intl/unicharutil/util/moz.build intl/unicharutil/util/moz.build +index cb1233c56d7e..06fb1f9f174b 100644 +--- intl/unicharutil/util/moz.build ++++ intl/unicharutil/util/moz.build +@@ -29,4 +29,7 @@ if CONFIG['ENABLE_INTL_API']: + 'ICUUtils.cpp', + ] + ++if CONFIG['MOZ_SYSTEM_HARFBUZZ']: ++ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] ++ + FINAL_LIBRARY = 'xul' +diff --git netwerk/dns/moz.build netwerk/dns/moz.build +index 79c26e3e7001..c4d93bc5f7dc 100644 +--- netwerk/dns/moz.build ++++ netwerk/dns/moz.build +@@ -69,6 +69,9 @@ LOCAL_INCLUDES += [ + '/netwerk/base', + ] + ++if CONFIG['MOZ_SYSTEM_HARFBUZZ']: ++ CXXFLAGS += CONFIG['MOZ_HARFBUZZ_CFLAGS'] ++ + if CONFIG['ENABLE_INTL_API']: + DEFINES['IDNA2008'] = True + USE_LIBS += ['icu'] +diff --git old-configure.in old-configure.in +index 95a58b634593..b614eef85c89 100644 +--- old-configure.in ++++ old-configure.in +@@ -4888,6 +4888,27 @@ dnl ======================================================== + AC_SUBST(MOZ_LINUX_32_SSE2_STARTUP_ERROR) + + dnl ======================================================== ++dnl Check for graphite2 ++dnl ======================================================== ++if test -n "$MOZ_SYSTEM_GRAPHITE2"; then ++ dnl graphite2.pc has bogus version, check manually ++ _SAVE_CFLAGS=$CFLAGS ++ CFLAGS="$CFLAGS $MOZ_GRAPHITE2_CFLAGS" ++ AC_TRY_COMPILE([ #include ++ #define GR2_VERSION_REQUIRE(major,minor,bugfix) \ ++ ( GR2_VERSION_MAJOR * 10000 + GR2_VERSION_MINOR \ ++ * 100 + GR2_VERSION_BUGFIX >= \ ++ (major) * 10000 + (minor) * 100 + (bugfix) ) ++ ], [ ++ #if !GR2_VERSION_REQUIRE(1,3,10) ++ #error "Insufficient graphite2 version." ++ #endif ++ ], [], ++ [AC_MSG_ERROR([--with-system-graphite2 requested but no working libgraphite2 found])]) ++ CFLAGS=$_SAVE_CFLAGS ++fi ++ ++dnl ======================================================== + dnl Check for pixman and cairo + dnl ======================================================== + +diff --git toolkit/library/moz.build toolkit/library/moz.build +index 24f940e1ed7e..079a575adec3 100644 +--- toolkit/library/moz.build ++++ toolkit/library/moz.build +@@ -224,6 +224,12 @@ if CONFIG['MOZ_SYSTEM_JPEG']: + if CONFIG['MOZ_SYSTEM_PNG']: + OS_LIBS += CONFIG['MOZ_PNG_LIBS'] + ++if CONFIG['MOZ_SYSTEM_GRAPHITE2']: ++ OS_LIBS += CONFIG['MOZ_GRAPHITE2_LIBS'] ++ ++if CONFIG['MOZ_SYSTEM_HARFBUZZ']: ++ OS_LIBS += CONFIG['MOZ_HARFBUZZ_LIBS'] ++ + if CONFIG['MOZ_SYSTEM_HUNSPELL']: + OS_LIBS += CONFIG['MOZ_HUNSPELL_LIBS'] + +diff --git toolkit/moz.configure toolkit/moz.configure +index 9297e4d6f501..d8e273887e4b 100644 +--- toolkit/moz.configure ++++ toolkit/moz.configure +@@ -356,6 +356,26 @@ add_old_configure_assignment('FT2_LIBS', + add_old_configure_assignment('FT2_CFLAGS', + delayed_getattr(ft2_info, 'cflags')) + ++# Graphite2 ++# ============================================================== ++option('--with-system-graphite2', ++ help="Use system graphite2 (located with pkgconfig)") ++ ++system_graphite2 = pkg_check_modules('MOZ_GRAPHITE2', 'graphite2', ++ when='--with-system-graphite2') ++ ++set_config('MOZ_SYSTEM_GRAPHITE2', depends_if(system_graphite2)(lambda _: True)) ++ ++# HarfBuzz ++# ============================================================== ++option('--with-system-harfbuzz', ++ help="Use system harfbuzz (located with pkgconfig)") ++ ++system_harfbuzz = pkg_check_modules('MOZ_HARFBUZZ', 'harfbuzz >= 1.4.7', ++ when='--with-system-harfbuzz') ++ ++set_config('MOZ_SYSTEM_HARFBUZZ', depends_if(system_harfbuzz)(lambda _: True)) ++ + # Apple platform decoder support + # ============================================================== + @depends(toolkit) Property changes on: head/www/waterfox/files/patch-bug847568 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-z-bug517422 =================================================================== --- head/www/waterfox/files/patch-z-bug517422 (nonexistent) +++ head/www/waterfox/files/patch-z-bug517422 (revision 454949) @@ -0,0 +1,502 @@ +# Allow more config/external/ libs built against system-wide version. + +diff --git build/moz.configure/old.configure build/moz.configure/old.configure +index d0fe7accffe6..c46bdd023225 100644 +--- build/moz.configure/old.configure ++++ build/moz.configure/old.configure +@@ -288,7 +288,12 @@ def old_configure_options(*options): + '--with-system-libvpx', + '--with-system-nspr', + '--with-system-nss', ++ '--with-system-ogg', + '--with-system-png', ++ '--with-system-soundtouch', ++ '--with-system-theora', ++ '--with-system-tremor', ++ '--with-system-vorbis', + '--with-system-zlib', + '--with-thumb', + '--with-thumb-interwork', +diff --git config/Makefile.in config/Makefile.in +index a6206bb0ff30..f20987c61754 100644 +--- config/Makefile.in ++++ config/Makefile.in +@@ -51,6 +51,11 @@ export:: $(export-preqs) + -DMOZ_SYSTEM_LIBEVENT=$(MOZ_SYSTEM_LIBEVENT) \ + -DMOZ_SYSTEM_LIBVPX=$(MOZ_SYSTEM_LIBVPX) \ + -DMOZ_SYSTEM_ICU=$(MOZ_SYSTEM_ICU) \ ++ -DMOZ_SYSTEM_OGG=$(MOZ_SYSTEM_OGG) \ ++ -DMOZ_SYSTEM_THEORA=$(MOZ_SYSTEM_THEORA) \ ++ -DMOZ_SYSTEM_VORBIS=$(MOZ_SYSTEM_VORBIS) \ ++ -DMOZ_SYSTEM_TREMOR=$(MOZ_SYSTEM_TREMOR) \ ++ -DMOZ_SYSTEM_SOUNDTOUCH=$(MOZ_SYSTEM_SOUNDTOUCH) \ + $(srcdir)/system-headers $(srcdir)/stl-headers | $(PERL) $(topsrcdir)/nsprpub/config/make-system-wrappers.pl system_wrappers + $(INSTALL) system_wrappers $(DIST) + +diff --git config/external/moz.build config/external/moz.build +index 029ff8504795..2c3a40caa1ba 100644 +--- config/external/moz.build ++++ config/external/moz.build +@@ -21,12 +21,21 @@ if CONFIG['MOZ_UPDATER']: + external_dirs += ['modules/brotli'] + external_dirs += ['modules/woff2'] + +-if CONFIG['MOZ_VORBIS']: ++if not CONFIG['MOZ_SYSTEM_OGG']: ++ external_dirs += ['media/libogg'] ++ ++if CONFIG['MOZ_VORBIS'] and not CONFIG['MOZ_SYSTEM_VORBIS']: + external_dirs += ['media/libvorbis'] + +-if CONFIG['MOZ_TREMOR']: ++if CONFIG['MOZ_TREMOR'] and not CONFIG['MOZ_SYSTEM_TREMOR']: + external_dirs += ['media/libtremor'] + ++if not CONFIG['MOZ_SYSTEM_THEORA']: ++ external_dirs += ['media/libtheora'] ++ ++if not CONFIG['MOZ_SYSTEM_SOUNDTOUCH']: ++ external_dirs += ['media/libsoundtouch'] ++ + if CONFIG['MOZ_WEBM_ENCODER']: + external_dirs += ['media/libmkv'] + +@@ -52,12 +61,9 @@ external_dirs += [ + 'media/kiss_fft', + 'media/libcubeb', + 'media/libnestegg', +- 'media/libogg', + 'media/libopus', +- 'media/libtheora', + 'media/libspeex_resampler', + 'media/libstagefright', +- 'media/libsoundtouch', + 'media/psshparser' + ] + +diff --git config/system-headers config/system-headers +index 5ee7f71f9634..13178ac3b3ab 100644 +--- config/system-headers ++++ config/system-headers +@@ -1348,3 +1348,17 @@ unicode/utypes.h + libutil.h + unwind.h + fenv.h ++#if MOZ_SYSTEM_OGG==1 ++ogg/ogg.h ++ogg/os_types.h ++#endif ++#if MOZ_SYSTEM_THEORA==1 ++theora/theoradec.h ++#endif ++#if MOZ_SYSTEM_VORBIS==1 ++vorbis/codec.h ++vorbis/vorbisenc.h ++#endif ++#if MOZ_SYSTEM_TREMOR==1 ++tremor/ivorbiscodec.h ++#endif +diff --git dom/media/AudioStream.cpp dom/media/AudioStream.cpp +index 93ecda4319af..ff674c64ea07 100644 +--- dom/media/AudioStream.cpp ++++ dom/media/AudioStream.cpp +@@ -115,7 +115,9 @@ AudioStream::AudioStream(DataSource& aSource) + : mMonitor("AudioStream") + , mChannels(0) + , mOutChannels(0) ++#ifndef MOZ_SYSTEM_SOUNDTOUCH + , mTimeStretcher(nullptr) ++#endif + , mDumpFile(nullptr) + , mState(INITIALIZED) + , mDataSource(aSource) +@@ -135,9 +137,11 @@ AudioStream::~AudioStream() + if (mDumpFile) { + fclose(mDumpFile); + } ++#ifndef MOZ_SYSTEM_SOUNDTOUCH + if (mTimeStretcher) { + soundtouch::destroySoundTouchObj(mTimeStretcher); + } ++#endif + #if defined(XP_WIN) + if (XRE_IsContentProcess()) { + audio::AudioNotificationReceiver::Unregister(this); +@@ -151,7 +155,11 @@ nsresult AudioStream::EnsureTimeStretcherInitializedUnlocked() + { + mMonitor.AssertCurrentThreadOwns(); + if (!mTimeStretcher) { ++#ifdef MOZ_SYSTEM_SOUNDTOUCH ++ mTimeStretcher = new soundtouch::SoundTouch(); ++#else + mTimeStretcher = soundtouch::createSoundTouchObj(); ++#endif + mTimeStretcher->setSampleRate(mAudioClock.GetInputRate()); + mTimeStretcher->setChannels(mOutChannels); + mTimeStretcher->setPitch(1.0); +diff --git dom/media/AudioStream.h dom/media/AudioStream.h +index 7dc1f60f95cc..67d402a4117f 100644 +--- dom/media/AudioStream.h ++++ dom/media/AudioStream.h +@@ -16,7 +16,11 @@ + #include "mozilla/TimeStamp.h" + #include "mozilla/UniquePtr.h" + #include "CubebUtils.h" ++#ifdef MOZ_SYSTEM_SOUNDTOUCH ++#include "soundtouch/SoundTouch.h" ++#else + #include "soundtouch/SoundTouchFactory.h" ++#endif + + namespace mozilla { + +@@ -287,7 +291,11 @@ private: + uint32_t mChannels; + uint32_t mOutChannels; + AudioClock mAudioClock; ++#ifdef MOZ_SYSTEM_SOUNDTOUCH ++ nsAutoPtr mTimeStretcher; ++#else + soundtouch::SoundTouch* mTimeStretcher; ++#endif + + // Output file for dumping audio + FILE* mDumpFile; +diff --git dom/media/moz.build dom/media/moz.build +index 86b051c58d33..fb6186dce78b 100644 +--- dom/media/moz.build ++++ dom/media/moz.build +@@ -308,6 +308,21 @@ if CONFIG['MOZ_WEBRTC']: + + DEFINES['MOZILLA_INTERNAL_API'] = True + ++if CONFIG['MOZ_SYSTEM_OGG']: ++ CXXFLAGS += CONFIG['MOZ_OGG_CFLAGS'] ++ ++if CONFIG['MOZ_SYSTEM_THEORA']: ++ CXXFLAGS += CONFIG['MOZ_THEORA_CFLAGS'] ++ ++if CONFIG['MOZ_SYSTEM_VORBIS']: ++ CXXFLAGS += CONFIG['MOZ_VORBIS_CFLAGS'] ++ ++if CONFIG['MOZ_SYSTEM_TREMOR']: ++ CXXFLAGS += CONFIG['MOZ_TREMOR_CFLAGS'] ++ ++if CONFIG['MOZ_SYSTEM_SOUNDTOUCH']: ++ CXXFLAGS += CONFIG['MOZ_SOUNDTOUCH_CFLAGS'] ++ + if CONFIG['OS_TARGET'] == 'WINNT': + DEFINES['WEBRTC_WIN'] = True + else: +diff --git dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp +index 078f6ea5ef60..c600db067539 100644 +--- dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp ++++ dom/media/platforms/ffmpeg/ffvpx/FFVPXRuntimeLinker.cpp +@@ -11,9 +11,13 @@ + #include "prmem.h" + #include "prlink.h" + ++#ifdef MOZ_SYSTEM_SOUNDTOUCH ++#include "nsXPCOMPrivate.h" // for XUL_DLL ++#else + // We use a known symbol located in lgpllibs to determine its location. + // soundtouch happens to be always included in lgpllibs + #include "soundtouch/SoundTouch.h" ++#endif + + namespace mozilla { + +@@ -50,6 +54,12 @@ FFVPXRuntimeLinker::Init() + + sLinkStatus = LinkStatus_FAILED; + ++#ifdef MOZ_SYSTEM_SOUNDTOUCH ++ // We retrieve the path of the XUL library as this is where mozavcodec and ++ // mozavutil libs are located. ++ char* path = ++ PR_GetLibraryFilePathname(XUL_DLL, (PRFuncPtr)&FFVPXRuntimeLinker::Init); ++#else + // We retrieve the path of the lgpllibs library as this is where mozavcodec + // and mozavutil libs are located. + char* lgpllibsname = PR_GetLibraryName(nullptr, "lgpllibs"); +@@ -60,6 +70,7 @@ FFVPXRuntimeLinker::Init() + PR_GetLibraryFilePathname(lgpllibsname, + (PRFuncPtr)&soundtouch::SoundTouch::getVersionId); + PR_FreeLibraryName(lgpllibsname); ++#endif + if (!path) { + return false; + } +diff --git media/libogg/README_MOZILLA media/libogg/README_MOZILLA +index 6213fdc7770c..ada799916a17 100644 +--- media/libogg/README_MOZILLA ++++ media/libogg/README_MOZILLA +@@ -6,3 +6,6 @@ package downloaded from xiph.org and copied using the update.sh script. + The int-types.patch address a bug that config_types.h generated from + Linux platform can't be used on OpenSolaris directly see Mozilla bug + 449754 ++ ++The in-tree copy may be omitted during build by --with-system-ogg. ++Keep version in old-configure.in in sync on updates. +diff --git media/libsoundtouch/README_MOZILLA media/libsoundtouch/README_MOZILLA +index dc0dbe8f6886..ea73b55e3e39 100644 +--- media/libsoundtouch/README_MOZILLA ++++ media/libsoundtouch/README_MOZILLA +@@ -6,3 +6,5 @@ The whole library is not used, only the relevant files are imported in the tree, + using the script `update.sh`. Some changes have been made to the files, using + the patch `moz-libsoundtouch.patch`. We also use a custom soundtouch_config.h. + ++The in-tree copy may be omitted during build by --with-system-soundtouch. ++Keep version in old-configure.in in sync on updates. +diff --git media/libsoundtouch/src/soundtouch_perms.h media/libsoundtouch/src/soundtouch_perms.h +index 0af2fe618311..10973564e7a4 100644 +--- media/libsoundtouch/src/soundtouch_perms.h ++++ media/libsoundtouch/src/soundtouch_perms.h +@@ -12,7 +12,9 @@ + + #pragma GCC visibility push(default) + #include "SoundTouch.h" ++#ifndef MOZ_SYSTEM_SOUNDTOUCH + #include "SoundTouchFactory.h" ++#endif + #pragma GCC visibility pop + + #endif // MOZILLA_SOUNDTOUCH_PERMS_H +diff --git media/libtheora/README_MOZILLA media/libtheora/README_MOZILLA +index d48dbfa6f63d..6f30f250220e 100644 +--- media/libtheora/README_MOZILLA ++++ media/libtheora/README_MOZILLA +@@ -3,3 +3,6 @@ using the update.sh script. The changes made were those applied by update.sh, + the addition/update of Makefile.in files for the Mozilla build system. + + The subversion revision used was r17578. ++ ++The in-tree copy may be omitted during build by --with-system-theora. ++Keep version in old-configure.in in sync on updates. +diff --git media/libtheora/moz.build media/libtheora/moz.build +index c7f85eebff95..aae7b814adb5 100644 +--- media/libtheora/moz.build ++++ media/libtheora/moz.build +@@ -21,6 +21,9 @@ FINAL_LIBRARY = 'gkmedias' + # The encoder is currently not included. + DEFINES['THEORA_DISABLE_ENCODE'] = True + ++if CONFIG['MOZ_SYSTEM_OGG']: ++ CFLAGS += CONFIG['MOZ_OGG_CFLAGS'] ++ + # Suppress warnings in third-party code. + if CONFIG['GNU_CC'] or CONFIG['CLANG_CL']: + CFLAGS += ['-Wno-type-limits'] +diff --git media/libtremor/README_MOZILLA media/libtremor/README_MOZILLA +index ee67b53a05c5..81c971773d55 100644 +--- media/libtremor/README_MOZILLA ++++ media/libtremor/README_MOZILLA +@@ -5,3 +5,6 @@ Makefile.in files for the Mozilla build system. + + The upstream release used was http://svn.xiph.org/trunk/Tremor/ + The subversion revision used was r17547. ++ ++The in-tree copy may be omitted during build by --with-system-tremor. ++Keep version in old-configure.in in sync on updates. +diff --git media/libtremor/moz.build media/libtremor/moz.build +index 83afc8e37c64..71ef159da3d7 100644 +--- media/libtremor/moz.build ++++ media/libtremor/moz.build +@@ -9,3 +9,5 @@ with Files('*'): + + DIRS += ['include/tremor', 'lib'] + ++if CONFIG['MOZ_SYSTEM_OGG']: ++ CFLAGS += CONFIG['MOZ_OGG_CFLAGS'] +diff --git media/libvorbis/README_MOZILLA media/libvorbis/README_MOZILLA +index 1211ac074b33..eb31084aed25 100644 +--- media/libvorbis/README_MOZILLA ++++ media/libvorbis/README_MOZILLA +@@ -8,3 +8,6 @@ https://svn.xiph.org/tags/vorbis/libvorbis-1.3.5@19464 + + Some files are renamed during the copy to prevent clashes with object + file names with other Mozilla libraries. ++ ++The in-tree copy may be omitted during build by --with-system-vorbis. ++Keep version in old-configure.in in sync on updates. +diff --git media/libvorbis/moz.build media/libvorbis/moz.build +index adf393782cc9..923b76231107 100644 +--- media/libvorbis/moz.build ++++ media/libvorbis/moz.build +@@ -56,3 +56,6 @@ FINAL_LIBRARY = 'gkmedias' + # Suppress warnings in third-party code. + if CONFIG['GNU_CC']: + CFLAGS += ['-Wno-uninitialized'] ++ ++if CONFIG['MOZ_SYSTEM_OGG']: ++ CFLAGS += CONFIG['MOZ_OGG_CFLAGS'] +diff --git old-configure.in old-configure.in +index b614eef85c89..85f9099dba4d 100644 +--- old-configure.in ++++ old-configure.in +@@ -2941,6 +2941,111 @@ if test -n "$MOZ_OMX_PLUGIN"; then + fi + fi + ++dnl ======================================================== ++dnl Check for libogg ++dnl ======================================================== ++ ++MOZ_ARG_WITH_BOOL(system-ogg, ++[ --with-system-ogg Use system libogg (located with pkgconfig)], ++MOZ_SYSTEM_OGG=1, ++MOZ_SYSTEM_OGG=) ++ ++if test -n "$MOZ_SYSTEM_OGG"; then ++ PKG_CHECK_MODULES(MOZ_OGG, ogg >= 1.3.0) ++ ++ _SAVE_LIBS=$LIBS ++ LIBS="$LIBS $MOZ_OGG_LIBS" ++ AC_CHECK_FUNC(ogg_set_mem_functions, [], ++ [AC_DEFINE(MOZ_OGG_NO_MEM_REPORTING)]) ++ LIBS=$_SAVE_LIBS ++fi ++ ++AC_SUBST(MOZ_SYSTEM_OGG) ++ ++dnl ======================================================== ++dnl Check for libvorbis ++dnl ======================================================== ++ ++MOZ_ARG_WITH_BOOL(system-vorbis, ++[ --with-system-vorbis Use system libvorbis (located with pkgconfig)], ++MOZ_SYSTEM_VORBIS=1, ++MOZ_SYSTEM_VORBIS=) ++ ++if test -n "$MOZ_SYSTEM_VORBIS"; then ++ PKG_CHECK_MODULES(MOZ_VORBIS, vorbis vorbisenc >= 1.3.5) ++fi ++ ++AC_SUBST(MOZ_SYSTEM_VORBIS) ++ ++dnl ======================================================== ++dnl Check for integer-only libvorbis aka tremor ++dnl ======================================================== ++ ++MOZ_ARG_WITH_BOOL(system-tremor, ++[ --with-system-tremor Use system libtremor (located with pkgconfig)], ++MOZ_SYSTEM_TREMOR=1, ++MOZ_SYSTEM_TREMOR=) ++ ++if test -n "$MOZ_SYSTEM_TREMOR"; then ++ PKG_CHECK_MODULES(MOZ_TREMOR, vorbisidec >= 1.2.1) ++fi ++ ++AC_SUBST(MOZ_SYSTEM_TREMOR) ++ ++dnl ======================================================== ++dnl Check for libtheora ++dnl ======================================================== ++ ++MOZ_ARG_WITH_BOOL(system-theora, ++[ --with-system-theora Use system libtheora (located with pkgconfig)], ++MOZ_SYSTEM_THEORA=1, ++MOZ_SYSTEM_THEORA=) ++ ++if test -n "$MOZ_SYSTEM_THEORA"; then ++ PKG_CHECK_MODULES(MOZ_THEORA, theora >= 1.2) ++fi ++ ++AC_SUBST(MOZ_SYSTEM_THEORA) ++ ++dnl ======================================================== ++dnl Check for libSoundTouch ++dnl ======================================================== ++ ++MOZ_ARG_WITH_BOOL(system-soundtouch, ++[ --with-system-soundtouch Use system libSoundTouch (located with pkgconfig)], ++MOZ_SYSTEM_SOUNDTOUCH=1, ++MOZ_SYSTEM_SOUNDTOUCH=) ++ ++if test -n "$MOZ_SYSTEM_SOUNDTOUCH"; then ++ PKG_CHECK_MODULES(MOZ_SOUNDTOUCH, soundtouch >= 1.9.0) ++ ++ AC_LANG_SAVE ++ AC_LANG_CPLUSPLUS ++ _SAVE_CXXFLAGS=$CXXFLAGS ++ CXXFLAGS="$CXXFLAGS $MOZ_SOUNDTOUCH_CFLAGS" ++ AC_CACHE_CHECK(for soundtouch sample type, ++ ac_cv_soundtouch_sample_type, ++ [AC_TRY_COMPILE([#include ++ #ifndef SOUNDTOUCH_INTEGER_SAMPLES ++ #error soundtouch expects float samples ++ #endif], ++ [], ++ [ac_cv_soundtouch_sample_type=short], ++ [ac_cv_soundtouch_sample_type=float])]) ++ CXXFLAGS=$_SAVE_CXXFLAGS ++ AC_LANG_RESTORE ++ ++ if test \( -n "$MOZ_SAMPLE_TYPE_S16" -a "$ac_cv_soundtouch_sample_type" != short \) \ ++ -o \( -n "$MOZ_SAMPLE_TYPE_FLOAT32" -a "$ac_cv_soundtouch_sample_type" != float \) ; then ++ AC_MSG_ERROR([SoundTouch library is built with incompatible sample type. Either rebuild the library with/without --enable-integer-samples, chase default Mozilla sample type or remove --with-system-soundtouch.]) ++ fi ++fi ++ ++if test -n "$MOZ_SYSTEM_SOUNDTOUCH"; then ++ AC_DEFINE(MOZ_SYSTEM_SOUNDTOUCH) ++fi ++AC_SUBST(MOZ_SYSTEM_SOUNDTOUCH) ++ + dnl system libvpx Support + dnl ======================================================== + MOZ_ARG_WITH_BOOL(system-libvpx, +diff --git toolkit/library/moz.build toolkit/library/moz.build +index 079a575adec3..514d901195de 100644 +--- toolkit/library/moz.build ++++ toolkit/library/moz.build +@@ -237,6 +237,21 @@ if CONFIG['MOZ_SYSTEM_HARFBUZZ']: + if CONFIG['MOZ_SYSTEM_HUNSPELL']: + OS_LIBS += CONFIG['MOZ_HUNSPELL_LIBS'] + ++if CONFIG['MOZ_SYSTEM_OGG']: ++ OS_LIBS += CONFIG['MOZ_OGG_LIBS'] ++ ++if CONFIG['MOZ_SYSTEM_THEORA']: ++ OS_LIBS += CONFIG['MOZ_THEORA_LIBS'] ++ ++if CONFIG['MOZ_SYSTEM_VORBIS']: ++ OS_LIBS += CONFIG['MOZ_VORBIS_LIBS'] ++ ++if CONFIG['MOZ_SYSTEM_TREMOR']: ++ OS_LIBS += CONFIG['MOZ_TREMOR_LIBS'] ++ ++if CONFIG['MOZ_SYSTEM_SOUNDTOUCH']: ++ OS_LIBS += CONFIG['MOZ_SOUNDTOUCH_LIBS'] ++ + if CONFIG['MOZ_SYSTEM_LIBEVENT']: + OS_LIBS += CONFIG['MOZ_LIBEVENT_LIBS'] + +diff --git xpcom/build/XPCOMInit.cpp xpcom/build/XPCOMInit.cpp +index c083ab4bc4f3..62b917043a2c 100644 +--- xpcom/build/XPCOMInit.cpp ++++ xpcom/build/XPCOMInit.cpp +@@ -154,7 +154,9 @@ extern nsresult nsStringInputStreamConstructor(nsISupports*, REFNSIID, void**); + + #include "mozilla/ipc/GeckoChildProcessHost.h" + ++#ifndef MOZ_OGG_NO_MEM_REPORTING + #include "ogg/ogg.h" ++#endif + #if defined(MOZ_VPX) && !defined(MOZ_VPX_NO_MEM_REPORTING) + #if defined(HAVE_STDINT_H) + // mozilla-config.h defines HAVE_STDINT_H, and then it's defined *again* in +@@ -664,11 +666,13 @@ NS_InitXPCOM2(nsIServiceManager** aResult, + // this oddness. + mozilla::SetICUMemoryFunctions(); + ++#ifndef MOZ_OGG_NO_MEM_REPORTING + // Do the same for libogg. + ogg_set_mem_functions(OggReporter::CountingMalloc, + OggReporter::CountingCalloc, + OggReporter::CountingRealloc, + OggReporter::CountingFree); ++#endif + + #if defined(MOZ_VPX) && !defined(MOZ_VPX_NO_MEM_REPORTING) + // And for VPX. Property changes on: head/www/waterfox/files/patch-z-bug517422 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1386957 =================================================================== --- head/www/waterfox/files/patch-bug1386957 (nonexistent) +++ head/www/waterfox/files/patch-bug1386957 (revision 454949) @@ -0,0 +1,14 @@ +https://github.com/kinetiknz/cubeb/commit/16f9ccc064f2 + +--- media/libcubeb/src/cubeb_jack.cpp.orig 2017-07-07 05:37:16 UTC ++++ media/libcubeb/src/cubeb_jack.cpp +@@ -8,7 +8,9 @@ + */ + #define _DEFAULT_SOURCE + #define _BSD_SOURCE ++#ifndef __FreeBSD__ + #define _POSIX_SOURCE ++#endif + #include + #include + #include Property changes on: head/www/waterfox/files/patch-bug1386957 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1388744 =================================================================== --- head/www/waterfox/files/patch-bug1388744 (nonexistent) +++ head/www/waterfox/files/patch-bug1388744 (revision 454949) @@ -0,0 +1,14 @@ +Unbreak pingsender build on Tier3 archs + +--- toolkit/crashreporter/google-breakpad/src/third_party/curl/curlbuild.h ++++ toolkit/crashreporter/google-breakpad/src/third_party/curl/curlbuild.h +@@ -154,8 +154,7 @@ + #endif + + /* The size of `long', as computed by sizeof. */ +-#if defined(_M_X64) || (defined(__x86_64__) && !defined(__ILP32__)) || \ +- defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABI64) ++#if defined(_M_X64) || defined(__LP64__) + #define CURL_SIZEOF_LONG 8 + #else + #define CURL_SIZEOF_LONG 4 Property changes on: head/www/waterfox/files/patch-bug1388744 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1021761 =================================================================== --- head/www/waterfox/files/patch-bug1021761 (nonexistent) +++ head/www/waterfox/files/patch-bug1021761 (revision 454949) @@ -0,0 +1,1218 @@ +diff --git build/moz.configure/old.configure build/moz.configure/old.configure +index cd6c37cf4c7c..e98dc7973a6a 100644 +--- build/moz.configure/old.configure ++++ build/moz.configure/old.configure +@@ -275,6 +275,7 @@ def old_configure_options(*options): + '--with-nspr-prefix', + '--with-nss-exec-prefix', + '--with-nss-prefix', ++ '--with-oss', + '--with-pthreads', + '--with-qemu-exe', + '--with-sixgill', +diff --git old-configure.in old-configure.in +index dff46614635e..dbbfdb76ab78 100644 +--- old-configure.in ++++ old-configure.in +@@ -3128,6 +3128,67 @@ AC_DEFINE(MOZ_WEBM_ENCODER) + AC_SUBST(MOZ_WEBM_ENCODER) + + dnl ================================== ++dnl = Check OSS availability ++dnl ================================== ++ ++dnl If using Linux, Solaris or BSDs, ensure that OSS is available ++case "$OS_TARGET" in ++Linux|SunOS|DragonFly|FreeBSD|NetBSD|GNU/kFreeBSD) ++ MOZ_OSS=1 ++ ;; ++esac ++ ++MOZ_ARG_WITH_STRING(oss, ++[ --with-oss[=PFX] Enable OpenSoundSystem support [installed at prefix PFX]], ++ OSSPREFIX=$withval) ++ ++if test -n "$OSSPREFIX"; then ++ if test "$OSSPREFIX" != "no"; then ++ MOZ_OSS=1 ++ else ++ MOZ_OSS= ++ fi ++fi ++ ++_SAVE_CFLAGS=$CFLAGS ++_SAVE_LIBS=$LIBS ++if test -n "$MOZ_OSS"; then ++ dnl Prefer 4Front implementation ++ AC_MSG_CHECKING([MOZ_OSS_CFLAGS]) ++ if test "$OSSPREFIX" != "yes"; then ++ oss_conf=${OSSPREFIX%/usr}/etc/oss.conf ++ if test -f "$oss_conf"; then ++ . "$oss_conf" ++ else ++ OSSLIBDIR=$OSSPREFIX/lib/oss ++ fi ++ if test -d "$OSSLIBDIR"; then ++ MOZ_OSS_CFLAGS="$MOZ_OSS_CFLAGS -I$OSSLIBDIR/include" ++ fi ++ fi ++ AC_MSG_RESULT([$MOZ_OSS_CFLAGS]) ++ ++ CFLAGS="$CFLAGS $MOZ_OSS_CFLAGS" ++ MOZ_CHECK_HEADERS(sys/soundcard.h soundcard.h) ++ ++ if test "$ac_cv_header_sys_soundcard_h" != "yes" -a \ ++ "$ac_cv_header_soundcard_h" != "yes"; then ++ AC_MSG_ERROR([Need OSS for Ogg, Wave or WebM decoding on $OS_TARGET. Disable with --without-oss.]) ++ fi ++ ++ dnl Assume NetBSD implementation over SunAudio ++ AC_CHECK_LIB(ossaudio, _oss_ioctl, ++ [AC_DEFINE_UNQUOTED(CUBEB_OSS_DEFAULT_OUTPUT, "/dev/sound") ++ MOZ_OSS_LIBS="$MOZ_OSS_LIBS -lossaudio"]) ++fi ++CFLAGS=$_SAVE_CFLAGS ++LIBS=$_SAVE_LIBS ++ ++AC_SUBST(MOZ_OSS) ++AC_SUBST_LIST(MOZ_OSS_CFLAGS) ++AC_SUBST_LIST(MOZ_OSS_LIBS) ++ ++dnl ================================== + dnl = Check alsa availability on Linux + dnl ================================== + +diff --git dom/media/CubebUtils.cpp dom/media/CubebUtils.cpp +index e10e07e06ade..1fd561bea113 100644 +--- dom/media/CubebUtils.cpp ++++ dom/media/CubebUtils.cpp +@@ -71,7 +71,8 @@ const char* AUDIOSTREAM_BACKEND_ID_STR[] = { + "sndio", + "opensl", + "audiotrack", +- "kai" ++ "kai", ++ "oss", + }; + /* Index for failures to create an audio stream the first time. */ + const int CUBEB_BACKEND_INIT_FAILURE_FIRST = +diff --git media/libcubeb/AUTHORS media/libcubeb/AUTHORS +index 0fde65baad34..f8663c43b475 100644 +--- media/libcubeb/AUTHORS ++++ media/libcubeb/AUTHORS +@@ -4,6 +4,7 @@ Michael Wu + Paul Adenot + David Richards + Sebastien Alaiwan ++Evgeniy Vodolazskiy + KO Myung-Hun + Haakon Sporsheim + Alex Chronopoulos +diff --git media/libcubeb/src/cubeb.c media/libcubeb/src/cubeb.c +index 57bcb4c13652..68be024f4a68 100644 +--- media/libcubeb/src/cubeb.c ++++ media/libcubeb/src/cubeb.c +@@ -54,6 +54,9 @@ int audiotrack_init(cubeb ** context, char const * context_name); + #if defined(USE_KAI) + int kai_init(cubeb ** context, char const * context_name); + #endif ++#if defined(USE_OSS) ++int oss_init(cubeb ** context, char const * context_name); ++#endif + + static int + validate_stream_params(cubeb_stream_params * input_stream_params, +@@ -155,6 +158,10 @@ cubeb_init(cubeb ** context, char const * context_name, char const * backend_nam + #if defined(USE_KAI) + init_oneshot = kai_init; + #endif ++ } else if (!strcmp(backend_name, "oss")) { ++#if defined(USE_OSS) ++ init_oneshot = oss_init; ++#endif + } else { + /* Already set */ + } +@@ -196,6 +203,9 @@ cubeb_init(cubeb ** context, char const * context_name, char const * backend_nam + #if defined(USE_KAI) + kai_init, + #endif ++#if defined(USE_OSS) ++ oss_init, ++#endif + }; + int i; + +diff --git media/libcubeb/src/cubeb_alsa.c media/libcubeb/src/cubeb_alsa.c +index 05ad27fef53b..3ea78e994f59 100644 +--- media/libcubeb/src/cubeb_alsa.c ++++ media/libcubeb/src/cubeb_alsa.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -25,6 +26,52 @@ + + #define ALSA_PA_PLUGIN "ALSA <-> PulseAudio PCM I/O Plugin" + ++#ifdef DISABLE_LIBASOUND_DLOPEN ++#define WRAP(x) x ++#else ++#define WRAP(x) cubeb_##x ++#define MAKE_TYPEDEF(x) static typeof(x) * cubeb_##x ++MAKE_TYPEDEF(snd_config); ++MAKE_TYPEDEF(snd_config_add); ++MAKE_TYPEDEF(snd_config_copy); ++MAKE_TYPEDEF(snd_config_delete); ++MAKE_TYPEDEF(snd_config_get_id); ++MAKE_TYPEDEF(snd_config_get_string); ++MAKE_TYPEDEF(snd_config_imake_integer); ++MAKE_TYPEDEF(snd_config_search); ++MAKE_TYPEDEF(snd_config_search_definition); ++MAKE_TYPEDEF(snd_lib_error_set_handler); ++MAKE_TYPEDEF(snd_pcm_avail_update); ++MAKE_TYPEDEF(snd_pcm_close); ++MAKE_TYPEDEF(snd_pcm_delay); ++MAKE_TYPEDEF(snd_pcm_drain); ++MAKE_TYPEDEF(snd_pcm_frames_to_bytes); ++MAKE_TYPEDEF(snd_pcm_get_params); ++/* snd_pcm_hw_params_alloca is actually a macro */ ++/* MAKE_TYPEDEF(snd_pcm_hw_params_alloca); */ ++MAKE_TYPEDEF(snd_pcm_hw_params_sizeof); ++#define snd_pcm_hw_params_sizeof cubeb_snd_pcm_hw_params_sizeof ++MAKE_TYPEDEF(snd_pcm_hw_params_any); ++MAKE_TYPEDEF(snd_pcm_hw_params_get_channels_max); ++MAKE_TYPEDEF(snd_pcm_hw_params_get_rate); ++MAKE_TYPEDEF(snd_pcm_hw_params_set_rate_near); ++MAKE_TYPEDEF(snd_pcm_nonblock); ++MAKE_TYPEDEF(snd_pcm_open); ++MAKE_TYPEDEF(snd_pcm_open_lconf); ++MAKE_TYPEDEF(snd_pcm_pause); ++MAKE_TYPEDEF(snd_pcm_poll_descriptors); ++MAKE_TYPEDEF(snd_pcm_poll_descriptors_count); ++MAKE_TYPEDEF(snd_pcm_poll_descriptors_revents); ++MAKE_TYPEDEF(snd_pcm_readi); ++MAKE_TYPEDEF(snd_pcm_recover); ++MAKE_TYPEDEF(snd_pcm_set_params); ++MAKE_TYPEDEF(snd_pcm_start); ++MAKE_TYPEDEF(snd_pcm_state); ++MAKE_TYPEDEF(snd_pcm_writei); ++ ++#undef MAKE_TYPEDEF ++#endif ++ + /* ALSA is not thread-safe. snd_pcm_t instances are individually protected + by the owning cubeb_stream's mutex. snd_pcm_t creation and destruction + is not thread-safe until ALSA 1.0.24 (see alsa-lib.git commit 91c9c8f1), +@@ -65,6 +112,8 @@ struct cubeb { + workaround is not required. */ + snd_config_t * local_config; + int is_pa; ++ ++ void * libasound; + }; + + enum stream_state { +@@ -243,8 +292,8 @@ set_timeout(struct timeval * timeout, unsigned int ms) + static void + stream_buffer_decrement(cubeb_stream * stm, long count) + { +- char * bufremains = stm->buffer + snd_pcm_frames_to_bytes(stm->pcm, count); +- memmove(stm->buffer, bufremains, snd_pcm_frames_to_bytes(stm->pcm, stm->bufframes - count)); ++ char * bufremains = stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, count); ++ memmove(stm->buffer, bufremains, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes - count)); + stm->bufframes -= count; + } + +@@ -276,9 +325,9 @@ alsa_process_stream(cubeb_stream * stm) + /* Call _poll_descriptors_revents() even if we don't use it + to let underlying plugins clear null events. Otherwise poll() + may wake up again and again, producing unnecessary CPU usage. */ +- snd_pcm_poll_descriptors_revents(stm->pcm, stm->fds, stm->nfds, &revents); ++ WRAP(snd_pcm_poll_descriptors_revents)(stm->pcm, stm->fds, stm->nfds, &revents); + +- avail = snd_pcm_avail_update(stm->pcm); ++ avail = WRAP(snd_pcm_avail_update)(stm->pcm); + + /* Got null event? Bail and wait for another wakeup. */ + if (avail == 0) { +@@ -301,7 +350,7 @@ alsa_process_stream(cubeb_stream * stm) + // TODO: should it be marked as DRAINING? + } + +- got = snd_pcm_readi(stm->pcm, stm->buffer+stm->bufframes, avail); ++ got = WRAP(snd_pcm_readi)(stm->pcm, stm->buffer+stm->bufframes, avail); + + if (got < 0) { + avail = got; // the error handler below will recover us +@@ -345,7 +394,7 @@ alsa_process_stream(cubeb_stream * stm) + (!stm->other_stream || stm->other_stream->bufframes > 0)) { + long got = avail - stm->bufframes; + void * other_buffer = stm->other_stream ? stm->other_stream->buffer : NULL; +- char * buftail = stm->buffer + snd_pcm_frames_to_bytes(stm->pcm, stm->bufframes); ++ char * buftail = stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes); + + /* Correct read size to the other stream available frames */ + if (stm->other_stream && got > (snd_pcm_sframes_t) stm->other_stream->bufframes) { +@@ -372,8 +421,8 @@ alsa_process_stream(cubeb_stream * stm) + long drain_frames = avail - stm->bufframes; + double drain_time = (double) drain_frames / stm->params.rate; + +- char * buftail = stm->buffer + snd_pcm_frames_to_bytes(stm->pcm, stm->bufframes); +- memset(buftail, 0, snd_pcm_frames_to_bytes(stm->pcm, drain_frames)); ++ char * buftail = stm->buffer + WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->bufframes); ++ memset(buftail, 0, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, drain_frames)); + stm->bufframes = avail; + + /* Mark as draining, unless we're waiting for capture */ +@@ -400,7 +449,7 @@ alsa_process_stream(cubeb_stream * stm) + } + } + +- wrote = snd_pcm_writei(stm->pcm, stm->buffer, avail); ++ wrote = WRAP(snd_pcm_writei)(stm->pcm, stm->buffer, avail); + if (wrote < 0) { + avail = wrote; // the error handler below will recover us + } else { +@@ -413,13 +462,13 @@ alsa_process_stream(cubeb_stream * stm) + + /* Got some error? Let's try to recover the stream. */ + if (avail < 0) { +- avail = snd_pcm_recover(stm->pcm, avail, 0); ++ avail = WRAP(snd_pcm_recover)(stm->pcm, avail, 0); + + /* Capture pcm must be started after initial setup/recover */ + if (avail >= 0 && + stm->stream_type == SND_PCM_STREAM_CAPTURE && +- snd_pcm_state(stm->pcm) == SND_PCM_STATE_PREPARED) { +- avail = snd_pcm_start(stm->pcm); ++ WRAP(snd_pcm_state)(stm->pcm) == SND_PCM_STATE_PREPARED) { ++ avail = WRAP(snd_pcm_start)(stm->pcm); + } + } + +@@ -535,26 +584,26 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) + + slave_def = NULL; + +- r = snd_config_search(root_pcm, "slave", &slave_pcm); ++ r = WRAP(snd_config_search)(root_pcm, "slave", &slave_pcm); + if (r < 0) { + return NULL; + } + +- r = snd_config_get_string(slave_pcm, &string); ++ r = WRAP(snd_config_get_string)(slave_pcm, &string); + if (r >= 0) { +- r = snd_config_search_definition(lconf, "pcm_slave", string, &slave_def); ++ r = WRAP(snd_config_search_definition)(lconf, "pcm_slave", string, &slave_def); + if (r < 0) { + return NULL; + } + } + + do { +- r = snd_config_search(slave_def ? slave_def : slave_pcm, "pcm", &pcm); ++ r = WRAP(snd_config_search)(slave_def ? slave_def : slave_pcm, "pcm", &pcm); + if (r < 0) { + break; + } + +- r = snd_config_get_string(slave_def ? slave_def : slave_pcm, &string); ++ r = WRAP(snd_config_get_string)(slave_def ? slave_def : slave_pcm, &string); + if (r < 0) { + break; + } +@@ -563,7 +612,7 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) + if (r < 0 || r > (int) sizeof(node_name)) { + break; + } +- r = snd_config_search(lconf, node_name, &pcm); ++ r = WRAP(snd_config_search)(lconf, node_name, &pcm); + if (r < 0) { + break; + } +@@ -572,7 +621,7 @@ get_slave_pcm_node(snd_config_t * lconf, snd_config_t * root_pcm) + } while (0); + + if (slave_def) { +- snd_config_delete(slave_def); ++ WRAP(snd_config_delete)(slave_def); + } + + return NULL; +@@ -595,22 +644,22 @@ init_local_config_with_workaround(char const * pcm_name) + + lconf = NULL; + +- if (snd_config == NULL) { ++ if (*WRAP(snd_config) == NULL) { + return NULL; + } + +- r = snd_config_copy(&lconf, snd_config); ++ r = WRAP(snd_config_copy)(&lconf, *WRAP(snd_config)); + if (r < 0) { + return NULL; + } + + do { +- r = snd_config_search_definition(lconf, "pcm", pcm_name, &pcm_node); ++ r = WRAP(snd_config_search_definition)(lconf, "pcm", pcm_name, &pcm_node); + if (r < 0) { + break; + } + +- r = snd_config_get_id(pcm_node, &string); ++ r = WRAP(snd_config_get_id)(pcm_node, &string); + if (r < 0) { + break; + } +@@ -619,7 +668,7 @@ init_local_config_with_workaround(char const * pcm_name) + if (r < 0 || r > (int) sizeof(node_name)) { + break; + } +- r = snd_config_search(lconf, node_name, &pcm_node); ++ r = WRAP(snd_config_search)(lconf, node_name, &pcm_node); + if (r < 0) { + break; + } +@@ -630,12 +679,12 @@ init_local_config_with_workaround(char const * pcm_name) + } + + /* Fetch the PCM node's type, and bail out if it's not the PulseAudio plugin. */ +- r = snd_config_search(pcm_node, "type", &node); ++ r = WRAP(snd_config_search)(pcm_node, "type", &node); + if (r < 0) { + break; + } + +- r = snd_config_get_string(node, &string); ++ r = WRAP(snd_config_get_string)(node, &string); + if (r < 0) { + break; + } +@@ -646,18 +695,18 @@ init_local_config_with_workaround(char const * pcm_name) + + /* Don't clobber an explicit existing handle_underrun value, set it only + if it doesn't already exist. */ +- r = snd_config_search(pcm_node, "handle_underrun", &node); ++ r = WRAP(snd_config_search)(pcm_node, "handle_underrun", &node); + if (r != -ENOENT) { + break; + } + + /* Disable pcm_pulse's asynchronous underrun handling. */ +- r = snd_config_imake_integer(&node, "handle_underrun", 0); ++ r = WRAP(snd_config_imake_integer)(&node, "handle_underrun", 0); + if (r < 0) { + break; + } + +- r = snd_config_add(pcm_node, node); ++ r = WRAP(snd_config_add)(pcm_node, node); + if (r < 0) { + break; + } +@@ -665,7 +714,7 @@ init_local_config_with_workaround(char const * pcm_name) + return lconf; + } while (0); + +- snd_config_delete(lconf); ++ WRAP(snd_config_delete)(lconf); + + return NULL; + } +@@ -677,9 +726,9 @@ alsa_locked_pcm_open(snd_pcm_t ** pcm, char const * pcm_name, snd_pcm_stream_t s + + pthread_mutex_lock(&cubeb_alsa_mutex); + if (local_config) { +- r = snd_pcm_open_lconf(pcm, pcm_name, stream, SND_PCM_NONBLOCK, local_config); ++ r = WRAP(snd_pcm_open_lconf)(pcm, pcm_name, stream, SND_PCM_NONBLOCK, local_config); + } else { +- r = snd_pcm_open(pcm, pcm_name, stream, SND_PCM_NONBLOCK); ++ r = WRAP(snd_pcm_open)(pcm, pcm_name, stream, SND_PCM_NONBLOCK); + } + pthread_mutex_unlock(&cubeb_alsa_mutex); + +@@ -692,7 +741,7 @@ alsa_locked_pcm_close(snd_pcm_t * pcm) + int r; + + pthread_mutex_lock(&cubeb_alsa_mutex); +- r = snd_pcm_close(pcm); ++ r = WRAP(snd_pcm_close)(pcm); + pthread_mutex_unlock(&cubeb_alsa_mutex); + + return r; +@@ -755,12 +804,65 @@ alsa_init(cubeb ** context, char const * context_name) + pthread_attr_t attr; + snd_pcm_t * dummy; + ++ void * libasound = NULL; ++ ++#ifndef DISABLE_LIBASOUND_DLOPEN ++ libasound = dlopen("libasound.so", RTLD_LAZY); ++ if (!libasound) { ++ return CUBEB_ERROR; ++ } ++ ++#define LOAD(x) do { \ ++ cubeb_##x = dlsym(libasound, #x); \ ++ if (!cubeb_##x) { \ ++ dlclose(libasound); \ ++ return CUBEB_ERROR; \ ++ } \ ++ } while(0) ++ ++ LOAD(snd_config); ++ LOAD(snd_config_add); ++ LOAD(snd_config_copy); ++ LOAD(snd_config_delete); ++ LOAD(snd_config_get_id); ++ LOAD(snd_config_get_string); ++ LOAD(snd_config_imake_integer); ++ LOAD(snd_config_search); ++ LOAD(snd_config_search_definition); ++ LOAD(snd_lib_error_set_handler); ++ LOAD(snd_pcm_avail_update); ++ LOAD(snd_pcm_close); ++ LOAD(snd_pcm_delay); ++ LOAD(snd_pcm_drain); ++ LOAD(snd_pcm_frames_to_bytes); ++ LOAD(snd_pcm_get_params); ++ /* snd_pcm_hw_params_alloca is actually a macro */ ++ /* LOAD(snd_pcm_hw_params_alloca); */ ++ LOAD(snd_pcm_hw_params_sizeof); ++ LOAD(snd_pcm_hw_params_any); ++ LOAD(snd_pcm_hw_params_get_channels_max); ++ LOAD(snd_pcm_hw_params_get_rate); ++ LOAD(snd_pcm_hw_params_set_rate_near); ++ LOAD(snd_pcm_nonblock); ++ LOAD(snd_pcm_open); ++ LOAD(snd_pcm_open_lconf); ++ LOAD(snd_pcm_pause); ++ LOAD(snd_pcm_poll_descriptors); ++ LOAD(snd_pcm_poll_descriptors_count); ++ LOAD(snd_pcm_poll_descriptors_revents); ++ LOAD(snd_pcm_recover); ++ LOAD(snd_pcm_set_params); ++ LOAD(snd_pcm_state); ++ LOAD(snd_pcm_writei); ++ ++#undef LOAD ++#endif + assert(context); + *context = NULL; + + pthread_mutex_lock(&cubeb_alsa_mutex); + if (!cubeb_alsa_error_handler_set) { +- snd_lib_error_set_handler(silent_error_handler); ++ WRAP(snd_lib_error_set_handler)(silent_error_handler); + cubeb_alsa_error_handler_set = 1; + } + pthread_mutex_unlock(&cubeb_alsa_mutex); +@@ -768,6 +870,8 @@ alsa_init(cubeb ** context, char const * context_name) + ctx = calloc(1, sizeof(*ctx)); + assert(ctx); + ++ ctx->libasound = libasound; ++ + ctx->ops = &alsa_ops; + + r = pthread_mutex_init(&ctx->mutex, NULL); +@@ -817,7 +921,7 @@ alsa_init(cubeb ** context, char const * context_name) + config fails with EINVAL, the PA PCM is too old for this workaround. */ + if (r == -EINVAL) { + pthread_mutex_lock(&cubeb_alsa_mutex); +- snd_config_delete(ctx->local_config); ++ WRAP(snd_config_delete)(ctx->local_config); + pthread_mutex_unlock(&cubeb_alsa_mutex); + ctx->local_config = NULL; + } else if (r >= 0) { +@@ -857,9 +961,13 @@ alsa_destroy(cubeb * ctx) + pthread_mutex_destroy(&ctx->mutex); + free(ctx->fds); + ++ if (ctx->libasound) { ++ dlclose(ctx->libasound); ++ } ++ + if (ctx->local_config) { + pthread_mutex_lock(&cubeb_alsa_mutex); +- snd_config_delete(ctx->local_config); ++ WRAP(snd_config_delete)(ctx->local_config); + pthread_mutex_unlock(&cubeb_alsa_mutex); + } + +@@ -939,7 +1047,7 @@ alsa_stream_init_single(cubeb * ctx, cubeb_stream ** stream, char const * stream + return CUBEB_ERROR; + } + +- r = snd_pcm_nonblock(stm->pcm, 1); ++ r = WRAP(snd_pcm_nonblock)(stm->pcm, 1); + assert(r == 0); + + latency_us = latency_frames * 1e6 / stm->params.rate; +@@ -952,7 +1060,7 @@ alsa_stream_init_single(cubeb * ctx, cubeb_stream ** stream, char const * stream + latency_us = latency_us < min_latency ? min_latency: latency_us; + } + +- r = snd_pcm_set_params(stm->pcm, format, SND_PCM_ACCESS_RW_INTERLEAVED, ++ r = WRAP(snd_pcm_set_params)(stm->pcm, format, SND_PCM_ACCESS_RW_INTERLEAVED, + stm->params.channels, stm->params.rate, 1, + latency_us); + if (r < 0) { +@@ -960,20 +1068,20 @@ alsa_stream_init_single(cubeb * ctx, cubeb_stream ** stream, char const * stream + return CUBEB_ERROR_INVALID_FORMAT; + } + +- r = snd_pcm_get_params(stm->pcm, &stm->buffer_size, &period_size); ++ r = WRAP(snd_pcm_get_params)(stm->pcm, &stm->buffer_size, &period_size); + assert(r == 0); + + /* Double internal buffer size to have enough space when waiting for the other side of duplex connection */ + stm->buffer_size *= 2; +- stm->buffer = calloc(1, snd_pcm_frames_to_bytes(stm->pcm, stm->buffer_size)); ++ stm->buffer = calloc(1, WRAP(snd_pcm_frames_to_bytes)(stm->pcm, stm->buffer_size)); + assert(stm->buffer); + +- stm->nfds = snd_pcm_poll_descriptors_count(stm->pcm); ++ stm->nfds = WRAP(snd_pcm_poll_descriptors_count)(stm->pcm); + assert(stm->nfds > 0); + + stm->saved_fds = calloc(stm->nfds, sizeof(struct pollfd)); + assert(stm->saved_fds); +- r = snd_pcm_poll_descriptors(stm->pcm, stm->saved_fds, stm->nfds); ++ r = WRAP(snd_pcm_poll_descriptors)(stm->pcm, stm->saved_fds, stm->nfds); + assert((nfds_t) r == stm->nfds); + + if (alsa_register_stream(ctx, stm) != 0) { +@@ -1048,7 +1156,7 @@ alsa_stream_destroy(cubeb_stream * stm) + pthread_mutex_lock(&stm->mutex); + if (stm->pcm) { + if (stm->state == DRAINING) { +- snd_pcm_drain(stm->pcm); ++ WRAP(snd_pcm_drain)(stm->pcm); + } + alsa_locked_pcm_close(stm->pcm); + stm->pcm = NULL; +@@ -1094,12 +1202,12 @@ alsa_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) + + assert(stm); + +- r = snd_pcm_hw_params_any(stm->pcm, hw_params); ++ r = WRAP(snd_pcm_hw_params_any)(stm->pcm, hw_params); + if (r < 0) { + return CUBEB_ERROR; + } + +- r = snd_pcm_hw_params_get_channels_max(hw_params, max_channels); ++ r = WRAP(snd_pcm_hw_params_get_channels_max)(hw_params, max_channels); + if (r < 0) { + return CUBEB_ERROR; + } +@@ -1120,34 +1228,34 @@ alsa_get_preferred_sample_rate(cubeb * ctx, uint32_t * rate) { + + /* get a pcm, disabling resampling, so we get a rate the + * hardware/dmix/pulse/etc. supports. */ +- r = snd_pcm_open(&pcm, CUBEB_ALSA_PCM_NAME, SND_PCM_STREAM_PLAYBACK, SND_PCM_NO_AUTO_RESAMPLE); ++ r = WRAP(snd_pcm_open)(&pcm, CUBEB_ALSA_PCM_NAME, SND_PCM_STREAM_PLAYBACK, SND_PCM_NO_AUTO_RESAMPLE); + if (r < 0) { + return CUBEB_ERROR; + } + +- r = snd_pcm_hw_params_any(pcm, hw_params); ++ r = WRAP(snd_pcm_hw_params_any)(pcm, hw_params); + if (r < 0) { +- snd_pcm_close(pcm); ++ WRAP(snd_pcm_close)(pcm); + return CUBEB_ERROR; + } + +- r = snd_pcm_hw_params_get_rate(hw_params, rate, &dir); ++ r = WRAP(snd_pcm_hw_params_get_rate)(hw_params, rate, &dir); + if (r >= 0) { + /* There is a default rate: use it. */ +- snd_pcm_close(pcm); ++ WRAP(snd_pcm_close)(pcm); + return CUBEB_OK; + } + + /* Use a common rate, alsa may adjust it based on hw/etc. capabilities. */ + *rate = 44100; + +- r = snd_pcm_hw_params_set_rate_near(pcm, hw_params, rate, NULL); ++ r = WRAP(snd_pcm_hw_params_set_rate_near)(pcm, hw_params, rate, NULL); + if (r < 0) { +- snd_pcm_close(pcm); ++ WRAP(snd_pcm_close)(pcm); + return CUBEB_ERROR; + } + +- snd_pcm_close(pcm); ++ WRAP(snd_pcm_close)(pcm); + + return CUBEB_OK; + } +@@ -1180,10 +1288,10 @@ alsa_stream_start(cubeb_stream * stm) + pthread_mutex_lock(&stm->mutex); + /* Capture pcm must be started after initial setup/recover */ + if (stm->stream_type == SND_PCM_STREAM_CAPTURE && +- snd_pcm_state(stm->pcm) == SND_PCM_STATE_PREPARED) { +- snd_pcm_start(stm->pcm); ++ WRAP(snd_pcm_state)(stm->pcm) == SND_PCM_STATE_PREPARED) { ++ WRAP(snd_pcm_start)(stm->pcm); + } +- snd_pcm_pause(stm->pcm, 0); ++ WRAP(snd_pcm_pause)(stm->pcm, 0); + gettimeofday(&stm->last_activity, NULL); + pthread_mutex_unlock(&stm->mutex); + +@@ -1223,7 +1331,7 @@ alsa_stream_stop(cubeb_stream * stm) + pthread_mutex_unlock(&ctx->mutex); + + pthread_mutex_lock(&stm->mutex); +- snd_pcm_pause(stm->pcm, 1); ++ WRAP(snd_pcm_pause)(stm->pcm, 1); + pthread_mutex_unlock(&stm->mutex); + + return CUBEB_OK; +@@ -1239,8 +1347,8 @@ alsa_stream_get_position(cubeb_stream * stm, uint64_t * position) + pthread_mutex_lock(&stm->mutex); + + delay = -1; +- if (snd_pcm_state(stm->pcm) != SND_PCM_STATE_RUNNING || +- snd_pcm_delay(stm->pcm, &delay) != 0) { ++ if (WRAP(snd_pcm_state)(stm->pcm) != SND_PCM_STATE_RUNNING || ++ WRAP(snd_pcm_delay)(stm->pcm, &delay) != 0) { + *position = stm->last_position; + pthread_mutex_unlock(&stm->mutex); + return CUBEB_OK; +@@ -1265,7 +1373,7 @@ alsa_stream_get_latency(cubeb_stream * stm, uint32_t * latency) + snd_pcm_sframes_t delay; + /* This function returns the delay in frames until a frame written using + snd_pcm_writei is sent to the DAC. The DAC delay should be < 1ms anyways. */ +- if (snd_pcm_delay(stm->pcm, &delay)) { ++ if (WRAP(snd_pcm_delay)(stm->pcm, &delay)) { + return CUBEB_ERROR; + } + +diff --git media/libcubeb/src/cubeb_oss.c media/libcubeb/src/cubeb_oss.c +new file mode 100644 +index 000000000000..7b0b4f37dbe4 +--- /dev/null ++++ media/libcubeb/src/cubeb_oss.c +@@ -0,0 +1,445 @@ ++/* ++ * Copyright © 2014 Mozilla Foundation ++ * ++ * This program is made available under an ISC-style license. See the ++ * accompanying file LICENSE for details. ++ */ ++#if defined(HAVE_SYS_SOUNDCARD_H) ++#include ++#else ++#include ++#endif ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "cubeb/cubeb.h" ++#include "cubeb-internal.h" ++ ++#ifndef CUBEB_OSS_DEFAULT_OUTPUT ++#define CUBEB_OSS_DEFAULT_OUTPUT "/dev/dsp" ++#endif ++ ++#define OSS_BUFFER_SIZE 1024 ++ ++struct cubeb { ++ struct cubeb_ops const * ops; ++}; ++ ++struct cubeb_stream { ++ cubeb * context; ++ ++ cubeb_data_callback data_callback; ++ cubeb_state_callback state_callback; ++ void * user_ptr; ++ float volume; ++ float panning; ++ ++ pthread_mutex_t state_mutex; ++ pthread_cond_t state_cond; ++ ++ int running; ++ int stopped; ++ int floating; ++ ++ /* These two vars are needed to support old versions of OSS */ ++ unsigned int position_bytes; ++ unsigned int last_position_bytes; ++ ++ uint64_t written_frags; /* The number of fragments written to /dev/dsp */ ++ uint64_t missed_frags; /* fragments output with stopped stream */ ++ ++ cubeb_stream_params params; ++ int fd; ++ pthread_t th; ++}; ++ ++static struct cubeb_ops const oss_ops; ++ ++int oss_init(cubeb ** context, char const * context_name) ++{ ++ cubeb* ctx = (cubeb*)malloc(sizeof(cubeb)); ++ ctx->ops = &oss_ops; ++ *context = ctx; ++ return CUBEB_OK; ++} ++ ++static void oss_destroy(cubeb *ctx) ++{ ++ free(ctx); ++} ++ ++static char const * oss_get_backend_id(cubeb * context) ++{ ++ static char oss_name[] = "oss"; ++ return oss_name; ++} ++ ++static int oss_get_max_channel_count(cubeb * ctx, uint32_t * max_channels) ++{ ++ *max_channels = 2; /* Let's support only stereo for now */ ++ return CUBEB_OK; ++} ++ ++static int oss_get_min_latency(cubeb * context, cubeb_stream_params params, ++ uint32_t * latency_frames) ++{ ++ (void)context; ++ /* 40ms is a big enough number to work ok */ ++ *latency_frames = 40 * params.rate / 1000; ++ return CUBEB_OK; ++} ++ ++static int oss_get_preferred_sample_rate(cubeb *context, uint32_t * rate) ++{ ++ /* 48000 seems a prefered choice for most audio devices ++ * and a good choice for OSS */ ++ *rate = 48000; ++ return CUBEB_OK; ++} ++ ++static void run_state_callback(cubeb_stream *stream, cubeb_state state) ++{ ++ if (stream->state_callback) { ++ stream->state_callback(stream, stream->user_ptr, state); ++ } ++} ++ ++static long run_data_callback(cubeb_stream *stream, void *buffer, long nframes) ++{ ++ long got = 0; ++ pthread_mutex_lock(&stream->state_mutex); ++ if (stream->data_callback && stream->running && !stream->stopped) { ++ pthread_mutex_unlock(&stream->state_mutex); ++ got = stream->data_callback(stream, stream->user_ptr, NULL, buffer, nframes); ++ } else { ++ pthread_mutex_unlock(&stream->state_mutex); ++ } ++ return got; ++} ++ ++static void apply_volume_int(int16_t* buffer, unsigned int n, ++ float volume, float panning) ++{ ++ float left = volume; ++ float right = volume; ++ unsigned int i; ++ int pan[2]; ++ if (panning<0) { ++ right *= (1+panning); ++ } else { ++ left *= (1-panning); ++ } ++ pan[0] = 128.0*left; ++ pan[1] = 128.0*right; ++ for(i=0; irunning) { ++ pthread_mutex_lock(&stream->state_mutex); ++ if (stream->stopped) { ++ pthread_mutex_unlock(&stream->state_mutex); ++ run_state_callback(stream, CUBEB_STATE_STOPPED); ++ pthread_mutex_lock(&stream->state_mutex); ++ while (stream->stopped) { ++ pthread_cond_wait(&stream->state_cond, &stream->state_mutex); ++ } ++ pthread_mutex_unlock(&stream->state_mutex); ++ run_state_callback(stream, CUBEB_STATE_STARTED); ++ continue; ++ } ++ pthread_mutex_unlock(&stream->state_mutex); ++ if (stream->floating) { ++ got = run_data_callback(stream, f_buffer, ++ OSS_BUFFER_SIZE/stream->params.channels); ++ apply_volume_float(f_buffer, got*stream->params.channels, ++ stream->volume, stream->panning); ++ for (i=0; i<((unsigned long)got)*stream->params.channels; i++) { ++ /* Clipping is prefered to overflow */ ++ if(f_buffer[i]>=1.0){ ++ f_buffer[i]=1.0; ++ } ++ if(f_buffer[i]<=-1.0){ ++ f_buffer[i]=-1.0; ++ } ++ /* One might think that multipling by 32767.0 is logical but results in clipping */ ++ buffer[i] = f_buffer[i]*32767.0; ++ } ++ } else { ++ got = run_data_callback(stream, buffer, ++ OSS_BUFFER_SIZE/stream->params.channels); ++ apply_volume_int(buffer, got*stream->params.channels, ++ stream->volume, stream->panning); ++ } ++ if (got<0) { ++ run_state_callback(stream, CUBEB_STATE_ERROR); ++ break; ++ } ++ if (!got) { ++ run_state_callback(stream, CUBEB_STATE_DRAINED); ++ } ++ if (got) { ++ size_t i = 0; ++ size_t s = got*stream->params.channels*sizeof(int16_t); ++ while (i < s) { ++ ssize_t n = write(stream->fd, ((char*)buffer) + i, s - i); ++ if (n<=0) { ++ run_state_callback(stream, CUBEB_STATE_ERROR); ++ break; ++ } ++ i+=n; ++ } ++ stream->written_frags+=got; ++ } ++ } ++ return NULL; ++} ++ ++static void oss_try_set_latency(cubeb_stream* stream, unsigned int latency) ++{ ++ unsigned int latency_bytes, n_frag; ++ int frag; ++ /* fragment size of 1024 is a good choice with good chances to be accepted */ ++ unsigned int frag_log=10; /* 2^frag_log = fragment size */ ++ latency_bytes = ++ latency*stream->params.rate*stream->params.channels*sizeof(uint16_t)/1000; ++ n_frag = latency_bytes>>frag_log; ++ frag = (n_frag<<16) | frag_log; ++ /* Even if this fails we wish to continue, not checking for errors */ ++ ioctl(stream->fd, SNDCTL_DSP_SETFRAGMENT, &frag); ++} ++ ++static int oss_stream_init(cubeb * context, cubeb_stream ** stm, ++ char const * stream_name, ++ cubeb_devid input_device, ++ cubeb_stream_params * input_stream_params, ++ cubeb_devid output_device, ++ cubeb_stream_params * output_stream_params, ++ unsigned int latency, ++ cubeb_data_callback data_callback, ++ cubeb_state_callback state_callback, void * user_ptr) ++{ ++ cubeb_stream* stream = (cubeb_stream*)malloc(sizeof(cubeb_stream)); ++ stream->context = context; ++ stream->data_callback = data_callback; ++ stream->state_callback = state_callback; ++ stream->user_ptr = user_ptr; ++ ++ assert(!input_stream_params && "not supported."); ++ if (input_device || output_device) { ++ /* Device selection not yet implemented. */ ++ return CUBEB_ERROR_DEVICE_UNAVAILABLE; ++ } ++ ++ if ((stream->fd = open(CUBEB_OSS_DEFAULT_OUTPUT, O_WRONLY)) == -1) { ++ free(stream); ++ return CUBEB_ERROR; ++ } ++#define SET(what, to) do { unsigned int i = to; \ ++ int j = ioctl(stream->fd, what, &i); \ ++ if (j == -1 || i != to) { \ ++ close(stream->fd); \ ++ free(stream); \ ++ return CUBEB_ERROR_INVALID_FORMAT; } } while (0) ++ ++ stream->params = *output_stream_params; ++ stream->volume = 1.0; ++ stream->panning = 0.0; ++ ++ oss_try_set_latency(stream, latency); ++ ++ stream->floating = 0; ++ SET(SNDCTL_DSP_CHANNELS, stream->params.channels); ++ SET(SNDCTL_DSP_SPEED, stream->params.rate); ++ switch (stream->params.format) { ++ case CUBEB_SAMPLE_S16LE: ++ SET(SNDCTL_DSP_SETFMT, AFMT_S16_LE); ++ break; ++ case CUBEB_SAMPLE_S16BE: ++ SET(SNDCTL_DSP_SETFMT, AFMT_S16_BE); ++ break; ++ case CUBEB_SAMPLE_FLOAT32LE: ++ SET(SNDCTL_DSP_SETFMT, AFMT_S16_NE); ++ stream->floating = 1; ++ break; ++ default: ++ close(stream->fd); ++ free(stream); ++ return CUBEB_ERROR; ++ } ++ ++ ++ pthread_mutex_init(&stream->state_mutex, NULL); ++ pthread_cond_init(&stream->state_cond, NULL); ++ ++ stream->running = 1; ++ stream->stopped = 1; ++ stream->position_bytes = 0; ++ stream->last_position_bytes = 0; ++ stream->written_frags = 0; ++ stream->missed_frags = 0; ++ ++ pthread_create(&stream->th, NULL, writer, (void*)stream); ++ ++ *stm = stream; ++ ++ return CUBEB_OK; ++} ++ ++static void oss_stream_destroy(cubeb_stream * stream) ++{ ++ pthread_mutex_lock(&stream->state_mutex); ++ ++ stream->running = 0; ++ stream->stopped = 0; ++ pthread_cond_signal(&stream->state_cond); ++ ++ pthread_mutex_unlock(&stream->state_mutex); ++ ++ pthread_join(stream->th, NULL); ++ ++ pthread_mutex_destroy(&stream->state_mutex); ++ pthread_cond_destroy(&stream->state_cond); ++ close(stream->fd); ++ free(stream); ++} ++ ++static int oss_stream_get_latency(cubeb_stream * stream, uint32_t * latency) ++{ ++ if (ioctl(stream->fd, SNDCTL_DSP_GETODELAY, latency)==-1) { ++ return CUBEB_ERROR; ++ } ++ /* Convert latency from bytes to frames */ ++ *latency /= stream->params.channels*sizeof(int16_t); ++ return CUBEB_OK; ++} ++ ++ ++static int oss_stream_current_optr(cubeb_stream * stream, uint64_t * position) ++{ ++ count_info ci; ++ /* Unfortunately, this ioctl is only available in OSS 4.x */ ++#ifdef SNDCTL_DSP_CURRENT_OPTR ++ oss_count_t count; ++ if (ioctl(stream->fd, SNDCTL_DSP_CURRENT_OPTR, &count) != -1) { ++ *position = count.samples;// + count.fifo_samples; ++ return CUBEB_OK; ++ } ++#endif ++ /* Fall back to this ioctl in case the previous one fails */ ++ if (ioctl(stream->fd, SNDCTL_DSP_GETOPTR, &ci) == -1) { ++ return CUBEB_ERROR; ++ } ++ /* ci.bytes is only 32 bit and will start to wrap after arithmetic overflow */ ++ stream->position_bytes += ci.bytes - stream->last_position_bytes; ++ stream->last_position_bytes = ci.bytes; ++ *position = stream->position_bytes/stream->params.channels/sizeof(int16_t); ++ return CUBEB_OK; ++} ++ ++static int oss_stream_get_position(cubeb_stream * stream, uint64_t * position) ++{ ++ if ( oss_stream_current_optr(stream, position) == CUBEB_OK ){ ++ *position -= stream->missed_frags; ++ return CUBEB_OK; ++ } ++ /* If no correct method to get position works we resort to this */ ++ *position = stream->written_frags; ++ return CUBEB_OK; ++} ++ ++ ++static int oss_stream_start(cubeb_stream * stream) ++{ ++ pthread_mutex_lock(&stream->state_mutex); ++ if (stream->stopped) { ++ uint64_t ptr; ++ oss_stream_current_optr(stream, &ptr); ++ stream->missed_frags = ptr - stream->written_frags; ++ stream->stopped = 0; ++ pthread_cond_signal(&stream->state_cond); ++ } ++ pthread_mutex_unlock(&stream->state_mutex); ++ return CUBEB_OK; ++} ++ ++static int oss_stream_stop(cubeb_stream * stream) ++{ ++ pthread_mutex_lock(&stream->state_mutex); ++ stream->stopped = 1; ++ pthread_mutex_unlock(&stream->state_mutex); ++ return CUBEB_OK; ++} ++ ++int oss_stream_set_panning(cubeb_stream * stream, float panning) ++{ ++ if (stream->params.channels == 2) { ++ stream->panning=panning; ++ } ++ return CUBEB_OK; ++} ++ ++int oss_stream_set_volume(cubeb_stream * stream, float volume) ++{ ++ stream->volume=volume; ++ return CUBEB_OK; ++} ++ ++static struct cubeb_ops const oss_ops = { ++ .init = oss_init, ++ .get_backend_id = oss_get_backend_id, ++ .get_max_channel_count = oss_get_max_channel_count, ++ .get_min_latency = oss_get_min_latency, ++ .get_preferred_sample_rate = oss_get_preferred_sample_rate, ++ .get_preferred_channel_layout = NULL, ++ .destroy = oss_destroy, ++ .enumerate_devices = NULL, ++ .stream_init = oss_stream_init, ++ .stream_destroy = oss_stream_destroy, ++ .stream_start = oss_stream_start, ++ .stream_stop = oss_stream_stop, ++ .stream_get_position = oss_stream_get_position, ++ .stream_get_latency = oss_stream_get_latency, ++ .stream_set_volume = oss_stream_set_volume, ++ .stream_set_panning = oss_stream_set_panning, ++ .stream_get_current_device = NULL, ++ .stream_device_destroy = NULL, ++ .stream_register_device_changed_callback = NULL, ++ .register_device_collection_changed = NULL ++}; +diff --git media/libcubeb/src/moz.build media/libcubeb/src/moz.build +index fc9c79198e30..57d039d5a0f2 100644 +--- media/libcubeb/src/moz.build ++++ media/libcubeb/src/moz.build +@@ -20,6 +20,12 @@ if CONFIG['MOZ_ALSA']: + ] + DEFINES['USE_ALSA'] = True + ++if CONFIG['MOZ_OSS']: ++ SOURCES += [ ++ 'cubeb_oss.c', ++ ] ++ DEFINES['USE_OSS'] = True ++ + if CONFIG['MOZ_PULSEAUDIO'] or CONFIG['MOZ_JACK']: + SOURCES += [ + 'cubeb_resampler.cpp', +@@ -92,6 +98,7 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk': + '%' + '%s/system/media/wilhelm/include' % CONFIG['ANDROID_SOURCE'], + ] + ++CFLAGS += CONFIG['MOZ_OSS_CFLAGS'] + CFLAGS += CONFIG['MOZ_ALSA_CFLAGS'] + CFLAGS += CONFIG['MOZ_PULSEAUDIO_CFLAGS'] + +diff --git media/libcubeb/gtest/moz.build media/libcubeb/gtest/moz.build +index e99968648554..efbbbf779e11 100644 +--- media/libcubeb/gtest/moz.build ++++ media/libcubeb/gtest/moz.build +@@ -71,7 +71,6 @@ elif CONFIG['OS_TARGET'] == 'OpenBSD': + 'sndio', + ] + else: +- OS_LIBS += CONFIG['MOZ_ALSA_LIBS'] + OS_LIBS += CONFIG['MOZ_PULSEAUDIO_LIBS'] + + if CONFIG['GNU_CXX']: +diff --git media/libcubeb/update.sh media/libcubeb/update.sh +index b139b8f497fd..d1f8a223c6d8 100755 +--- media/libcubeb/update.sh ++++ media/libcubeb/update.sh +@@ -20,6 +20,7 @@ cp $1/src/cubeb_log.h src + cp $1/src/cubeb_mixer.cpp src + cp $1/src/cubeb_mixer.h src + cp $1/src/cubeb_opensl.c src ++cp $1/src/cubeb_oss.c src + cp $1/src/cubeb_osx_run_loop.h src + cp $1/src/cubeb_panner.cpp src + cp $1/src/cubeb_panner.h src +diff --git toolkit/library/moz.build toolkit/library/moz.build +index a61c689c83c3..7764df6f8a6b 100644 +--- toolkit/library/moz.build ++++ toolkit/library/moz.build +@@ -242,8 +242,8 @@ if CONFIG['MOZ_SYSTEM_LIBVPX']: + if not CONFIG['MOZ_TREE_PIXMAN']: + OS_LIBS += CONFIG['MOZ_PIXMAN_LIBS'] + +-if CONFIG['MOZ_ALSA']: +- OS_LIBS += CONFIG['MOZ_ALSA_LIBS'] ++if CONFIG['MOZ_OSS']: ++ OS_LIBS += CONFIG['MOZ_OSS_LIBS'] + + if CONFIG['HAVE_CLOCK_MONOTONIC']: + OS_LIBS += CONFIG['REALTIME_LIBS'] Property changes on: head/www/waterfox/files/patch-bug1021761 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug702179 =================================================================== --- head/www/waterfox/files/patch-bug702179 (nonexistent) +++ head/www/waterfox/files/patch-bug702179 (revision 454949) @@ -0,0 +1,12 @@ +Don't build static JS lib to make sure DTrace probes are picked up. + +--- js/src/build/moz.build.orig 2017-04-16 18:00:50 UTC ++++ js/src/build/moz.build +@@ -71,7 +71,3 @@ if CONFIG['OS_ARCH'] == 'SunOS': + ] + + OS_LIBS += CONFIG['REALTIME_LIBS'] +- +-NO_EXPAND_LIBS = True +- +-DIST_INSTALL = True Property changes on: head/www/waterfox/files/patch-bug702179 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-third__party_python_futures_concurrent_futures_process.py =================================================================== --- head/www/waterfox/files/patch-third__party_python_futures_concurrent_futures_process.py (nonexistent) +++ head/www/waterfox/files/patch-third__party_python_futures_concurrent_futures_process.py (revision 454949) @@ -0,0 +1,15 @@ +--- third_party/python/futures/concurrent/futures/process.py.orig 2017-04-11 04:15:19 UTC ++++ third_party/python/futures/concurrent/futures/process.py +@@ -247,7 +247,11 @@ def _check_system_limits(): + _system_limits_checked = True + try: + import os +- nsems_max = os.sysconf("SC_SEM_NSEMS_MAX") ++ if sys.platform.startswith('freebsd'): ++ # sem(4) confuses sysconf(3) on FreeBSD < 11.1 ++ nsems_max = -1 ++ else: ++ nsems_max = os.sysconf("SC_SEM_NSEMS_MAX") + except (AttributeError, ValueError): + # sysconf not available or setting not available + return Property changes on: head/www/waterfox/files/patch-third__party_python_futures_concurrent_futures_process.py ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-env-api-keys =================================================================== --- head/www/waterfox/files/patch-env-api-keys (nonexistent) +++ head/www/waterfox/files/patch-env-api-keys (revision 454949) @@ -0,0 +1,21 @@ +# Accept API keys from environment like before bug 1294585 + +--- build/moz.configure/keyfiles.configure ++++ build/moz.configure/keyfiles.configure +@@ -18,6 +18,7 @@ def keyfile(desc, help=None, callback=lambda x: x): + @checking('for the %s key' % desc, lambda x: x and x is not no_key) + @imports(_from='__builtin__', _import='open') + @imports(_from='__builtin__', _import='IOError') ++ @imports(_from='os', _import='environ') + def keyfile(value): + if value: + try: +@@ -28,7 +29,7 @@ def keyfile(desc, help=None, callback=lambda x: x): + raise FatalCheckError("'%s' is empty." % value[0]) + except IOError as e: + raise FatalCheckError("'%s': %s." % (value[0], e.strerror)) +- return no_key ++ return environ.get('MOZ_%s_KEY' % desc.upper().replace(' ', '_')) or no_key + + return keyfile + Property changes on: head/www/waterfox/files/patch-env-api-keys ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-browser-app-nsBrowserApp.cpp =================================================================== --- head/www/waterfox/files/patch-browser-app-nsBrowserApp.cpp (nonexistent) +++ head/www/waterfox/files/patch-browser-app-nsBrowserApp.cpp (revision 454949) @@ -0,0 +1,12 @@ +--- browser/app/nsBrowserApp.cpp.orig 2016-09-19 16:19:28 UTC ++++ browser/app/nsBrowserApp.cpp +@@ -324,6 +324,9 @@ int main(int argc, char* argv[], char* e + { + mozilla::TimeStamp start = mozilla::TimeStamp::Now(); + ++ setenv("MOZ_GMP_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko", 0); ++ setenv("MOZ_PLUGIN_PATH", "%%LOCALBASE%%/lib/browser_plugins/symlinks/gecko", 0); ++ + #ifdef HAS_DLL_BLOCKLIST + DllBlocklist_Initialize(); + Property changes on: head/www/waterfox/files/patch-browser-app-nsBrowserApp.cpp ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug1288587 =================================================================== --- head/www/waterfox/files/patch-bug1288587 (nonexistent) +++ head/www/waterfox/files/patch-bug1288587 (revision 454949) @@ -0,0 +1,67 @@ +diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure +index 855214a..1e91d51 100644 +--- build/moz.configure/init.configure ++++ build/moz.configure/init.configure +@@ -165,16 +165,17 @@ option(env='PYTHON', nargs=1, help='Python interpreter') + # ============================================================== + @depends('PYTHON', check_build_environment, mozconfig, '--help') + @imports('os') + @imports('sys') + @imports('subprocess') + @imports(_from='mozbuild.configure.util', _import='LineIO') + @imports(_from='mozbuild.virtualenv', _import='VirtualenvManager') + @imports(_from='mozbuild.virtualenv', _import='verify_python_version') ++@imports(_from='__builtin__', _import='KeyError') + @imports('distutils.sysconfig') + def virtualenv_python(env_python, build_env, mozconfig, help): + if help: + return + + python = env_python[0] if env_python else None + + # Ideally we'd rely on the mozconfig injection from mozconfig_options, +@@ -184,16 +185,22 @@ def virtualenv_python(env_python, build_env, mozconfig, help): + if 'PYTHON' in mozconfig['env']['added']: + python = mozconfig['env']['added']['PYTHON'] + elif 'PYTHON' in mozconfig['env']['modified']: + python = mozconfig['env']['modified']['PYTHON'][1] + elif 'PYTHON' in mozconfig['vars']['added']: + python = mozconfig['vars']['added']['PYTHON'] + elif 'PYTHON' in mozconfig['vars']['modified']: + python = mozconfig['vars']['modified']['PYTHON'][1] ++ for i in ('env', 'vars'): ++ for j in ('added', 'modified'): ++ try: ++ del mozconfig[i][j]['PYTHON'] ++ except KeyError: ++ pass + + with LineIO(lambda l: log.error(l)) as out: + verify_python_version(out) + topsrcdir, topobjdir = build_env.topsrcdir, build_env.topobjdir + if topobjdir.endswith('/js/src'): + topobjdir = topobjdir[:-7] + + with LineIO(lambda l: log.info(l)) as out: +@@ -219,17 +226,20 @@ def virtualenv_python(env_python, build_env, mozconfig, help): + log.info('Creating Python environment') + manager.build(python) + + python = normsep(manager.python_path) + + if python != normsep(sys.executable): + log.info('Reexecuting in the virtualenv') + if env_python: +- del os.environ['PYTHON'] ++ try: ++ del os.environ['PYTHON'] ++ except KeyError: ++ pass + # One would prefer to use os.execl, but that's completely borked on + # Windows. + sys.exit(subprocess.call([python] + sys.argv)) + + # We are now in the virtualenv + if not distutils.sysconfig.get_python_lib(): + die('Could not determine python site packages directory') + Property changes on: head/www/waterfox/files/patch-bug1288587 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-ijg-libjpeg =================================================================== --- head/www/waterfox/files/patch-ijg-libjpeg (nonexistent) +++ head/www/waterfox/files/patch-ijg-libjpeg (revision 454949) @@ -0,0 +1,383 @@ +# Partially revert bug 791305 to allow building with system IJG jpeg library + +diff --git old-configure.in configure.in +index f0aeb5d..1c01010 100644 +--- old-configure.in ++++ old-configure.in +@@ -4027,11 +4027,7 @@ if test "$MOZ_SYSTEM_JPEG" = 1; then + #include ], + [ #if JPEG_LIB_VERSION < $MOZJPEG + #error "Insufficient JPEG library version ($MOZJPEG required)." +- #endif +- #ifndef JCS_EXTENSIONS +- #error "libjpeg-turbo JCS_EXTENSIONS required" +- #endif +- ], ++ #endif ], + MOZ_SYSTEM_JPEG=1, + AC_MSG_ERROR([Insufficient JPEG library version for --with-system-jpeg])) + fi +diff --git image/decoders/nsJPEGDecoder.cpp image/decoders/nsJPEGDecoder.cpp +index 8fa8200..1d2a259 100644 +--- image/decoders/nsJPEGDecoder.cpp ++++ image/decoders/nsJPEGDecoder.cpp +@@ -21,13 +21,28 @@ + + extern "C" { + #include "iccjpeg.h" +-} + ++#ifdef JCS_EXTENSIONS + #if MOZ_BIG_ENDIAN + #define MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB JCS_EXT_XRGB + #else + #define MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB JCS_EXT_BGRX + #endif ++#else ++/* Colorspace conversion (copied from jpegint.h) */ ++struct jpeg_color_deconverter { ++ JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); ++ JMETHOD(void, color_convert, (j_decompress_ptr cinfo, ++ JSAMPIMAGE input_buf, JDIMENSION input_row, ++ JSAMPARRAY output_buf, int num_rows)); ++}; ++ ++METHODDEF(void) ++ycc_rgb_convert_argb (j_decompress_ptr cinfo, ++ JSAMPIMAGE input_buf, JDIMENSION input_row, ++ JSAMPARRAY output_buf, int num_rows); ++#endif ++} + + static void cmyk_convert_rgb(JSAMPROW row, JDIMENSION width); + +@@ -367,6 +382,7 @@ nsJPEGDecoder::WriteInternal(const char* + case JCS_GRAYSCALE: + case JCS_RGB: + case JCS_YCbCr: ++#ifdef JCS_EXTENSIONS + // if we're not color managing we can decode directly to + // MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB + if (mCMSMode != eCMSMode_All) { +@@ -375,6 +391,9 @@ nsJPEGDecoder::WriteInternal(const char* + } else { + mInfo.out_color_space = JCS_RGB; + } ++#else ++ mInfo.out_color_space = JCS_RGB; ++#endif + break; + case JCS_CMYK: + case JCS_YCCK: +@@ -448,6 +467,16 @@ nsJPEGDecoder::WriteInternal(const char* + return; // I/O suspension + } + ++#ifndef JCS_EXTENSIONS ++ /* Force to use our YCbCr to Packed RGB converter when possible */ ++ if (!mTransform && (mCMSMode != eCMSMode_All) && ++ mInfo.jpeg_color_space == JCS_YCbCr && mInfo.out_color_space == JCS_RGB) { ++ /* Special case for the most common case: transform from YCbCr direct into packed ARGB */ ++ mInfo.out_color_components = 4; /* Packed ARGB pixels are always 4 bytes...*/ ++ mInfo.cconvert->color_convert = ycc_rgb_convert_argb; ++ } ++#endif ++ + // If this is a progressive JPEG ... + mState = mInfo.buffered_image ? + JPEG_DECOMPRESS_PROGRESSIVE : JPEG_DECOMPRESS_SEQUENTIAL; +@@ -605,7 +633,11 @@ nsJPEGDecoder::OutputScanlines(bool* sus + uint32_t* imageRow = ((uint32_t*)mImageData) + + (mInfo.output_scanline * mInfo.output_width); + ++#ifdef JCS_EXTENSIONS + if (mInfo.out_color_space == MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB) { ++#else ++ if (mInfo.cconvert->color_convert == ycc_rgb_convert_argb) { ++#endif + // Special case: scanline will be directly converted into packed ARGB + if (jpeg_read_scanlines(&mInfo, (JSAMPARRAY)&imageRow, 1) != 1) { + *suspend = true; // suspend +@@ -920,6 +952,282 @@ term_source (j_decompress_ptr jd) + } // namespace mozilla + + ++#ifndef JCS_EXTENSIONS ++/**************** YCbCr -> Cairo's RGB24/ARGB32 conversion: most common case **************/ ++ ++/* ++ * YCbCr is defined per CCIR 601-1, except that Cb and Cr are ++ * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. ++ * The conversion equations to be implemented are therefore ++ * R = Y + 1.40200 * Cr ++ * G = Y - 0.34414 * Cb - 0.71414 * Cr ++ * B = Y + 1.77200 * Cb ++ * where Cb and Cr represent the incoming values less CENTERJSAMPLE. ++ * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) ++ * ++ * To avoid floating-point arithmetic, we represent the fractional constants ++ * as integers scaled up by 2^16 (about 4 digits precision); we have to divide ++ * the products by 2^16, with appropriate rounding, to get the correct answer. ++ * Notice that Y, being an integral input, does not contribute any fraction ++ * so it need not participate in the rounding. ++ * ++ * For even more speed, we avoid doing any multiplications in the inner loop ++ * by precalculating the constants times Cb and Cr for all possible values. ++ * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); ++ * for 12-bit samples it is still acceptable. It's not very reasonable for ++ * 16-bit samples, but if you want lossless storage you shouldn't be changing ++ * colorspace anyway. ++ * The Cr=>R and Cb=>B values can be rounded to integers in advance; the ++ * values for the G calculation are left scaled up, since we must add them ++ * together before rounding. ++ */ ++ ++#define SCALEBITS 16 /* speediest right-shift on some machines */ ++ ++/* Use static tables for color processing. */ ++/* Four tables, each 256 entries of 4 bytes totals 4K which is not bad... */ ++ ++const int Cr_r_tab[(MAXJSAMPLE+1) * sizeof(int)] ={ ++ -0xb3, -0xb2, -0xb1, -0xaf, -0xae, -0xac, ++ -0xab, -0xaa, -0xa8, -0xa7, -0xa5, -0xa4, ++ -0xa3, -0xa1, -0xa0, -0x9e, -0x9d, -0x9c, ++ -0x9a, -0x99, -0x97, -0x96, -0x95, -0x93, ++ -0x92, -0x90, -0x8f, -0x8e, -0x8c, -0x8b, ++ -0x89, -0x88, -0x87, -0x85, -0x84, -0x82, ++ -0x81, -0x80, -0x7e, -0x7d, -0x7b, -0x7a, ++ -0x79, -0x77, -0x76, -0x74, -0x73, -0x72, ++ -0x70, -0x6f, -0x6d, -0x6c, -0x6b, -0x69, ++ -0x68, -0x66, -0x65, -0x64, -0x62, -0x61, ++ -0x5f, -0x5e, -0x5d, -0x5b, -0x5a, -0x58, ++ -0x57, -0x56, -0x54, -0x53, -0x51, -0x50, ++ -0x4f, -0x4d, -0x4c, -0x4a, -0x49, -0x48, ++ -0x46, -0x45, -0x43, -0x42, -0x40, -0x3f, ++ -0x3e, -0x3c, -0x3b, -0x39, -0x38, -0x37, ++ -0x35, -0x34, -0x32, -0x31, -0x30, -0x2e, ++ -0x2d, -0x2b, -0x2a, -0x29, -0x27, -0x26, ++ -0x24, -0x23, -0x22, -0x20, -0x1f, -0x1d, ++ -0x1c, -0x1b, -0x19, -0x18, -0x16, -0x15, ++ -0x14, -0x12, -0x11, -0x0f, -0x0e, -0x0d, ++ -0x0b, -0x0a, -0x08, -0x07, -0x06, -0x04, ++ -0x03, -0x01, 0x00, 0x01, 0x03, 0x04, ++ 0x06, 0x07, 0x08, 0x0a, 0x0b, 0x0d, ++ 0x0e, 0x0f, 0x11, 0x12, 0x14, 0x15, ++ 0x16, 0x18, 0x19, 0x1b, 0x1c, 0x1d, ++ 0x1f, 0x20, 0x22, 0x23, 0x24, 0x26, ++ 0x27, 0x29, 0x2a, 0x2b, 0x2d, 0x2e, ++ 0x30, 0x31, 0x32, 0x34, 0x35, 0x37, ++ 0x38, 0x39, 0x3b, 0x3c, 0x3e, 0x3f, ++ 0x40, 0x42, 0x43, 0x45, 0x46, 0x48, ++ 0x49, 0x4a, 0x4c, 0x4d, 0x4f, 0x50, ++ 0x51, 0x53, 0x54, 0x56, 0x57, 0x58, ++ 0x5a, 0x5b, 0x5d, 0x5e, 0x5f, 0x61, ++ 0x62, 0x64, 0x65, 0x66, 0x68, 0x69, ++ 0x6b, 0x6c, 0x6d, 0x6f, 0x70, 0x72, ++ 0x73, 0x74, 0x76, 0x77, 0x79, 0x7a, ++ 0x7b, 0x7d, 0x7e, 0x80, 0x81, 0x82, ++ 0x84, 0x85, 0x87, 0x88, 0x89, 0x8b, ++ 0x8c, 0x8e, 0x8f, 0x90, 0x92, 0x93, ++ 0x95, 0x96, 0x97, 0x99, 0x9a, 0x9c, ++ 0x9d, 0x9e, 0xa0, 0xa1, 0xa3, 0xa4, ++ 0xa5, 0xa7, 0xa8, 0xaa, 0xab, 0xac, ++ 0xae, 0xaf, 0xb1, 0xb2, ++ }; ++ ++const int Cb_b_tab[(MAXJSAMPLE+1) * sizeof(int)] ={ ++ -0xe3, -0xe1, -0xdf, -0xde, -0xdc, -0xda, ++ -0xd8, -0xd6, -0xd5, -0xd3, -0xd1, -0xcf, ++ -0xce, -0xcc, -0xca, -0xc8, -0xc6, -0xc5, ++ -0xc3, -0xc1, -0xbf, -0xbe, -0xbc, -0xba, ++ -0xb8, -0xb7, -0xb5, -0xb3, -0xb1, -0xaf, ++ -0xae, -0xac, -0xaa, -0xa8, -0xa7, -0xa5, ++ -0xa3, -0xa1, -0x9f, -0x9e, -0x9c, -0x9a, ++ -0x98, -0x97, -0x95, -0x93, -0x91, -0x90, ++ -0x8e, -0x8c, -0x8a, -0x88, -0x87, -0x85, ++ -0x83, -0x81, -0x80, -0x7e, -0x7c, -0x7a, ++ -0x78, -0x77, -0x75, -0x73, -0x71, -0x70, ++ -0x6e, -0x6c, -0x6a, -0x69, -0x67, -0x65, ++ -0x63, -0x61, -0x60, -0x5e, -0x5c, -0x5a, ++ -0x59, -0x57, -0x55, -0x53, -0x52, -0x50, ++ -0x4e, -0x4c, -0x4a, -0x49, -0x47, -0x45, ++ -0x43, -0x42, -0x40, -0x3e, -0x3c, -0x3a, ++ -0x39, -0x37, -0x35, -0x33, -0x32, -0x30, ++ -0x2e, -0x2c, -0x2b, -0x29, -0x27, -0x25, ++ -0x23, -0x22, -0x20, -0x1e, -0x1c, -0x1b, ++ -0x19, -0x17, -0x15, -0x13, -0x12, -0x10, ++ -0x0e, -0x0c, -0x0b, -0x09, -0x07, -0x05, ++ -0x04, -0x02, 0x00, 0x02, 0x04, 0x05, ++ 0x07, 0x09, 0x0b, 0x0c, 0x0e, 0x10, ++ 0x12, 0x13, 0x15, 0x17, 0x19, 0x1b, ++ 0x1c, 0x1e, 0x20, 0x22, 0x23, 0x25, ++ 0x27, 0x29, 0x2b, 0x2c, 0x2e, 0x30, ++ 0x32, 0x33, 0x35, 0x37, 0x39, 0x3a, ++ 0x3c, 0x3e, 0x40, 0x42, 0x43, 0x45, ++ 0x47, 0x49, 0x4a, 0x4c, 0x4e, 0x50, ++ 0x52, 0x53, 0x55, 0x57, 0x59, 0x5a, ++ 0x5c, 0x5e, 0x60, 0x61, 0x63, 0x65, ++ 0x67, 0x69, 0x6a, 0x6c, 0x6e, 0x70, ++ 0x71, 0x73, 0x75, 0x77, 0x78, 0x7a, ++ 0x7c, 0x7e, 0x80, 0x81, 0x83, 0x85, ++ 0x87, 0x88, 0x8a, 0x8c, 0x8e, 0x90, ++ 0x91, 0x93, 0x95, 0x97, 0x98, 0x9a, ++ 0x9c, 0x9e, 0x9f, 0xa1, 0xa3, 0xa5, ++ 0xa7, 0xa8, 0xaa, 0xac, 0xae, 0xaf, ++ 0xb1, 0xb3, 0xb5, 0xb7, 0xb8, 0xba, ++ 0xbc, 0xbe, 0xbf, 0xc1, 0xc3, 0xc5, ++ 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xcf, ++ 0xd1, 0xd3, 0xd5, 0xd6, 0xd8, 0xda, ++ 0xdc, 0xde, 0xdf, 0xe1, ++ }; ++ ++const int Cr_g_tab[(MAXJSAMPLE+1) * sizeof(int)] ={ ++ 0x5b6900, 0x5ab22e, 0x59fb5c, 0x59448a, 0x588db8, 0x57d6e6, ++ 0x572014, 0x566942, 0x55b270, 0x54fb9e, 0x5444cc, 0x538dfa, ++ 0x52d728, 0x522056, 0x516984, 0x50b2b2, 0x4ffbe0, 0x4f450e, ++ 0x4e8e3c, 0x4dd76a, 0x4d2098, 0x4c69c6, 0x4bb2f4, 0x4afc22, ++ 0x4a4550, 0x498e7e, 0x48d7ac, 0x4820da, 0x476a08, 0x46b336, ++ 0x45fc64, 0x454592, 0x448ec0, 0x43d7ee, 0x43211c, 0x426a4a, ++ 0x41b378, 0x40fca6, 0x4045d4, 0x3f8f02, 0x3ed830, 0x3e215e, ++ 0x3d6a8c, 0x3cb3ba, 0x3bfce8, 0x3b4616, 0x3a8f44, 0x39d872, ++ 0x3921a0, 0x386ace, 0x37b3fc, 0x36fd2a, 0x364658, 0x358f86, ++ 0x34d8b4, 0x3421e2, 0x336b10, 0x32b43e, 0x31fd6c, 0x31469a, ++ 0x308fc8, 0x2fd8f6, 0x2f2224, 0x2e6b52, 0x2db480, 0x2cfdae, ++ 0x2c46dc, 0x2b900a, 0x2ad938, 0x2a2266, 0x296b94, 0x28b4c2, ++ 0x27fdf0, 0x27471e, 0x26904c, 0x25d97a, 0x2522a8, 0x246bd6, ++ 0x23b504, 0x22fe32, 0x224760, 0x21908e, 0x20d9bc, 0x2022ea, ++ 0x1f6c18, 0x1eb546, 0x1dfe74, 0x1d47a2, 0x1c90d0, 0x1bd9fe, ++ 0x1b232c, 0x1a6c5a, 0x19b588, 0x18feb6, 0x1847e4, 0x179112, ++ 0x16da40, 0x16236e, 0x156c9c, 0x14b5ca, 0x13fef8, 0x134826, ++ 0x129154, 0x11da82, 0x1123b0, 0x106cde, 0x0fb60c, 0x0eff3a, ++ 0x0e4868, 0x0d9196, 0x0cdac4, 0x0c23f2, 0x0b6d20, 0x0ab64e, ++ 0x09ff7c, 0x0948aa, 0x0891d8, 0x07db06, 0x072434, 0x066d62, ++ 0x05b690, 0x04ffbe, 0x0448ec, 0x03921a, 0x02db48, 0x022476, ++ 0x016da4, 0x00b6d2, 0x000000, -0x00b6d2, -0x016da4, -0x022476, ++ -0x02db48, -0x03921a, -0x0448ec, -0x04ffbe, -0x05b690, -0x066d62, ++ -0x072434, -0x07db06, -0x0891d8, -0x0948aa, -0x09ff7c, -0x0ab64e, ++ -0x0b6d20, -0x0c23f2, -0x0cdac4, -0x0d9196, -0x0e4868, -0x0eff3a, ++ -0x0fb60c, -0x106cde, -0x1123b0, -0x11da82, -0x129154, -0x134826, ++ -0x13fef8, -0x14b5ca, -0x156c9c, -0x16236e, -0x16da40, -0x179112, ++ -0x1847e4, -0x18feb6, -0x19b588, -0x1a6c5a, -0x1b232c, -0x1bd9fe, ++ -0x1c90d0, -0x1d47a2, -0x1dfe74, -0x1eb546, -0x1f6c18, -0x2022ea, ++ -0x20d9bc, -0x21908e, -0x224760, -0x22fe32, -0x23b504, -0x246bd6, ++ -0x2522a8, -0x25d97a, -0x26904c, -0x27471e, -0x27fdf0, -0x28b4c2, ++ -0x296b94, -0x2a2266, -0x2ad938, -0x2b900a, -0x2c46dc, -0x2cfdae, ++ -0x2db480, -0x2e6b52, -0x2f2224, -0x2fd8f6, -0x308fc8, -0x31469a, ++ -0x31fd6c, -0x32b43e, -0x336b10, -0x3421e2, -0x34d8b4, -0x358f86, ++ -0x364658, -0x36fd2a, -0x37b3fc, -0x386ace, -0x3921a0, -0x39d872, ++ -0x3a8f44, -0x3b4616, -0x3bfce8, -0x3cb3ba, -0x3d6a8c, -0x3e215e, ++ -0x3ed830, -0x3f8f02, -0x4045d4, -0x40fca6, -0x41b378, -0x426a4a, ++ -0x43211c, -0x43d7ee, -0x448ec0, -0x454592, -0x45fc64, -0x46b336, ++ -0x476a08, -0x4820da, -0x48d7ac, -0x498e7e, -0x4a4550, -0x4afc22, ++ -0x4bb2f4, -0x4c69c6, -0x4d2098, -0x4dd76a, -0x4e8e3c, -0x4f450e, ++ -0x4ffbe0, -0x50b2b2, -0x516984, -0x522056, -0x52d728, -0x538dfa, ++ -0x5444cc, -0x54fb9e, -0x55b270, -0x566942, -0x572014, -0x57d6e6, ++ -0x588db8, -0x59448a, -0x59fb5c, -0x5ab22e, ++ }; ++ ++const int Cb_g_tab[(MAXJSAMPLE+1) * sizeof(int)] ={ ++ 0x2c8d00, 0x2c34e6, 0x2bdccc, 0x2b84b2, 0x2b2c98, 0x2ad47e, ++ 0x2a7c64, 0x2a244a, 0x29cc30, 0x297416, 0x291bfc, 0x28c3e2, ++ 0x286bc8, 0x2813ae, 0x27bb94, 0x27637a, 0x270b60, 0x26b346, ++ 0x265b2c, 0x260312, 0x25aaf8, 0x2552de, 0x24fac4, 0x24a2aa, ++ 0x244a90, 0x23f276, 0x239a5c, 0x234242, 0x22ea28, 0x22920e, ++ 0x2239f4, 0x21e1da, 0x2189c0, 0x2131a6, 0x20d98c, 0x208172, ++ 0x202958, 0x1fd13e, 0x1f7924, 0x1f210a, 0x1ec8f0, 0x1e70d6, ++ 0x1e18bc, 0x1dc0a2, 0x1d6888, 0x1d106e, 0x1cb854, 0x1c603a, ++ 0x1c0820, 0x1bb006, 0x1b57ec, 0x1affd2, 0x1aa7b8, 0x1a4f9e, ++ 0x19f784, 0x199f6a, 0x194750, 0x18ef36, 0x18971c, 0x183f02, ++ 0x17e6e8, 0x178ece, 0x1736b4, 0x16de9a, 0x168680, 0x162e66, ++ 0x15d64c, 0x157e32, 0x152618, 0x14cdfe, 0x1475e4, 0x141dca, ++ 0x13c5b0, 0x136d96, 0x13157c, 0x12bd62, 0x126548, 0x120d2e, ++ 0x11b514, 0x115cfa, 0x1104e0, 0x10acc6, 0x1054ac, 0x0ffc92, ++ 0x0fa478, 0x0f4c5e, 0x0ef444, 0x0e9c2a, 0x0e4410, 0x0debf6, ++ 0x0d93dc, 0x0d3bc2, 0x0ce3a8, 0x0c8b8e, 0x0c3374, 0x0bdb5a, ++ 0x0b8340, 0x0b2b26, 0x0ad30c, 0x0a7af2, 0x0a22d8, 0x09cabe, ++ 0x0972a4, 0x091a8a, 0x08c270, 0x086a56, 0x08123c, 0x07ba22, ++ 0x076208, 0x0709ee, 0x06b1d4, 0x0659ba, 0x0601a0, 0x05a986, ++ 0x05516c, 0x04f952, 0x04a138, 0x04491e, 0x03f104, 0x0398ea, ++ 0x0340d0, 0x02e8b6, 0x02909c, 0x023882, 0x01e068, 0x01884e, ++ 0x013034, 0x00d81a, 0x008000, 0x0027e6, -0x003034, -0x00884e, ++ -0x00e068, -0x013882, -0x01909c, -0x01e8b6, -0x0240d0, -0x0298ea, ++ -0x02f104, -0x03491e, -0x03a138, -0x03f952, -0x04516c, -0x04a986, ++ -0x0501a0, -0x0559ba, -0x05b1d4, -0x0609ee, -0x066208, -0x06ba22, ++ -0x07123c, -0x076a56, -0x07c270, -0x081a8a, -0x0872a4, -0x08cabe, ++ -0x0922d8, -0x097af2, -0x09d30c, -0x0a2b26, -0x0a8340, -0x0adb5a, ++ -0x0b3374, -0x0b8b8e, -0x0be3a8, -0x0c3bc2, -0x0c93dc, -0x0cebf6, ++ -0x0d4410, -0x0d9c2a, -0x0df444, -0x0e4c5e, -0x0ea478, -0x0efc92, ++ -0x0f54ac, -0x0facc6, -0x1004e0, -0x105cfa, -0x10b514, -0x110d2e, ++ -0x116548, -0x11bd62, -0x12157c, -0x126d96, -0x12c5b0, -0x131dca, ++ -0x1375e4, -0x13cdfe, -0x142618, -0x147e32, -0x14d64c, -0x152e66, ++ -0x158680, -0x15de9a, -0x1636b4, -0x168ece, -0x16e6e8, -0x173f02, ++ -0x17971c, -0x17ef36, -0x184750, -0x189f6a, -0x18f784, -0x194f9e, ++ -0x19a7b8, -0x19ffd2, -0x1a57ec, -0x1ab006, -0x1b0820, -0x1b603a, ++ -0x1bb854, -0x1c106e, -0x1c6888, -0x1cc0a2, -0x1d18bc, -0x1d70d6, ++ -0x1dc8f0, -0x1e210a, -0x1e7924, -0x1ed13e, -0x1f2958, -0x1f8172, ++ -0x1fd98c, -0x2031a6, -0x2089c0, -0x20e1da, -0x2139f4, -0x21920e, ++ -0x21ea28, -0x224242, -0x229a5c, -0x22f276, -0x234a90, -0x23a2aa, ++ -0x23fac4, -0x2452de, -0x24aaf8, -0x250312, -0x255b2c, -0x25b346, ++ -0x260b60, -0x26637a, -0x26bb94, -0x2713ae, -0x276bc8, -0x27c3e2, ++ -0x281bfc, -0x287416, -0x28cc30, -0x29244a, -0x297c64, -0x29d47e, ++ -0x2a2c98, -0x2a84b2, -0x2adccc, -0x2b34e6, ++ }; ++ ++ ++/* We assume that right shift corresponds to signed division by 2 with ++ * rounding towards minus infinity. This is correct for typical "arithmetic ++ * shift" instructions that shift in copies of the sign bit. But some ++ * C compilers implement >> with an unsigned shift. For these machines you ++ * must define RIGHT_SHIFT_IS_UNSIGNED. ++ * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. ++ * It is only applied with constant shift counts. SHIFT_TEMPS must be ++ * included in the variables of any routine using RIGHT_SHIFT. ++ */ ++ ++#ifdef RIGHT_SHIFT_IS_UNSIGNED ++#define SHIFT_TEMPS INT32 shift_temp; ++#define RIGHT_SHIFT(x,shft) \ ++ ((shift_temp = (x)) < 0 ? \ ++ (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ ++ (shift_temp >> (shft))) ++#else ++#define SHIFT_TEMPS ++#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) ++#endif ++ ++ ++METHODDEF(void) ++ycc_rgb_convert_argb (j_decompress_ptr cinfo, ++ JSAMPIMAGE input_buf, JDIMENSION input_row, ++ JSAMPARRAY output_buf, int num_rows) ++{ ++ JDIMENSION num_cols = cinfo->output_width; ++ JSAMPLE * range_limit = cinfo->sample_range_limit; ++ ++ SHIFT_TEMPS ++ ++ /* This is used if we don't have SSE2 */ ++ ++ while (--num_rows >= 0) { ++ JSAMPROW inptr0 = input_buf[0][input_row]; ++ JSAMPROW inptr1 = input_buf[1][input_row]; ++ JSAMPROW inptr2 = input_buf[2][input_row]; ++ input_row++; ++ uint32_t *outptr = (uint32_t *) *output_buf++; ++ for (JDIMENSION col = 0; col < num_cols; col++) { ++ int y = GETJSAMPLE(inptr0[col]); ++ int cb = GETJSAMPLE(inptr1[col]); ++ int cr = GETJSAMPLE(inptr2[col]); ++ JSAMPLE * range_limit_y = range_limit + y; ++ /* Range-limiting is essential due to noise introduced by DCT losses. */ ++ outptr[col] = 0xFF000000 | ++ ( range_limit_y[Cr_r_tab[cr]] << 16 ) | ++ ( range_limit_y[((int) RIGHT_SHIFT(Cb_g_tab[cb] + Cr_g_tab[cr], SCALEBITS))] << 8 ) | ++ ( range_limit_y[Cb_b_tab[cb]] ); ++ } ++ } ++} ++#endif ++ ++ + ///*************** Inverted CMYK -> RGB conversion ************************* + /// Input is (Inverted) CMYK stored as 4 bytes per pixel. + /// Output is RGB stored as 3 bytes per pixel. Property changes on: head/www/waterfox/files/patch-ijg-libjpeg ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-sample-type =================================================================== --- head/www/waterfox/files/patch-sample-type (nonexistent) +++ head/www/waterfox/files/patch-sample-type (revision 454949) @@ -0,0 +1,13 @@ +# Let ports handle default sample type + +--- old-configure.in~ ++++ old-configure.in +@@ -5144,7 +5144,7 @@ dnl Use integers over floats for audio o + dnl (regarless of the CPU architecture, because audio + dnl backends for those platforms don't support floats. We also + dnl use integers on ARM with other OS, because it's more efficient. +-if test "$OS_TARGET" = "Android" -o "$CPU_ARCH" = "arm"; then ++if test -n "$MOZ_INTEGER_SAMPLES"; then + MOZ_SAMPLE_TYPE_S16=1 + AC_DEFINE(MOZ_SAMPLE_TYPE_S16) + AC_SUBST(MOZ_SAMPLE_TYPE_S16) Property changes on: head/www/waterfox/files/patch-sample-type ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-config-baseconfig.mk =================================================================== --- head/www/waterfox/files/patch-config-baseconfig.mk (nonexistent) +++ head/www/waterfox/files/patch-config-baseconfig.mk (revision 454949) @@ -0,0 +1,17 @@ +--- config/baseconfig.mk~ ++++ config/baseconfig.mk +@@ -2,10 +2,10 @@ + # directly in python/mozbuild/mozbuild/base.py for gmake validation. + # We thus use INCLUDED_AUTOCONF_MK to enable/disable some parts depending + # whether a normal build is happening or whether the check is running. +-includedir := $(includedir)/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) +-idldir = $(datadir)/idl/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) +-installdir = $(libdir)/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION) +-sdkdir = $(libdir)/$(MOZ_APP_NAME)-devel-$(MOZ_APP_VERSION) ++includedir := $(includedir)/%%MOZILLA%% ++idldir = $(datadir)/idl/%%MOZILLA%% ++installdir = $(libdir)/%%MOZILLA%% ++sdkdir = $(libdir)/%%MOZILLA%% + ifeq (.,$(DEPTH)) + DIST = dist + else Property changes on: head/www/waterfox/files/patch-config-baseconfig.mk ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-bug991253 =================================================================== --- head/www/waterfox/files/patch-bug991253 (nonexistent) +++ head/www/waterfox/files/patch-bug991253 (revision 454949) @@ -0,0 +1,17 @@ +--- extensions/spellcheck/hunspell/glue/mozHunspell.cpp~ ++++ extensions/spellcheck/hunspell/glue/mozHunspell.cpp +@@ -392,6 +392,14 @@ mozHunspell::LoadDictionaryList(bool aNo + } + } + ++ // load system hunspell dictionaries ++ nsCOMPtr hunDir; ++ NS_NewNativeLocalFile(NS_LITERAL_CSTRING("%%LOCALBASE%%/share/hunspell"), ++ true, getter_AddRefs(hunDir)); ++ if (hunDir) { ++ LoadDictionariesFromDir(hunDir); ++ } ++ + // find dictionaries from extensions requiring restart + nsCOMPtr dictDirs; + rv = dirSvc->Get(DICTIONARY_SEARCH_DIRECTORY_LIST, Property changes on: head/www/waterfox/files/patch-bug991253 ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/files/patch-build-pgo-profileserver.py =================================================================== --- head/www/waterfox/files/patch-build-pgo-profileserver.py (nonexistent) +++ head/www/waterfox/files/patch-build-pgo-profileserver.py (revision 454949) @@ -0,0 +1,11 @@ +--- build/pgo/profileserver.py.orig 2011-02-24 21:49:47.000000000 +0100 ++++ build/pgo/profileserver.py 2011-02-24 21:50:30.000000000 +0100 +@@ -59,7 +59,7 @@ if __name__ == '__main__': + env["MOZ_JAR_LOG_FILE"] = os.path.abspath(jarlog) + print "jarlog: %s" % env["MOZ_JAR_LOG_FILE"] + +- cmdargs = ["http://localhost:%d/index.html" % PORT] ++ cmdargs = ["http://127.0.0.1:%d/index.html" % PORT] + runner = FirefoxRunner(profile=profile, + binary=build.get_binary_path(where="staged-package"), + cmdargs=cmdargs, Property changes on: head/www/waterfox/files/patch-build-pgo-profileserver.py ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/pkg-descr =================================================================== --- head/www/waterfox/pkg-descr (nonexistent) +++ head/www/waterfox/pkg-descr (revision 454949) @@ -0,0 +1,24 @@ +The Waterfox source code is a specialised modification of the Mozilla +platform, designed for privacy and user choice in mind. You should be +able to install it and compile Waterfox without any issues. Other +modifications and patches that are more upstream have been implemented +as well to fix any compatibility/security issues that Mozilla may lag +behind in implementing (usually due to not being high priority). High +request features removed by Mozilla but wanted by users are retained +(if they aren't removed due to security). + +Features: + + o Disabled Encrypted Media Extensions (EME) + o Disabled Web Runtime (deprecated as of 2015) + o Removed Pocket + o Removed Telemetry + o Removed data collection + o Removed startup profiling + o Allow running of all 64-Bit NPAPI plugins + o Allow running of unsigned extensions + o Removal of Sponsored Tiles on New Tab Page + o Addition of Duplicate Tab option (toggle with browser.tabs.duplicateTab) + o Locale selector in about:preferences > General + +WWW: https://www.waterfoxproject.org/ Property changes on: head/www/waterfox/pkg-descr ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/www/waterfox/pkg-message =================================================================== --- head/www/waterfox/pkg-message (nonexistent) +++ head/www/waterfox/pkg-message (revision 454949) @@ -0,0 +1,34 @@ +====================================================================== + +Some features available on other platforms are not implemented: +- Native audio (OSS backend is incomplete, doesn't support WebRTC) +- Encrypted Media Extensions (requires Widevine CDM binary) +- Process sandboxing (requires Capsicum backend) +- Reduced memory usage (requires mozjemalloc) +- Performance profiling (requires GeckoProfiler) +- Gamepad API (requires libusbhid backend) +- WebVR (requires open source runtime) +- U2F Security Keys (requires libusbhid backend) + +====================================================================== + +To select non-default audio backend open about:config page and create +media.cubeb.backend preference. Supported values are: alsa, jack, +pulse, pulse-rust, oss, sndio. Currently used backend can be inspected +on about:support page. + +====================================================================== + +smb:// issues (Gvfs/GIO option): +Network group, machine, and share browsing does not work correctly. + +sftp:// (Gvfs/GIO option): +Only sftp access using public key authentication works. To easily +setup public key authentication to "remote_host": + +ssh-keygen +cat ~/.ssh/id_rsa.pub | ssh remote_host "cat >> .ssh/authorized_keys" + +The SSH server on remote_host must allow pub key authentication. + +====================================================================== Property changes on: head/www/waterfox/pkg-message ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property