📄 htmldisplay.py
字号:
return YES def isSelectorExcludedFromWebScript_(self,sel): if (str(sel) == 'eventURL'): return NO else: return YES def eventURL(self,url): self.onLoadURL(str(url)) def webView_contextMenuItemsForElement_defaultMenuItems_(self,webView,contextMenu,defaultMenuItems): event = NSApp().currentEvent() if event.type() == NSLeftMouseDown and (event.modifierFlags() & NSControlKeyMask): fake = NSEvent.mouseEventWithType_location_modifierFlags_timestamp_windowNumber_context_eventNumber_clickCount_pressure_( NSRightMouseDown, event.locationInWindow(), 0, 0, event.windowNumber(), nil, 0, 1, 0) NSApp().postEvent_atStart_(fake, YES) return nil # Generate callbacks when the initial HTML (passed in the constructor) # has been loaded def webView_didFinishLoadForFrame_(self, webview, frame): if (not self.initialLoadFinished) and (frame is self.view.mainFrame()): platformutils.warnIfNotOnMainThread('ManagedWebView.webView_didFinishLoadForFrame_') # Execute any function calls we queued because the page load # hadn't completed self.initialLoadFinished = True for func in self.execQueue: func() self.execQueue = [] if self.onInitialLoadFinished: self.onInitialLoadFinished() scriptObj = self.view.windowScriptObject() scriptObj.setValue_forKey_(self,'frontend') # Intercept navigation actions and give program a chance to respond def webView_decidePolicyForNavigationAction_request_frame_decisionListener_(self, webview, action, request, frame, listener): platformutils.warnIfNotOnMainThread('ManagedWebView.webView_decidePolicyForNavigationAction_request_frame_decisionListener_') method = request.HTTPMethod() url = request.URL() body = request.HTTPBody() type = action['WebActionNavigationTypeKey'] #print "policy %d for url %s" % (type, url) # setting document.location.href in Javascript (our preferred # method of triggering an action) comes out as an # WebNavigationTypeOther. if type == WebNavigationTypeLinkClicked or type == WebNavigationTypeFormSubmitted or type == WebNavigationTypeOther: # Make sure we have a real, bona fide Python string, not an # NSString. Unfortunately, == can tell the difference. if (not self.onLoadURL) or self.onLoadURL('%s' % url): listener.use() else: listener.ignore() else: listener.use() # Redirect resource: links to files in resource bundle def webView_resource_willSendRequest_redirectResponse_fromDataSource_(self, webview, resourceCookie, request, redirectResponse, dataSource): platformutils.warnIfNotOnMainThread('ManagedWebView.webView_resource_willSendRequest_redirectResponse_fromDataSource_') url = "%s" % request.URL() # Make sure it's a Python string match = re.compile("resource:(.*)$").match(url) if match: path = resources.path(match.group(1)) urlObject = NSURL.fileURLWithPath_(path) return NSURLRequest.requestWithURL_(urlObject) return request # Return the actual WebView that we're managing def getView(self): return self.view # Call func() once the document has finished loading. If the # document has already finished loading, call it right away. But # in either case, the call is executed on the main thread, by # queueing an event, since WebViews are not documented to be # thread-safe, and we have seen crashes. def execAfterLoad(self, func): if not self.initialLoadFinished: self.execQueue.append(func) else: platformutils.callOnMainThreadAndWaitUntilDone(func) # Decorator to make using execAfterLoad easier def deferUntilAfterLoad(func): def runFunc(*args, **kwargs): func(*args, **kwargs) def schedFunc(self, *args, **kwargs): rf = lambda: runFunc(self, *args, **kwargs) self.execAfterLoad(rf) return schedFunc # Execute given Javascript string in context of the HTML document @deferUntilAfterLoad def execJS(self, js): self.view.stringByEvaluatingJavaScriptFromString_(js) ## DOM mutators called, ultimately, by dynamic template system ## def findElt(self, id): doc = self.view.mainFrame().DOMDocument() elt = doc.getElementById_(id) return elt def createElts(self, xml): parent = self.view.mainFrame().DOMDocument().createElement_("div") if len(xml) == 0: parent.setInnerHTML_(" ") else: parent.setInnerHTML_(xml) eltlist = [] for child in range(parent.childNodes().length()): eltlist.append(parent.childNodes().item_(child)) return eltlist @deferUntilAfterLoad def addItemAtEnd(self, xml, id): elt = self.findElt(id) if not elt: print "warning: addItemAtEnd: missing element %s" % id else: #print "add item %s at end of %s" % (elt.getAttribute_("id"), id) #print xml[0:79] newElts = self.createElts(xml) for newElt in newElts: elt.insertBefore__(newElt, None) @deferUntilAfterLoad def addItemBefore(self, xml, id): elt = self.findElt(id) if not elt: print "warning: addItemBefore: missing element %s" % id else: newElts = self.createElts(xml) for newElt in newElts: #print "add item %s before %s" % (newelt.getAttribute_("id"), id) elt.parentNode().insertBefore__(newElt, elt) @deferUntilAfterLoad def removeItem(self, id): self._removeElement(id) @deferUntilAfterLoad def removeItems(self, ids): for id in ids: self._removeElement(id) def _removeElement(self, id): elt = self.findElt(id) if not elt: print "warning: removeItem: missing element %s" % id else: #print "remove item %s" % id elt.parentNode().removeChild_(elt) @deferUntilAfterLoad def changeItem(self, id, xml, changedAttrs, newInnerHTML): self._changeElement(id, xml, changedAttrs, newInnerHTML) @deferUntilAfterLoad def changeItems(self, args): for id, xml, changedAttrs, newInnerHTML in args: self._changeElement(id, xml, changedAttrs, newInnerHTML) def _changeElement(self, id, xml, changedAttrs, newInnerHTML): elt = self.findElt(id) if not elt: print "warning: changeItem: missing element %s" % id else: #print "change item %s (new id %s)" % (id, elt.getAttribute_("id")) #print xml[0:79] #if id != elt.getAttribute_("id"): # raise Exception #elt = self.findElt(id) #if not elt: # print "ERROR ELEMENT LOST %s" % id elt.setOuterHTML_(xml) @deferUntilAfterLoad def hideItem(self, id): elt = self.findElt(id) if not elt: print "warning: hideItem: missing element %s" % id else: #print "hide item %s (new style '%s')" % (id, elt.getAttribute_("style")) elt.setAttribute__("style", "display:none") @deferUntilAfterLoad def showItem(self, id): elt = self.findElt(id) if not elt: print "warning: showItem: missing element %s" % id else: #print "show item %s (new style '%s')" % (id, elt.getAttribute_("style")) elt.setAttribute__("style", "")###############################################################################
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -