diff --git a/AppKit/CPCompatibility.j b/AppKit/CPCompatibility.j index d2b31889a..852f68b26 100644 --- a/AppKit/CPCompatibility.j +++ b/AppKit/CPCompatibility.j @@ -26,11 +26,12 @@ // Browser Engines CPUnknownBrowserEngine = 0; -CPGeckoBrowserEngine = 1; -CPInternetExplorerBrowserEngine = 2; -CPKHTMLBrowserEngine = 3; -CPOperaBrowserEngine = 4; -CPWebKitBrowserEngine = 5; +CPGeckoBrowserEngine = 1 << 0; +CPInternetExplorerBrowserEngine = 1 << 1; +CPKHTMLBrowserEngine = 1 << 2; +CPOperaBrowserEngine = 1 << 3; +CPWebKitBrowserEngine = 1 << 4; // Safari + Chrome +CPBlinkBrowserEngine = 1 << 5; // Recent Chrome // Operating Systems CPMacOperatingSystem = 0; @@ -84,14 +85,23 @@ CPAltEnterTextAreaFeature = 32; /* When an absolutely positioned div (CPView) with an absolutely positioned canvas in it (CPView with drawRect:) moves things on top of the canvas (subviews) don't redraw correctly. E.g. if you have a bunch of text fields in a CPBox in a sheet which animates in, some of the text fields might not be visible because the CPBox has a canvas at the bottom and the box moved form offscreen to onscreen. This bug is probably very related: https://bugs.webkit.org/show_bug.cgi?id=67203 -*/ + */ CPCanvasParentDrawErrorsOnMovementBug = 1 << 0; // The paste event is only sent if an input or textarea has focus. -CPJavaScriptPasteRequiresEditableTarget = 1 << 1; +CPJavaScriptPasteRequiresEditableTarget = 1 << 1; // Redirecting the focus of the browser on keydown to an input for Cmd-V or Ctrl-V makes the paste fail. CPJavaScriptPasteCantRefocus = 1 << 2; +/* + Safari calculates incorrect text size unless you set the canvas font even if it is already set + You can see the bug after disabling the workaround and opening any panel while typing. + You can use the font panel in the manual test for CPTextView. + Look out for a displaced cursor, i.e. after typing letters of small width, such as the 'i'. + https://bugs.webkit.org/show_bug.cgi?id=150224 + */ +CPTextSizingAlwaysNeedsSetFontBug = 1 << 3; + var USER_AGENT = "", PLATFORM_ENGINE = CPUnknownBrowserEngine, @@ -110,7 +120,7 @@ if (typeof window !== "undefined" && typeof window.navigator !== "undefined") // Opera if (typeof window !== "undefined" && window.opera) { - PLATFORM_ENGINE = CPOperaBrowserEngine; + PLATFORM_ENGINE |= CPOperaBrowserEngine; PLATFORM_FEATURES[CPJavaScriptCanvasDrawFeature] = YES; } @@ -118,7 +128,7 @@ if (typeof window !== "undefined" && window.opera) // Internet Explorer else if (typeof window !== "undefined" && (window.attachEvent || (!(window.ActiveXObject) && "ActiveXObject" in window))) // Must follow Opera check. { - PLATFORM_ENGINE = CPInternetExplorerBrowserEngine; + PLATFORM_ENGINE |= CPInternetExplorerBrowserEngine; // Features we can only be sure of with IE (no known independent tests) PLATFORM_FEATURES[CPVMLFeature] = YES; @@ -136,10 +146,10 @@ else if (typeof window !== "undefined" && (window.attachEvent || (!(window.Activ PLATFORM_FEATURES[CPJavaScriptClipboardAccessFeature] = YES; } -// WebKit +// Safari + Chrome (WebKit and Blink) else if (USER_AGENT.indexOf("AppleWebKit/") != -1) { - PLATFORM_ENGINE = CPWebKitBrowserEngine; + PLATFORM_ENGINE |= CPWebKitBrowserEngine; // Features we can only be sure of with WebKit (no known independent tests) PLATFORM_FEATURES[CPCSSRGBAFeature] = YES; @@ -179,7 +189,10 @@ else if (USER_AGENT.indexOf("AppleWebKit/") != -1) PLATFORM_BUGS |= CPJavaScriptPasteRequiresEditableTarget; // https://bugs.webkit.org/show_bug.cgi?id=39689 PLATFORM_BUGS |= CPJavaScriptPasteCantRefocus; + PLATFORM_BUGS |= CPTextSizingAlwaysNeedsSetFontBug; } + else if ((window.chrome || (window.Intl && Intl.v8BreakIterator)) && 'CSS' in window) + PLATFORM_ENGINE |= CPBlinkBrowserEngine; // Assume this bug was introduced around Safari 5.1/Chrome 16. This could probably be tighter. if (majorVersion > 533) @@ -189,13 +202,13 @@ else if (USER_AGENT.indexOf("AppleWebKit/") != -1) // KHTML else if (USER_AGENT.indexOf("KHTML") != -1) // Must follow WebKit check. { - PLATFORM_ENGINE = CPKHTMLBrowserEngine; + PLATFORM_ENGINE |= CPKHTMLBrowserEngine; } // Gecko else if (USER_AGENT.indexOf("Gecko") !== -1) // Must follow KHTML check. { - PLATFORM_ENGINE = CPGeckoBrowserEngine; + PLATFORM_ENGINE |= CPGeckoBrowserEngine; PLATFORM_FEATURES[CPJavaScriptCanvasDrawFeature] = YES; @@ -286,7 +299,7 @@ function CPPlatformHasBug(aBug) function CPBrowserIsEngine(anEngine) { - return PLATFORM_ENGINE === anEngine; + return PLATFORM_ENGINE & anEngine; } function CPBrowserIsOperatingSystem(anOperatingSystem) diff --git a/AppKit/CPStringDrawing.j b/AppKit/CPStringDrawing.j index cbffafb85..5aab8aa01 100644 --- a/AppKit/CPStringDrawing.j +++ b/AppKit/CPStringDrawing.j @@ -30,9 +30,7 @@ var CPStringSizeWithFontInWidthCache = [], CPStringSizeWithFontHeightCache = [], - CPStringSizeMeasuringContext, - CPStringSizeIsCanvasSizingInvalid, - CPStringSizeDidTestCanvasSizingValid; + CPStringSizeMeasuringContext; CPStringSizeCachingEnabled = YES; @@ -59,22 +57,14 @@ CPStringSizeCachingEnabled = YES; return [self sizeWithFont:aFont inWidth:NULL]; } -- (void) _initializeStringSizing ++ (void) initialize { + if ([self class] != [CPString class]) + return; + #if PLATFORM(DOM) - CPStringSizeIsCanvasSizingInvalid = YES; - - if (CPFeatureIsCompatible(CPHTMLCanvasFeature)) - { - var aFont = [CPFont systemFontOfSize:12.0]; - - if (!CPStringSizeMeasuringContext) - CPStringSizeMeasuringContext = CGBitmapGraphicsContextCreate(); - - CPStringSizeMeasuringContext.font = [aFont cssString]; - var teststring = "0123456879abcdefghiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.-()"; - CPStringSizeIsCanvasSizingInvalid = ABS([CPPlatformString sizeOfString:teststring withFont:aFont forWidth:0].width - CPStringSizeMeasuringContext.measureText(teststring).width) > 2; - } + if (CPFeatureIsCompatible(CPHTMLCanvasFeature) && !CPStringSizeMeasuringContext) + CPStringSizeMeasuringContext = CGBitmapGraphicsContextCreate(); #endif } @@ -99,17 +89,11 @@ CPStringSizeCachingEnabled = YES; if (size !== undefined && sizeCacheForFont.hasOwnProperty(cacheKey)) return CGSizeMakeCopy(size); - if (CPStringSizeDidTestCanvasSizingValid === undefined) - { - [self _initializeStringSizing]; - CPStringSizeDidTestCanvasSizingValid = YES; - } - - if (CPStringSizeIsCanvasSizingInvalid || aWidth > 0) + if (!CPFeatureIsCompatible(CPHTMLCanvasFeature) || aWidth > 0) size = [CPPlatformString sizeOfString:self withFont:aFont forWidth:aWidth]; else { - if (CPStringSizeMeasuringContext.font !== cssString) + if (CPPlatformHasBug(CPTextSizingAlwaysNeedsSetFontBug) || CPStringSizeMeasuringContext.font !== cssString) CPStringSizeMeasuringContext.font = cssString; var fontHeight = CPStringSizeWithFontHeightCache[cssString]; diff --git a/AppKit/CPTextView/CPFontPanel.j b/AppKit/CPTextView/CPFontPanel.j index c4c4a6449..81a2cf93f 100644 --- a/AppKit/CPTextView/CPFontPanel.j +++ b/AppKit/CPTextView/CPFontPanel.j @@ -4,8 +4,7 @@ * * TODOs: * 1. make browser-width for size smaller and fix columns - * 2. sampleview is currently not shown - * 3. add all the missing features from the MacOS X counterpart + * 2. add all the missing features from the MacOS X counterpart (sampleview) * * * Created by Daniel Boehringer on 2/JAN/2014. @@ -68,54 +67,6 @@ var kTypefaceIndex_Normal = 0, var _availableTraits= [@"Normal", @"Italic", @"Bold", @"Bold Italic"], _availableSizes = [@"9", @"10", @"11", @"12", @"13", @"14", @"18", @"24", @"36", @"48", @"72", @"96"]; -@implementation _CPFontPanelSampleView : CPView -{ - CPLayoutManager _layoutManager; - CPTextStorage _textStorage; - CPTextContainer _textContainer; -} - -- (id)initWithFrame:(CGRect)rect -{ - if (self = [super initWithFrame:rect]) - { - _textStorage = [[CPTextStorage alloc] init]; - _layoutManager = [[CPLayoutManager alloc] init]; - - _textContainer = [[CPTextContainer alloc] init]; - [_layoutManager addTextContainer:_textContainer]; - - [_textStorage addLayoutManager:_layoutManager]; - } - - return self; -} - -- (void)setAttributedString:(CPAttributedString)aSting -{ - [_textStorage replaceCharactersInRange:CPMakeRange(0, [_textStorage length]) - withAttributedString:aSting]; - - [self setNeedsDisplay:YES]; -} - -- (void)drawRect:(CGRect)rect -{ - var ctx = [[CPGraphicsContext currentContext] graphicsPort], - glyphRange = [_layoutManager glyphRangeForTextContainer:_textContainer], - usedRect = [_layoutManager usedRectForTextContainer:_textContainer], - bounds = [self bounds], - pos = CGPointMake((bounds.size.width - usedRect.size.width) / 2.0, (bounds.size.height - usedRect.size.height) / 2.0); - - CGContextSaveGState(ctx); - CGContextSetFillColor(ctx, [CPColor whiteColor]); - CGContextFillRect(ctx, bounds); - CGContextRestoreGState(ctx); - - [_layoutManager drawGlyphsForGlyphRange:glyphRange atPoint:pos]; -} - -@end /*! @ingroup appkit @@ -132,8 +83,6 @@ var _availableTraits= [@"Normal", @"Italic", @"Bold", @"Bold Italic"], int _currentColorButtonTag; BOOL _setupDone; int _fontChanges; - - _CPFontPanelSampleView _sampleView; } @@ -187,8 +136,6 @@ var _availableTraits= [@"Normal", @"Italic", @"Bold", @"Bold Italic"], /*! @ignore */ - (void)_setupToolbarView { - var colorPanel = [CPColorPanel sharedColorPanel]; - _toolbarView = [[CPView alloc] initWithFrame:CGRectMake(0, kBorderSpacing, CGRectGetWidth([self frame]), kToolbarHeight)]; [_toolbarView setAutoresizingMask:CPViewWidthSizable]; @@ -196,8 +143,6 @@ var _availableTraits= [@"Normal", @"Italic", @"Bold", @"Bold Italic"], _textColorWell = [[CPColorWell alloc] initWithFrame:CGRectMake(10, 0, 25, 25)]; [_textColorWell setColor:_textColor]; [_toolbarView addSubview:_textColorWell]; - [colorPanel setTarget:self]; - [colorPanel setAction:@selector(changeColor:)]; } - (void)_setupBrowser:(CPBrowser)aBrowser @@ -425,10 +370,6 @@ var _availableTraits= [@"Normal", @"Italic", @"Bold", @"Bold Italic"], if ([self currentTrait] != typefaceIndex) [self setCurrentTrait:typefaceIndex ]; - [_sampleView setAttributedString: [[CPAttributedString alloc] initWithString:[font familyName] - attributes:[CPDictionary dictionaryWithObjects:[font, [CPColor blackColor]] - forKeys:[CPFontAttributeName, CPForegroundColorAttributeName]]]]; - _fontChanges = kNothingChanged; }