RESOLVED FIXED Bug 40092
spellcheck does not check pasted text
https://bugs.webkit.org/show_bug.cgi?id=40092
Summary spellcheck does not check pasted text
Tony Chang
Reported 2010-06-02 17:25:37 PDT
For example, copy "foo baz" into your clipboard and paste it into a bugzilla comment. "foo" doesn't get a red underline because it isn't checked. This is similar to bug 37050.
Attachments
A draft implementation (only for discussion) (16.71 KB, patch)
2010-07-08 03:05 PDT, Hironori Bono
no flags
Another draft implementation (29.23 KB, patch)
2010-07-14 01:19 PDT, Hironori Bono
no flags
Draft implementation #2 (29.22 KB, patch)
2010-07-14 01:35 PDT, Hironori Bono
no flags
Draft implementation #3 (29.22 KB, patch)
2010-07-14 01:47 PDT, Hironori Bono
eric: review-
Draft implementation #4 (30.45 KB, patch)
2010-07-30 00:27 PDT, Hironori Bono
no flags
Draft implementation #5 (31.39 KB, patch)
2010-08-26 23:00 PDT, Hironori Bono
no flags
Patch (52.11 KB, patch)
2010-09-08 02:15 PDT, Hajime Morrita
no flags
sync up to the latest tree (52.29 KB, patch)
2010-09-08 04:33 PDT, Hajime Morrita
no flags
An attempt to fix build on Loopard (52.25 KB, patch)
2010-09-08 18:55 PDT, Hajime Morrita
no flags
Another attempt to fix build on Loopard (52.20 KB, patch)
2010-09-08 20:42 PDT, Hajime Morrita
no flags
Saved the buildbot delay (52.36 KB, patch)
2010-09-09 03:39 PDT, Hajime Morrita
no flags
took care of textInput event (62.27 KB, patch)
2010-10-12 02:36 PDT, Hajime Morrita
no flags
Updated to lastest (62.24 KB, patch)
2010-10-13 01:59 PDT, Hajime Morrita
no flags
Fixing Qt WebKit2 build (62.26 KB, patch)
2010-10-13 04:41 PDT, Hajime Morrita
no flags
Patch (62.61 KB, patch)
2010-10-21 05:36 PDT, Hajime Morrita
no flags
Patch (62.56 KB, patch)
2010-10-21 05:59 PDT, Hajime Morrita
no flags
Patch (76.18 KB, patch)
2010-10-28 04:39 PDT, Hajime Morrita
no flags
trying to make efl bot happy (76.23 KB, patch)
2010-10-28 04:47 PDT, Hajime Morrita
no flags
resolving conflict (76.27 KB, patch)
2010-10-28 06:00 PDT, Hajime Morrita
no flags
trying to fix build (77.81 KB, patch)
2010-10-28 18:40 PDT, Hajime Morrita
no flags
Updated to ToT (78.02 KB, patch)
2010-11-10 18:03 PST, Hajime Morrita
no flags
Patch (78.01 KB, patch)
2010-11-16 18:39 PST, Hajime Morrita
no flags
Updated to ToT (77.51 KB, patch)
2010-12-09 01:05 PST, Hajime Morrita
ojan: review+
Alexey Proskuryakov
Comment 1 2010-06-03 13:41:58 PDT
Interestingly, TextEdit on Mac OS X 10.5 has similar behavior - but that's not the case on 10.6 for me.
Hironori Bono
Comment 2 2010-07-08 03:05:19 PDT
Created attachment 60861 [details] A draft implementation (only for discussion) Greetings, I have quickly implemented an asynchronous spellchecker which uses [NSSpellChecker requestCheckingOfString:] so we can check the spellings (and grammar) of pasted text in the background on 10.6. Unfortunately, this change needs xcode 3.2 to compile it because it depends on GCD (Grand Central Dispatch). Even though this change does not include layout tests and is not ready for review, it may be good for starting a discussion to solve this issue. (I'm writing a change for <https://bugs.webkit.org/show_bug.cgi?id=41832> to write a layout test for this issue.) Regards, Hironori Bono
Hironori Bono
Comment 3 2010-07-14 01:19:49 PDT
Created attachment 61480 [details] Another draft implementation Greetings, Even though nobody gave me any comments to my previous one, I have added a layout test to start a review process. Is it possible to review this change? Regards, Hironori Bono
WebKit Review Bot
Comment 4 2010-07-14 01:21:22 PDT
Attachment 61480 [details] did not pass style-queue: Failed to run "['WebKitTools/Scripts/check-webkit-style']" exit_code: 1 WebCore/editing/Editor.cpp:1196: Use 0 instead of NULL. [readability/null] [5] WebKit/mac/WebView/WebFrame.mm:1622: Line contains tab character. [whitespace/tab] [5] Total errors found: 2 in 19 files If any of these errors are false positives, please file a bug against check-webkit-style.
Early Warning System Bot
Comment 5 2010-07-14 01:29:09 PDT
Hironori Bono
Comment 6 2010-07-14 01:35:02 PDT
Created attachment 61485 [details] Draft implementation #2 Sorry, my previous change causes a build break on GTK. Regards, Hironori Bono
WebKit Review Bot
Comment 7 2010-07-14 01:36:51 PDT
Attachment 61485 [details] did not pass style-queue: Failed to run "['WebKitTools/Scripts/check-webkit-style']" exit_code: 1 WebCore/editing/Editor.cpp:1198: Use 0 instead of NULL. [readability/null] [5] WebKit/mac/WebView/WebFrame.mm:1622: Line contains tab character. [whitespace/tab] [5] Total errors found: 2 in 19 files If any of these errors are false positives, please file a bug against check-webkit-style.
Hironori Bono
Comment 8 2010-07-14 01:47:59 PDT
Created attachment 61488 [details] Draft implementation #3 Sorry for my annoying updates. I have fixed style issues in my previous change. Regards, Hironori Bono
WebKit Review Bot
Comment 9 2010-07-14 01:57:04 PDT
WebKit Review Bot
Comment 10 2010-07-14 02:00:11 PDT
Eric Seidel (no email)
Comment 11 2010-07-23 09:33:16 PDT
IIRC Doug did the recent spell-checking work in WebKit and might want to see this.
Douglas Davidson
Comment 12 2010-07-23 09:38:53 PDT
Yes, I'm definitely interested in looking at this. Unfortunately I will not be available until 8/13, but I would like to see an asynchronous implementation. Jia Pu is also working in this area.
Eric Seidel (no email)
Comment 13 2010-07-23 09:45:00 PDT
Comment on attachment 61488 [details] Draft implementation #3 WebCore/editing/Editor.cpp:1172 + String text; I would have put this "get me the text I need to process" block in its own function to make this one simpler. WebCore/editing/Editor.cpp:1187 + Node* Editor::getSpellingNode(Node* node) We don't use get in names in WebKit. WebCore/editing/Editor.cpp:1236 + m_spellingNode = 0; This could be a set or reset function given how you always set these both at once. Maybe these need to be a struct held by the object? WebCore/editing/Editor.cpp:1207 + if (node) { Early return is almost always cleaner. WebCore/editing/Editor.cpp:1220 + Position end(start); We have a PositionIterator for this sort of thing. WebCore/editing/Editor.cpp:1230 + String source(m_spellingText.substring(results[i].location, results[i].length)); Personally I tend to use = over assignment constructors myself. WebCore/editing/Editor.h:70 + : type(DocumentMarker::Spelling), location(0), length(0) { } Each assignment gets its own line. WebCore/editing/Editor.h:350 + Node* getSpellingNode(Node*); Again, no "get" functions in WebKit. WebKit/mac/ChangeLog:31 + 2010-07-14 Hironori Bono <hbono@chromium.org> Double ChangeLog entry! WebKit/mac/WebCoreSupport/WebEditorClient.mm:827 + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 && NS_BLOCKS_AVAILABLE NS_BLOCKS_AVAILABLE? WebKit/mac/WebCoreSupport/WebEditorClient.mm:839 + [[NSSpellChecker sharedSpellChecker] requestCheckingOfString:text range:NSMakeRange(0, text.length()) types:NSTextCheckingAllSystemTypes options:0 inSpellDocumentWithTag:0 completionHandler:^(NSInteger sequenceNumber, NSArray *results, NSOrthography *orthography, NSInteger wordCount) { Woh. Please split this into multiple lines using local variables. WebKit/mac/WebView/WebFrame.mm:1596 + switch ([[results objectAtIndex:i] resultType]) { I would have put this switch into an inline function instead of inlining it here to make this loop easier to read. WebKit/mac/WebView/WebFrame.mm:1614 + static Node* getSpellingNode(Frame* coreFrame) No "get" in function names.
Hironori Bono
Comment 14 2010-07-30 00:27:11 PDT
Created attachment 63034 [details] Draft implementation #4 Greetings Eric, Thank you for your review and comments. I have added the AsyncSpellCheckerController class to encapsulate some spellchecker-specific code and apply your comments. (I may miss some of them, though.) (In reply to comment #13) > WebKit/mac/WebCoreSupport/WebEditorClient.mm:827 > + #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 && NS_BLOCKS_AVAILABLE > NS_BLOCKS_AVAILABLE? This define means we can use GCD (Grand Central Dispatch), which is required by [NSSpellChecker requestCheckingOfString:]. (Even though GCD is enabled by default on 10.6, we can disable it. So it may be safer to add this define in my code.) It is definitely helpful to review the updated one and give me your comments? Regards, Hironori Bono
Hironori Bono
Comment 15 2010-08-22 22:17:51 PDT
ping?
Hironori Bono
Comment 16 2010-08-26 23:00:06 PDT
Created attachment 65679 [details] Draft implementation #5 Greetings, Even though nobody reviewed my pervious change, I would like to update my change because my previous change does not compile any longer. Would it be possible to give me your comments? Regards, Hironori Bono
Adam Barth
Comment 17 2010-08-31 19:50:21 PDT
Comment on attachment 65679 [details] Draft implementation #5 View in context: https://bugs.webkit.org/attachment.cgi?id=65679&action=prettypatch > WebCore/editing/Editor.cpp:321 > +#if PLATFORM(MAC) > + requestCheckingOfFocusedNodeText(); > +#endif I don't understand why this code has so many #if defs. Should this code be in a Mac-specific file?
Hironori Bono
Comment 18 2010-08-31 20:50:56 PDT
(In reply to comment #17) > > WebCore/editing/Editor.cpp:321 > > +#if PLATFORM(MAC) > > + requestCheckingOfFocusedNodeText(); > > +#endif > I don't understand why this code has so many #if defs. Should this code be in a Mac-specific file? Thank you for your comment. In fact, most code under "WebCore" does not need #if defs. Nevertheless, I enclosed them with #if and #endif since this code needs special functions like [requestCheckingOfString:] or threads. Therefore, I'm wondering if other platforms except Mac (and Chromium) would like to use this code. (The Chromium implementation is a little more complicated: it consists of a WebKit change and a Chromium change. So, I would like to send them with another change.) Regards,
Hironori Bono
Comment 19 2010-09-03 01:12:16 PDT
(In reply to comment #17) > I don't understand why this code has so many #if defs. Should this code be in a Mac-specific file? By the way, I'm a little wondering about the intention of your comment. Would you like to fix this issue only by changing Mac-specific files, to fix this issue without using Mac-specific functions, or something else? Regards,
Darin Adler
Comment 20 2010-09-03 09:56:42 PDT
Comment on attachment 65679 [details] Draft implementation #5 Our usual approach would be to put in fewer ifdefs, and compile in more of the infrastructure for the feature even on platforms that don't have it yet. Editor.h should not have all those PLATFORM(MAC) #if statements. It’s also not good to add new classes to existing files. We probably want to add new source files.
Hironori Bono
Comment 21 2010-09-07 20:04:41 PDT
Comment on attachment 65679 [details] Draft implementation #5 Greetings, I would like to cancel this review request since Morita-san kindly takes over this bug. Regards,
Hajime Morrita
Comment 22 2010-09-08 02:15:30 PDT
Hajime Morrita
Comment 23 2010-09-08 02:18:01 PDT
Hi Darin, thank you for reviewing! As Bono-san mentioned, I'm taking this patch over him. > > Editor.h should not have all those PLATFORM(MAC) #if statements. > > It’s also not good to add new classes to existing files. We probably want to add new source files. Updated patch introduce SpellChecker class, which defined in separated files. The patch also attempt to minimize ifdefs. Could you take a look at it?
Hajime Morrita
Comment 24 2010-09-08 04:33:44 PDT
Created attachment 66879 [details] sync up to the latest tree
Eric Seidel (no email)
Comment 25 2010-09-08 05:00:25 PDT
Hajime Morrita
Comment 26 2010-09-08 18:55:25 PDT
Created attachment 66988 [details] An attempt to fix build on Loopard
Eric Seidel (no email)
Comment 27 2010-09-08 19:22:51 PDT
Hajime Morrita
Comment 28 2010-09-08 20:42:28 PDT
Created attachment 66994 [details] Another attempt to fix build on Loopard
Hajime Morrita
Comment 29 2010-09-09 03:39:35 PDT
Created attachment 67016 [details] Saved the buildbot delay
Hajime Morrita
Comment 30 2010-09-09 18:30:07 PDT
Long queue of windows bot prevents patches with new file from built successfully. I'd like to leave it to avoid making the queue longer.
Hajime Morrita
Comment 31 2010-10-12 02:36:16 PDT
Created attachment 70518 [details] took care of textInput event
Hajime Morrita
Comment 32 2010-10-13 01:59:41 PDT
Created attachment 70592 [details] Updated to lastest
Early Warning System Bot
Comment 33 2010-10-13 02:15:51 PDT
Hajime Morrita
Comment 34 2010-10-13 04:41:19 PDT
Created attachment 70599 [details] Fixing Qt WebKit2 build
Eric Seidel (no email)
Comment 35 2010-10-20 14:04:27 PDT
Comment on attachment 70599 [details] Fixing Qt WebKit2 build View in context: https://bugs.webkit.org/attachment.cgi?id=70599&action=review This generally appears sane. It would be nice if Doug or one of the Apple folks could comment on the Obj-C. r- for the nits. > WebCore/dom/DocumentMarkerController.h:77 > +void showDocumentMarkers(const WebCore::DocumentMarkerController*); Why is this outside of WebCore? > WebCore/editing/Editor.cpp:3663 > +static Node* findFirstMarkable(Node* node) We didn't have this logic before? > WebCore/editing/SpellChecker.h:35 > +struct SpellCheckingResult { Structs rarely stay structs for long... > WebCore/editing/SpellChecker.h:48 > +class SpellChecker { Seems this should inherit from NonCopyable. > WebCore/editing/SpellChecker.h:53 > + bool isAsynchronousEnabled() const; is "Enabled" needed here? > WebCore/editing/SpellChecker.h:54 > + bool isAsynchronousAvailableFor(Node*) const; canCheckAsynchronously(node)? I'm not sure what this function does so my naming suggestions may make little sense. > WebCore/editing/SpellChecker.h:57 > + bool isCheckeable(Node* node) const; isCheckable? Also, "node" is not needed here. > WebKit/mac/WebCoreSupport/WebEditorClient.mm:954 > + RetainPtr<NSArray> _results; Seems a bit odd, but I guess this is Objective c++? Are destructors called for obj-c++? Isn't there a new fancy obj-c2 way to do autoretain? > WebKit/mac/WebCoreSupport/WebEditorClient.mm:978 > +- (WTF::Vector<WebCore::SpellCheckingResult>) _coreResults Extra space "lt>) _coreR" > WebKit/mac/WebCoreSupport/WebEditorClient.mm:995 > + for (size_t i = 0; i < [results count]; ++i) { > + NSTextCheckingType type = [[results objectAtIndex:i] resultType]; > + if (type & NSTextCheckingTypeSpelling) > + coreResults[i].type = DocumentMarker::Spelling; > + else if (type & NSTextCheckingTypeGrammar) > + coreResults[i].type = DocumentMarker::Grammar; > + else > + coreResults[i].type = DocumentMarker::AllMarkers; > + > + NSRange range = [[results objectAtIndex:i] range]; > + coreResults[i].location = range.location; > + coreResults[i].length = range.length; > + } This feels like a function passed to a map. Sadly I don't think obj-c has list comprehensions.
Douglas Davidson
Comment 36 2010-10-20 14:07:23 PDT
We'll need to look at this and see how it meshes with what we're doing.
Darin Adler
Comment 37 2010-10-20 14:09:49 PDT
(In reply to comment #35) > > WebKit/mac/WebCoreSupport/WebEditorClient.mm:954 > > + RetainPtr<NSArray> _results; > > Seems a bit odd, but I guess this is Objective c++? Are destructors called for obj-c++? Yes. > Isn't there a new fancy obj-c2 way to do autoretain? The fancy new Objective-C 2 way to do it would be to have property access handle the retain/release or to use garbage collection. Using a RetainPtr is the right way to do it in WebKit.
Hajime Morrita
Comment 38 2010-10-21 05:36:42 PDT
Hajime Morrita
Comment 39 2010-10-21 05:59:41 PDT
Hajime Morrita
Comment 40 2010-10-21 06:00:24 PDT
Eric and Everybody, thanks for giving a review! I update the patch to address Eric's point. > > WebCore/dom/DocumentMarkerController.h:77 > > +void showDocumentMarkers(const WebCore::DocumentMarkerController*); > > Why is this outside of WebCore? It follows RenderObject.cpp:showRenderTree() style. The function is designed to be called from gdb, so be in global namespace matters. > > > WebCore/editing/Editor.cpp:3663 > > +static Node* findFirstMarkable(Node* node) > > We didn't have this logic before? Unfortunately, no. Other part of spellchecking is immediately done once It finds a candidate to mark. So they need no extra traversing. But we need it because we mark them later. > > > WebCore/editing/SpellChecker.h:35 > > +struct SpellCheckingResult { > > Structs rarely stay structs for long... Agreed. Made it to a class. > > > WebCore/editing/SpellChecker.h:48 > > +class SpellChecker { > > Seems this should inherit from NonCopyable. Done. > > > WebCore/editing/SpellChecker.h:53 > > + bool isAsynchronousEnabled() const; > > is "Enabled" needed here? I think so. It is asking EditorClient to the setting. > > > WebCore/editing/SpellChecker.h:54 > > + bool isAsynchronousAvailableFor(Node*) const; > > canCheckAsynchronously(node)? I'm not sure what this function does so my naming suggestions may make little sense. Done. I agree that brief name is preferable. > > > WebCore/editing/SpellChecker.h:57 > > + bool isCheckeable(Node* node) const; > > isCheckable? Also, "node" is not needed here. Done. > > > WebKit/mac/WebCoreSupport/WebEditorClient.mm:954 > > + RetainPtr<NSArray> _results; > > Seems a bit odd, but I guess this is Objective c++? Are destructors called for obj-c++? Isn't there a new fancy obj-c2 way to do autoretain? It looks OK, as Darin mentioned. > > > WebKit/mac/WebCoreSupport/WebEditorClient.mm:978 > > +- (WTF::Vector<WebCore::SpellCheckingResult>) _coreResults > > Extra space "lt>) _coreR" Done. > > > WebKit/mac/WebCoreSupport/WebEditorClient.mm:995 > > + for (size_t i = 0; i < [results count]; ++i) { > > + NSTextCheckingType type = [[results objectAtIndex:i] resultType]; > > + if (type & NSTextCheckingTypeSpelling) > > + coreResults[i].type = DocumentMarker::Spelling; > > + else if (type & NSTextCheckingTypeGrammar) > > + coreResults[i].type = DocumentMarker::Grammar; > > + else > > + coreResults[i].type = DocumentMarker::AllMarkers; > > + > > + NSRange range = [[results objectAtIndex:i] range]; > > + coreResults[i].location = range.location; > > + coreResults[i].length = range.length; > > + } > > This feels like a function passed to a map. Sadly I don't think obj-c has list comprehensions. Agreed but there is no map() from NSArray to WTF::Vector. So I factored out the logic to make it more map()-like feeling.
Hajime Morrita
Comment 41 2010-10-21 06:02:39 PDT
(In reply to comment #36) > We'll need to look at this and see how it meshes with what we're doing. Hi Davidson! Please take a look. Any feedback are appreciated. I just this is not so large change. large chunks of the code is just a boilerplate.
Jia Pu
Comment 42 2010-10-27 13:55:34 PDT
(In reply to comment #41) > (In reply to comment #36) > > We'll need to look at this and see how it meshes with what we're doing. > Hi Davidson! > Please take a look. Any feedback are appreciated. > I just this is not so large change. large chunks of the code is just a boilerplate. Since we don't do autocorrection for pasted text, this patch doesn't seem interfere with our recent work on autocorrection. But I'd like to apply to apply this patch on 10.7, see if everything work together. I will let you know. My other concern is racing condition when multiple threads call [NSSpellChecker requestCheckingOfString:]. Is it possible?
Hajime Morrita
Comment 43 2010-10-27 18:53:47 PDT
Hi Jia, thank you for taking a look! > > Since we don't do autocorrection for pasted text, this patch doesn't seem interfere with our recent work on autocorrection. But I'd like to apply to apply this patch on 10.7, see if everything work together. I will let you know. Hmm. on the other hand, we need this for chromium (with separate EditorClient implementation)... How about this? : To land the patch, with the async check settings false. And doing the experiments before landing it true (at 10.7 release?). In this way, Chromium port can enable the feature with keeping other ports' behavior unchanged at this time. (I hope every ports to enable the flag at a certain timing. But it might need more experiments as you mentioned.) In my feeling, what really matters here is introducing the async spellcheck API. Without it, we cannot run spellchecking against larger chunks of text like copy-paste, dynamic @spellcheck attribute change, etc. And for Chromium (sorry for mentioning a specific port again...), A grammar check could be done by a separate process so async API is unavoidable. > > My other concern is racing condition when multiple threads call [NSSpellChecker requestCheckingOfString:]. Is it possible? Since WebKit is single-threaded, [NSSpellChecker requestCheckingOfString:] is only called from the main thread. Although NSSpellChecker looks to run the actual check logic on another (worker) thread, it is managed by NSSpellChecker. So we wouldn't care about that. A tricky part is that the passed completionHandler is called at the worker thread. To void a race, We go back to the main thread using [NSRunLoop performSelector:]. We touch WebCore objects only on the main thread by doing so.
Jia Pu
Comment 44 2010-10-27 19:05:14 PDT
(In reply to comment #43) > Hi Jia, thank you for taking a look! > > > > > Since we don't do autocorrection for pasted text, this patch doesn't seem interfere with our recent work on autocorrection. But I'd like to apply to apply this patch on 10.7, see if everything work together. I will let you know. > > Hmm. on the other hand, we need this for chromium (with separate EditorClient implementation)... > How about this? : > To land the patch, with the async check settings false. I just tried the patch. It seems play well with autocorrection on Mac. This is likely a desirable behavior on Mac as well, but I think we should land it with async set to false for now, just to be safe. > In my feeling, what really matters here is introducing the async spellcheck API. > Without it, we cannot run spellchecking against larger chunks of text > like copy-paste, dynamic @spellcheck attribute change, etc. Agree.
Hajime Morrita
Comment 45 2010-10-27 19:28:26 PDT
Hi Jia, > I just tried the patch. It seems play well with autocorrection on Mac. This is likely a desirable behavior on Mac as well, but I think we should land it with async set to false for now, just to be safe. Thank you for trying this! So I'll disable the default settings and add LayoutTestController method to make it enabled.
Hajime Morrita
Comment 46 2010-10-28 04:39:09 PDT
Hajime Morrita
Comment 47 2010-10-28 04:42:03 PDT
Updated the patch. It - introduced Settings::m_asynchronousSpellCheckingEnabled, false as default. - added a LayoutTestController API to enable it. - removed EditorClient::isAsynchronousSpellCheckingEnabled(), replaced by settings.
Hajime Morrita
Comment 48 2010-10-28 04:47:27 PDT
Created attachment 72170 [details] trying to make efl bot happy
Hajime Morrita
Comment 49 2010-10-28 06:00:18 PDT
Created attachment 72177 [details] resolving conflict
Early Warning System Bot
Comment 50 2010-10-28 06:48:47 PDT
Eric Seidel (no email)
Comment 51 2010-10-28 09:14:37 PDT
WebKit Review Bot
Comment 52 2010-10-28 16:49:31 PDT
Hajime Morrita
Comment 53 2010-10-28 18:40:35 PDT
Created attachment 72283 [details] trying to fix build
Hajime Morrita
Comment 54 2010-11-01 15:27:38 PDT
Could anyone take a look ? I think we got a consensus and the patch is ready to review. Thanks in advance.
Hajime Morrita
Comment 55 2010-11-10 18:03:03 PST
Created attachment 73564 [details] Updated to ToT
Hajime Morrita
Comment 56 2010-11-16 18:39:49 PST
Hajime Morrita
Comment 57 2010-12-09 01:05:11 PST
Created attachment 76023 [details] Updated to ToT
Hajime Morrita
Comment 58 2010-12-09 17:33:12 PST
Ojan, thank you reviewing! Darin, Alexey, I'll land this if there is no objection.
Hajime Morrita
Comment 59 2010-12-12 22:07:04 PST
Note You need to log in before you can comment on or make changes to this bug.