View | Details | Raw Unified | Return to bug 60144
Collapse All | Expand All

(-)build.xml (-2 / +2 lines)
Lines 349-356 Link Here
349
  <!-- Compilation parameters -->
349
  <!-- Compilation parameters -->
350
  <property name="optimize" value="on"/>
350
  <property name="optimize" value="on"/>
351
  <property name="deprecation" value="off"/>
351
  <property name="deprecation" value="off"/>
352
  <property name="target.java.version" value="1.7"/>
352
  <property name="target.java.version" value="1.8"/>
353
  <property name="src.java.version" value="1.7"/>
353
  <property name="src.java.version" value="1.8"/>
354
  <property name="encoding" value="UTF-8"/>
354
  <property name="encoding" value="UTF-8"/>
355
  <!-- Set test encoding to the same default, but allow override -->
355
  <!-- Set test encoding to the same default, but allow override -->
356
  <property name="test.encoding" value="${encoding}"/>
356
  <property name="test.encoding" value="${encoding}"/>
(-)src/components/org/apache/jmeter/visualizers/RenderInBrowser.java (+198 lines)
Line 0 Link Here
1
/*
2
 * Licensed to the Apache Software Foundation (ASF) under one or more
3
 * contributor license agreements.  See the NOTICE file distributed with
4
 * this work for additional information regarding copyright ownership.
5
 * The ASF licenses this file to You under the Apache License, Version 2.0
6
 * (the "License"); you may not use this file except in compliance with
7
 * the License.  You may obtain a copy of the License at
8
 *
9
 *   http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed  under the  License is distributed on an "AS IS" BASIS,
13
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
14
 * implied.
15
 *
16
 * See the License for the specific language governing permissions and
17
 * limitations under the License.
18
 */
19
20
package org.apache.jmeter.visualizers;
21
22
import java.awt.BorderLayout;
23
import java.awt.Dimension;
24
25
import javafx.application.Platform;
26
import javafx.beans.value.ChangeListener;
27
import javafx.beans.value.ObservableValue;
28
import javafx.concurrent.Worker.State;
29
import javafx.embed.swing.JFXPanel;
30
import javafx.event.EventHandler;
31
import javafx.scene.Scene;
32
import javafx.scene.web.WebEngine;
33
import javafx.scene.web.WebEvent;
34
import javafx.scene.web.WebView;
35
36
import javax.swing.BorderFactory;
37
import javax.swing.JLabel;
38
import javax.swing.JOptionPane;
39
import javax.swing.JPanel;
40
import javax.swing.JProgressBar;
41
import javax.swing.SwingUtilities;
42
43
import org.apache.jmeter.samplers.SampleResult;
44
import org.apache.jmeter.util.JMeterUtils;
45
46
/**
47
 * {@link ResultRenderer} implementation that uses JAVAFX WebEngine to render as browser do
48
 */
49
public class RenderInBrowser extends SamplerResultTab implements ResultRenderer {
50
51
    private final JFXPanel jfxPanel = new JFXPanel();
52
    private WebEngine engine;
53
    private final JLabel lblStatus = new JLabel();
54
    private final JProgressBar progressBar = new JProgressBar();
55
56
    private JPanel browserPanel;
57
58
    /** {@inheritDoc} */
59
    @Override
60
    public void renderResult(SampleResult sampleResult) {
61
        String response = ViewResultsFullVisualizer
62
                .getResponseAsString(sampleResult);
63
        showRenderedResponse(response, sampleResult);
64
    }
65
66
    protected void showRenderedResponse(String response, SampleResult res) {
67
        showRenderedResponse(response, res, false);
68
    }
69
70
    protected void showRenderedResponse(String response, SampleResult res,
71
            boolean embedded) {
72
        if (response == null) {
73
            results.setText("");
74
            return;
75
        }
76
77
        int htmlIndex = response.indexOf("<HTML"); // could be <HTML lang=""> //
78
                                                   // $NON-NLS-1$
79
80
        // Look for a case variation
81
        if (htmlIndex < 0) {
82
            htmlIndex = response.indexOf("<html"); // ditto // $NON-NLS-1$
83
        }
84
85
        // If we still can't find it, just try using all of the text
86
        if (htmlIndex < 0) {
87
            htmlIndex = 0;
88
        }
89
90
        final String html = response.substring(htmlIndex);
91
92
        if (browserPanel == null) {
93
            browserPanel = initComponents(html);
94
        } 
95
        browserPanel.setVisible(true);
96
        resultsScrollPane.setViewportView(browserPanel);
97
        Platform.runLater(new Runnable() {
98
            @Override
99
            public void run() {
100
                engine.loadContent(html);
101
            }
102
        });
103
    }
104
105
    private JPanel initComponents(String htmlContent) {
106
        createScene(htmlContent);
107
108
        progressBar.setPreferredSize(new Dimension(150, 18));
109
        progressBar.setStringPainted(true);
110
111
        JPanel statusBar = new JPanel(new BorderLayout(5, 0));
112
        statusBar.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
113
        statusBar.add(lblStatus, BorderLayout.CENTER);
114
        statusBar.add(progressBar, BorderLayout.WEST);
115
116
        JPanel panel = new JPanel(new BorderLayout());
117
        panel.setPreferredSize(new Dimension(1024, 600));
118
        panel.add(statusBar, BorderLayout.NORTH);
119
        panel.add(jfxPanel, BorderLayout.CENTER);
120
        return panel;
121
    }
122
123
    private void createScene(final String htmlContent) {
124
        Platform.setImplicitExit(false);
125
        Platform.runLater(new Runnable() {
126
            @Override
127
            public void run() {
128
129
                WebView view = new WebView();
130
                engine = view.getEngine();
131
132
                engine.setOnStatusChanged(new EventHandler<WebEvent<String>>() {
133
                    @Override
134
                    public void handle(final WebEvent<String> event) {
135
                        SwingUtilities.invokeLater(new Runnable() {
136
                            @Override
137
                            public void run() {
138
                                lblStatus.setText(event.getData());
139
                            }
140
                        });
141
                    }
142
                });
143
144
                engine.getLoadWorker().workDoneProperty()
145
                        .addListener(new ChangeListener<Number>() {
146
                            @Override
147
                            public void changed(
148
                                    ObservableValue<? extends Number> observableValue,
149
                                    Number oldValue, final Number newValue) {
150
                                SwingUtilities.invokeLater(new Runnable() {
151
                                    @Override
152
                                    public void run() {
153
                                        progressBar.setValue(newValue
154
                                                .intValue());
155
                                    }
156
                                });
157
                            }
158
                        });
159
160
                engine.getLoadWorker().exceptionProperty()
161
                        .addListener(new ChangeListener<Throwable>() {
162
163
                            @Override
164
                            public void changed(
165
                                    ObservableValue<? extends Throwable> o,
166
                                    Throwable old, final Throwable value) {
167
                                if (engine.getLoadWorker().getState() == State.FAILED) {
168
                                    SwingUtilities.invokeLater(new Runnable() {
169
                                        @Override
170
                                        public void run() {
171
                                            JOptionPane
172
                                                    .showMessageDialog(
173
                                                            resultsScrollPane,
174
                                                            (value != null) ? engine
175
                                                                    .getLocation()
176
                                                                    + "\n"
177
                                                                    + value.getMessage()
178
                                                                    : engine.getLocation()
179
                                                                            + "\nUnexpected error.",
180
                                                            "Loading error...",
181
                                                            JOptionPane.ERROR_MESSAGE);
182
                                        }
183
                                    });
184
                                }
185
                            }
186
                        });
187
                jfxPanel.setScene(new Scene(view));
188
            }
189
        });
190
    }
191
192
    /** {@inheritDoc} */
193
    @Override
194
    public String toString() {
195
        return JMeterUtils.getResString("view_results_render_browser"); // $NON-NLS-1$
196
    }
197
198
}
(-)src/core/org/apache/jmeter/resources/messages.properties (-1 / +2 lines)
Lines 1246-1252 Link Here
1246
view_results_latency=Latency: 
1246
view_results_latency=Latency: 
1247
view_results_connect_time=Connect Time: 
1247
view_results_connect_time=Connect Time: 
1248
view_results_load_time=Load time: 
1248
view_results_load_time=Load time: 
1249
view_results_render=Render: 
1249
view_results_render=Render:
1250
view_results_render_browser=Browser 
1250
view_results_render_document=Document
1251
view_results_render_document=Document
1251
view_results_render_html=HTML
1252
view_results_render_html=HTML
1252
view_results_render_html_embedded=HTML (download resources)
1253
view_results_render_html_embedded=HTML (download resources)
(-)src/core/org/apache/jmeter/resources/messages_fr.properties (-1 / +2 lines)
Lines 1231-1237 Link Here
1231
view_results_in_table=Tableau de r\u00E9sultats
1231
view_results_in_table=Tableau de r\u00E9sultats
1232
view_results_latency=Latence \: 
1232
view_results_latency=Latence \: 
1233
view_results_load_time=Temps de r\u00E9ponse \: 
1233
view_results_load_time=Temps de r\u00E9ponse \: 
1234
view_results_render=Rendu \: 
1234
view_results_render=Rendu \:
1235
view_results_render_browser=Navigateur 
1235
view_results_render_document=Document
1236
view_results_render_document=Document
1236
view_results_render_html=HTML
1237
view_results_render_html=HTML
1237
view_results_render_html_embedded=HTML et ressources
1238
view_results_render_html_embedded=HTML et ressources

Return to bug 60144