| 180 | |
| 181 | |
| 182 | class LoadHandler(object): |
| 183 | def __init__(self, test_case, datauri): |
| 184 | self.test_case = test_case |
| 185 | self.datauri = datauri |
| 186 | self.frame_source_visitor = None |
| 187 | |
| 188 | # Asserts for True/False will be checked just before shutdown |
| 189 | self.test_for_True = True # Test whether asserts are working correctly |
| 190 | self.OnLoadStart_True = False |
| 191 | self.OnLoadEnd_True = False |
| 192 | self.FrameSourceVisitor_True = False |
| 193 | # self.OnLoadingStateChange_Start_True = False # FAILS |
| 194 | self.OnLoadingStateChange_End_True = False |
| 195 | |
| 196 | def OnLoadStart(self, browser, frame, **_): |
| 197 | self.test_case.assertFalse(self.OnLoadStart_True) |
| 198 | self.OnLoadStart_True = True |
| 199 | self.test_case.assertEqual(browser.GetUrl(), frame.GetUrl()) |
| 200 | self.test_case.assertEqual(browser.GetUrl(), self.datauri) |
| 201 | |
| 202 | def OnLoadEnd(self, browser, frame, http_code, **_): |
| 203 | # OnLoadEnd should be called only once |
| 204 | self.test_case.assertFalse(self.OnLoadEnd_True) |
| 205 | self.OnLoadEnd_True = True |
| 206 | self.test_case.assertEqual(http_code, 200) |
| 207 | self.frame_source_visitor = FrameSourceVisitor(self, self.test_case) |
| 208 | frame.GetSource(self.frame_source_visitor) |
| 209 | browser.ExecuteJavascript("print('LoadHandler.OnLoadEnd() ok')") |
| 210 | |
| 211 | subtest_message("Executing callbacks registered with on_load_end()") |
| 212 | global g_on_load_end_callbacks |
| 213 | for callback_data in g_on_load_end_callbacks: |
| 214 | callback_data[0](*callback_data[1]) |
| 215 | del g_on_load_end_callbacks |
| 216 | |
| 217 | def OnLoadingStateChange(self, browser, is_loading, can_go_back, |
| 218 | can_go_forward, **_): |
| 219 | if is_loading: |
| 220 | # TODO: this test fails, looks like OnLoadingStaetChange with |
| 221 | # is_loading=False is being called very fast, before |
| 222 | # OnLoadStart and before client handler is set by calling |
| 223 | # browser.SetClientHandler(). |
| 224 | # SOLUTION: allow to set OnLoadingStateChange through |
| 225 | # SetGlobalClientCallback similarly to _OnAfterCreated(). |
| 226 | # self.test_case.assertFalse(self.OnLoadingStateChange_Start_True) |
| 227 | # self.OnLoadingStateChange_Start_True = True |
| 228 | pass |
| 229 | else: |
| 230 | self.test_case.assertFalse(self.OnLoadingStateChange_End_True) |
| 231 | self.OnLoadingStateChange_End_True = True |
| 232 | self.test_case.assertEqual(browser.CanGoBack(), can_go_back) |
| 233 | self.test_case.assertEqual(browser.CanGoForward(), can_go_forward) |
| 234 | |
| 235 | |
| 236 | class FrameSourceVisitor(object): |