long long TestRunner::applicationCacheDiskUsageForOrigin(JSStringRef url) { COMPtr<IWebSecurityOrigin2> origin; if (FAILED(WebKitCreateInstance(CLSID_WebSecurityOrigin, 0, IID_IWebSecurityOrigin2, reinterpret_cast<void**>(&origin)))) return 0; COMPtr<IWebApplicationCache> applicationCache; if (FAILED(WebKitCreateInstance(CLSID_WebApplicationCache, 0, IID_IWebApplicationCache, reinterpret_cast<void**>(&applicationCache)))) return 0; _bstr_t urlBstr(JSStringCopyBSTR(url), false); origin->initWithURL(urlBstr.GetBSTR()); long long usage = 0; if (FAILED(applicationCache->diskUsageForOrigin(origin.get(), &usage))) return 0; return usage; }
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; }
HRESULT Drosera::initUI(HINSTANCE hInstance, int nCmdShow) { // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, ARRAYSIZE(szTitle)); LoadString(hInstance, IDC_DROSERA, szWindowClass, ARRAYSIZE(szWindowClass)); registerDroseraClass(hInstance); Drosera::setInst(hInstance); // Store instance handle in our local variable m_hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0); if (!m_hWnd) return HRESULT_FROM_WIN32(GetLastError()); SetLastError(0); SetWindowLongPtr(m_hWnd, 0, reinterpret_cast<LONG_PTR>(this)); HRESULT ret = HRESULT_FROM_WIN32(GetLastError()); if (FAILED(ret)) return ret; ret = OleInitialize(0); if (FAILED(ret)) return ret; ret = CoCreateInstance(CLSID_WebView, 0, CLSCTX_ALL, IID_IWebView, (void**)&m_webView); if (FAILED(ret)) return ret; ret = m_webView->QueryInterface(IID_IWebViewPrivate, reinterpret_cast<void**>(&m_webViewPrivate)); if (FAILED(ret)) return ret; ret = m_webView->setHostWindow(reinterpret_cast<OLE_HANDLE>(m_hWnd)); if (FAILED(ret)) return ret; ret = m_webView->setFrameLoadDelegate(this); if (FAILED(ret)) return ret; ret = m_webView->setUIDelegate(this); if (FAILED(ret)) return ret; RECT rect = {0}; ret = m_webView->initWithFrame(rect, 0, 0); if (FAILED(ret)) return ret; HWND viewWindow; ret = m_webViewPrivate->viewWindow(reinterpret_cast<OLE_HANDLE*>(&viewWindow)); if (FAILED(ret)) return ret; ::SetProp(viewWindow, kDroseraPointerProp, (HANDLE)this); COMPtr<IWebFrame> mainFrame; ret = m_webView->mainFrame(&mainFrame); if (FAILED(ret)) return ret; COMPtr<IWebMutableURLRequest> request; ret = CoCreateInstance(CLSID_WebMutableURLRequest, 0, CLSCTX_ALL, IID_IWebMutableURLRequest, (void**)&request); if (FAILED(ret)) return ret; RetainPtr<CFURLRef> htmlURLRef(AdoptCF, ::CFBundleCopyResourceURL(::CFBundleGetBundleWithIdentifier(CFSTR("org.webkit.drosera")), CFSTR("debugger"), CFSTR("html"), CFSTR("Drosera"))); if (!htmlURLRef) return E_FAIL; CFStringRef urlStringRef = ::CFURLGetString(htmlURLRef.get()); BSTR tempStr = cfStringToBSTR(urlStringRef); // Both initWithRUL and SysFreeString can handle 0. ret = request->initWithURL(tempStr, WebURLRequestUseProtocolCachePolicy, 60); SysFreeString(tempStr); if (FAILED(ret)) return ret; ret = mainFrame->loadRequest(request.get()); if (FAILED(ret)) return ret; m_webViewLoaded = true; // FIXME: Implement window size/position save/restore RECT frame; frame.left = 60; frame.top = 200; frame.right = 750; frame.bottom = 550; ::SetWindowPos(m_hWnd, HWND_TOPMOST, frame.left, frame.top, frame.right - frame.left, frame.bottom - frame.top, 0); ShowWindow(m_hWnd, nCmdShow); UpdateWindow(m_hWnd); return 0; }