void LayoutTestController::clearBackForwardList() { COMPtr<IWebView> webView; if (FAILED(frame->webView(&webView))) return; COMPtr<IWebBackForwardList> backForwardList; if (FAILED(webView->backForwardList(&backForwardList))) return; COMPtr<IWebHistoryItem> item; if (FAILED(backForwardList->currentItem(&item))) return; // We clear the history by setting the back/forward list's capacity to 0 // then restoring it back and adding back the current item. int capacity; if (FAILED(backForwardList->capacity(&capacity))) return; backForwardList->setCapacity(0); backForwardList->setCapacity(capacity); backForwardList->addItem(item.get()); backForwardList->goToItem(item.get()); }
void LayoutTestController::apiTestGoToCurrentBackForwardItem() { COMPtr<IWebView> webView; if (FAILED(frame->webView(&webView))) return; COMPtr<IWebBackForwardList> backForwardList; if (FAILED(webView->backForwardList(&backForwardList))) return; COMPtr<IWebHistoryItem> item; if (FAILED(backForwardList->currentItem(&item))) return; BOOL success; webView->goToBackForwardItem(item.get(), &success); }
static void dumpBackForwardList(IWebView* webView) { ASSERT(webView); printf("\n============== Back Forward List ==============\n"); COMPtr<IWebBackForwardList> bfList; if (FAILED(webView->backForwardList(&bfList))) return; // Print out all items in the list after prevTestBFItem, which was from the previous test // Gather items from the end of the list, the print them out from oldest to newest Vector<COMPtr<IUnknown> > itemsToPrint; int forwardListCount; if (FAILED(bfList->forwardListCount(&forwardListCount))) return; for (int i = forwardListCount; i > 0; --i) { COMPtr<IWebHistoryItem> item; if (FAILED(bfList->itemAtIndex(i, &item))) return; // something is wrong if the item from the last test is in the forward part of the b/f list assert(item != prevTestBFItem); COMPtr<IUnknown> itemUnknown; item->QueryInterface(&itemUnknown); itemsToPrint.append(itemUnknown); } COMPtr<IWebHistoryItem> currentItem; if (FAILED(bfList->currentItem(¤tItem))) return; assert(currentItem != prevTestBFItem); COMPtr<IUnknown> currentItemUnknown; currentItem->QueryInterface(¤tItemUnknown); itemsToPrint.append(currentItemUnknown); int currentItemIndex = itemsToPrint.size() - 1; int backListCount; if (FAILED(bfList->backListCount(&backListCount))) return; for (int i = -1; i >= -backListCount; --i) { COMPtr<IWebHistoryItem> item; if (FAILED(bfList->itemAtIndex(i, &item))) return; if (item == prevTestBFItem) break; COMPtr<IUnknown> itemUnknown; item->QueryInterface(&itemUnknown); itemsToPrint.append(itemUnknown); } for (int i = itemsToPrint.size() - 1; i >= 0; --i) { COMPtr<IWebHistoryItem> historyItemToPrint; itemsToPrint[i]->QueryInterface(&historyItemToPrint); dumpHistoryItem(historyItemToPrint.get(), 8, i == currentItemIndex); } printf("===============================================\n"); }
static void runTest(const string& testPathOrURL) { static BSTR methodBStr = SysAllocString(TEXT("GET")); // Look for "'" as a separator between the path or URL, and the pixel dump hash that follows. string pathOrURL(testPathOrURL); string expectedPixelHash; size_t separatorPos = pathOrURL.find("'"); if (separatorPos != string::npos) { pathOrURL = string(testPathOrURL, 0, separatorPos); expectedPixelHash = string(testPathOrURL, separatorPos + 1); } BSTR urlBStr; CFStringRef str = CFStringCreateWithCString(0, pathOrURL.c_str(), kCFStringEncodingWindowsLatin1); CFURLRef url = CFURLCreateWithString(0, str, 0); if (!url) url = CFURLCreateWithFileSystemPath(0, str, kCFURLWindowsPathStyle, false); CFRelease(str); str = CFURLGetString(url); CFIndex length = CFStringGetLength(str); UniChar* buffer = new UniChar[length]; CFStringGetCharacters(str, CFRangeMake(0, length), buffer); urlBStr = SysAllocStringLen((OLECHAR*)buffer, length); delete[] buffer; CFRelease(url); ::gLayoutTestController = new LayoutTestController(pathOrURL, expectedPixelHash); done = false; topLoadingFrame = 0; gLayoutTestController->setIconDatabaseEnabled(false); if (shouldLogFrameLoadDelegates(pathOrURL.c_str())) gLayoutTestController->setDumpFrameLoadCallbacks(true); COMPtr<IWebView> webView; if (SUCCEEDED(frame->webView(&webView))) { COMPtr<IWebViewPrivate> viewPrivate; if (SUCCEEDED(webView->QueryInterface(&viewPrivate))) { if (shouldLogHistoryDelegates(pathOrURL.c_str())) { gLayoutTestController->setDumpHistoryDelegateCallbacks(true); viewPrivate->setHistoryDelegate(sharedHistoryDelegate.get()); } else viewPrivate->setHistoryDelegate(0); } } COMPtr<IWebHistory> history; if (SUCCEEDED(WebKitCreateInstance(CLSID_WebHistory, 0, __uuidof(history), reinterpret_cast<void**>(&history)))) history->setOptionalSharedHistory(0); resetWebViewToConsistentStateBeforeTesting(); if (shouldEnableDeveloperExtras(pathOrURL.c_str())) { gLayoutTestController->setDeveloperExtrasEnabled(true); if (shouldOpenWebInspector(pathOrURL.c_str())) gLayoutTestController->showWebInspector(); } prevTestBFItem = 0; if (webView) { COMPtr<IWebBackForwardList> bfList; if (SUCCEEDED(webView->backForwardList(&bfList))) bfList->currentItem(&prevTestBFItem); } WorkQueue::shared()->clear(); WorkQueue::shared()->setFrozen(false); HWND hostWindow; webView->hostWindow(reinterpret_cast<OLE_HANDLE*>(&hostWindow)); COMPtr<IWebMutableURLRequest> request; HRESULT hr = WebKitCreateInstance(CLSID_WebMutableURLRequest, 0, IID_IWebMutableURLRequest, (void**)&request); if (FAILED(hr)) goto exit; request->initWithURL(urlBStr, WebURLRequestUseProtocolCachePolicy, 60); request->setHTTPMethod(methodBStr); frame->loadRequest(request.get()); MSG msg; while (GetMessage(&msg, 0, 0, 0)) { // We get spurious WM_MOUSELEAVE events which make event handling machinery think that mouse button // is released during dragging (see e.g. fast\dynamic\layer-hit-test-crash.html). // Mouse can never leave WebView during normal DumpRenderTree operation, so we just ignore all such events. if (msg.message == WM_MOUSELEAVE) continue; TranslateMessage(&msg); DispatchMessage(&msg); } if (shouldEnableDeveloperExtras(pathOrURL.c_str())) gLayoutTestController->closeWebInspector(); resetWebViewToConsistentStateBeforeTesting(); frame->stopLoading(); if (::gLayoutTestController->closeRemainingWindowsWhenComplete()) { Vector<HWND> windows = openWindows(); unsigned size = windows.size(); for (unsigned i = 0; i < size; i++) { HWND window = windows[i]; // Don't try to close the main window if (window == hostWindow) continue; DestroyWindow(window); } } exit: SysFreeString(urlBStr); ::gLayoutTestController->deref(); ::gLayoutTestController = 0; return; }
static void runTest(const string& inputLine) { TestCommand command = parseInputLine(inputLine); const string& pathOrURL = command.pathOrURL; dumpPixelsForCurrentTest = command.shouldDumpPixels || dumpPixelsForAllTests; static BSTR methodBStr = SysAllocString(TEXT("GET")); BSTR urlBStr; CFStringRef str = CFStringCreateWithCString(0, pathOrURL.c_str(), kCFStringEncodingWindowsLatin1); CFURLRef url = CFURLCreateWithString(0, str, 0); if (!url) url = CFURLCreateWithFileSystemPath(0, str, kCFURLWindowsPathStyle, false); CFRelease(str); String fallbackPath = findFontFallback(pathOrURL.c_str()); str = CFURLGetString(url); CFIndex length = CFStringGetLength(str); UniChar* buffer = new UniChar[length]; CFStringGetCharacters(str, CFRangeMake(0, length), buffer); urlBStr = SysAllocStringLen((OLECHAR*)buffer, length); delete[] buffer; CFRelease(url); ::gTestRunner = TestRunner::create(pathOrURL, command.expectedPixelHash); done = false; topLoadingFrame = 0; addFontFallbackIfPresent(fallbackPath); sizeWebViewForCurrentTest(); gTestRunner->setIconDatabaseEnabled(false); if (shouldLogFrameLoadDelegates(pathOrURL.c_str())) gTestRunner->setDumpFrameLoadCallbacks(true); COMPtr<IWebView> webView; if (SUCCEEDED(frame->webView(&webView))) { COMPtr<IWebViewPrivate> viewPrivate; if (SUCCEEDED(webView->QueryInterface(&viewPrivate))) { if (shouldLogHistoryDelegates(pathOrURL.c_str())) { gTestRunner->setDumpHistoryDelegateCallbacks(true); viewPrivate->setHistoryDelegate(sharedHistoryDelegate.get()); } else viewPrivate->setHistoryDelegate(0); } } COMPtr<IWebHistory> history; if (SUCCEEDED(WebKitCreateInstance(CLSID_WebHistory, 0, __uuidof(history), reinterpret_cast<void**>(&history)))) history->setOptionalSharedHistory(0); resetWebViewToConsistentStateBeforeTesting(); if (shouldEnableDeveloperExtras(pathOrURL.c_str())) { gTestRunner->setDeveloperExtrasEnabled(true); if (shouldOpenWebInspector(pathOrURL.c_str())) gTestRunner->showWebInspector(); } if (shouldDumpAsText(pathOrURL.c_str())) { gTestRunner->setDumpAsText(true); gTestRunner->setGeneratePixelResults(false); } prevTestBFItem = 0; if (webView) { COMPtr<IWebBackForwardList> bfList; if (SUCCEEDED(webView->backForwardList(&bfList))) bfList->currentItem(&prevTestBFItem); } WorkQueue::shared()->clear(); WorkQueue::shared()->setFrozen(false); HWND hostWindow; webView->hostWindow(reinterpret_cast<OLE_HANDLE*>(&hostWindow)); COMPtr<IWebMutableURLRequest> request; HRESULT hr = WebKitCreateInstance(CLSID_WebMutableURLRequest, 0, IID_IWebMutableURLRequest, (void**)&request); if (FAILED(hr)) goto exit; request->initWithURL(urlBStr, WebURLRequestUseProtocolCachePolicy, 60); request->setHTTPMethod(methodBStr); frame->loadRequest(request.get()); MSG msg; while (true) { #if USE(CF) CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true); #endif if (!GetMessage(&msg, 0, 0, 0)) break; // We get spurious WM_MOUSELEAVE events which make event handling machinery think that mouse button // is released during dragging (see e.g. fast\dynamic\layer-hit-test-crash.html). // Mouse can never leave WebView during normal DumpRenderTree operation, so we just ignore all such events. if (msg.message == WM_MOUSELEAVE) continue; TranslateMessage(&msg); DispatchMessage(&msg); } if (shouldEnableDeveloperExtras(pathOrURL.c_str())) { gTestRunner->closeWebInspector(); gTestRunner->setDeveloperExtrasEnabled(false); } resetWebViewToConsistentStateBeforeTesting(); frame->stopLoading(); if (::gTestRunner->closeRemainingWindowsWhenComplete()) { Vector<HWND> windows = openWindows(); unsigned size = windows.size(); for (unsigned i = 0; i < size; i++) { HWND window = windows[i]; // Don't try to close the main window if (window == hostWindow) continue; DestroyWindow(window); } } exit: removeFontFallbackIfPresent(fallbackPath); SysFreeString(urlBStr); ::gTestRunner.clear(); return; }