1 21 24 package org.lobobrowser.html.test; 25 26 import java.io.*; 27 import java.net.HttpURLConnection ; 28 import java.net.URL ; 29 import java.net.URLConnection ; 30 import java.util.*; 31 32 import javax.swing.JOptionPane ; 33 34 import org.lobobrowser.html.*; 35 import org.lobobrowser.html.domimpl.*; 36 import org.lobobrowser.html.gui.HtmlPanel; 37 import org.lobobrowser.html.parser.DocumentBuilderImpl; 38 import org.lobobrowser.html.parser.InputSourceImpl; 39 import org.lobobrowser.util.io.*; 40 import org.w3c.dom.html2.*; 41 42 import java.util.logging.*; 43 44 51 public class SimpleHtmlRendererContext implements HtmlRendererContext { 52 private static final Logger logger = Logger.getLogger(SimpleHtmlRendererContext.class.getName()); 53 private static final Set mediaNames = new HashSet(); 54 55 private final HtmlPanel htmlPanel; 56 private final HtmlRendererContext parentRcontext; 57 58 static { 59 Set mn = mediaNames; 61 mn.add("screen"); 62 mn.add("tv"); 63 mn.add("tty"); 64 mn.add("all"); 65 } 66 67 71 public SimpleHtmlRendererContext(HtmlPanel contextComponent) { 72 super(); 73 this.htmlPanel = contextComponent; 74 this.parentRcontext = null; 75 } 76 77 85 public SimpleHtmlRendererContext(HtmlPanel contextComponent, HtmlParserContext pcontext) { 86 this(contextComponent, pcontext, null); 87 } 88 89 97 public SimpleHtmlRendererContext(HtmlPanel contextComponent, HtmlParserContext pcontext, HtmlRendererContext parentRcontext) { 98 super(); 99 this.htmlPanel = contextComponent; 100 this.parentRcontext = parentRcontext; 101 } 102 103 109 public SimpleHtmlRendererContext(HtmlPanel contextComponent, HtmlRendererContext parentRcontext) { 110 super(); 111 this.htmlPanel = contextComponent; 112 this.parentRcontext = parentRcontext; 113 } 114 115 private volatile String sourceCode; 116 117 public String getSourceCode() { 118 return this.sourceCode; 119 } 120 121 public HTMLCollection getFrames() { 122 Object rootNode = this.htmlPanel.getRootNode(); 123 if(rootNode instanceof HTMLDocumentImpl) { 124 return ((HTMLDocumentImpl) rootNode).getFrames(); 125 } 126 else { 127 return null; 128 } 129 } 130 131 137 protected HtmlParserContext createParserContext(java.net.URL url) { 138 return new SimpleHtmlParserContext(); 139 } 140 141 146 public void reload() { 147 HTMLDocumentImpl document = (HTMLDocumentImpl) this.htmlPanel.getRootNode(); 148 if(document != null) { 149 try { 150 URL url = new URL (document.getDocumentURI()); 151 this.navigate(url, null); 152 } catch(java.net.MalformedURLException throwable) { 153 this.warn("reload(): Malformed URL", throwable); 154 } 155 } 156 } 157 158 174 public void navigate(final URL href, String target) { 175 if(target != null) { 177 HtmlRendererContext topCtx = this.getTop(); 178 HTMLCollection frames = topCtx.getFrames(); 179 if(frames != null) { 180 org.w3c.dom.Node frame = frames.namedItem(target); 181 if(frame instanceof FrameNode) { 182 BrowserFrame bframe = ((FrameNode) frame).getBrowserFrame(); 183 if(bframe == null) { 184 throw new IllegalStateException ("Frame node without a BrowserFrame instance: " + frame); 185 } 186 if(bframe.getHtmlRendererContext() != this) { 187 bframe.loadURL(href); 188 return; 189 } 190 } 191 } 192 target = target.trim().toLowerCase(); 193 if("_top".equals(target)) { 194 this.getTop().navigate(href, null); 195 return; 196 } 197 else if ("_parent".equals(target)) { 198 HtmlRendererContext parent = this.getParent(); 199 if(parent != null) { 200 parent.navigate(href, null); 201 return; 202 } 203 } 204 else if("_blank".equals(target)) { 205 this.open(href.toExternalForm(), "cobra.blank", "", false); 206 return; 207 } 208 else { 209 } 211 } 212 213 URL urlForLoading; 214 if(href.getProtocol().equals("file")) { 215 try { 217 urlForLoading = new URL (href.getProtocol(), href.getHost(), href.getPort(), href.getPath()); 218 } catch(java.net.MalformedURLException throwable) { 219 this.warn("malformed", throwable); 220 urlForLoading = href; 221 } 222 } 223 else { 224 urlForLoading = href; 225 } 226 final URL finalURLForLoading = urlForLoading; 227 new Thread () { 229 public void run() { 230 try { 231 URL uri = href; 232 logger.info("process(): Loading URI=[" + uri + "]."); 233 long time0 = System.currentTimeMillis(); 234 URLConnection connection = finalURLForLoading.openConnection(); 236 connection.setRequestProperty("User-Agent", getUserAgentContext().getUserAgent()); 237 connection.setRequestProperty("Cookie", ""); 238 if (connection instanceof HttpURLConnection ) { 239 HttpURLConnection hc = (HttpURLConnection ) connection; 240 hc.setInstanceFollowRedirects(true); 241 int responseCode = hc.getResponseCode(); 242 logger.info("process(): HTTP response code: " 243 + responseCode); 244 } 245 InputStream in = connection.getInputStream(); 246 try { 247 SimpleHtmlRendererContext.this.sourceCode = null; 248 long time1 = System.currentTimeMillis(); 249 RecordedInputStream rin = new RecordedInputStream(in); 250 InputStream bin = new BufferedInputStream(rin, 8192); 251 HtmlParserContext pcontext = createParserContext(uri); 252 DocumentBuilderImpl builder = new DocumentBuilderImpl( 253 pcontext, SimpleHtmlRendererContext.this); 254 String actualURI = uri.toExternalForm(); 255 HTMLDocumentImpl document = (HTMLDocumentImpl) builder 257 .createDocument(new InputSourceImpl(bin, actualURI, 258 "ISO-8859-1")); 259 SimpleHtmlRendererContext.this.htmlPanel.setDocument(document, SimpleHtmlRendererContext.this); 261 document.load(); 263 long time2 = System.currentTimeMillis(); 264 logger.info("Parsed URI=[" + uri + "]: Parse elapsed: " 265 + (time2 - time1) + " ms. Connection elapsed: " 266 + (time1 - time0) + " ms."); 267 SimpleHtmlRendererContext.this.sourceCode = rin.getString("ISO-8859-1"); 268 } finally { 269 in.close(); 270 } 271 } catch (Exception err) { 272 SimpleHtmlRendererContext.this.error( 273 "navigate(): Error loading or parsing request.", 274 err); 275 } 276 } 277 }.start(); 278 } 279 280 283 public void submitForm(String method, java.net.URL action, String target, String enctype, FormInput[] formInputs) { 284 StringBuffer sb = new StringBuffer (); 285 String lineBreak = System.getProperty("line.separator"); 286 if(formInputs != null) { 287 for(int i = 0; i < formInputs.length; i++) { 288 sb.append("INPUT: " + formInputs[i].toString()); 289 sb.append(lineBreak); 290 } 291 } 292 this.warn("submitForm(): Not overridden; method=" + method + "; action=" + action + "; target=" + target + "; enctype=" + enctype + lineBreak + sb); 293 } 294 295 297 public void alert(String message) { 298 JOptionPane.showMessageDialog(this.htmlPanel, message); 299 } 300 301 public void back() { 302 this.warn("back(): Not overridden"); 303 } 304 305 public void blur() { 306 this.warn("back(): Not overridden"); 307 } 308 309 public void close() { 310 this.warn("close(): Not overridden"); 311 } 312 313 public boolean confirm(String message) { 314 int retValue = JOptionPane.showConfirmDialog(htmlPanel, message, "Confirm", JOptionPane.YES_NO_OPTION); 315 return retValue == JOptionPane.YES_OPTION; 316 } 317 318 public void focus() { 319 this.warn("focus(): Not overridden"); 320 } 321 322 public HtmlRendererContext open(String url, String windowName, String windowFeatures, boolean replace) { 323 this.warn("open(): Not overridden"); 324 return null; 325 } 326 327 public HtmlRendererContext open(java.net.URL url, String windowName, String windowFeatures, boolean replace) { 328 this.warn("open(): Not overridden"); 329 return null; 330 } 331 332 public String prompt(String message, String inputDefault) { 333 return JOptionPane.showInputDialog(htmlPanel, message); 334 } 335 336 public void scroll(int x, int y) { 337 this.warn("scroll(): Not overridden"); 338 } 339 340 public boolean isClosed() { 341 this.warn("isClosed(): Not overridden"); 342 return false; 343 } 344 345 public String getDefaultStatus() { 346 this.warn("getDefaultStatus(): Not overridden"); 347 return ""; 348 } 349 350 public int getLength() { 351 this.warn("getLength(): Not overridden"); 352 return 0; 353 } 354 355 public String getName() { 356 this.warn("getName(): Not overridden"); 357 return ""; 358 } 359 360 public HtmlRendererContext getParent() { 361 return this.parentRcontext; 362 } 363 364 private volatile HtmlRendererContext opener; 365 366 public HtmlRendererContext getOpener() { 367 return this.opener; 368 } 369 370 public void setOpener(HtmlRendererContext opener) { 371 this.opener = opener; 372 } 373 374 public String getStatus() { 375 this.warn("getStatus(): Not overridden"); 376 return ""; 377 } 378 379 public void setStatus(String message) { 380 this.warn("setStatus(): Not overridden"); 381 } 382 383 public HtmlRendererContext getTop() { 384 HtmlRendererContext ancestor = this.parentRcontext; 385 if(ancestor == null) { 386 return this; 387 } 388 return ancestor.getTop(); 389 } 390 391 394 public BrowserFrame createBrowserFrame() { 395 return new SimpleBrowserFrame(this); 396 } 397 398 public void warn(String message, Throwable throwable) { 399 if(logger.isLoggable(Level.WARNING)) { 400 logger.log(Level.WARNING, message, throwable); 401 } 402 } 403 404 public void error(String message, Throwable throwable) { 405 if(logger.isLoggable(Level.SEVERE)) { 406 logger.log(Level.SEVERE, message, throwable); 407 } 408 } 409 410 public void warn(String message) { 411 if(logger.isLoggable(Level.WARNING)) { 412 logger.log(Level.WARNING, message); 413 } 414 } 415 416 public void error(String message) { 417 if(logger.isLoggable(Level.SEVERE)) { 418 logger.log(Level.SEVERE, message); 419 } 420 } 421 422 public HtmlObject getHtmlObject(HTMLElement element) { 423 HtmlObject result; 424 if("OBJECT".equalsIgnoreCase(element.getTagName())) { 425 result = null; 426 } 427 else { 428 result = new SimpleHtmlObject(element); 429 } 430 this.warn("getHtmlObject(): Not overridden; returning " + result + " for " + element + "."); 431 return result; 432 } 433 434 public void setDefaultStatus(String message) { 435 this.warn("setDefaultStatus(): Not overridden."); 436 } 437 438 private UserAgentContext bcontext = null; 439 440 public UserAgentContext getUserAgentContext() { 441 this.warn("getUserAgentContext(): Not overridden; returning simple one."); 442 synchronized(this) { 443 if(this.bcontext == null) { 444 this.bcontext = new SimpleUserAgentContext(); 445 } 446 return this.bcontext; 447 } 448 } 449 450 454 public boolean isVisitedLink(HTMLLinkElement link) { 455 return false; 457 } 458 459 public boolean isMedia(String mediaName) { 460 return mediaNames.contains(mediaName.toLowerCase()); 461 } 462 } 463 | Popular Tags |