Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #include "nsISupports.h"
7 : #include "nsRegressionTester.h"
8 :
9 : #include "nsXPIDLString.h"
10 : #include "nsReadableUtils.h"
11 : #include "nsIWindowWatcher.h"
12 : #include "nsPIDOMWindow.h"
13 : #include "nsIPresShell.h"
14 : #include "nsIURI.h"
15 : #include "nsISimpleEnumerator.h"
16 : #include "nsIDocShell.h"
17 : #include "nsIContentViewer.h"
18 : #include "nsIContentViewerFile.h"
19 : #include "nsIFrame.h"
20 : #include "nsStyleStruct.h"
21 : #include "nsIFrameUtil.h"
22 : #include "nsLayoutCID.h"
23 : #include "nsIFile.h"
24 : #include "nsViewManager.h"
25 : #include "nsView.h"
26 :
27 :
28 :
29 : static NS_DEFINE_CID(kFrameUtilCID, NS_FRAME_UTIL_CID);
30 :
31 :
32 0 : nsRegressionTester::nsRegressionTester()
33 : {
34 0 : }
35 :
36 0 : nsRegressionTester::~nsRegressionTester()
37 : {
38 0 : }
39 :
40 0 : NS_IMPL_ISUPPORTS(nsRegressionTester, nsILayoutRegressionTester)
41 :
42 : NS_IMETHODIMP
43 0 : nsRegressionTester::DumpFrameModel(mozIDOMWindow* aWindowToDump,
44 : nsIFile *aDestFile,
45 : uint32_t aFlagsMask, int32_t *aResult)
46 : {
47 0 : NS_ENSURE_ARG(aWindowToDump);
48 0 : NS_ENSURE_ARG_POINTER(aResult);
49 :
50 0 : *aResult = DUMP_RESULT_ERROR;
51 :
52 : #ifndef DEBUG
53 : return NS_ERROR_NOT_AVAILABLE;
54 : #else
55 0 : nsresult rv = NS_ERROR_NOT_AVAILABLE;
56 : uint32_t busyFlags;
57 : bool stillLoading;
58 :
59 0 : auto* windowToDump = nsPIDOMWindowInner::From(aWindowToDump);
60 :
61 0 : nsCOMPtr<nsIDocShell> docShell = windowToDump->GetDocShell();
62 :
63 : // find out if the document is loaded
64 0 : docShell->GetBusyFlags(&busyFlags);
65 0 : stillLoading = busyFlags & (nsIDocShell::BUSY_FLAGS_BUSY |
66 : nsIDocShell::BUSY_FLAGS_PAGE_LOADING);
67 0 : if (stillLoading)
68 : {
69 0 : *aResult = DUMP_RESULT_LOADING;
70 0 : return NS_OK;
71 : }
72 :
73 0 : nsCOMPtr<nsIPresShell> presShell = docShell->GetPresShell();
74 :
75 0 : nsIFrame* root = presShell->GetRootFrame();
76 :
77 0 : FILE* fp = stdout;
78 0 : if (aDestFile)
79 : {
80 0 : rv = aDestFile->OpenANSIFileDesc("w", &fp);
81 0 : if (NS_FAILED(rv)) return rv;
82 : }
83 0 : if (aFlagsMask & DUMP_FLAGS_MASK_PRINT_MODE) {
84 0 : nsCOMPtr <nsIContentViewer> viewer;
85 0 : docShell->GetContentViewer(getter_AddRefs(viewer));
86 0 : if (viewer){
87 0 : nsCOMPtr<nsIContentViewerFile> viewerFile = do_QueryInterface(viewer);
88 0 : if (viewerFile) {
89 0 : viewerFile->Print(true, fp, nullptr);
90 : }
91 : }
92 : }
93 : else {
94 0 : root->DumpRegressionData(presShell->GetPresContext(), fp, 0);
95 : }
96 0 : if (fp != stdout)
97 0 : fclose(fp);
98 0 : *aResult = DUMP_RESULT_COMPLETED;
99 0 : return NS_OK;
100 : #endif
101 : }
102 :
103 : NS_IMETHODIMP
104 0 : nsRegressionTester::CompareFrameModels(nsIFile *aBaseFile, nsIFile *aVerFile,
105 : uint32_t aFlags, bool *aResult)
106 : {
107 0 : NS_ENSURE_ARG(aBaseFile);
108 0 : NS_ENSURE_ARG(aVerFile);
109 0 : NS_ENSURE_ARG_POINTER(aResult);
110 :
111 0 : *aResult = false;
112 :
113 : nsresult rv;
114 : FILE* baseFile;
115 0 : rv = aBaseFile->OpenANSIFileDesc("r", &baseFile);
116 0 : if (NS_FAILED(rv)) return rv;
117 :
118 : FILE* verFile;
119 0 : rv = aVerFile->OpenANSIFileDesc("r", &verFile);
120 0 : if (NS_FAILED(rv)) {
121 0 : fclose(baseFile);
122 0 : return rv;
123 : }
124 :
125 0 : nsCOMPtr<nsIFrameUtil> frameUtil = do_CreateInstance(kFrameUtilCID, &rv);
126 0 : if (NS_SUCCEEDED(rv))
127 : {
128 0 : int32_t outputLevel = (aFlags == COMPARE_FLAGS_VERBOSE) ? 0 : 1;
129 0 : rv = frameUtil->CompareRegressionData(baseFile, verFile, outputLevel);
130 : // CompareRegressionData closes |baseFile| and |verFile|.
131 : } else {
132 0 : fclose(verFile);
133 0 : fclose(baseFile);
134 : }
135 :
136 0 : *aResult = NS_FAILED(rv);
137 0 : return NS_OK;
138 : }
|