<feed xmlns="http://www.w3.org/2005/Atom"><title type="text">Chromium Notes</title><id>tag:neugierig.org,2009:chromium-notes</id><updated>2010-03-04T18:57:1267729020Z</updated><author><name>Evan Martin</name><uri>http://neugierig.org</uri></author><entry><id>tag:neugierig.org,2009:chromium-notes/2010-03-04/latin-1-decoding</id><title type="text">Latin-1 decoding change</title><updated>2010-03-04T18:57:1267729020Z</updated><content type="html">&lt;p
&gt;Originally I started this blog with the intent that each post would be about a particular commit. Here&#39;s a post back in that vein, about a change I had no involvement in but thought might be of interest to you:&lt;/p
&gt;&lt;p
&gt;&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=35233&quot;
  &gt;WebKit bug 35233 -- Optimize Latin-1 decoding in TextCodecLatin1::decode()&lt;/a
  &gt;&lt;/p
&gt;&lt;p
&gt;How many ways do I like this change?&lt;/p
&gt;&lt;ul
&gt;&lt;li
  &gt;Nokia wrote it but we all benefit from it;&lt;/li
  &gt;&lt;li
  &gt;C++ master Darin proposed a template-hacker modification to it that makes it type-safe without losing the speed benefit;&lt;/li
  &gt;&lt;li
  &gt;The precommit bots that Googlers wrote caught that an earlier version would&#39;ve broken the 32-bit Mac build;&lt;/li
  &gt;&lt;li
  &gt;The patch itself is a simple but clever low-hanging-fruit optimization.&lt;/li
  &gt;&lt;/ul
&gt;&lt;p
&gt;The only piece it&#39;s missing is a regression test, but I guess WebKit currently doesn&#39;t have a lot in the way of performance regression tests.&lt;/p
&gt;&lt;p
&gt;PS: Since I&#39;m again deep in a free-software lovefest, I&#39;ll just bury here that it&#39;s also pretty neat that Mozilla is both using bits of Nitro (one of the many confusing names of the Apple JavaScript engine) for improving JS speed and bits of Chrome for its out of process plugins. My mind circles around all of the biological metaphors we use for these things -- source trees, cross-pollination of ideas -- and I feel briefly like I&#39;m living in the future.&lt;/p
&gt;</content><link href="2010/03/latin-1-decoding.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2010-02-17/reload</id><title type="text">Reload</title><updated>2010-02-18T03:55:1266465300Z</updated><content type="html">&lt;p
&gt;What does the reload button do? Well, it reloads the page, obviously. Or at least that was about how far I had thought about it when I thought to poke into fixing &lt;a href=&quot;http://code.google.com/p/chromium/issues/detail?id=1906&quot;
  &gt;the age-old &amp;quot;Chrome should support shift-reload&amp;quot; bug&lt;/a
  &gt; and I discovered there&#39;s plenty of subtlety in even a simple-sounding feature.&lt;/p
&gt;&lt;p
&gt;RFC 2616 (the HTTP 1.1 spec) has a section 14.9.4 titled &amp;quot;Cache Revalidation and Reload Controls&amp;quot; specifically discussing the various meanings &amp;quot;reload&amp;quot; could have. But rather than dive into that, another way of looking at it is to think about it from the user&#39;s perspective.&lt;/p
&gt;&lt;p
&gt;One use case is: I&#39;m looking at a live blog or a stock ticker site and I think they may have updated something on the page. I want to go out to the site and ask it if it has anything new, but I don&#39;t want to redownload the stuff (like, say, the site logo) that I already have. That is, I use the existing HTTP support for If-Modified-Since or ETag and just request that the site (and any caching layers in between me and the site) go check if there&#39;s anything new for me and show me if so, and the same for subresources.&lt;/p
&gt;&lt;p
&gt;In a perfect world where caching is done correctly, I think that is all you would ever need. But that leads to the other use case, which is: something has gone wrong in the caching, and I want to flush all caches (both local and held by proxy servers). Here, you request the resources along with the appropriate HTTP headers to instruct everyone along the line to please not use their caches.&lt;/p
&gt;&lt;p
&gt;These two cases are intended to correspond in Chrome to the refresh button versus holding shift and hitting the refresh button. And though I fixed the bug, my work was just to plumb the shift state down to a flag passed to WebKit, and Darin suggested there are still WebKit bugs in this area.&lt;/p
&gt;&lt;p
&gt;How do we at least compare to other browsers? I don&#39;t know; there is more depth I haven&#39;t fully thought through. For example, suppose a server does the common JS/image caching trick where they provide headers that say the resources &lt;em
  &gt;never&lt;/em
  &gt; expire and then just use a new URL when they want to change the resources. When I do a normal refresh, should I even go out to the network to see if those were modified? How about when I just hit enter in the URL bar of the currently-displayed page: should I just load everything from on-disk cache? (I believe that&#39;s what we&#39;d do when you hit the back button.) Which behavior does the meta refresh tag do? And most importantly, how can a normal human being user understand all this?&lt;/p
&gt;&lt;p
&gt;From this I mostly conclude that web stuff is always more subtle than you&#39;d expect. I came into this thinking that reload meant &amp;quot;go fetch the resources again as if you hadn&#39;t fetched them before&amp;quot;, but learned that neither plain reload (which will allow servers to tell you to reuse your existing cached entries) nor shift-reload (which includes extra headers to try to get intermediate caches to drop their copy, something that even a first-time load won&#39;t do) does that. And also I learned not to trust browsers when they claim they&#39;ve reloaded something.&lt;/p
&gt;</content><link href="2010/02/reload.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2010-02-08/webkit-commits-followup</id><title type="text">WebKit commits followup</title><updated>2010-02-08T18:45:1265654700Z</updated><content type="html">&lt;p
&gt;Ugh. Unfortunately, just as I had worried, my previous post was taken the wrong way (by TechCrunch). As the long list of caveats were trying to point out, I wasn&#39;t trying to frame a Google versus Apple story; aside from the many things wrong with counting commits that I tried to disclaim in that post, there&#39;s also a ton of other work that is not even hinted at in that metric.&lt;/p
&gt;&lt;p
&gt;For example, pretty much every change I&#39;ve made to WebKit that isn&#39;t Chromium-specific has been reviewed by Apple employees; poor Darin Adler has probably invested about 50% of the time I did in reading through the patches I wrote, giving me feedback, and dealing with fallout when they break.&lt;/p
&gt;&lt;p
&gt;For another example, consider all of the hosting infrastructure (the website, the buildbots, the paperwork of granting people commit access). Or who answers all the questions on the mailing list.&lt;/p
&gt;&lt;p
&gt;For the record, what I was trying to say with that graph is: isn&#39;t it neat that there are so many other contributors to WebKit and that their involvement is growing? There are few (if any) other free software projects in such a healthy state -- &lt;a href=&quot;http://www.linuxfoundation.org/publications/linuxkerneldevelopment.php&quot;
  &gt;the Linux Kernel&lt;/a
  &gt; comes to mind.&lt;/p
&gt;&lt;p
&gt;If anything, the only competition story in this is that this &amp;quot;coopetition&amp;quot; makes the web evolve faster and in a better way. By virtue of a shared source tree we&#39;re compelled to improve Safari/iPhones/Blackberries/etc. as we improve Chrome, with the benefit of experienced browser developers santity-checking the work as we go.&lt;/p
&gt;</content><link href="2010/02/webkit-commits-followup.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2010-02-06/webkit-commits</id><title type="text">Who develops WebKit?</title><updated>2010-02-06T19:33:1265484780Z</updated><content type="html">&lt;p
&gt;&lt;strong
  &gt;Edit: I wrote a &lt;a href=&quot;http://neugierig.org/software/chromium/notes/2010/02/webkit-commits-followup.html&quot;
    &gt;followup&lt;/a
    &gt; to this post. Please read that before jumping to conclusions.&lt;/strong
  &gt;&lt;/p
&gt;&lt;p
&gt;Who develops WebKit? Open-source projects that come from a single company typically have trouble attracting contributors from outside, but WebKit seems more successful than most in broad usage and contributions from both the industry and enthusiasts. I was curious about the trends of the project so I thought I&#39;d dive into the commit history.&lt;/p
&gt;&lt;p
&gt;I hesitated to post this because it&#39;s easy to misinterpret. So please read the following carefully before jumping to conclusions. I am skeptical it is possible to measure contribution in a meaningful way; counting lines of diff credits people who make whitespace changes too heavily and penalizes people who spend weeks tracking down a subtle bug that results a one-liner change, while tracking commit counts weights people who commit frequently (e.g., Git users) more heavily. With that said, surely either way of counting at least correlates with investment.&lt;/p
&gt;&lt;p
&gt;Furthermore, Apple has had a working WebKit port since the first release of Safari, so the majority of continuing work that Apple does is core features that benefit everyone: all of that yummy stuff like CSS3 gradients and transforms. The work of ports (including Chromium) is primarily adapting WebKit to the particular platform, which only benefits the port. (Though as I &lt;a href=&quot;http://neugierig.org/software/chromium/notes/2009/10/going-upstream.html&quot;
  &gt;mentioned earlier&lt;/a
  &gt; Google is gradually migrating towards more core features -- I missed a bunch in that earlier list, including web forms 2 and Gears-derived HTML5 features like storage/database/app cache.)&lt;/p
&gt;&lt;p
&gt;Finally, it&#39;s difficult to credit the work of many people to a particular company, as companies tend to hire from the talent pool of existing WebKit hackers, and people like Eric worked on WebKit at Apple, then at a startup, now on WebKit at Google. I took the easy way out and credited these to the latest applicable company; for example, the work done Qt hackers on WebKit before Nokia acquired Trolltech are credited below to Nokia, which isn&#39;t accurate.&lt;/p
&gt;&lt;p
&gt;Ok, enough disclaimers. Here&#39;s a graph of commits/day with some of the heavier committers split out into separate lines. I still think it&#39;s interesting despite its many flaws. The two spikes in Apple work appear to be related to Safari releases (though the first also correlates with the release of Chrome and appear to be a lot of work on the JavaScriptCore JavaScript engine).&lt;/p
&gt;&lt;script type=&quot;text/javascript&quot;
  src=&quot;http://neugierig.org/software/chromium/notes/static/dygraph-combined.js&quot;&gt;&lt;/script&gt;
&lt;div id=&quot;webkit-commits-graph&quot; style=&quot;width: 800px; height: 600px;&quot;&gt;&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
  g = new Dygraph(
    document.getElementById(&quot;webkit-commits-graph&quot;),
                            &quot;http://neugierig.org/software/chromium/notes/static/webkit-commits-data.csv&quot;,
                            { rollPeriod: 90,
                              showRoller: true });
&lt;/script&gt;
&lt;p
&gt;I&#39;d also at some point like to take a look at which projects attract which developers. As I looked at this data I noticed in particular that SVG and the inspector seem to have attracted, better than other parts of WebKit, developers outside of any particular community. I suspect it is because those pieces of WebKit are relatively self-contained; stuff like the core layout engine are way more difficult to hack on (unless your last name is Hyatt). If you&#39;d like to play with the data I&#39;ve collected (or improve it!) the code &lt;a href=&quot;http://github.com/martine/webkit-who&quot;
  &gt;is up on github&lt;/a
  &gt;.&lt;/p
&gt;</content><link href="2010/02/webkit-commits.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2010-01-28/extensions-paper</id><title type="text">Extensions paper</title><updated>2010-01-28T17:43:1264700580Z</updated><content type="html">&lt;p
&gt;&lt;a href=&quot;http://www.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-185.html&quot;
  &gt;A paper on the security features of the Chrome extensions system&lt;/a
  &gt;, drawing on the experience of Firefox.&lt;/p
&gt;&lt;p
&gt;&lt;a href=&quot;http://www.aaronboodman.com/2010/01/academic-paper-on-chromium-extensions.html&quot;
  &gt;Aaron&#39;s thoughts&lt;/a
  &gt;.&lt;/p
&gt;</content><link href="2010/01/extensions-paper.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2010-01-14/forum-fonts</id><title type="text">Free fonts</title><updated>2010-01-15T02:41:1263523260Z</updated><content type="html">&lt;p
&gt;Many people were upset that our tests depend on the non-free Microsoft web fonts. However, realistically, many web sites depend on these fonts and it is important that we test that our font metrics match the metrics used on those sites.&lt;/p
&gt;&lt;p
&gt;Separately, someone filed a bug saying we&#39;re using the wrong font on &lt;code
  &gt;ubuntuforums.org&lt;/code
  &gt;, a popular forum site. I took a look and found their CSS says:&lt;/p
&gt;&lt;pre
&gt;&lt;code
  &gt;font-family: Verdana, Arial, Tahoma;
&lt;/code
  &gt;&lt;/pre
&gt;&lt;p
&gt;with no mention of their presumed intent that you fall back on a free sans-serif font if those fonts aren&#39;t available. So Chrome just falls back to the default font: a serifed one. (The interaction between CSS font fallback and fontconfig is complicated and ugly; hopefully I&#39;ll get to it another time.)&lt;/p
&gt;&lt;p
&gt;In conclusion, now I have a great example of the point I was making about non-free fonts.&lt;/p
&gt;</content><link href="2010/01/forum-fonts.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2010-01-12/totalfinder-tabs</id><title type="text">TotalFinder tabs</title><updated>2010-01-12T16:50:1263315000Z</updated><content type="html">&lt;p
&gt;The &lt;a href=&quot;http://blog.binaryage.com/totalfinder-with-tabs/&quot;
  &gt;TotalFinder project&lt;/a
  &gt;&#39;s recent release includes Chrome-style tabs, taken directly from the Chrome tree. I think this is the first project I&#39;ve heard of that isn&#39;t directly browser related that has used code from Chrome.&lt;/p
&gt;&lt;p
&gt;Here&#39;s the relevant section of that page, just in case it changes in the future:&lt;/p
&gt;&lt;blockquote
&gt;&lt;p
  &gt;I had an idea of bringing tabs experience into Finder back in November 2009. Obviously this is a hard task, but so exciting. I&#226;&#128;&#153;m quite new to Cocoa and I&#226;&#128;&#153;ve never implemented such a complex UI element in Cocoa before. But I&#226;&#128;&#153;m not afraid to search the internet and get deep into problems I happen to be exploring.&lt;/p
  &gt;&lt;p
  &gt;Luckily enough, there is a great state-of-the-art open source tabs implementation in the Chromium project available. I&#226;&#128;&#153;ve studied briefly their codebase and it looked as a promising path to follow. I took their main browser window implementation and also components realizing tabs and extracted them from the main project. I&#226;&#128;&#153;ve spent few days stripping dependencies and isolating functionality I needed. Dirty job but it paid off. After few evenings I&#226;&#128;&#153;ve got working skeleton app with blank tabs.&lt;/p
  &gt;&lt;p
  &gt;I&#226;&#128;&#153;d like to thank Google to made this all possible. I was really surprised how clean and well-documented the Chrome code is. People working on it earned my full respect. Kudos guys!&lt;/p
  &gt;&lt;/blockquote
&gt;</content><link href="2010/01/totalfinder-tabs.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2009-12-30/iron</id><title type="text">The story of Iron</title><updated>2009-12-30T18:15:1262196900Z</updated><content type="html">&lt;p
&gt;Iron claims to be a &amp;quot;privacy-oriented&amp;quot; fork of Chrome, which removes a bunch of pieces that the Iron author claims are privacy invasive. In the abstract this is a thing I&#39;d support -- nothing like some publicity to put pressure on the project to be more careful about user privacy -- but when you look at the details it kinda falls down.&lt;/p
&gt;&lt;p
&gt;Right when we first came out our IRC channel was flooded with hundreds of curious people, and for posterity&#39;s sake I logged it. (It&#39;s now logged &lt;a href=&quot;http://echelog.matzon.dk/logs/browse/chromium/1262127600&quot;
  &gt;by a third party&lt;/a
  &gt;.) It turns out &lt;a href=&quot;http://neugierig.org/software/chromium/chromium-dev-2008-09-17&quot;
  &gt;the log of September 19, 2008&lt;/a
  &gt; is interesting to look back on. That link is to the unmodified file that my IRC client produced, but since you&#39;re unlikely to want to read through it all (search for &amp;quot;Iron&amp;quot; if you&#39;d like), I&#39;ll summarize the interesting bits.&lt;/p
&gt;&lt;p
&gt;(For context, I am &amp;quot;evmar&amp;quot; in that log, and the usernames with a + before their names are Chrome developers.)&lt;/p
&gt;&lt;ol style=&quot;list-style-type: decimal;&quot;
&gt;&lt;li
  &gt;&lt;p
    &gt;Someone with the nick of &amp;quot;Iron&amp;quot; joins the channel and announces they&#39;re making a fork of Chrome.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;They ask some semi-legal questions about how to advertise it, which we can&#39;t answer.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;They ask some technical questions, like how to change the name of the browser that shows up in the executable, which &lt;code
      &gt;kuchhal&lt;/code
      &gt; nicely helps them with.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;Then there&#39;s this exchange (reformatted to remove timestamps and add line wrapping):&lt;/p
    &gt;&lt;pre
    &gt;&lt;code
      &gt;&amp;lt;Kmos&amp;gt; Iron: why not contribute to it, instead of forking ?
&amp;lt;Iron&amp;gt; because i removed all privacy-related code
&amp;lt;Iron&amp;gt; e.g. RLZ
&amp;lt;Iron&amp;gt; and URL tracking every 5 seconds after start
&amp;lt;Iron&amp;gt; the original chrome  is heavily communitating to google...i
       hate that
&amp;lt;jamessan&amp;gt; all of those are supposed to have options to disable them,
           iirc
&amp;lt;Iron&amp;gt; yes but they haven&#39;t options yet
&amp;lt;Iron&amp;gt; and nobody knows when the next beta is released
&amp;lt;jamessan&amp;gt; so work on getting the options added so they&#39;ll be there
           for the next release
&amp;lt;mgreenblatt&amp;gt; Iron.. why not propose a patch based on preprocessor
              defines that disables the sections you dislike without
              forking the code?
&amp;lt;mgreenblatt&amp;gt; (assuming such a thing doesn&#39;t already exist)
&amp;lt;Iron&amp;gt; because a fork will bring a lot of publicity to my person and
       my homepage
&amp;lt;Iron&amp;gt; that means: a lot of money too ;)
&amp;lt;Kmos&amp;gt; rotflol
&amp;lt;Iron&amp;gt; what means rotful?
&amp;lt;mgreenblatt&amp;gt; Iron.. you&#39;re a large corporation that can dedicate the
              time to support a fork of something as complicated as
              chromium?
&amp;lt;Kmos&amp;gt; Iron: google about it
&amp;lt;Iron&amp;gt; yes there is enough time to support it
&amp;lt;jamessan&amp;gt; heh, you&#39;re expecting to make lots of money from making a
           fork of chromium? that&#39;s quite amusing
&amp;lt;Iron&amp;gt; i dont take money for my fork
&amp;lt;Iron&amp;gt; but i have adsense on my page ;)
&amp;lt;Iron&amp;gt; a lot of visitor -&amp;gt; a lot of clicka &amp;gt; a lot of money ;)
&amp;lt;Kmos&amp;gt; and do you think google should support your fork
&amp;lt;Kmos&amp;gt; lol
&amp;lt;mgreenblatt&amp;gt; Iron.. it&#39;s always good to have dreams ;-)
&amp;lt;Iron&amp;gt; we are here in germany
&amp;lt;Iron&amp;gt; the press will love my fork
&amp;lt;Iron&amp;gt; i talked to much journalists already
&amp;lt;DrPizza&amp;gt; Why are you forking?
&amp;lt;DrPizza&amp;gt; to do what?
&amp;lt;Iron&amp;gt; to remove all things in source talking to google ;)
&amp;lt;jamessan&amp;gt; to get fame and fortune
&amp;lt;Iron&amp;gt; nobody here trusts google
&amp;lt;Iron&amp;gt; the german people say: google is very evil
&amp;lt;jamessan&amp;gt; yet you use google&#39;s adsense
&lt;/code
      &gt;&lt;/pre
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;Then follows a bunch of &amp;quot;Google is evil&amp;quot; conversation which you&#39;ve heard before. (And a rather strongly-worded flame from &lt;code
      &gt;DannyB&lt;/code
      &gt; about the above, which I&#39;ll skip for brevity.) This sort of non-technical discussion is frowned upon in our development channel, so he&#39;s then more or less told to go away (surprisingly politely, in retrospect).&lt;/p
    &gt;&lt;/li
  &gt;&lt;/ol
&gt;&lt;p
&gt;(Now, it&#39;s possible (but highly unlikely) this isn&#39;t the eventual author of Iron, but in some sense that&#39;s irrelevant to the two meta-points: (1) if you don&#39;t trust Google to not do something sneaky, you probably shouldn&#39;t be running software made by Google, and (2) why would you trust code from some random third party more?)&lt;/p
&gt;&lt;p
&gt;Furthermore, the &amp;quot;URL tracking&amp;quot; mentioned both on IRC and on the Iron website refers to the &lt;a href=&quot;http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/google_url_tracker.cc?view=markup&quot;
  &gt;GoogleURLTracker&lt;/a
  &gt; class. This unforutnately-named class figures out whether to use &lt;code
  &gt;google.com&lt;/code
  &gt; or &lt;code
  &gt;google.es&lt;/code
  &gt; for searches from the URL bar, and does not in any way do any sort of spyware URL monitoring. This is obvious to anyone who can read code, and should be obvious to anyone technical enough to produce a product like Iron. At this point I can&#39;t believe they&#39;re doing anything other than being intentionally misleading.&lt;/p
&gt;&lt;p
&gt;&lt;a href=&quot;http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/google_url_tracker.h?view=markup&quot;
  &gt;The header&lt;/a
  &gt; plainly says as much, and also:&lt;/p
&gt;&lt;blockquote
&gt;&lt;pre
  &gt;&lt;code
    &gt;// To protect users&#39; privacy and reduce server load, no updates
// will be performed (ever) unless at least one consumer registers
// interest by calling RequestServerCheck().
&lt;/code
    &gt;&lt;/pre
  &gt;&lt;/blockquote
&gt;&lt;p
&gt;Which, you can easily &lt;a href=&quot;http://www.google.com/codesearch/p?hl=en#h0RrPvyPu-c/chrome/browser/search_engines/template_url_model.cc&amp;amp;q=RequestServerCheck&amp;amp;sa=N&amp;amp;cd=6&amp;amp;ct=rc&amp;amp;l=137&quot;
  &gt;verify&lt;/a
  &gt;, is only ever called if you&#39;re using Google as your default search engine, which Chrome doesn&#39;t even use by default (Chrome asks you what search engine to use the first time you install).&lt;/p
&gt;&lt;p
&gt;This serves as a good example of the sort or significant effort we&#39;ve put in to make Chrome be privacy-conscious and Google-independent. Half of the bullet points on the Iron &amp;quot;feature&amp;quot; page are options that can be turned off in a clearly-marked &amp;quot;Privacy&amp;quot; section of the Chrome options, and the other half are misunderstandings like this one.&lt;/p
&gt;&lt;p
&gt;(Edit: I am biased here towards Linux Chrome; Windows Chrome does not make it obvious how to remove the updater nor RLZ. I will hopefully find time to post about those some other time.)&lt;/p
&gt;&lt;hr
 /&gt;&lt;p
&gt;So where does that leave users? I think there is a space for a privacy-conscious browser: a &amp;quot;portable&amp;quot; one that starts in Incognito mode, that integrates Tor or some other proxying system, one that defaults some features that trade privacy for convenience off -- but I am highly skeptical the Iron developer is the person able to produce such a thing. In fact, I think that browser could be Chrome, if someone would contribute patches for it (there&#39;s an incognito-at-startup flag already, I believe) instead of needlessly forking for shady reasons.&lt;/p
&gt;&lt;p
&gt;(Edit: It is negligent for me not to point out the reportedly excellent &lt;a href=&quot;https://www.torproject.org/torbutton/&quot;
  &gt;Torbutton extension&lt;/a
  &gt; for Firefox, which is probably your current best bet in this space.)&lt;/p
&gt;</content><link href="2009/12/iron.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2009-12-08/flash-lahf</id><title type="text">Flash LAHF workaround</title><updated>2009-12-08T22:53:1260312780Z</updated><content type="html">&lt;p
&gt;Flash uses an instruction not available on some CPUs, causing it to die with SIGILL (&amp;quot;Illegal instruction&amp;quot;). Some might say, &amp;quot;Ok, let&#39;s wait for Adobe to release a fix.&amp;quot; But not Maks Verver, who wrote &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=535548#22&quot;
  &gt;this bad ass patch&lt;/a
  &gt;:&lt;/p
&gt;&lt;pre
&gt;&lt;code
  &gt;/* Simple work-around for running the 64-bit Adobe Flash plug-in version 10
   on Athlon64 processors without support for the lahf instruction.

Compile with:
cc -fPIC -shared -nostdlib -lc -oflashplugin-lahf-fix.so flashplugin-lahf-fix.c
Then place the .so file in the plug-in directory (e.g. $HOME/.mozilla/plugins)
or use LD_PRELOAD to force Firefox to load the library.

   - Maks Verver &amp;lt;maksverver@geocities.com&amp;gt; July 2009 */

#define _GNU_SOURCE
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;signal.h&amp;gt;
#include &amp;lt;ucontext.h&amp;gt;

static void sig_handler(int signal, siginfo_t *info, void *context) {
        if (signal != SIGILL) return;
        if (*(char*)info-&amp;gt;si_addr != (char)0x9f) abort();
        greg_t *regs = ((ucontext_t*)context)-&amp;gt;uc_mcontext.gregs;
        ((char*)&amp;amp;regs[REG_RAX])[1] = ((char*)&amp;amp;regs[REG_EFL])[0];
        regs[REG_RIP]++;
}

static struct sigaction old_sa, new_sa = {
        .sa_flags     = SA_SIGINFO,
        .sa_sigaction = &amp;amp;sig_handler };

int _init() { sigaction(SIGILL, &amp;amp;new_sa, &amp;amp;old_sa); return 0; }
int _fini() { sigaction(SIGILL, &amp;amp;old_sa, &amp;amp;new_sa); return 0; }
&lt;/code
  &gt;&lt;/pre
&gt;&lt;p
&gt;It catches the signal, inspects the registers, and by hand updates the state and advances the instruction pointer.&lt;/p
&gt;</content><link href="2009/12/flash-lahf.html" /></entry><entry><id>tag:neugierig.org,2009:chromium-notes/2009-12-03/forking</id><title type="text">Forking upstream software</title><updated>2009-12-03T17:09:1259860140Z</updated><content type="html">&lt;p
&gt;&lt;a href=&quot;http://lwn.net/Articles/364528/&quot;
  &gt;Tom wrote a rant&lt;/a
  &gt; about the way we&#39;ve incorporated other free software, and while I know it&#39;s easy to get carried away when you&#39;re mid-rant and talk in generalities, I thought it&#39;d be interesting to look at the details.&lt;/p
&gt;&lt;p
&gt;First, some background. On Windows, your software is basically on its own: if the code you want isn&#39;t provided by Microsoft, it&#39;s your responsibility to package, ship, and update it. So for any third-party libraries we use (take sqlite as an example) we already must dedicate resources to integrating it into our build system, tracking security vulnerabilities upstream, and updating the code we use. This cost is fundamental to the endeavor, and any approach to software management beyond that (notably the Linux way) is by definition extra work to support. (That doesn&#39;t mean I don&#39;t want to change things, but just that doing so doesn&#39;t come for free.)&lt;/p
&gt;&lt;p
&gt;An interesting side effect of having all this code locally is that there is no longer a difference between your bugs and someone else&#39;s bugs: in tracking a bug down, you trace the code to the source of the problem and then you fix the bug, regardless of whose it is. Contrast this with development of software on any other platform, &lt;em
  &gt;including Linux&lt;/em
  &gt;, where if there&#39;s a bug in Karmic&#39;s version of GTK the best we can say is &amp;quot;darn, let&#39;s file a bug upstream then attempt to find a workaround&amp;quot;. (Which is what we&#39;ve done; for a particular example I&#39;ll note my coworker Dan has written patches for two or three window managers, not that that helps any of our existing users.)&lt;/p
&gt;&lt;p
&gt;I believe this is generally the approach we have taken: do whatever it takes to make the best product we can, contribute bits upstream where we can. So let&#39;s take a stroll through the &lt;code
  &gt;README&lt;/code
  &gt;s in the &lt;code
  &gt;third_party&lt;/code
  &gt; directories and see what we can find. As I type this post I don&#39;t actually know the conclusion I&#39;ll reach, so this is for my education as much as yours. (Edit: Now that I&#39;ve gone through more of this, I&#39;ll use the short phrase &amp;quot;build changes&amp;quot; to mean &amp;quot;changes made to let this to build as part of our cross-platform build system, ending up as a static lib that gets pulled into our final binary.&amp;quot;)&lt;/p
&gt;&lt;ul
&gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;apple&lt;/code
      &gt;: two random files, no README. I have no idea what this is. The reviewer should have caught this before checking it in. Filed &lt;a href=&quot;http://code.google.com/p/chromium/issues/detail?id=29334&quot;
      &gt;bug 29334&lt;/a
      &gt;. (Edit: now fixed.)&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;bsdiff&lt;/code
      &gt;: &amp;quot;This is Chrome&#39;s locally patched copy of Colin Percival&#39;s bsdiff tool [...] obtained from Mozilla&#39;s local copy/fork of bsdiff.&amp;quot; The entirety of the code is a 382 line source file, so I can&#39;t be too bothered either way. Fork severity: harmless.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;bspatch&lt;/code
      &gt;: just like bsdiff. 357 lines.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;bzip2&lt;/code
      &gt;: &amp;quot;When updating, no modifications should be necessary aside from copying the subset of files included here.&amp;quot;&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;cld&lt;/code
      &gt;: I believe this is an internal Google project. I wonder if was ever officially open sourced. &lt;a href=&quot;http://code.google.com/p/chromium/issues/detail?id=29342&quot;
      &gt;Filed bug 29342 about unclear license&lt;/a
      &gt;.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;codesighs&lt;/code
      &gt;: &amp;quot;There are no local changes to the code itself.&amp;quot;&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;expat&lt;/code
      &gt;: Removed unused files. Two patches: one to fix a compiler warning on Windows, one to fix a crash. The README says it&#39;s version 2.7.0, but as far as I can tell from the home page and my Karmic install the latest version is 2.0.1 released in 2007? Perhaps it&#39;s a typo in the README. I tried to check if we&#39;d reported the bug into their bug tracker but I get a server error when I click their bug tracker link. Fork severity: &lt;em
      &gt;suspicious&lt;/em
      &gt;.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;ffmpeg&lt;/code
      &gt;: Patched to hell. I believe we actually build this with gcc on Windows, it is so gnarly to build. The README is terrifying to me; it says we patch out some of its hand-written assembly so our crash catcher can function. Fork severity: &lt;em
      &gt;fail&lt;/em
      &gt;.&lt;/p
    &gt;&lt;p
    &gt;On the other hand, I don&#39;t think ffmpeg really cares too much; it seems from their download page they don&#39;t actually make releases, and instead recommend just pulling their trunk.&lt;/p
    &gt;&lt;p
    &gt;I asked a coworker about it and he said:&lt;/p
    &gt;&lt;blockquote
    &gt;&lt;p
      &gt;The good news is that of the 50 patches about 1/2 actually have made it upstream in one way or another (mostly by the FFMpeg devs themselves). I&#39;ve been tracking it on a spreadsheet [...]&lt;/p
      &gt;&lt;/blockquote
    &gt;&lt;p
    &gt;Why so many patches? I think a lot are from our security guys who found a lot of bugs after spending some time fuzzing it.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;fuzzymatch&lt;/code
      &gt;: A one-off C program agl hacked up.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;glew&lt;/code
      &gt;: OpenGL stuff I don&#39;t quite understand. The local modification was for sandboxing reasons, but it is pretty invasive (much of the API now goes through an extra indirection) so it seems unlikely upstream would want it. Fork score: not good, but I think it&#39;s legit.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;harfbuzz&lt;/code
      &gt;: I know this one because I work with it personally. We track upstream&#39;s git repo directly and have contributed both bug fixes and a bunch of code in upstream&#39;s &amp;quot;contrib/&amp;quot; directory. The last time I sent patches Behdad said something to the effect of: &amp;quot;you&#39;re basically the only people using this code so don&#39;t worry about it too much&amp;quot;. I hope to retarget Chrome to the harfbuzz-ng rewrite this month.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;hunspell&lt;/code
      &gt;: A variety of small patches for integrating it into the build (of the &amp;quot;remove reference to &lt;code
      &gt;&amp;quot;config.h&amp;quot;&lt;/code
      &gt; sort), &amp;quot;Change the input params of the constructors to receive a FILE* instead of a file path. This is required to use hunspell in the sandbox.&amp;quot; Diffstat: 6 files changed, 28 insertions(+), 25 deletions(-).&lt;/p
    &gt;&lt;p
    &gt;Additional major change: a different on-disk representation for a large memory and CPU performance impact. I asked the author of the Chrome patch and he said:&lt;/p
    &gt;&lt;blockquote
    &gt;&lt;p
      &gt;There&#39;s not really a mailing list or active project site as far as I could find. I emailed some random guy whose email address I found with some of my perf numbers and he responded with &amp;quot;oh thanks&amp;quot; but that&#39;s the extent of the communication.&lt;/p
      &gt;&lt;/blockquote
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;icu&lt;/code
      &gt;: See &lt;a href=&quot;http://code.google.com/p/chromium/issues/detail?id=28294&quot;
      &gt;bug 28294, &amp;quot;use system ICU&amp;quot;&lt;/a
      &gt;. The version of ICU we need is newer than the one provided on OS X or on Karmic (let alone Hardy, which we also want to support); we also continue to make improvements. We send these patches upstream.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;jemalloc&lt;/code
      &gt;: Diffstat: 5 files changed, 38 insertions(+), 17 deletions(-). The local changes there aren&#39;t even up to snuff for acceptable Chrome changes, with commented-out bits. I don&#39;t believe we actually use this yet, but Mike has been experimenting with it. Fork severity: eh.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;lcov&lt;/code
      &gt;: Upstream + a perl script. I think this is only used by the build bots.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;libevent&lt;/code
      &gt;: Upstream + build system change. We carried a forked version of this for quite a while, due to a bug that caused libevent to use a large amount of extra memory per instance (ChangeLog says: &amp;quot;Saves up to 512K per epoll-based event_base.&amp;quot;). We sent that patch upstream but it took a while for Niels to make a release carrying it. Upstream ChangeLog includes patches from multiple Chrome people (Dean and Adam).&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;libjingle&lt;/code
      &gt;: Lots of local patches. I ran into Sean (the author) the other day and he indicated libjingle is more or less unmaintained, but don&#39;t quote me on that. I see no attempt to upstream these patches; but I do see at least two unanswered bugs on the bug tracker with patches from Craig (one of the Chromium contributors).&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;libjpeg&lt;/code
      &gt;: Upstream version + fixes to integrate into our build.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;libpng&lt;/code
      &gt;: Same as libjpeg.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;libxml&lt;/code
      &gt;: Lots of changes! The README indicates we cherry-picked unreleased security fixes on top of the latest released version, but the version we carry is now older than trunk. Diffstat: 9 files changed, 310 insertions(+), 9 deletions(-). Majority of the diffs look like they&#39;re adding ICU support; I tried to see whether upstream supported this but in my ten seconds of looking I found &lt;a href=&quot;http://mail.gnome.org/archives/xml/2007-September/msg00094.html&quot;
      &gt;this dispiriting old thread&lt;/a
      &gt;. (Edit: originally I wrote that upstream was opposed to supporting ICU; I see now I failed to read the context correctly, and that they welcomed an ICU patch and that the following quote that I used in the original post was about why upstream would &lt;em
      &gt;prefer&lt;/em
      &gt; people to not ICU, not that they were completely opposed to it.)&lt;/p
    &gt;&lt;blockquote
    &gt;&lt;p
      &gt;Mark&amp;gt; I&#39;m not advocating that ICU be the default, I&#39;m just curious why you feel vendors should not use it if it is present.&lt;/p
      &gt;&lt;p
      &gt;Daniel (upstream)&amp;gt; Very simple, I don&#39;t want to be perceived as depending on ICU.&lt;/p
      &gt;&lt;/blockquote
    &gt;&lt;p
    &gt;Ironically, the person involved in that thread is none other than Mark Rowe, who I now know as one of the WebKit hackers. Maybe things have changed since 2007? Fork score: not sure. Even if upstream does allow a compile-time dependency on ICU, I doubt any distros would ship it that way. And we lose points for having other patches.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;libxslt&lt;/code
      &gt;: Build changes, one functional change for Windows. Unclear if that&#39;s upstream or not, nor why it&#39;s necessary in the first place (&amp;quot;Modified libxslt/security.c to use GetFileAttributesA instead of GetFileAttributes.&amp;quot;) -- perhaps for the sandbox?&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;lighttpd&lt;/code
      &gt;: Used for running HTTP-based tests. Just Mac/Win binaries. We historically only pull binaries if you&#39;re on the relevant platform; the fact I have this on my Linux box was probably an oversight.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;lzma_sdk&lt;/code
      &gt;: README indicates only build changes.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;modp_64&lt;/code
      &gt;: 913 lines of code. Build changes, including some that make it reach deep into shared Chrome headers. I am suspicious but it&#39;s also tiny.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;mozilla&lt;/code
      &gt;: Mozilla headers needed to work with Java. Build changes.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;npapi&lt;/code
      &gt;: Headers needed to work with Netscape plugins. Build changes. Rather forked. I don&#39;t think this is available as a standalone library, though.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;ocmock&lt;/code
      &gt;: No modifications.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;openmax&lt;/code
      &gt;: I don&#39;t know what this is. khronos.org reference makes me think WebGL or something. The README says it&#39;s headers.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;ots&lt;/code
      &gt;: Written by the Chrome team, trying to be a library other browsers can use.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;protobuf2&lt;/code
      &gt;: Written by Google.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;pyftpdlib&lt;/code
      &gt;: A server used for testing FTP. Local patch is to remove a timing-based DoS protection, because the tests want to run as quickly as possible and so they hammer on it. Maybe this should be made into API and upstreamed?&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;pywebsocket&lt;/code
      &gt;: Written by the Chrome team, trying to be a library other browsers can use. WebKit uses it now I think.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;scons&lt;/code
      &gt;: Build changes. But don&#39;t use scons anymore; we should probably drop this.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;simplejson&lt;/code
      &gt;: Build changes.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;skia&lt;/code
      &gt;: Written by Google. We push patches into it.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;sqlite&lt;/code
      &gt;: Forked heavily. The full-text indexing support for SQLite (which is now upstream) was written by someone on the Chrome team, and so he feels comfortable making whatever changes needed. Fork severity: &lt;em
      &gt;bad&lt;/em
      &gt;. Someone needs to spend some time cleaning this up.&lt;/p
    &gt;&lt;p
    &gt;Concidentally, someone left an &lt;a href=&quot;http://spot.livejournal.com/312320.html?thread=1463808#t1463808&quot;
      &gt;anonymous comment on Tom&#39;s post ranting about sqlite upstream, saying why they forked it as well&lt;/a
      &gt;; but I don&#39;t think this has been our experience at all; I met Richard once at a conference and he seemed like an ideal upstream -- friendly and fixated on details.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;tcmalloc&lt;/code
      &gt;: Written by Google. I think there is a lot of experimentation going on here, so it&#39;s probably forked a bit.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;tlslite&lt;/code
      &gt;: Used by tests. Includes a patch with bug fix, which references a thread on the user mailing list where someone else ran into the same problem. It&#39;s unclear if the patch has been upstreamed. Fork severity: not good.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;WebKit&lt;/code
      &gt;: WebKit is a full half of the project&#39;s code weight, and we have made extensive changes to it. We now have many people on the project contributing to upstream WebKit and we now can build directly out of a copy of upstream&#39;s trunk with no local patches. &lt;a href=&quot;http://neugierig.org/software/chromium/notes/2009/10/going-upstream.html&quot;
      &gt;More on upstreaming to WebKit in another post&lt;/a
      &gt;.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;xdg-utils&lt;/code
      &gt;: We contributed &lt;code
      &gt;xdg-settings&lt;/code
      &gt; upstream, then pulled it back down into our tree. For the other xdg utilities we already use the one already on the system. It is not clear what the current relationship is between our copy and the upstream release; on the other hand, since we wrote the only file we use, it is unlikely anyone else needs it. Fork score: not so good. &lt;a href=&quot;http://code.google.com/p/chromium/issues/detail?id=29769&quot;
      &gt;Filed bug 29769&lt;/a
      &gt;.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;yasm&lt;/code
      &gt;: gnarly. Needed for ffmpeg. See ffmpeg above.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;zlib&lt;/code
      &gt;: Fix a compile warning. Windows fixes. Not clear whether the changes are upstream.&lt;/p
    &gt;&lt;/li
  &gt;&lt;/ul
&gt;&lt;hr
 /&gt;&lt;p
&gt;There are a few other directories other than the top level for third-party code. Let&#39;s now go into them alphabetically:&lt;/p
&gt;&lt;ul
&gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;base/third_party/dmg_fp&lt;/code
      &gt;: As far as I can tell every project that has ever used this has forked it.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;base/third_party/icu&lt;/code
      &gt;: Some basic UTF handling functions pulled from ICU (used for bits of code that don&#39;t want to depend on all of ICU).&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;base/third_party/nspr&lt;/code
      &gt;: This is just a couple of files, not all of nspr. The README is unclear. &lt;a href=&quot;http://code.google.com/p/chromium/issues/detail?id=29764&quot;
      &gt;Filed bug 29764&lt;/a
      &gt;.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;base/third_party/purify&lt;/code
      &gt;: The Windows equivalent of Valgrind. But there is no README. Looks like headers. &lt;a href=&quot;http://code.google.com/p/chromium/issues/detail?id=29765&quot;
      &gt;Filed bug 29765&lt;/a
      &gt;.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;base/third_party/valgrind&lt;/code
      &gt;: Header for working with Valgrind. It seems a little excessive to depend on a 24mb Valgrind package to build with this one file.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;base/third_party/xdg_mime&lt;/code
      &gt;: Claims it contains one minor compilation fix, looks like working around a warning.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;base/third_party/xdg_user_dirs&lt;/code
      &gt;: Build changes. Upstream designed this with the intent it is always copied into other projects, never built as a separate library.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;chrome/third_party/jstemplate&lt;/code
      &gt;: Minor changes. There&#39;s not really a good build/packaging infrastructure for JavaScript libraries anyway, so this is hand-&amp;quot;optimized&amp;quot; (removed dead code, run through the Closure compiler).&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;chrome/third_party/wtl&lt;/code
      &gt;: Windows code. &amp;quot;These headers are almost the equivalent of WTL 8.0 from &lt;code
      &gt;http://sourceforge.net/projects/wtl/&lt;/code
      &gt; with &lt;a href=&quot;http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=1871358&amp;amp;group_id=109071&amp;amp;atid=652374&quot;
      &gt;patch #1871358&lt;/a
      &gt; applied.&amp;quot;&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;net/third_party/nss&lt;/code
      &gt;: libssl from upstream. Used for staging various SSL changes for e.g. SPDY experiments; those changes eventually show up upstream. The NSS maintainer works on the Chrome team, and he ok&#39;d this.&lt;/p
    &gt;&lt;/li
  &gt;&lt;li
  &gt;&lt;p
    &gt;&lt;code
      &gt;net/third_party/parseftp&lt;/code
      &gt;: Copied from Mozilla. Just build changes (remove NSPR, add namespace). I believe Pawel is working on this with Mozilla, but I don&#39;t follow this stuff closely.&lt;/p
    &gt;&lt;/li
  &gt;&lt;/ul
&gt;&lt;hr
 /&gt;&lt;p
&gt;...*whew*, that was exhausting! And I am actually rather surprised -- I expected to find more projects hacked up like sqlite, when in fact that&#39;s one of the few projects we&#39;ve actually forked in a meaningful way.&lt;/p
&gt;</content><link href="2009/12/forking.html" /></entry></feed>