79b295963014dafcb0dbf44c6e266eb7cf4d0eb1
[WebKit-https.git] / WebKit / mac / WebCoreSupport / WebViewFactory.mm
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:@"ARIAApplicationLog"])
559         return UI_STRING("log", "An ARIA accessibility group that acts as a console log.");
560     if ([ariaType isEqualToString:@"ARIAApplicationMarquee"])
561         return UI_STRING("marquee", "An ARIA accessibility group that acts as a marquee.");    
562     if ([ariaType isEqualToString:@"ARIAApplicationStatus"])
563         return UI_STRING("application status", "An ARIA accessibility group that acts as a status update.");    
564     if ([ariaType isEqualToString:@"ARIAApplicationTimer"])
565         return UI_STRING("timer", "An ARIA accessibility group that acts as an updating timer.");    
566     if ([ariaType isEqualToString:@"ARIADocument"])
567         return UI_STRING("document", "An ARIA accessibility group that acts as a document.");    
568     if ([ariaType isEqualToString:@"ARIADocumentArticle"])
569         return UI_STRING("article", "An ARIA accessibility group that acts as an article.");    
570     if ([ariaType isEqualToString:@"ARIADocumentNote"])
571         return UI_STRING("note", "An ARIA accessibility group that acts as a note in a document.");    
572     if ([ariaType isEqualToString:@"ARIADocumentRegion"])
573         return UI_STRING("region", "An ARIA accessibility group that acts as a distinct region in a document.");    
574     if ([ariaType isEqualToString:@"ARIALandmarkApplication"])
575         return UI_STRING("application", "An ARIA accessibility group that acts as an application.");    
576     if ([ariaType isEqualToString:@"ARIALandmarkBanner"])
577         return UI_STRING("banner", "An ARIA accessibility group that acts as a banner.");    
578     if ([ariaType isEqualToString:@"ARIALandmarkComplementary"])
579         return UI_STRING("complementary", "An ARIA accessibility group that acts as a region of complementary information.");    
580     if ([ariaType isEqualToString:@"ARIALandmarkContentInfo"])
581         return UI_STRING("content", "An ARIA accessibility group that contains content.");    
582     if ([ariaType isEqualToString:@"ARIALandmarkMain"])
583         return UI_STRING("main", "An ARIA accessibility group that is the main portion of the website.");    
584     if ([ariaType isEqualToString:@"ARIALandmarkNavigation"])
585         return UI_STRING("navigation", "An ARIA accessibility group that contains the main navigation elements of a website.");    
586     if ([ariaType isEqualToString:@"ARIALandmarkSearch"])
587         return UI_STRING("search", "An ARIA accessibility group that contains a search feature of a website.");    
588     if ([ariaType isEqualToString:@"ARIAUserInterfaceTooltip"])
589         return UI_STRING("tooltip", "An ARIA accessibility group that acts as a tooltip.");    
590     return nil;
591 }
592
593 - (NSString *)AXButtonActionVerb
594 {
595     return UI_STRING("press", "Verb stating the action that will occur when a button is pressed, as used by accessibility");
596 }
597
598 - (NSString *)AXRadioButtonActionVerb
599 {
600     return UI_STRING("select", "Verb stating the action that will occur when a radio button is clicked, as used by accessibility");
601 }
602
603 - (NSString *)AXTextFieldActionVerb
604 {
605     return UI_STRING("activate", "Verb stating the action that will occur when a text field is selected, as used by accessibility");
606 }
607
608 - (NSString *)AXCheckedCheckBoxActionVerb
609 {
610     return UI_STRING("uncheck", "Verb stating the action that will occur when a checked checkbox is clicked, as used by accessibility");
611 }
612
613 - (NSString *)AXUncheckedCheckBoxActionVerb
614 {
615     return UI_STRING("check", "Verb stating the action that will occur when an unchecked checkbox is clicked, as used by accessibility");
616 }
617
618 - (NSString *)AXLinkActionVerb
619 {
620     return UI_STRING("jump", "Verb stating the action that will occur when a link is clicked, as used by accessibility");
621 }
622
623 - (NSString *)multipleFileUploadTextForNumberOfFiles:(unsigned)numberOfFiles
624 {
625     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];
626 }
627
628 - (NSString *)unknownFileSizeText
629 {
630     return UI_STRING("Unknown", "Unknown filesize FTP directory listing item");
631 }
632
633 - (NSString*)imageTitleForFilename:(NSString*)filename width:(int)width height:(int)height
634 {
635     return [NSString stringWithFormat:UI_STRING("%@ %d×%d pixels", "window title for a standalone image (uses multiplication symbol, not x)"), filename, width, height];
636 }
637
638 - (NSString*)mediaElementLoadingStateText
639 {
640     return UI_STRING("Loading...", "Media controller status message when the media is loading");
641 }
642
643 - (NSString*)mediaElementLiveBroadcastStateText
644 {
645     return UI_STRING("Live Broadcast", "Media controller status message when watching a live broadcast");
646 }
647
648 - (NSString*)localizedMediaControlElementString:(NSString*)name
649 {
650     if ([name isEqualToString:@"AudioElement"])
651         return UI_STRING("audio element controller", "accessibility role description for audio element controller");
652     if ([name isEqualToString:@"VideoElement"])
653         return UI_STRING("video element controller", "accessibility role description for video element controller");
654
655     // FIXME: the ControlsPanel container should never be visible in the accessibility hierarchy.
656     if ([name isEqualToString:@"ControlsPanel"])
657         return @"";
658
659     if ([name isEqualToString:@"MuteButton"])
660         return UI_STRING("mute", "accessibility role description for mute button");
661     if ([name isEqualToString:@"UnMuteButton"])
662         return UI_STRING("unmute", "accessibility role description for turn mute off button");
663     if ([name isEqualToString:@"PlayButton"])
664         return UI_STRING("play", "accessibility role description for play button");
665     if ([name isEqualToString:@"PauseButton"])
666         return UI_STRING("pause", "accessibility role description for pause button");
667     if ([name isEqualToString:@"Slider"])
668         return UI_STRING("movie time", "accessibility role description for timeline slider");
669     if ([name isEqualToString:@"SliderThumb"])
670         return UI_STRING("timeline slider thumb", "accessibility role description for timeline thumb");
671     if ([name isEqualToString:@"RewindButton"])
672         return UI_STRING("back 30 seconds", "accessibility role description for seek back 30 seconds button");
673     if ([name isEqualToString:@"ReturnToRealtimeButton"])
674         return UI_STRING("return to realtime", "accessibility role description for return to real time button");
675     if ([name isEqualToString:@"CurrentTimeDisplay"])
676         return UI_STRING("elapsed time", "accessibility role description for elapsed time display");
677     if ([name isEqualToString:@"TimeRemainingDisplay"])
678         return UI_STRING("remaining time", "accessibility role description for time remaining display");
679     if ([name isEqualToString:@"StatusDisplay"])
680         return UI_STRING("status", "accessibility role description for movie status");
681     if ([name isEqualToString:@"FullscreenButton"])
682         return UI_STRING("fullscreen", "accessibility role description for enter fullscreen button");
683     if ([name isEqualToString:@"SeekForwardButton"])
684         return UI_STRING("fast forward", "accessibility role description for fast forward button");
685     if ([name isEqualToString:@"SeekBackButton"])
686         return UI_STRING("fast reverse", "accessibility role description for fast reverse button");
687     ASSERT_NOT_REACHED();
688     return @"";
689 }
690
691 - (NSString*)localizedMediaControlElementHelpText:(NSString*)name
692 {
693     if ([name isEqualToString:@"AudioElement"])
694         return UI_STRING("audio element playback controls and status display", "accessibility role description for audio element controller");
695     if ([name isEqualToString:@"VideoElement"])
696         return UI_STRING("video element playback controls and status display", "accessibility role description for video element controller");
697
698     if ([name isEqualToString:@"MuteButton"])
699         return UI_STRING("mute audio tracks", "accessibility help text for mute button");
700     if ([name isEqualToString:@"UnMuteButton"])
701         return UI_STRING("unmute audio tracks", "accessibility help text for un mute button");
702     if ([name isEqualToString:@"PlayButton"])
703         return UI_STRING("begin playback", "accessibility help text for play button");
704     if ([name isEqualToString:@"PauseButton"])
705         return UI_STRING("pause playback", "accessibility help text for pause button");
706     if ([name isEqualToString:@"Slider"])
707         return UI_STRING("movie time scrubber", "accessibility help text for timeline slider");
708     if ([name isEqualToString:@"SliderThumb"])
709         return UI_STRING("movie time scrubber thumb", "accessibility help text for timeline slider thumb");
710     if ([name isEqualToString:@"RewindButton"])
711         return UI_STRING("seek movie back 30 seconds", "accessibility help text for jump back 30 seconds button");
712     if ([name isEqualToString:@"ReturnToRealtimeButton"])
713         return UI_STRING("return streaming movie to real time", "accessibility help text for return streaming movie to real time button");
714     if ([name isEqualToString:@"CurrentTimeDisplay"])
715         return UI_STRING("current movie time in seconds", "accessibility help text for elapsed time display");
716     if ([name isEqualToString:@"TimeRemainingDisplay"])
717         return UI_STRING("number of seconds of movie remaining", "accessibility help text for remaining time display");
718     if ([name isEqualToString:@"StatusDisplay"])
719         return UI_STRING("current movie status", "accessibility help text for movie status display");
720     if ([name isEqualToString:@"SeekBackButton"])
721         return UI_STRING("seek quickly back", "accessibility help text for fast rewind button");
722     if ([name isEqualToString:@"SeekForwardButton"])
723         return UI_STRING("seek quickly forward", "accessibility help text for fast forward button");
724     if ([name isEqualToString:@"FullscreenButton"])
725         return UI_STRING("Play movie in fullscreen mode", "accessibility help text for enter fullscreen button");
726     ASSERT_NOT_REACHED();
727     return @"";
728 }
729
730 - (NSString*)localizedMediaTimeDescription:(float)time
731 {
732     if (!isfinite(time))
733         return UI_STRING("indefinite time", "string for an indefinite movie time");
734
735     int seconds = (int)fabsf(time); 
736     int days = seconds / (60 * 60 * 24);
737     int hours = seconds / (60 * 60);
738     int minutes = (seconds / 60) % 60;
739     seconds %= 60;
740
741     if (days)
742         return [NSString stringWithFormat:UI_STRING("date.format.for.days", "string for days, hours, minutes & seconds"), days, hours, minutes, seconds];
743     else if (hours)
744         return [NSString stringWithFormat:UI_STRING("date.format.for.hours", "string for hours, minutes & seconds"), hours, minutes, seconds];
745     else if (minutes)
746         return [NSString stringWithFormat:UI_STRING("date.format.for.minutes", "string for minutes & seconds"), minutes, seconds];
747
748     return [NSString stringWithFormat:UI_STRING("date.format.for.seconds", "string for seconds"), seconds];
749 }
750
751 @end