/* * Copyright (C) 2017 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #import "config.h" #import "DumpRenderTreeSpellChecker.h" #if PLATFORM(MAC) #import #import #import static bool spellCheckerLoggingEnabled; static IMP appKitRecordResponseIMP; static const char *stringForCorrectionResponse(NSCorrectionResponse correctionResponse) { switch (correctionResponse) { case NSCorrectionResponseNone: return "none"; case NSCorrectionResponseAccepted: return "accepted"; case NSCorrectionResponseRejected: return "rejected"; case NSCorrectionResponseIgnored: return "ignored"; case NSCorrectionResponseEdited: return "edited"; case NSCorrectionResponseReverted: return "reverted"; } return "invalid"; } static void drt_NSSpellChecker_recordResponseToCorrection(id self, SEL _cmd, NSCorrectionResponse response, NSString *correction, NSString *word, NSString *language, NSInteger spellDocumentTag) { if (spellCheckerLoggingEnabled) printf("NSSpellChecker recordResponseToCorrection: %s -> %s (response: %s)\n", [word UTF8String], [correction UTF8String], stringForCorrectionResponse(response)); wtfCallIMP(appKitRecordResponseIMP, self, _cmd, response, correction, word, language, spellDocumentTag); } static void swizzleNSSpellCheckerMethodsIfNeeded() { static bool hasSwizzled; if (hasSwizzled) return; hasSwizzled = true; Method recordResponseMethod = class_getInstanceMethod(objc_getClass("NSSpellChecker"), @selector(recordResponse:toCorrection:forWord:language:inSpellDocumentWithTag:)); appKitRecordResponseIMP = method_setImplementation(recordResponseMethod, (IMP)drt_NSSpellChecker_recordResponseToCorrection); } void setSpellCheckerLoggingEnabled(bool enabled) { swizzleNSSpellCheckerMethodsIfNeeded(); spellCheckerLoggingEnabled = enabled; } #else // PLATFORM(MAC) void setSpellCheckerLoggingEnabled(bool) { } #endif // PLATFORM(MAC)