1# Copyright 2015 The Chromium OS Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5 6from autotest_lib.client.cros.video import video_player 7 8import py_utils 9import logging 10 11 12class NativeHtml5Player(video_player.VideoPlayer): 13 """ 14 Provides an interface to interact with native html5 player in chrome. 15 16 """ 17 18 19 def inject_source_file(self): 20 """ 21 Injects the path to the video file under test into the html doc. 22 23 24 """ 25 self.tab.ExecuteJavaScript( 26 'loadVideoSource("%s")' % self.video_src_path) 27 28 29 def is_video_ready(self): 30 """ 31 Determines if a native html5 video is ready by using javascript. 32 33 returns: bool, True if video is ready, else False. 34 35 """ 36 return self.tab.EvaluateJavaScript('canplay()') 37 38 39 def is_javascript_ready(self): 40 """ 41 returns: True if javascript variables and functions have been defined, 42 43 else False. 44 45 """ 46 return self.tab.EvaluateJavaScript( 47 'typeof script_ready!="undefined" && script_ready == true') 48 49 50 def play(self): 51 """ 52 Plays the video. 53 54 """ 55 self.tab.ExecuteJavaScript('play()') 56 57 58 def pause(self): 59 """ 60 Pauses the video. 61 62 """ 63 self.tab.ExecuteJavaScript('pause()') 64 65 66 def paused(self): 67 """ 68 Checks whether video paused. 69 70 """ 71 cmd = '%s.paused' % self.video_id 72 return self.tab.EvaluateJavaScript(cmd) 73 74 75 def ended(self): 76 """ 77 Checks whether video paused. 78 79 """ 80 cmd = '%s.ended' % self.video_id 81 return self.tab.EvaluateJavaScript(cmd) 82 83 84 def currentTime(self): 85 """ 86 Returns the current time of the video element. 87 88 """ 89 return self.tab.EvaluateJavaScript('currentTime()') 90 91 92 def seek_to(self, t): 93 """ 94 Seeks a video to a time stamp. 95 96 @param t: timedelta, time value to seek to. 97 98 """ 99 cmd = '%s.currentTime=%.3f' % (self.video_id, t.total_seconds()) 100 self.tab.ExecuteJavaScript(cmd) 101 102 103 def has_video_finished_seeking(self): 104 """ 105 Determines if the video has finished seeking. 106 107 """ 108 return self.tab.EvaluateJavaScript('finishedSeeking()') 109 110 111 def wait_for_error(self): 112 """ 113 Determines if the video has any errors 114 115 """ 116 return self.tab.WaitForJavaScriptCondition('errorDetected();', 117 timeout=30) 118 119 120 def reload_page(self): 121 """ 122 Reloads current page 123 124 """ 125 self.tab.ExecuteJavaScript('location.reload()') 126 127 128 def enable_VideoControls(self): 129 """ 130 For enabling controls 131 132 """ 133 self.tab.ExecuteJavaScript('setControls()') 134 135 136 def dropped_frame_count(self): 137 """ 138 Gets the number of dropped frames. 139 140 @returns: An integer indicates the number of dropped frame. 141 142 """ 143 cmd = '%s.webkitDroppedFrameCount' % self.video_id 144 return self.tab.EvaluateJavaScript(cmd) 145 146 147 def duration(self): 148 """ 149 Gets the duration of the video. 150 151 @returns: An number indicates the duration of the video. 152 153 """ 154 cmd = '%s.duration' % self.video_id 155 return self.tab.EvaluateJavaScript(cmd) 156 157 158 def wait_video_ended(self): 159 """ 160 Waits until the video playback is ended. 161 162 """ 163 cmd = '%s.ended' % self.video_id 164 self.tab.WaitForJavaScriptCondition(cmd, timeout=(self.duration() * 2)) 165 166 167 def wait_ended_or_error(self): 168 """ 169 Waits until the video ends or an error happens. 170 171 """ 172 try: 173 # unit of timeout is second. 174 self.tab.WaitForJavaScriptCondition('endOrError()', 175 timeout=(self.duration() + 10)) 176 except py_utils.TimeoutException: 177 logging.error('Timeout in waiting endOrError()') 178 raise 179 180 181 def check_error(self): 182 """ 183 Check whether an error happens. 184 185 """ 186 return self.tab.EvaluateJavaScript('errorDetected()') 187 188 189 def get_error_info(self): 190 """ 191 Get error code and message 192 @returns string,string: error code and message 193 194 """ 195 error_code = self.tab.EvaluateJavaScript( 196 '%s.error.code' % self.video_id) 197 error_message = self.tab.EvaluateJavaScript( 198 '%s.error.message' % self.video_id) 199 return error_code, error_message 200