1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/layout/tools/layout-debug/src/nsRegressionTester.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,151 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "nsISupports.h" 1.10 +#include "nsRegressionTester.h" 1.11 + 1.12 +#include "nsXPIDLString.h" 1.13 +#include "nsReadableUtils.h" 1.14 +#include "nsIWindowWatcher.h" 1.15 +#include "nsPIDOMWindow.h" 1.16 +#include "nsIPresShell.h" 1.17 +#include "nsIURI.h" 1.18 +#include "nsISimpleEnumerator.h" 1.19 +#include "nsIDocShell.h" 1.20 +#include "nsIContentViewer.h" 1.21 +#include "nsIContentViewerFile.h" 1.22 +#include "nsIFrame.h" 1.23 +#include "nsStyleStruct.h" 1.24 +#include "nsIFrameUtil.h" 1.25 +#include "nsLayoutCID.h" 1.26 +#include "nsNetUtil.h" 1.27 +#include "nsIFile.h" 1.28 +#include "nsViewManager.h" 1.29 +#include "nsView.h" 1.30 + 1.31 + 1.32 + 1.33 +static NS_DEFINE_CID(kFrameUtilCID, NS_FRAME_UTIL_CID); 1.34 + 1.35 + 1.36 +nsRegressionTester::nsRegressionTester() 1.37 +{ 1.38 +} 1.39 + 1.40 +nsRegressionTester::~nsRegressionTester() 1.41 +{ 1.42 +} 1.43 + 1.44 +NS_IMPL_ISUPPORTS(nsRegressionTester, nsILayoutRegressionTester) 1.45 + 1.46 +NS_IMETHODIMP 1.47 +nsRegressionTester::DumpFrameModel(nsIDOMWindow *aWindowToDump, 1.48 + nsIFile *aDestFile, 1.49 + uint32_t aFlagsMask, int32_t *aResult) 1.50 +{ 1.51 + NS_ENSURE_ARG(aWindowToDump); 1.52 + NS_ENSURE_ARG_POINTER(aResult); 1.53 + 1.54 + *aResult = DUMP_RESULT_ERROR; 1.55 + 1.56 +#ifndef DEBUG 1.57 + return NS_ERROR_NOT_AVAILABLE; 1.58 +#else 1.59 + nsresult rv = NS_ERROR_NOT_AVAILABLE; 1.60 + uint32_t busyFlags; 1.61 + bool stillLoading; 1.62 + 1.63 + nsCOMPtr<nsIDocShell> docShell; 1.64 + rv = GetDocShellFromWindow(aWindowToDump, getter_AddRefs(docShell)); 1.65 + if (NS_FAILED(rv)) return rv; 1.66 + 1.67 + // find out if the document is loaded 1.68 + docShell->GetBusyFlags(&busyFlags); 1.69 + stillLoading = busyFlags & (nsIDocShell::BUSY_FLAGS_BUSY | 1.70 + nsIDocShell::BUSY_FLAGS_PAGE_LOADING); 1.71 + if (stillLoading) 1.72 + { 1.73 + *aResult = DUMP_RESULT_LOADING; 1.74 + return NS_OK; 1.75 + } 1.76 + 1.77 + nsCOMPtr<nsIPresShell> presShell = docShell->GetPresShell(); 1.78 + 1.79 + nsIFrame* root = presShell->GetRootFrame(); 1.80 + 1.81 + FILE* fp = stdout; 1.82 + if (aDestFile) 1.83 + { 1.84 + rv = aDestFile->OpenANSIFileDesc("w", &fp); 1.85 + if (NS_FAILED(rv)) return rv; 1.86 + } 1.87 + if (aFlagsMask & DUMP_FLAGS_MASK_PRINT_MODE) { 1.88 + nsCOMPtr <nsIContentViewer> viewer; 1.89 + docShell->GetContentViewer(getter_AddRefs(viewer)); 1.90 + if (viewer){ 1.91 + nsCOMPtr<nsIContentViewerFile> viewerFile = do_QueryInterface(viewer); 1.92 + if (viewerFile) { 1.93 + viewerFile->Print(true, fp, nullptr); 1.94 + } 1.95 + } 1.96 + } 1.97 + else { 1.98 + root->DumpRegressionData(presShell->GetPresContext(), fp, 0); 1.99 + } 1.100 + if (fp != stdout) 1.101 + fclose(fp); 1.102 + *aResult = DUMP_RESULT_COMPLETED; 1.103 + return NS_OK; 1.104 +#endif 1.105 +} 1.106 + 1.107 +NS_IMETHODIMP 1.108 +nsRegressionTester::CompareFrameModels(nsIFile *aBaseFile, nsIFile *aVerFile, 1.109 + uint32_t aFlags, bool *aResult) 1.110 +{ 1.111 + NS_ENSURE_ARG(aBaseFile); 1.112 + NS_ENSURE_ARG(aVerFile); 1.113 + NS_ENSURE_ARG_POINTER(aResult); 1.114 + 1.115 + *aResult = false; 1.116 + 1.117 + nsresult rv; 1.118 + FILE* baseFile; 1.119 + rv = aBaseFile->OpenANSIFileDesc("r", &baseFile); 1.120 + if (NS_FAILED(rv)) return rv; 1.121 + 1.122 + FILE* verFile; 1.123 + rv = aVerFile->OpenANSIFileDesc("r", &verFile); 1.124 + if (NS_FAILED(rv)) { 1.125 + fclose(baseFile); 1.126 + return rv; 1.127 + } 1.128 + 1.129 + nsCOMPtr<nsIFrameUtil> frameUtil = do_CreateInstance(kFrameUtilCID, &rv); 1.130 + if (NS_SUCCEEDED(rv)) 1.131 + { 1.132 + int32_t outputLevel = (aFlags == COMPARE_FLAGS_VERBOSE) ? 0 : 1; 1.133 + rv = frameUtil->CompareRegressionData(baseFile, verFile, outputLevel); 1.134 + // CompareRegressionData closes |baseFile| and |verFile|. 1.135 + } else { 1.136 + fclose(verFile); 1.137 + fclose(baseFile); 1.138 + } 1.139 + 1.140 + *aResult = NS_FAILED(rv); 1.141 + return NS_OK; 1.142 +} 1.143 + 1.144 +nsresult 1.145 +nsRegressionTester::GetDocShellFromWindow(nsIDOMWindow* inWindow, nsIDocShell** outShell) 1.146 +{ 1.147 + nsCOMPtr<nsPIDOMWindow> window(do_QueryInterface(inWindow)); 1.148 + if (!window) return NS_ERROR_FAILURE; 1.149 + 1.150 + *outShell = window->GetDocShell(); 1.151 + NS_IF_ADDREF(*outShell); 1.152 + 1.153 + return NS_OK; 1.154 +}