1/* 2 * Copyright (C) 2005, 2009 Apple Computer, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#import <WebKit/WebViewFactory.h> 30 31#import <WebKit/WebFrameInternal.h> 32#import <WebKit/WebViewInternal.h> 33#import <WebKit/WebHTMLViewInternal.h> 34#import <WebKit/WebLocalizableStrings.h> 35#import <WebKit/WebNSUserDefaultsExtras.h> 36#import <WebKit/WebNSObjectExtras.h> 37#import <WebKit/WebNSViewExtras.h> 38#import <WebKit/WebPluginDatabase.h> 39#import <WebKitSystemInterface.h> 40#import <wtf/Assertions.h> 41 42@interface NSMenu (WebViewFactoryAdditions) 43- (NSMenuItem *)addItemWithTitle:(NSString *)title action:(SEL)action tag:(int)tag; 44@end 45 46@implementation NSMenu (WebViewFactoryAdditions) 47 48- (NSMenuItem *)addItemWithTitle:(NSString *)title action:(SEL)action tag:(int)tag 49{ 50 NSMenuItem *item = [[[NSMenuItem alloc] initWithTitle:title action:action keyEquivalent:@""] autorelease]; 51 [item setTag:tag]; 52 [self addItem:item]; 53 return item; 54} 55 56@end 57 58@implementation WebViewFactory 59 60+ (void)createSharedFactory 61{ 62 if (![self sharedFactory]) { 63 [[[self alloc] init] release]; 64 } 65 ASSERT([[self sharedFactory] isKindOfClass:self]); 66} 67 68- (NSArray *)pluginsInfo 69{ 70 return [[WebPluginDatabase sharedDatabase] plugins]; 71} 72 73- (void)refreshPlugins 74{ 75 [[WebPluginDatabase sharedDatabase] refresh]; 76} 77 78- (NSString *)inputElementAltText 79{ 80 return UI_STRING_KEY("Submit", "Submit (input element)", "alt text for <input> elements with no alt, title, or value"); 81} 82 83- (NSString *)resetButtonDefaultLabel 84{ 85 return UI_STRING("Reset", "default label for Reset buttons in forms on web pages"); 86} 87 88- (NSString *)searchableIndexIntroduction 89{ 90 return UI_STRING("This is a searchable index. Enter search keywords: ", 91 "text that appears at the start of nearly-obsolete web pages in the form of a 'searchable index'"); 92} 93 94- (NSString *)submitButtonDefaultLabel 95{ 96 return UI_STRING("Submit", "default label for Submit buttons in forms on web pages"); 97} 98 99- (NSString *)fileButtonChooseFileLabel 100{ 101 return UI_STRING("Choose File", "title for file button used in HTML forms"); 102} 103 104- (NSString *)fileButtonNoFileSelectedLabel 105{ 106 return UI_STRING("no file selected", "text to display in file button used in HTML forms when no file is selected"); 107} 108 109- (NSString *)copyImageUnknownFileLabel 110{ 111 return UI_STRING("unknown", "Unknown filename"); 112} 113 114- (NSString *)searchMenuNoRecentSearchesText 115{ 116 return UI_STRING("No recent searches", "Label for only item in menu that appears when clicking on the search field image, when no searches have been performed"); 117} 118 119- (NSString *)searchMenuRecentSearchesText 120{ 121 return UI_STRING("Recent Searches", "label for first item in the menu that appears when clicking on the search field image, used as embedded menu title"); 122} 123 124- (NSString *)searchMenuClearRecentSearchesText 125{ 126 return UI_STRING("Clear Recent Searches", "menu item in Recent Searches menu that empties menu's contents"); 127} 128 129- (NSString *)defaultLanguageCode 130{ 131 return [NSUserDefaults _webkit_preferredLanguageCode]; 132} 133 134- (NSString *)contextMenuItemTagOpenLinkInNewWindow 135{ 136 return UI_STRING("Open Link in New Window", "Open in New Window context menu item"); 137} 138 139- (NSString *)contextMenuItemTagDownloadLinkToDisk 140{ 141 return UI_STRING("Download Linked File", "Download Linked File context menu item"); 142} 143 144- (NSString *)contextMenuItemTagCopyLinkToClipboard 145{ 146 return UI_STRING("Copy Link", "Copy Link context menu item"); 147} 148 149- (NSString *)contextMenuItemTagOpenImageInNewWindow 150{ 151 return UI_STRING("Open Image in New Window", "Open Image in New Window context menu item"); 152} 153 154- (NSString *)contextMenuItemTagDownloadImageToDisk 155{ 156 return UI_STRING("Download Image", "Download Image context menu item"); 157} 158 159- (NSString *)contextMenuItemTagCopyImageToClipboard 160{ 161 return UI_STRING("Copy Image", "Copy Image context menu item"); 162} 163 164- (NSString *)contextMenuItemTagOpenFrameInNewWindow 165{ 166 return UI_STRING("Open Frame in New Window", "Open Frame in New Window context menu item"); 167} 168 169- (NSString *)contextMenuItemTagCopy 170{ 171 return UI_STRING("Copy", "Copy context menu item"); 172} 173 174- (NSString *)contextMenuItemTagGoBack 175{ 176 return UI_STRING("Back", "Back context menu item"); 177} 178 179- (NSString *)contextMenuItemTagGoForward 180{ 181 return UI_STRING("Forward", "Forward context menu item"); 182} 183 184- (NSString *)contextMenuItemTagStop 185{ 186 return UI_STRING("Stop", "Stop context menu item"); 187} 188 189- (NSString *)contextMenuItemTagReload 190{ 191 return UI_STRING("Reload", "Reload context menu item"); 192} 193 194- (NSString *)contextMenuItemTagCut 195{ 196 return UI_STRING("Cut", "Cut context menu item"); 197} 198 199- (NSString *)contextMenuItemTagPaste 200{ 201 return UI_STRING("Paste", "Paste context menu item"); 202} 203 204- (NSString *)contextMenuItemTagNoGuessesFound 205{ 206 return UI_STRING("No Guesses Found", "No Guesses Found context menu item"); 207} 208 209- (NSString *)contextMenuItemTagIgnoreSpelling 210{ 211 return UI_STRING("Ignore Spelling", "Ignore Spelling context menu item"); 212} 213 214- (NSString *)contextMenuItemTagLearnSpelling 215{ 216 return UI_STRING("Learn Spelling", "Learn Spelling context menu item"); 217} 218 219- (NSString *)contextMenuItemTagSearchInSpotlight 220{ 221 return UI_STRING("Search in Spotlight", "Search in Spotlight context menu item"); 222} 223 224- (NSString *)contextMenuItemTagSearchWeb 225{ 226 return UI_STRING("Search in Google", "Search in Google context menu item"); 227} 228 229- (NSString *)contextMenuItemTagLookUpInDictionary 230{ 231 return UI_STRING("Look Up in Dictionary", "Look Up in Dictionary context menu item"); 232} 233 234- (NSString *)contextMenuItemTagOpenLink 235{ 236 return UI_STRING("Open Link", "Open Link context menu item"); 237} 238 239- (NSString *)contextMenuItemTagIgnoreGrammar 240{ 241 return UI_STRING("Ignore Grammar", "Ignore Grammar context menu item"); 242} 243 244- (NSString *)contextMenuItemTagSpellingMenu 245{ 246#ifndef BUILDING_ON_TIGER 247 return UI_STRING("Spelling and Grammar", "Spelling and Grammar context sub-menu item"); 248#else 249 return UI_STRING("Spelling", "Spelling context sub-menu item"); 250#endif 251} 252 253- (NSString *)contextMenuItemTagShowSpellingPanel:(bool)show 254{ 255#ifndef BUILDING_ON_TIGER 256 if (show) 257 return UI_STRING("Show Spelling and Grammar", "menu item title"); 258 return UI_STRING("Hide Spelling and Grammar", "menu item title"); 259#else 260 return UI_STRING("Spelling...", "menu item title"); 261#endif 262} 263 264- (NSString *)contextMenuItemTagCheckSpelling 265{ 266#ifndef BUILDING_ON_TIGER 267 return UI_STRING("Check Document Now", "Check spelling context menu item"); 268#else 269 return UI_STRING("Check Spelling", "Check spelling context menu item"); 270#endif 271} 272 273- (NSString *)contextMenuItemTagCheckSpellingWhileTyping 274{ 275#ifndef BUILDING_ON_TIGER 276 return UI_STRING("Check Spelling While Typing", "Check spelling while typing context menu item"); 277#else 278 return UI_STRING("Check Spelling as You Type", "Check spelling while typing context menu item"); 279#endif 280} 281 282- (NSString *)contextMenuItemTagCheckGrammarWithSpelling 283{ 284 return UI_STRING("Check Grammar With Spelling", "Check grammar with spelling context menu item"); 285} 286 287- (NSString *)contextMenuItemTagFontMenu 288{ 289 return UI_STRING("Font", "Font context sub-menu item"); 290} 291 292- (NSString *)contextMenuItemTagShowFonts 293{ 294 return UI_STRING("Show Fonts", "Show fonts context menu item"); 295} 296 297- (NSString *)contextMenuItemTagBold 298{ 299 return UI_STRING("Bold", "Bold context menu item"); 300} 301 302- (NSString *)contextMenuItemTagItalic 303{ 304 return UI_STRING("Italic", "Italic context menu item"); 305} 306 307- (NSString *)contextMenuItemTagUnderline 308{ 309 return UI_STRING("Underline", "Underline context menu item"); 310} 311 312- (NSString *)contextMenuItemTagOutline 313{ 314 return UI_STRING("Outline", "Outline context menu item"); 315} 316 317- (NSString *)contextMenuItemTagStyles 318{ 319 return UI_STRING("Styles...", "Styles context menu item"); 320} 321 322- (NSString *)contextMenuItemTagShowColors 323{ 324 return UI_STRING("Show Colors", "Show colors context menu item"); 325} 326 327- (NSString *)contextMenuItemTagSpeechMenu 328{ 329 return UI_STRING("Speech", "Speech context sub-menu item"); 330} 331 332- (NSString *)contextMenuItemTagStartSpeaking 333{ 334 return UI_STRING("Start Speaking", "Start speaking context menu item"); 335} 336 337- (NSString *)contextMenuItemTagStopSpeaking 338{ 339 return UI_STRING("Stop Speaking", "Stop speaking context menu item"); 340} 341 342- (NSString *)contextMenuItemTagWritingDirectionMenu 343{ 344#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 345 return UI_STRING("Paragraph Direction", "Paragraph direction context sub-menu item"); 346#else 347 return UI_STRING("Writing Direction", "Writing direction context sub-menu item"); 348#endif 349} 350 351- (NSString *)contextMenuItemTagTextDirectionMenu 352{ 353 return UI_STRING("Selection Direction", "Selection direction context sub-menu item"); 354} 355 356- (NSString *)contextMenuItemTagDefaultDirection 357{ 358 return UI_STRING("Default", "Default writing direction context menu item"); 359} 360 361- (NSString *)contextMenuItemTagLeftToRight 362{ 363 return UI_STRING("Left to Right", "Left to Right context menu item"); 364} 365 366- (NSString *)contextMenuItemTagRightToLeft 367{ 368 return UI_STRING("Right to Left", "Right to Left context menu item"); 369} 370 371- (NSString *)contextMenuItemTagCorrectSpellingAutomatically 372{ 373 return UI_STRING("Correct Spelling Automatically", "Correct Spelling Automatically context menu item"); 374} 375 376- (NSString *)contextMenuItemTagSubstitutionsMenu 377{ 378 return UI_STRING("Substitutions", "Substitutions context sub-menu item"); 379} 380 381- (NSString *)contextMenuItemTagShowSubstitutions:(bool)show 382{ 383 if (show) 384 return UI_STRING("Show Substitutions", "menu item title"); 385 return UI_STRING("Hide Substitutions", "menu item title"); 386} 387 388- (NSString *)contextMenuItemTagSmartCopyPaste 389{ 390 return UI_STRING("Smart Copy/Paste", "Smart Copy/Paste context menu item"); 391} 392 393- (NSString *)contextMenuItemTagSmartQuotes 394{ 395 return UI_STRING("Smart Quotes", "Smart Quotes context menu item"); 396} 397 398- (NSString *)contextMenuItemTagSmartDashes 399{ 400 return UI_STRING("Smart Dashes", "Smart Dashes context menu item"); 401} 402 403- (NSString *)contextMenuItemTagSmartLinks 404{ 405 return UI_STRING("Smart Links", "Smart Links context menu item"); 406} 407 408- (NSString *)contextMenuItemTagTextReplacement 409{ 410 return UI_STRING("Text Replacement", "Text Replacement context menu item"); 411} 412 413- (NSString *)contextMenuItemTagTransformationsMenu 414{ 415 return UI_STRING("Transformations", "Transformations context sub-menu item"); 416} 417 418- (NSString *)contextMenuItemTagMakeUpperCase 419{ 420 return UI_STRING("Make Upper Case", "Make Upper Case context menu item"); 421} 422 423- (NSString *)contextMenuItemTagMakeLowerCase 424{ 425 return UI_STRING("Make Lower Case", "Make Lower Case context menu item"); 426} 427 428- (NSString *)contextMenuItemTagCapitalize 429{ 430 return UI_STRING("Capitalize", "Capitalize context menu item"); 431} 432 433- (NSString *)contextMenuItemTagChangeBack:(NSString *)replacedString 434{ 435 static NSString *formatString = nil; 436#if !defined(BUILDING_ON_TIGER) && !defined(BUILDING_ON_LEOPARD) 437 static bool lookedUpString = false; 438 if (!lookedUpString) { 439 formatString = [[[NSBundle bundleForClass:[NSSpellChecker class]] localizedStringForKey:@"Change Back to \\U201C%@\\U201D" value:nil table:@"MenuCommands"] retain]; 440 lookedUpString = true; 441 } 442#endif 443 return formatString ? [NSString stringWithFormat:formatString, replacedString] : replacedString; 444} 445 446- (NSString *)contextMenuItemTagInspectElement 447{ 448 return UI_STRING("Inspect Element", "Inspect Element context menu item"); 449} 450 451- (BOOL)objectIsTextMarker:(id)object 452{ 453 return object != nil && CFGetTypeID(object) == WKGetAXTextMarkerTypeID(); 454} 455 456- (BOOL)objectIsTextMarkerRange:(id)object 457{ 458 return object != nil && CFGetTypeID(object) == WKGetAXTextMarkerRangeTypeID(); 459} 460 461- (WebCoreTextMarker *)textMarkerWithBytes:(const void *)bytes length:(size_t)length 462{ 463 return WebCFAutorelease(WKCreateAXTextMarker(bytes, length)); 464} 465 466- (BOOL)getBytes:(void *)bytes fromTextMarker:(WebCoreTextMarker *)textMarker length:(size_t)length 467{ 468 return WKGetBytesFromAXTextMarker(textMarker, bytes, length); 469} 470 471- (WebCoreTextMarkerRange *)textMarkerRangeWithStart:(WebCoreTextMarker *)start end:(WebCoreTextMarker *)end 472{ 473 ASSERT(start != nil); 474 ASSERT(end != nil); 475 ASSERT(CFGetTypeID(start) == WKGetAXTextMarkerTypeID()); 476 ASSERT(CFGetTypeID(end) == WKGetAXTextMarkerTypeID()); 477 return WebCFAutorelease(WKCreateAXTextMarkerRange(start, end)); 478} 479 480- (WebCoreTextMarker *)startOfTextMarkerRange:(WebCoreTextMarkerRange *)range 481{ 482 ASSERT(range != nil); 483 ASSERT(CFGetTypeID(range) == WKGetAXTextMarkerRangeTypeID()); 484 return WebCFAutorelease(WKCopyAXTextMarkerRangeStart(range)); 485} 486 487- (WebCoreTextMarker *)endOfTextMarkerRange:(WebCoreTextMarkerRange *)range 488{ 489 ASSERT(range != nil); 490 ASSERT(CFGetTypeID(range) == WKGetAXTextMarkerRangeTypeID()); 491 return WebCFAutorelease(WKCopyAXTextMarkerRangeEnd(range)); 492} 493 494- (void)accessibilityHandleFocusChanged 495{ 496 WKAccessibilityHandleFocusChanged(); 497} 498 499- (AXUIElementRef)AXUIElementForElement:(id)element 500{ 501 return WKCreateAXUIElementRef(element); 502} 503 504- (CGRect)accessibilityConvertScreenRect:(CGRect)bounds 505{ 506 NSArray *screens = [NSScreen screens]; 507 if ([screens count]) { 508 CGFloat screenHeight = NSHeight([[screens objectAtIndex:0] frame]); 509 bounds.origin.y = (screenHeight - (bounds.origin.y + bounds.size.height)); 510 } else 511 bounds = CGRectZero; 512 513 return bounds; 514} 515 516- (void)unregisterUniqueIdForUIElement:(id)element 517{ 518 WKUnregisterUniqueIdForElement(element); 519} 520 521- (NSString *)AXWebAreaText 522{ 523 return UI_STRING("HTML content", "accessibility role description for web area"); 524} 525 526- (NSString *)AXLinkText 527{ 528 return UI_STRING("link", "accessibility role description for link"); 529} 530 531- (NSString *)AXListMarkerText 532{ 533 return UI_STRING("list marker", "accessibility role description for list marker"); 534} 535 536- (NSString *)AXImageMapText 537{ 538 return UI_STRING("image map", "accessibility role description for image map"); 539} 540 541- (NSString *)AXHeadingText 542{ 543 return UI_STRING("heading", "accessibility role description for headings"); 544} 545 546- (NSString *)AXDefinitionListTermText 547{ 548 return UI_STRING("term", "term word of a definition"); 549} 550 551- (NSString *)AXDefinitionListDefinitionText 552{ 553 return UI_STRING("definition", "definition phrase"); 554} 555 556- (NSString *)AXARIAContentGroupText:(NSString *)ariaType 557{ 558 if ([ariaType isEqualToString:@"ARIAApplicationAlert"]) 559 return UI_STRING("alert", "An ARIA accessibility group that acts as an alert."); 560 if ([ariaType isEqualToString:@"ARIAApplicationAlertDialog"]) 561 return UI_STRING("alert dialog", "An ARIA accessibility group that acts as an alert dialog."); 562 if ([ariaType isEqualToString:@"ARIAApplicationDialog"]) 563 return UI_STRING("dialog", "An ARIA accessibility group that acts as an dialog."); 564 if ([ariaType isEqualToString:@"ARIAApplicationLog"]) 565 return UI_STRING("log", "An ARIA accessibility group that acts as a console log."); 566 if ([ariaType isEqualToString:@"ARIAApplicationMarquee"]) 567 return UI_STRING("marquee", "An ARIA accessibility group that acts as a marquee."); 568 if ([ariaType isEqualToString:@"ARIAApplicationStatus"]) 569 return UI_STRING("application status", "An ARIA accessibility group that acts as a status update."); 570 if ([ariaType isEqualToString:@"ARIAApplicationTimer"]) 571 return UI_STRING("timer", "An ARIA accessibility group that acts as an updating timer."); 572 if ([ariaType isEqualToString:@"ARIADocument"]) 573 return UI_STRING("document", "An ARIA accessibility group that acts as a document."); 574 if ([ariaType isEqualToString:@"ARIADocumentArticle"]) 575 return UI_STRING("article", "An ARIA accessibility group that acts as an article."); 576 if ([ariaType isEqualToString:@"ARIADocumentNote"]) 577 return UI_STRING("note", "An ARIA accessibility group that acts as a note in a document."); 578 if ([ariaType isEqualToString:@"ARIADocumentRegion"]) 579 return UI_STRING("region", "An ARIA accessibility group that acts as a distinct region in a document."); 580 if ([ariaType isEqualToString:@"ARIALandmarkApplication"]) 581 return UI_STRING("application", "An ARIA accessibility group that acts as an application."); 582 if ([ariaType isEqualToString:@"ARIALandmarkBanner"]) 583 return UI_STRING("banner", "An ARIA accessibility group that acts as a banner."); 584 if ([ariaType isEqualToString:@"ARIALandmarkComplementary"]) 585 return UI_STRING("complementary", "An ARIA accessibility group that acts as a region of complementary information."); 586 if ([ariaType isEqualToString:@"ARIALandmarkContentInfo"]) 587 return UI_STRING("content", "An ARIA accessibility group that contains content."); 588 if ([ariaType isEqualToString:@"ARIALandmarkMain"]) 589 return UI_STRING("main", "An ARIA accessibility group that is the main portion of the website."); 590 if ([ariaType isEqualToString:@"ARIALandmarkNavigation"]) 591 return UI_STRING("navigation", "An ARIA accessibility group that contains the main navigation elements of a website."); 592 if ([ariaType isEqualToString:@"ARIALandmarkSearch"]) 593 return UI_STRING("search", "An ARIA accessibility group that contains a search feature of a website."); 594 if ([ariaType isEqualToString:@"ARIAUserInterfaceTooltip"]) 595 return UI_STRING("tooltip", "An ARIA accessibility group that acts as a tooltip."); 596 if ([ariaType isEqualToString:@"ARIATabPanel"]) 597 return UI_STRING("tab panel", "An ARIA accessibility group that contains the content of a tab."); 598 if ([ariaType isEqualToString:@"ARIADocumentMath"]) 599 return UI_STRING("math", "An ARIA accessibility group that contains mathematical symbols."); 600 return nil; 601} 602 603- (NSString *)AXButtonActionVerb 604{ 605 return UI_STRING("press", "Verb stating the action that will occur when a button is pressed, as used by accessibility"); 606} 607 608- (NSString *)AXRadioButtonActionVerb 609{ 610 return UI_STRING("select", "Verb stating the action that will occur when a radio button is clicked, as used by accessibility"); 611} 612 613- (NSString *)AXTextFieldActionVerb 614{ 615 return UI_STRING("activate", "Verb stating the action that will occur when a text field is selected, as used by accessibility"); 616} 617 618- (NSString *)AXCheckedCheckBoxActionVerb 619{ 620 return UI_STRING("uncheck", "Verb stating the action that will occur when a checked checkbox is clicked, as used by accessibility"); 621} 622 623- (NSString *)AXUncheckedCheckBoxActionVerb 624{ 625 return UI_STRING("check", "Verb stating the action that will occur when an unchecked checkbox is clicked, as used by accessibility"); 626} 627 628- (NSString *)AXLinkActionVerb 629{ 630 return UI_STRING("jump", "Verb stating the action that will occur when a link is clicked, as used by accessibility"); 631} 632 633- (NSString *)AXMenuListPopupActionVerb 634{ 635 return nil; 636} 637 638- (NSString *)AXMenuListActionVerb 639{ 640 return nil; 641} 642 643- (NSString *)multipleFileUploadTextForNumberOfFiles:(unsigned)numberOfFiles 644{ 645 return [NSString stringWithFormat:UI_STRING("%d files", "Label to describe the number of files selected in a file upload control that allows multiple files"), numberOfFiles]; 646} 647 648- (NSString *)unknownFileSizeText 649{ 650 return UI_STRING("Unknown", "Unknown filesize FTP directory listing item"); 651} 652 653- (NSString*)imageTitleForFilename:(NSString*)filename width:(int)width height:(int)height 654{ 655 return [NSString stringWithFormat:UI_STRING("%@ %d×%d pixels", "window title for a standalone image (uses multiplication symbol, not x)"), filename, width, height]; 656} 657 658- (NSString*)mediaElementLoadingStateText 659{ 660 return UI_STRING("Loading...", "Media controller status message when the media is loading"); 661} 662 663- (NSString*)mediaElementLiveBroadcastStateText 664{ 665 return UI_STRING("Live Broadcast", "Media controller status message when watching a live broadcast"); 666} 667 668- (NSString*)localizedMediaControlElementString:(NSString*)name 669{ 670 if ([name isEqualToString:@"AudioElement"]) 671 return UI_STRING("audio element controller", "accessibility role description for audio element controller"); 672 if ([name isEqualToString:@"VideoElement"]) 673 return UI_STRING("video element controller", "accessibility role description for video element controller"); 674 675 // FIXME: the ControlsPanel container should never be visible in the accessibility hierarchy. 676 if ([name isEqualToString:@"ControlsPanel"]) 677 return @""; 678 679 if ([name isEqualToString:@"MuteButton"]) 680 return UI_STRING("mute", "accessibility role description for mute button"); 681 if ([name isEqualToString:@"UnMuteButton"]) 682 return UI_STRING("unmute", "accessibility role description for turn mute off button"); 683 if ([name isEqualToString:@"PlayButton"]) 684 return UI_STRING("play", "accessibility role description for play button"); 685 if ([name isEqualToString:@"PauseButton"]) 686 return UI_STRING("pause", "accessibility role description for pause button"); 687 if ([name isEqualToString:@"Slider"]) 688 return UI_STRING("movie time", "accessibility role description for timeline slider"); 689 if ([name isEqualToString:@"SliderThumb"]) 690 return UI_STRING("timeline slider thumb", "accessibility role description for timeline thumb"); 691 if ([name isEqualToString:@"RewindButton"]) 692 return UI_STRING("back 30 seconds", "accessibility role description for seek back 30 seconds button"); 693 if ([name isEqualToString:@"ReturnToRealtimeButton"]) 694 return UI_STRING("return to realtime", "accessibility role description for return to real time button"); 695 if ([name isEqualToString:@"CurrentTimeDisplay"]) 696 return UI_STRING("elapsed time", "accessibility role description for elapsed time display"); 697 if ([name isEqualToString:@"TimeRemainingDisplay"]) 698 return UI_STRING("remaining time", "accessibility role description for time remaining display"); 699 if ([name isEqualToString:@"StatusDisplay"]) 700 return UI_STRING("status", "accessibility role description for movie status"); 701 if ([name isEqualToString:@"FullscreenButton"]) 702 return UI_STRING("fullscreen", "accessibility role description for enter fullscreen button"); 703 if ([name isEqualToString:@"SeekForwardButton"]) 704 return UI_STRING("fast forward", "accessibility role description for fast forward button"); 705 if ([name isEqualToString:@"SeekBackButton"]) 706 return UI_STRING("fast reverse", "accessibility role description for fast reverse button"); 707 if ([name isEqualToString:@"ShowClosedCaptionsButton"]) 708 return UI_STRING("show closed captions", "accessibility role description for show closed captions button"); 709 if ([name isEqualToString:@"HideClosedCaptionsButton"]) 710 return UI_STRING("hide closed captions", "accessibility role description for hide closed captions button"); 711 712 ASSERT_NOT_REACHED(); 713 return @""; 714} 715 716- (NSString*)localizedMediaControlElementHelpText:(NSString*)name 717{ 718 if ([name isEqualToString:@"AudioElement"]) 719 return UI_STRING("audio element playback controls and status display", "accessibility role description for audio element controller"); 720 if ([name isEqualToString:@"VideoElement"]) 721 return UI_STRING("video element playback controls and status display", "accessibility role description for video element controller"); 722 723 if ([name isEqualToString:@"MuteButton"]) 724 return UI_STRING("mute audio tracks", "accessibility help text for mute button"); 725 if ([name isEqualToString:@"UnMuteButton"]) 726 return UI_STRING("unmute audio tracks", "accessibility help text for un mute button"); 727 if ([name isEqualToString:@"PlayButton"]) 728 return UI_STRING("begin playback", "accessibility help text for play button"); 729 if ([name isEqualToString:@"PauseButton"]) 730 return UI_STRING("pause playback", "accessibility help text for pause button"); 731 if ([name isEqualToString:@"Slider"]) 732 return UI_STRING("movie time scrubber", "accessibility help text for timeline slider"); 733 if ([name isEqualToString:@"SliderThumb"]) 734 return UI_STRING("movie time scrubber thumb", "accessibility help text for timeline slider thumb"); 735 if ([name isEqualToString:@"RewindButton"]) 736 return UI_STRING("seek movie back 30 seconds", "accessibility help text for jump back 30 seconds button"); 737 if ([name isEqualToString:@"ReturnToRealtimeButton"]) 738 return UI_STRING("return streaming movie to real time", "accessibility help text for return streaming movie to real time button"); 739 if ([name isEqualToString:@"CurrentTimeDisplay"]) 740 return UI_STRING("current movie time in seconds", "accessibility help text for elapsed time display"); 741 if ([name isEqualToString:@"TimeRemainingDisplay"]) 742 return UI_STRING("number of seconds of movie remaining", "accessibility help text for remaining time display"); 743 if ([name isEqualToString:@"StatusDisplay"]) 744 return UI_STRING("current movie status", "accessibility help text for movie status display"); 745 if ([name isEqualToString:@"SeekBackButton"]) 746 return UI_STRING("seek quickly back", "accessibility help text for fast rewind button"); 747 if ([name isEqualToString:@"SeekForwardButton"]) 748 return UI_STRING("seek quickly forward", "accessibility help text for fast forward button"); 749 if ([name isEqualToString:@"FullscreenButton"]) 750 return UI_STRING("Play movie in fullscreen mode", "accessibility help text for enter fullscreen button"); 751 if ([name isEqualToString:@"ShowClosedCaptionsButton"]) 752 return UI_STRING("start displaying closed captions", "accessibility help text for show closed captions button"); 753 if ([name isEqualToString:@"HideClosedCaptionsButton"]) 754 return UI_STRING("stop displaying closed captions", "accessibility help text for hide closed captions button"); 755 ASSERT_NOT_REACHED(); 756 return @""; 757} 758 759- (NSString*)localizedMediaTimeDescription:(float)time 760{ 761 if (!isfinite(time)) 762 return UI_STRING("indefinite time", "accessibility help text for an indefinite media controller time value"); 763 764 int seconds = (int)fabsf(time); 765 int days = seconds / (60 * 60 * 24); 766 int hours = seconds / (60 * 60); 767 int minutes = (seconds / 60) % 60; 768 seconds %= 60; 769 770 if (days) 771 return [NSString stringWithFormat:UI_STRING("%1$d days %2$d hours %3$d minutes %4$d seconds", "accessibility help text for media controller time value >= 1 day"), days, hours, minutes, seconds]; 772 else if (hours) 773 return [NSString stringWithFormat:UI_STRING("%1$d hours %2$d minutes %3$d seconds", "accessibility help text for media controller time value >= 60 minutes"), hours, minutes, seconds]; 774 else if (minutes) 775 return [NSString stringWithFormat:UI_STRING("%1$d minutes %2$d seconds", "accessibility help text for media controller time value >= 60 seconds"), minutes, seconds]; 776 777 return [NSString stringWithFormat:UI_STRING("%1$d seconds", "accessibility help text for media controller time value < 60 seconds"), seconds]; 778} 779 780- (NSString *)validationMessageValueMissingText 781{ 782 return UI_STRING("value missing", "Validation message for required form control elements that have no value"); 783} 784 785- (NSString *)validationMessageTypeMismatchText 786{ 787 return UI_STRING("type mismatch", "Validation message for input form controls with a value not matching type"); 788} 789 790- (NSString *)validationMessagePatternMismatchText 791{ 792 return UI_STRING("pattern mismatch", "Validation message for input form controls requiring a constrained value according to pattern"); 793} 794 795- (NSString *)validationMessageTooLongText 796{ 797 return UI_STRING("too long", "Validation message for form control elements with a value longer than maximum allowed length"); 798} 799 800- (NSString *)validationMessageRangeUnderflowText 801{ 802 return UI_STRING("range underflow", "Validation message for input form controls with value lower than allowed minimum"); 803} 804 805- (NSString *)validationMessageRangeOverflowText 806{ 807 return UI_STRING("range overflow", "Validation message for input form controls with value higher than allowed maximum"); 808} 809 810- (NSString *)validationMessageStepMismatchText 811{ 812 return UI_STRING("step mismatch", "Validation message for input form controls with value not respecting the step attribute"); 813} 814 815@end 816