Known bugs The following are known bugs:
  • Some tables don't work right. Some table features aren't implemented, like percentage widths or heights.
  • Javascript. Javascript is currently in beta, available as a separate bundle.
  • Tabs are not supported in plain or RTF text files.



Fixed but not released The following bugs are fixed in the next release:
  • None yet! (Or at least, none listed here yet.)



3.0 Released on July 20, 1999. Changes include:
  • You can now append paths to URL shortcuts: for example, you can now enter "omnigroup/products" to reach "http://www.omnigroup.com/products", or "apple/developer" for "http://www.apple.com/developer".
  • Added new padlocked zap icon for secure URLs.
  • Added support for the body tag's marginwidth, marginheight, leftmargin, and topmargin attributes. (The first two take precedence over the latter two.)
  • Added support for <table align=center>.
  • We can now handle alphanumeric list indices ("a" .. "z", "aa" .. "zz", "aaa" .. "zzz", etc.) up to the maximum integer size, 2,147,483,647 ("fxshrxw").
  • Added support for line breaking on CJK characters (such as Kanji ideographs), as well as Hiragana and Katakana characters. (The <nobr> tag is not currently supported for text containing these characters.)
  • Added framework support for a new Japanese decoding plug-in which autodetects various Japanese character sets and selects between them automatically. (If you're interested in testing this plug-in, please contact us at omniweb3@omnigroup.com.)
  • The Search panel now understands Sherlock plug-ins, so we won't have to keep updating our Search engine descriptions by hand. (We do need to update the UI to better handle the notion of searching of dozens of engines rather than just a dozen.)
  • Added a "Refuse All Cookies" switch to Cookie Preferences.
  • Added "Open Selected URL" menu item, bound to Command-Shift-U (like the service). Flush Cache used to be Command-Shift-U, now it's to Command-Option-U on Mac OS X, Command-$ on OPENSTEP/Mach 4.2.
  • Edited the Reload button's image to get rid of some stray pixels.
  • Fixed bug where table cell background images would sometimes fail to render.
  • Fixed bugs in preferences, such as the non-functional character set preferences and the animation preferences which wouldn't reset to their default state.
  • Source windows now display an HTML icon when they're miniaturized.
  • We no longer automatically select the anchor we're following.
  • Fixed JavaScript plug-in on OPENSTEP/Mach for non-Intel hardware.
  • Enabled the "Do security checks" JavaScript preference.
  • Allow JavaScript onClick events to be triggered from the keyboard. (For example, you can now turn www.omnigroup.com's lights on and off by using the down arrow key to select the light switch, then using the right arrow key to trigger it.)
  • Fixed a bug where we'd wrap a word to the next line for no reason. (Well, there was a reason, of course, just not a good one: we'd accidentally rounded the size to the nearest pixel when we should have always rounded up.)
  • Some HTML authoring tools create HTML with incorrect Unicode character entities: for example, they'll turn an em-dash into a character in the reserved upper control block (which is where those characters live in the Windows Latin 1 encoding, but isn't valid for Unicode). We now translate these characters to their correct Unicode equivalents so they display correctly (rather than being displayed as spaces).
  • Added some support for <table height>. The biggest limitation is that percentage heights don't work in sub-tables, only in the outermost table. (This does mean that the outermost table can say width="100%" height="100%" to fill the screen, though.)
  • Marginal elements no longer reserve space between themselves and their margin. (I.e., a left-aligned image will now be flush with the left margin rather than leaving as much space between itself and the margin as it does between itself and the text.)
  • We no longer send a malformed HTTP request when someone forgets to quote the spaces in an http URL.
  • A refreshing HTML page in a frame will now correctly stop refreshing when the frame is removed from its frame set.
  • Made the image border color a preference (OHImageCellBorderColor), and changed its default to black (it had been blue to make it easier to test layout).
  • If you instruct OmniWeb to refuse cookies from a particular domain, it will now correctly remember that setting across multiple sessions.
3.0 release candidate 2 Released on July 2, 1999. Changes include:
  • Install licenses in .../SoftwareLicenses rather than .../OmniLicenses. (But we still find licenses installed in the old locations.)
  • Fixed a crasher that could occur if you were navigating through your history as a frameset expired from the cache.
  • Fixed a crasher related to tooltips and tables.
  • Fixed an apparent modal-loop hang relating to key presses.
  • Made the font cache thread-safe (since that's the point of it, after all).
  • Fixed some thread-unsafeness with our zone support.
  • Treat font and link colors more consistently with other browsers. (Makes things like www.slashdot.com's links visible if you don't have link underlining on, plus is much nicer for WOF development.)
  • Create ~/Library if needed so that sample bookmarks will be displayed.
  • Create the path to the bookmarks file if it doesn't exist.
  • Show image dimensions in the inspector (in addition to the image data size, which was already being displayed).
  • Changed the way cookies affect cached pages (my.yahoo.com now works).
  • Allow refusing all cookies.
  • Store cookies in "Cookies.plist" instead of "Cookies." If the former doesn't exist, get cookies from the latter. This adds some consistency to our file naming schemes and allows you to use both OmniWeb 3 and OmniWeb 2 without conflicting cookies.
  • Disabled pipelined requests by default (fixes problems with servers that have broken support for this feature).
  • Added some HTTP configuration options (no UI available yet).
  • Added a non-expiring single-user license.
  • Added a workaround for AppKit bug so windows will restore to screens other than the main one.
3.0 release candidate 1 Released on June 19, 1999. Changes include:
  • Lots of changes to support JavaScript. JavaScript is a separate bundle, so you won't see these changes until you download and install it.
  • Duplicate submissions: Forms which return a page with a client-side image map used to get submitted multiple times.
  • Form elements did not always get initialized properly (Viewing source and redisplaying used to help with any of these bugs.):
    • Submit buttons occasionally are displayed as small 9 x 7 pixel images which do not perform as submit buttons.
    • Radio buttons are occasionally displayed as checkboxes (but they still perform as radio buttons).
    • Select elements which are supposed to allow multiple selections don't always.
  • Handle unreliable HTTP 1.1 servers Beta 9 repeatedly tried to perform HTTP 1.1 fetches on uncooperative servers, even though it wasn't making much progress each time. (For example, when it loses connections for lots of small inline images and tries again, and again, and again.) It should give up and go back to HTTP 1.0 much more quickly. This makes www.necx.com totally usable again.
  • Crashes on launch: on some systems One cannot run OmniWeb on a system with an unconfigured network interface.
  • Services did not work: We misconfigured the OmniWeb launcher's Info-nextstep.plist.
  • HTML files did not open in OmniWeb: We misconfigured the OmniWeb launcher's Info-nextstep.plist.
  • JavaScript links and HTTP proxy servers: With a HTTP proxy server enabled, the JavaScript function WAS NOT evaluated, but passed on to the proxy server, instead. The proxy server, of course, does not like this at all.
  • Could not abort HTTP 1.1 sessions: HTTP sessions did not abort until they receive input from the server--and if the server is unresponsive, that can be a long wait. (And since we refuse to create more than four connections to a server, you could end up completely locked out of one.)
  • License expires early: We adjusted the licensing code to allow for a few extra days of use after the license officially expired. Unfortunately, this new code mistakenly expired the application a few days early instead of late.
  • We used to process the content for unknown tags, but this can lead to incredibly deep recursion if you're using a processor (such as our image map processor) which hasn't registered a method to handle, say, <img> tags (which don't have a matching close tag). This caused crashes on pages like this where we'd run out out of stack space.
  • OWHTMLSourcePreferences: Renamed -fontView:didChangeFontTo: to -fontView:didChangeToFont: so that we can actually change our font again.
  • Changed the color parsing so that the "#" is advisory only: if we find a "#", we'll first try a hex color, then fall back on a named color; if there isn't a "#", we'll first try a named color, then fall back on a hex color.
    I've also changed things so that when the color parsing fails (either because of a malformed hex number or because of a unknown or misspelled named color) we'll ignore the color rather than treating it as black.
    We can now parse 3-digit, 6-digit, and 9-digit hex colors (just like X Windows).
  • By default, don't antialias text. We have some bugs (antialiasing animations is very slow), Apple has some bugs (antialiasing sometimes crashes the windowserver), and it breaks Mac OS X (Client) compatibility.
  • Fixed a cluster of select-popup bugs: OHFormSelectPopup now refers to popup items by index instead of by name. OHFormValue includes an extra field, "extraState", for storing state which is not part of the form submission but is necessary to recreate the UI state; this is used to disambiguate between multiple select options with the same value. Select options with the same label text are made distinct by appending zero-width spaces ( \u200B ) as necessary.
  • Works around a handful of bugs in popup lists on MacOSX (but not on OS4.2): popups with a zero-length title on their first cell size incorrectly; cells with a nonzero-length title string which has zero width when displayed cause an exception (which prevents the page from displaying at all).
  • Changes to text-style form elements (text fields, text areas, and file inputs) made by resetFromFormValues: are now reflected in -formValues immediately instead of waiting for the change to get to the UI. Also a nil value is returned as an empty string instead of no value, and the end-of-line convention conversion kludge no longer builds up an arbitrary number of \015's over time.
  • In -drawTableCellBackgroundForRect:withBorders:, pass the origin of the cellFrame to -drawBackgroundForRect:backgroundOrigin:. This fixes the other bug with our new web pages where the background image for our search table cell would draw in the wrong position.
  • We now turn off antialiasing when drawing cells, since antialiasing animations can eat up a ton of CPU.
  • Put tabs in their own lays, and set their width based on the paragraph's -positionOfTabStopFollowingPosition:. Also, we're willing to put a tab that "won't fit" on the end of a line, but it takes us to the next line. (The default behavior would have been for it to start the next line, which isn't the way tab stops are supposed to work in ASCII.)
  • When centering a line, ensure we end up with an integral x position. (This fixes the wacky redrawing bug on our new home page when cycling through the links in an odd-sized window.)
  • Menu items for starting and stopping animations.



3.0 beta 9 Released on March 26, 1999. Changes include:
  • Tons of fixes and extensions for JavaScript.
  • [OPENSTEP Only] Occasionally a loading page will draw as a blank gray screen. Refetching sometimes fixes it and sometimes crashes or causes other errors. [fixed]
  • Use the threadsafe lookupd gethostbyname on Hera rather than forking off lots of little tasks to perform each lookup. And on Solaris, use the threadsafe resolver call gethostbyname_r().
  • Fix a leak of dictionary entries. This is the bug that would make OmniWeb eventually run out of available socket descriptors.
  • Put locks around unix file manipulation, fixes some OpenStep crashers.
  • Patched a 4.2 bug: OPENSTEP/Mach 4.2 had a bug where -createFileAtPath:contents:attributes: with nil attributes would create a file with the permissions of 0700 (u=rwx), rather than 0666 (a=rw) modified by the umask. Thus, all files created using this method (by OmniWeb, for example) were made executable, which meant that when opening them in the Workspace tried to execute them rather than view them.
  • When the inspector window closes, unsubscribe from just the notifications that we signed up for explicitly. Otherwise, we'll never receive notification of the close again.
  • Added antialiased text option.
  • Patch to -[NSFileWrapper writeToFile:atomically:updateFilenames:] which corrects the permissions on the saved document. (Otherwise, it defaults to being world-writable.)
  • Fixed the OmniWeb OpenStep crash when the pageup/pagedown buttons are used at the beginning/end of a document. In -scrollDownByPercentage, we try to jump to the next/previous page only if we have a delegate that will handle it.
  • OASecureTextField No longer clobbers the selection in -stringValue (which means that password fields work again in OW).
  • The status view no longer draws itself in the wrong place the first time it's drawn. (We were resizing its window, which modified its frame's origin. Now I reset the frame's origin to zero after the resize.) We also clip the status view to the view we're supposedly drawing within, rather than drawing off to the left until PostScript clips us at the left edge of the window. This means that we no longer draw over the window border on Rhapsody, and that the beginning of the status is now always visible rather than the end. (This was most noticable on the Search panel.)
  • We no longer ignore the NetscapeCompatibleRelativeAddresses preference when connecting via a proxy server.
  • OWF now does HTTP 1.1 and works with servers that do HTTP 1.0 Connection: Keep-Alive headers. Now all requests to a particular site go into a single queue. OWF will start up to 4 sessions for each site. As each session comes free (either finishes connecting, or finishes fetching the last request), it gets the next queued request and sends the request to the server. If the server supports HTTP 1.1, the session will try to pull off more than one queued request (up to 3) and send them to the server all at once to take advantage of pipelining. It'll try to keep that maximum pipelining going all the time (i.e. pull another off the queue and send that request after every fetch, even though 2 others may be still in the pipeline.) On www.apple.com this gives you about 6 seconds for the home page, as opposed to 8 or so before. But further pages on the same site take advantage of the already open sockets: following up by going to the Apple Store Software page is about 3 seconds vs. 10 before.
  • If a server keeps dropping HTTP/1.1 connections before sending us any data, we tell the session queue that the server can't handle 1.1 reliably, and fall back to using HTTP/1.0 (where the server isn't allowed to drop the connection).
  • Added an expiration time for Omni/Animation, since otherwise it defaults to not being cached. Since all GIFs are animations, this means that GIF display no longer requires that the image data be decoded each time and sent to the window server. This makes GIF display much faster. JavaScript rollovers are particularly noticeable.
  • Removed 2 out of 3 copied-and-pasted methods and replaced them with one copy and a switch statement for the single line in which they differed. As a side effect the FTP processor now handles the PUT and (http/1.1) DELETE methods in the way you'd expect.
  • When the content cache is flushed, we flush any cached idle connections.
  • Now OWHTTPProcessor only runs in a seperate thread if there isn't anything previously queued on the session. Otherwise it just queues itself and it is done. The first guy in handles all of the actual HTTP session stuff until the queue empties. This leads to a lot more free threads, one less HTTP session lock, and it's faster 'n stuff.
  • OWCookies: Made domains case-insensitive (by lowercaseing 'em all). Now OmniWeb can successfully navigate ChaseCredit's rickety assemblage of refreshes and Visual BASIC scripts and submit a credit report request.
  • The authorizationServer is no longer a per-fetch variable. (I know it's not obvious from the +serverForAddress: API, but there's really a common server for each net location, just as there's a common session. I guess I ought to change that API to say +serverForNetLocation, someday.) This fixes the infinite loops at places requiring authentication (since the authentication object wasn't there when it was needed).
  • Fixed a bug where </Pwhatever> was parsed as </P>. (Note: whenever scanning tokens using -readLongestTrieElement:, peek at the following character to make sure it isn't a member of the token character set.)
  • TextBuilder was calling -textBuilderNoLongerPristine: on its delegate as soon as it first appended characters to its attributed string. Changed it so it doesn't call the delegate until the first time the attributed string gets appended to the HTML view. This was causing the empty white redraw between pages because the HTMLView got added to the pipeline and was displayed before it had any content. A really minor change but it certainly makes OmniWeb _feel_ much faster. (And incremental display still works - honest! It's just hard to notice on most sites with this and the HTTP 1.1 speedups. Our mail archive pages still take long enough to see incrementally, though.)
  • Added support for polygons in image maps. We may be the only browser that does this.
  • We now understand <td valign=baseline>, though we don't currently render it any differently than valign=top (but that's better than the valign=bottom rendering we were doing).
  • Added the OWAPI.h which contains the DO protocols for OmniWeb. This is added in the Resources folder and then added as a project header in Makefile.preamble. This means that the header will get shipped with the app and will still be available for compiles.
  • Spoof Preferences can now also be used to set the User-Agent used when spoofing.
  • Added a Store button to the source view window, which does about what you'd expect.
  • If we were the active frame while being removed from our view, we'd set the view's first responder to nil. Unfortunately, this meant that one of our subviews (being the first responder) would draw itself as part of its process of resigning first responder. That this was unnecessary drawing wasn't so bad, but the real problem was that our frame had already been adjusted for being removed, and that meant that our subview would draw itself in the wrong location (sometimes even over the window border on Rhapsody).
  • If the pipeline gives us alternate content, and that content is an OWAddress, then the URL has some scheme that we don't understand. Instead of passing it off to OHDownloader that doesn't know how to deal with it either, throw an 'Unknown URL Scheme' error onto the pipe and continue. Now you get feedback when you hit an HTTPS link or RealAudio or whatever and don't have a plugin that handles it.
  • Search panel: throw in a display of the count under each heading. Someone requested it on the OmniWeb3 list, and it was easy to do.
  • Search panel: you can now do a find on search results.
  • You can now pass '-d' to openURL to cause it to use the DO API rather than services. This was requested by a customer for a kiosk environment where Workspace isn't running (and thus Services are unavailable).



3.0 beta 8b Released on Sep 30, 1998. Changes include:
  • Our licensing framework no longer uses multicast (which failed in some configurations).
  • OmniWeb plug-ins are now required to specify which version of the frameworks they use, so that we don't crash due to incompatible plug-ins.



3.0 beta 8 Released on Sep 29, 1998. Changes include:
  • Licensing
    • This is the first version of OmniWeb 3 to use our licensing framework. An expiring 10-user license has been provided for this beta release; a non-expiring 1-user license will be provided for the final release. If you would like additional licenses please contact sales@omnigroup.com.
  • Features
    • Added "Shortcut" preferences, which allow you to add shortcuts for URLs. (For example, you can enter a shortcut so that typing "ow3" will take you to "http://www.omnigroup.com/Omniweb/3/".)
    • Keyboard navigation of form elements is now supported.
    • We've added support for the <spacer> tag. (Handy for CyberStudio-generated pages.)
  • Optimizations
    • Pages with lots of links render much more quickly.
    • Memory usage is reduced and much more localized.
  • Bug fixes
    • Refetching an inline image twice no longer causes a spinning cursor and event lagging.
    • Dragging from an image map or an image inside an anchor now drags the selected link rather than dragging the image. (You can hold down Shift to drag the image itself.)
    • The stop button actually works properly now.
    • Find works in frames.
    • Top-aligned cells now align along the true top of a line, rather than aligning with the top of the text to that point of the line.
    • You can jump to named anchors with no contained text.
    • Several bugs with cookies have been fixed.
    • Fixed a bug in the time remaining calculation in downloads.
    • Saving edited HTML source no longer changes the source's encoding.
    • Fixed some bugs in the proxy server preferences panel.
    • Fixed some bugs in frame targetting.
    • Fixed a bug where images would be scaled proportional to their alternate text before being fetched if only one dimension was specified. (This made the graphics on The Apple Store's main page jump around a lot as it was loading.)
    • Probably a bunch of other minor bugs.



3.0 beta 7 Released on June 4, 1998. Changes include:
  • New plugins:
    • Java: this is our first public beta of Java, ONLY for Rhapsody DR2 and newer. Still some stuff to be done, but, hey, you asked for Java, here's Java.
    • Macromedia flash: We don't do JPEGs or sound yet, but you can watch the South Park movies and take the quiz.
    • QuickTime downloader: While we're waiting for info on how to use QuickTime from Rhapsody, we've temporarily made OmniWeb at least show a nice big button for QT movies that you can click on so they'll download and open in the viewer.
  • New features:
    • Services now work on text selected in the new HTML view. Took nine minutes of coding. OpenStep rules.
    • Plugins now end in ".plugin" so people will stop asking us if we support plugins.
    • Plugins now can register what version they are and what versions of other components they require, so we won't load out-of-date plugins any more.
    • Added a menu item for "Stop Animations". Also, made animations stop when you leave a page, which seems like a darn good thing, really.
    • We now parse mailto URL parameters, i.e. mailto:x@y.com?subject=hi&cc=z@q.com&body=blah
    • Added support for <EMBED> and <OBJECT>. Right now we have the flash and QT plugins that use this.
    • Table cells can now have background images, like Netscape and IE 4.0.
    • By popular demand, removed the "check" button from the bookmarks panel -- it is now effectively always on.
    • Removed seperate preferences for gray colors. Been a long time since 2-bit grayscale was hip.
  • Bugs fixed:
    • Pages are now always completely rendered. (For example, http://www.eff.org/papers/eegtti/eeg_toc.html would stop drawing after the bullet following "Ontario".)
    • Closing the browser window after rendering a particular HTML page (and presumably similar pages) caused OmniWeb to start chewing CPU. This has been fixed (and that page now displays faster initially as well).
    • Find now works correctly in pages with tables, including side-aligned tables. It actually works a lot better than in OmniWeb 2.x, as I've fixed a bunch of longstanding thinkos. Find won't get stuck in TEXTAREAs any more (but will find text in them).
    • 'Jump to Selection' now works for all text objects.
    • Turned off the 'Netscape compatible nonterminated entities' preference by default, since Netscape 4.0 has finally thrown away this hack. Good for them! Also, cut down our entities list to only support the ones Netscape and IE do, because people do stupid things like write URLs of the form: 'http://www.foo.com/cgi-bin/submit&prod=blah'. Since &prod is an HTML 4.0 entity, it will be turned into a big 'x' (the mathematical product symbol) by browsers that understand extra entities. So, since we can't change the world, we restricted our browser's entities, so now if it doesn't trip up Netscape and IE, it won't trip us up. Fixes a LOT of problems people have been having with forms not submitting correctly on some sites.
    • Cookies were sometimes lost inappropriately due to STUPID SERVERS NOT FOLLOWING THE HTTP SPEC FOR DATES. Since lots of servers don't follow the spec, we totally rewrote our date parsing to encompass all the servers we've seen. Let us know if we're missing any.
    • If you have the preference set for auto-checking bookmarks, now they only check as often as you asked, rather than EVERY time you open your bookmarks.
    • The setting of the "Netscape compatible nonterminated entities" and several other preferences wasn't saved.
    • The "Use Defaults" button on the preferences panel didn't work for most preferences.
    • Formatting
      • On OPENSTEP/Mach, form input text fields would sometimes be too narrow if you'd changed your fixed-width font.
      • Special-cased two windows characters that weren't displaying correctly by the NSText system.
      • <SELECT> tags without the MULTIPLE attribute now keep their selection -- works around an OpenStep bug that still exists in Rhapsody.
      • <SELECT> tags now always display the number of rows the user asks for (the way Netscape always has), which allows forms pages to be formatted purdier.
      • <break clear=foo> was failing if it was the next-to-last thing in a text object and a side-aligned image was last.
    • OmniWeb sometimes crashed on launch when it tried to send a message to an NSString constant from two threads simultaneously. (This is a bug in Foundation which we've worked around in other places, but we needed to work around it in OIAnimationFrame too.)
    • Fixed a display bug where the last line of a paragraph before a paragraph with a much bigger font would sometimes be WAY too tall.
    • Fixed a bug that caused unkillable processes which would hang out in the processes panel forever.
    • Worked around a crasher with secure text fields that is actually Apple's bug, so hopefully they'll fix it themselves soon.
    • Worked around a Rhapsody bug with accessing the font panel before you render a page and then not being able to see any other pages.
    • Fixed URL parsing bug that was pretty obscure but resulted in multiple slashes between the hostname and the path.



3.0 beta 6 Released on April 28, 1998. Changes include:
  • Brand new text object! Text is now displayed in our own custom view instead of a modified NSTextView. We are still using an NSLayoutManager under our view, but we do all the drawing, selecting, and word layout ourselves now. This enabled us to handle a lot more wacky HTMLisms without all the hacks we had before, and increased our layout speed by 3-4x.
    • YOU CAN COPY TABLES TO RTF. You can also save a page as RTF, unless we get sued by Wang. Tables, images, and other objects now correctly add themselves to the pasteboard as TIFF or EPS inclusions.
    • You can now drag links out of documents just by click-dragging, with no bucky-bits. Makes bookmarks darn easy. On Rhapsody, you can just drag onto the desktop to save the file, although in DR1 it's still just a link to the file. (Yes, Netscape has had dragging to the filesystem, but they did copy it from us originally.)
    • Big pages now do not take a disproportionate amount of time to display. They no longer only update once, then hang the app for 10 seconds, then display again and everything is fine.
    • Find is still mostly broken on pages with tables (most pages), but I did fix 'enter selection' to work right in all cases.
    • Cells have been completely rewritten:
      • Cells now layout from the top down, which has really cleaned up a bunch of ugly stuff for us. In the old days when we used the NSText object, we had no way of knowing when a cell was about to be laid out, so it was very hard for cells to do things like resize to be a percentage of their views..
      • Side aligned-images now always display correctly.
      • More types of objects can be side-aligned, have their sizes be a percentage of the page, or have hspace and vspace, like they can in IE and Netscape 4.0. Applets, buttons, images, and tables now all understand side-alignment, percentage sizes, and padding, using the same code! Actual code reusability!
    • Table layout is better, but hasn't been majorly rewritten. We're eagerly looking for tables that still don't work right.
    • We hacked our HTML parser so dummies can put </HTML> or </FONT> in the middle of a table and it won't end the table. Especially common on servers that include documents, or auto-append documents.
  • Bookmarks changes
    • The big change behind bookmark checking has been finished (last release had only parts of the work done). Bookmarks now (by default) inherit their checking behaviour from their parent, so you can set a group of bookmarks to all check once an hour just by having a header that says, "Check me once an hour" and then dragging bookmarks under it. (You no longer have to set the check time on each bookmark.)
    • Editing bookmarks now has a different look (and different code behind it).
    • Checking all bookmarks now doesn't bring the machine to its knees. This was actually a problem where I was drawing the status messages about a zillion times a second. Doh.
  • Frames:
    • Frames are now rewritten to support grid-style framesets (eg, <Frameset rows="*,*" cols="*,*">).
    • Ken spent a bunch of time making frames do the same things that Netscape does when the user gives us bad HTML (like mismatching the number of rows and frames).
    • Bordered frames now don't count the border as part of the frame's size, unlike Netscape but like IE. Hey, if you ask for 60 pixels, you should get 60 pixels.
    • Bordered frames now draw a border a lot like the cool MacOS platinum window border. Darn, it looks neat.
    • You can even drag both a horizontal and a vertical border simultaneously in a frameset that's laid-out as a grid. Let's see Netscape do that.
  • Interface:
    • Some animated GIFs were using a misfeature in the GIF standard that we were checking for and skipping around. Removed checking code and now those animated GIFs work right.
    • URLs in the processes panel now display in character-wrapping mode instead of word-wrapping, so you'll see more of them.
    • The preferences UI has been redone to look more Maclike and to simplify adding new preferences. Eventually we'll probably do a heirarchical thingy, but not until we go pure Rhapsody.
    • Stuck in a workaround for a Rhapsody bug having to do with changing the focus in a window. In the past it's been responsible for a lot of wacky behaviour on Rhapsody, including troubles editing bookmarks. (Bug reported to Apple.)
    • Created a new secure text field object that patches a number of bugs in the OpenStep one, including:
      • -stringValue works whether or not the secure text field is the first responder.
      • Secure text fields no longer try to make themselves the first responder whenever their frame changes (-setFrameSize: no longer calls -selectText:), which fixes a class of bugs (including both the crasher Luke was complaining about and a bug where you couldn't select any other fields in OmniWeb when a secure text field was visible because it kept autoselecting itself).
    • We now collapse spaces in TITLE tag.
    • If you download a file that would be opened in Edit, it is just selected in the Workspace instead, so you won't get 20MB binaries opening in Edit.
    • Added 'Save Source To...' menu command, which can save HTML or JPEG or whatever is in the main window.
    • Now when dragging anchors into a window the URL well in that window will light up if it's receptive to you. Also, URLs now drag with their titles on a little transparent background, and it's pretty darn cool.
    • If you start typing in the URL well and a page loads, it will no longer blow away what you've been typing. Don't you hate it when Netscape does that to you?
  • Frameworks:
    • Any cookies with no specified expiration date now expire at the end of the session rather than hanging around forever.
    • Pipelines have been changed so a pipeline will tend to finish before other pipelines are started, as opposed to the old system which would do all pipelines' first stages, then all their second stages, etc. This is really noticeable on pages with 50 or so inline images -- now the first images on the page will display immediately, rather than waiting for all 50 to load before any draw. It also is noticeable when checking lots of bookmarks -- the bookmarks will load the page, check it, and go away, rather than hang around saying, "SourceSignature queued".
    • Defaults handling is much better - no more pauses (or sometimes crashes) when you change preferences.
    • Fixed bad PS so printing will work again. (Unfortunately, we still emit PostScript Level 2, so printing is not yet reliable to printers which only speak PostScript Level 1. We definitely plan to fix this.)
    • Stopped using NeXT's old -dateWithNaturalLanguageString:, which is slow, leaks 8K every time you call it, and also crashes occasionally in multi-threaded setups. (Bug reported to Apple.)
    • Started to use NSZones intelligently so persistent data will be allocated in its own zone, and not fragment up main memory. Should help those pesky swapfiles shrink occasionally.
    • We now ignore the second and following duplicate attributes in a tag, rather than ignoring all but the last. For example, you sometimes see people write bad HTML of the form: <IMG align=left align=middle>. Netscape treats this as align=left and ignores the align=middle, so now we do too.
    • When parsing tags that have no attributes (like <li>), we now use a single static immutable class-wide tag object to represent all occurances of that tag on all pages. Reduces memory usage, fragmentation, and processing time.



3.0 beta 5 Released on February 21, 1998. Changes include:
  • Stability, accuracy, speed, memory usage:
    • We find OmniWeb 3 beta 5 to be more stable than OmniWeb 2.5 and to do a better job rendering pages. Everyone at Omni now uses OmniWeb 3 for everyday web browsing, except the one person stuck on a 486.
    • Beta 5 is about as fast as OmniWeb 2.5 for most pages on our hardware. We still have not done the big rendering optimization we plan to do.
    • Memory usage is still bad, but not super-bad. We haven't done leak checking yet, because it's easiest to do that in one big lump at the end, since we'll just re-introduce leaks later and have to run OmniObjectAlloc all over again.
  • HTML
    • Sometimes (rarely) when you visited a complex page the app would start sucking down CPU as it relaid out the page over and over.
    • We don't use character constants in our code any more, because the default encodings are different on different platforms, changing the intended character.
    • Since stupid Microsoft FrontPage incorrectly writes out documents using WinLatin1 encoding instead of ISO 8859-1 (WinLatin1 is a superset) and Unicode &#xxxx escapes, we now use WinLatin1 by default, and understand &#xx; entities that are in WinLatin1's extra space, even though THE STANDARD SAYS WE SHOULDN'T. (Notably, Apple's pages use lots of these illegal entities– their hot news page has lots of single quotes and en-dashes in the WinLatin1 set).
    • Selecting an anchor does a funky transparent purple box kinda deal instead of dotted lines a la Internet Explorer. I like it.
    • Fixed bugs where transparent tables inside colorful tables on a page with a background image would draw the background image instead of their parent's color. Follow that?
  • Searching
    • Search logic totally rewritten, so we actually show good links and skip ads and other stuff. It actually works! Try it! It's just really cool.
    • Details:
      • Search result parsing uses regular expressions, making parsing more resistant to changes in search result format, and making inspector much easier to understand and add to.
      • Getting multiple pages of results now happens automatically instead of having the weird 4-state search button with the "continue" state that never worked.
      • Added grouping of results by search engine, URL site, or none (mix 'em all together).
      • Added sorting of results by order receieved or alphabetically.
      • The sorting and grouping stuff is totally expandable: register a name, and implement a protocol and you can add new sorting methods.
      • In short: rules.
    • Search images are now in app-wrapper, so you don't have to load them from Omni. That'll make it a lot faster to load the search panel.
    • Dragging into and within a search panel now works again.
  • Bookmarks
    • Added menu items:
      • Check all bookmarks for changes or check all bookmarks under the current selection for changes.
      • Mark all (or all under selection) bookmarks as read.
      • Mark all (or all under selection) bookmarks as not unreachable.
      • Delete all (or all under selection) unreachable bookmarks, which has a particularly keen little panel that pops up and lets you select which ones to axe. Take that, Netscape! (Oh, wait, I forgot they quit the browser business.)
    • Stepping through 'new' and '???' links is much faster in big files.
    • For new users, a defaults bookmarks file is now automatically created, rather than the weird old system of editing the built-in bookmarks for a while and then possibly accidentally saving them in the wrong place.
    • Checking bookmarks could sometimes mistakenly mark them as viewed or unreachable when neither was true. Both are fixed.
    • When a bookmark is set to auto-check itself, it will also auto-check all its children which have their checking state set to "default". This means you can turn on checking once on a header and have everything you put under that header automatically checked without having to mess with it.
  • History
    • The history button now has context-menu on Rhapsody and windows which lets you select from the three types of history.
    • The history button now brings up the persistent history on single-click, since that's really the coolest history.
    • Forms now store their values with our history nodes, which means if you fill in a forms page, leave it, it expires from our cache, and you go back to the page, it'll refill in your values. Isn't that spanky! Niftier yet, we verify that no hanky-panky has gone on with the page in the meantime, so we don't suffer from the bug Netscape did where you could swizzle a textfield into a file submit form in JavaScript and steal any of the user's files.
  • Status
    • Fixed a host of problems with status bar, including leaving crud sometimes on Rhapsody and Windows, being erased sometimes, being flickery, sometimes showing up in the wrong spot, sometimes scrolling with the page, etc. OpenStep just really wasn't meant to display a view on top of other views, but I found a way.
    • The status bar uses a much nicer algorithm to figure out what to say about a loading page, so it spends less time flashing around and really reflects what's going on, as a status bar ought to.
    • Search panel and bookmarks now have status bars, too.
    • Changed abbreviations of bytes (eg, 9.1KB) to be more in line with Macs.
  • Processes panel
    • Stopping a bunch of pipelines now works much more reliably, as pipelines that aren't started will now stop correctly.
  • Downloads
    • Downloading a file, stopping in the middle, and then downloading again now works correctly (instead of just trying to open the previous, truncated file).
    • When a download starts the processes panel will pop up and the file will be highlighted in it.
  • HTTP
    • Added back support for partial URLs of the form "http:foo.html", which is completely illegal but sometimes seen.
    • Changed URL routines so that paths work correctly under Win32.
    • By customer suggestion, you can now enable/disable proxies with a single click on the preference panel.
  • Images
    • JPEGs and GIFs that people mistakenly call GIFs and JPEGs (respectively) will now be correctly recognized as the other and rerouted invisibly to the right renderer. Gosh, I love the web.
  • Applets
    • We added applet preferences and we draw a nifty little icon where applets would go in web pages, just to tease you. The code we're releasing doesn't do a darn thing with applets, but internally we're all losing hours of productivity perfecting our Tic-Tac-Toe technique.
  • Edit Source
    • Added new "New Empty Source View" item, which does what you might expect. If you haven't tried editing in OmniWeb, you really should.
    • Added buttons to top of screen for keeping source colorized and/or formatted, and for compacting your text when you're all done editing.
  • General
    • There was a bug in 3b4 where, exactly 10 minutes after looking at a page with an imagemap, OmniWeb would hang with spinny cursor. The console would show something like, "Message respondsToObject: sent to FREED object (0x19939)". My bad. All better.
    • Fixed unaligned access crasher in calculating bookmarks checksum on OpenStep/Sparc only.
    • Fixed a crasher where you'd pop up the search panel, do a search, and then the next time you left a page you'd get a message about sending release to a freed object (or just crash).
    • Fixed the bug where connecting to www.nosuchplace.com would say "No IP address for host" rather than "No such host".
    • OmniWeb no longer treats files inside the app-wrapper as really being on the local disk, meaning it prevents you from saving files there even if you are logged in as a privileged user.
    • Credentials are now saved to ~/Library/OmniWeb/Credentials.plist, rather than to defaults. The file is set to be protected, but this assumes your account is safe. If not, don't save your passwords (yet).
    • Fixed bug where inspector sometimes won't inspect.
    • More menu items disable/enable themselves. I love OpenStep.
    • Worked around bug in OpenStep/Rhapsody where secure text fields required you to click out of them to actually get a value. Now they just work (although, we'd still like for Apple to fix the bug).



3.0 beta 4 Released on January 13, 1998. Changes include:
  • General
    • Many memory leaks fixed. Still a memory-hog, but not as bad. Work continues.
    • Quitting while there are active downloads now pops up a warning panel.
    • On Rhapsody, Japanese EUC and Shift-JIS pages work, and Japanese characters should display correctly throughout the program (bookmarks, progress panels, etc), although the interfaces still aren't localized.
    • Setting up a proxy no longer disables accessing machines in your local net (duh).
  • Bookmarks
    • Dragging into bookmarks won't leave the insert marker lying around after you finish an operation.
    • Dragging between bookmarks windows doesn't fail.
    • A bookmark won't lose its annotation text as soon as you look at it.
    • Bookmarks no longer temporarily overdraw or draw incorrectly, then look OK.
    • Bookmark checking is now limited to only using 3 of the 32 available threads, so you can no longer lock up OmniWeb by checking all your bookmarks at once. Check out the preferences panel for bookmarks, and try it!
    • There is now a tiny check button on the bookmark panel that toggles whether a tiny check is drawn to the left of bookmarks which have automatic checking enabled.
    • The bookmark checking for changes since last viewed algorithm has been changed since so many sites now don't return a correct 'last-modified-date' header (dynamic HTML killed that). Now we actually look at the raw text of the page (skipping tags) and see if that has changed since the last time you viewed the page. This is nice because pages with dynamic, graphic ads won't trigger the "new" flag, as they do in Internet Explorer 4.0's lame attempt to copy our feature. (No, we don't store the page text itself, we store a SHA1 signature in the bookmarks file. Tricky, eh?)
  • HTML
    • Text outside of tables now wraps to the right edge of the window even if some cells are wider than the window (just like Netscape and OmniWeb 2).
    • We now highlight the selected anchor with a dashed box (like IE), and use the 'active anchor color' only on links that are actively being fetched (like IE and Netscape). This fixes the annoying bug where clever HTML authors set the active anchor color to be the background color, so as you would select anchors (via right-click or whatever) they'd disappear.
    • Tables
      • support vertical alignment again.
      • background colors work again.
      • better layout, more closely imitates Netscape's 'algorithm'.
  • Browser
    • Context menus
      • Added context menus for links.
      • Added context menus for the page-back and page-forward buttons.
      • All context menus currently only work on Rhapsody/Intel and Win95/NT. Apple is working on Rhapsody/PPC support (it was there for a while, but dropped out).
    • Clicking between characters in a link no longer fails. (No more ignored mouse clicks.)
    • Fixed random crasher with bringing up find panel.
    • Frames draw border in highlightColor (definable in Win95 and Rhapsody) around themselves when they are the first responder, which lets you know that the history and arrow keys are applying to them, not the whole window. Border isn't drawn if the HTML frame 'border' attribute is off (like in Netscape 4.0, which incidentally copied this feature from OmniWeb 2.0).
    • Broswer address field (combo box now, actually) now has a title on it, which changes from "Page address:" to "Goto address:" depending on whether the address it's showing is the address of the page or the address of the page you're thinking about going to. Works nifty.
    • The selected anchor nows draw a little dotted box around itself a la IE. We used to draw the selected anchor in the "selected anchor" color, but since no one else was doing this bad HTML authors would make the selected color be the same as their background color (don't ask me why) and so the selected link would disappear. Now we only draw a link in the selected color if it's actually being followed, like IE and NS.
  • History
    • New history preferences panel.
    • New persistant history panel remembers where you've been, sorts addresses by site.
    • History for frames works again (hitting arrow keys with frame selected moves the frame back).
    • Combo box can work off of persistant history or window history.
  • Processes panel
    • New layout. More information on processes, presented in a clearer manner.
    • New process queueing and priorities system:
      • All processes are now sorted into 5 headers, currently "Saving Files", "Web Pages", "Downloads", "Search Engines", and "Checking Bookmarks".
      • Processes now have a priority based on which header they belong to. Thus, file saving will always grab a thread before web pages, and web pages will always have precedence over checking bookmarks.
      • In addition, each header will only allow its children to tie up a limited number of the available threads (currently 32). For example, checking bookmarks can only use 3 threads at once.
      • The number of available threads has been increased from 8 to 32. There is now a hidden preference (which will be brought out later) so experts can play with this.
    • Headers now show the progress of all their children, combined, in their status bars. They also give an indication of how long their children will take.
    • Process's status bars will draw in gray outline if the process doesn't have a thread yet, rather than drawing the spinny barber pole. This gives a good indication of whether you are waiting for your machine or the remote machine.



3.0 beta 3b Released on Oct 31, 1997. Changes include:
  • Changed the default news host to localhost, since beta 3 crashes on startup if it can't find the news host.



3.0 beta 3a Released on Oct 31, 1997. Changes include:
  • The Search panel works.
  • The Search panel displays images for all the targets. (It also supports animations now.)
  • Reformatting in the HTML Source view properly indents container tags which have an implied end tag (e.g., <td> without </td>).
  • If a form contains a single text field, hitting return in that field submits the form.
  • Password text fields are more secure.



3.0 beta 3 Released on Oct 30, 1997. Changes include:
  • Faster (though still nowhere close to being optimized).
    • Subthreads don't have to lock the main thread as often (we now maintain a thread-safe font cache).
    • When subthreads do have to lock the main thread, it responds to their requests much more quickly.
    • Tooltip support is much more efficient.
  • HTML Display
    • Fixed the exception which (on some pages) would cause background layout errors to be reported to the console repeatedly (until the app was terminated or the system disk filled up from the huge console log).
    • Scroll bars should now always appear when they should.
    • The height of side-aligned images and tables is now correctly taken into account when determining the size of a table cell or an html page.
    • Side-aligned images and tables at the end of a page (or table cell) now display properly.
    • Side-aligned images and tables now obey the left and right margins.
    • Font sizes are rounded to the nearest integer, to avoid triggering a bug in the NSText suite's selection mechanism which occurs when the text contains fonts of non-integer sizes.
  • Preferences
    • Split Preferences into User Preferences and Administrator Preferences.
    • Added animated gif preferences.
    • Added gamma correction setting for HTML colors.
    • HTML Source now has several new settings, including one which allow you to distinguish between mismatched tags and unrecognized tags.
  • Bookmarks
    • Fixed dragging within a bookmarks file.
    • Fixed a bug where double-clicking on a new entry made closing not work properly.
  • Miscellaneous
    • Browser windows with timed refreshes no longer make themselves the main window when the refresh kicks in.
    • The source view no longer crashes when you type a quotation mark within a tag without another quotation mark following it somewhere within the HTML source.
    • We now prompt for a directory when saving all image links on a page.
    • Made the document inspector's outline view no longer be editable.
    • file: URLs pointing at directories now work properly.
    • Added very primitive support for news: URLs.
    • When sending mail (by messaging the local mail application), we convert newlines into spaces in the subject line.
    • Fixed a crasher in GIF processing.
    • Fixed a bug in frame targetting when the target was up more than one level.
    • The splash panel no longer forces itself to the front of the screen when OmniWeb isn't the active application.
    • Built the Rhapsody version for multiple architectures, so it can run on both Rhapsody/PowerPC and (untested) on Rhapsody/Intel.




3.0 beta 2 The first public beta of OmniWeb 3 was released on Oct 17, 1997. Here's a brief rundown of some of what's new:
  • OpenStepified
  • Borderless frames
  • Colored frame borders
  • Side-aligned tables
  • Inline frames
  • Animated Gifs
  • One URL field (vs 2)
  • URL field is combo box giving window history
  • Processes panel is hierachical
  • New status view, rather than using URL field as status view
  • Web page inspector
  • Syntax coloring in Source view
  • Source formatting
  • Source view marks errors and unrecognized tags
  • Can download all images linked to from a given page
  • Bookmarks panel provides easy way to rotate through updated bookmarks and dead bookmarks
  • Bookmarks panel has button for calling up the inspector panel
  • Improved named colors
  • Table formatting (in general) greatly improved
  • Default fonts tweaked to more closely match the width of Netscape's default fonts
  • Reload button on toolbar
  • Swapped accelerator keys for Open functions: Open URL is now cmd-o, Open File is now cmd-O
  • Menu item for loading all images on the current page
  • Sample bookmarks completely new
  • Open Company gone; URL field now accepts things like "apple" and does the right thing



3.0 beta 1 An early snapshot of OmniWeb 3 was distributed on the Rhapsody Developer Release Third Party Software CD-ROM.