[WebKit-devel] KDE Webkit status update...
Dawit A.
adawit at kde.org
Sun Oct 4 15:46:32 CEST 2009
On Saturday 03 October 2009 17:06:14 Michael Howell wrote:
> On Saturday 03 October 2009 09:43:40 Dawit A. wrote:
> > 1.) Add the search bar to KWebView's parent widget layout when it is
> > first created and call update on the layout. This is a matter of adding
> > few lines of code to what is now KWebView::searchBar() and changing that
> > function into a slot that gets invoked when CTRL+F is pressed. I have
> > done this in my local copy and it works. However, this is not a robust
> > solution at all! What if the application using kdewebkit wants to add its
> > own widgets such as a save password bar (KWallet integration) for example
> > ?
> >
> > 2.) For a more robust solution we need to do something like what KHTML
> > does. It has a KHTMLViewBar class which manages widgets you want to add
> > to the view. KHTML then creates two instance of the view bar, one at the
> > top and bottom, and allow you to add your own widgets to these bars. This
> > is what KHTML uses to add the password and search bar widgets to its
> > view. We can do the a similar thing by creating a public KWebViewBar
> > class and exposing the instances we create through public member
> > functions, e.g. topViewBar() and bottomViewBar(). This is probably a
> > better approach in the long run, no ?
>
> Either way KWebView messes with its parent widget in unexpected ways.
> Particularly, ways that QWebView does not.
Well that is correct statement only for approach #1. It has a very bad
limitation in that since it uses parentWidget()->layout()->addWidget(QWidget*)
to add the widget, it might screw things if the parent object used the
addWidget functions in QGridlayout for example ; so that is true for approach
#1, but not for approach #2. See below...
> The way I do it, KWebView acts as a normal, self-contained widget. Besides,
> I don't expose internal APIs. I expose a QWidget.
And that is exactly the problem. Exposing it as a QWidget completely limits
its functionality. For example, how do you intend to connect the "Find Next"
and "Find Previous" signals from the part ? You cannot. You have either one of
two options. Either make SearchBar a public api like KWebView and KWebPage and
provide a public function to set a search bar in KWebView so that it can
connect to the desired signals and correctly search for the necessary text or
completely move it out of kdewebkit and put in the webkitpart where it
actually belongs. Truth be told there is no reason for kdewebkit as a
rendering engine to provide search widgets at all. Search widgets are a
function of the application. That is the source of the problem.
> I'm surprised that KHTMLWidget messes with it's parents. They have control
> over how KHTML draws, so they can put the find bar inside it.
You completely misunderstood the point I was attempting to make or I did not
do a good enough job of explaining it. First, so far as I can tell KHTML does
not mess with its parent objects at all. In fact it does not even publicly
expose the KHTMLViewBar and KHTMLViewBarWidget class. These classes are simply
used to manage widgets, such as the search part, that are added to the
KHTMLPart as viewbar items, not to the to its rendering view. In retrospect, I
realize that doing something like this also belongs in the application, i.e.
webkitpart, and not in kdewebkit which is precisely what is done in khtml.
However, this still does not resolve the issues with the way the searchbar
widget is now exposed to external applications in kdewebkit ; so here is
another more viable and completely clean approach:
#1. Clean up the SearchBar API and make it a publically available widget.
Perhaps KWebViewSearchBar ??
#2. Let applications/parts create an instance of this widget if they so choose
and connect all the signals they want to the publicly available slots such as
show(), findNextMatch(), findPreviousMatch(), setSearchText(const QString&) etc.
#3. Change the QWidget* searchbar() function in KWebView to setSearchBar(const
KWebViewSearch*) so that the KWebView can connect to signals from the
searchbar widget and correctly invoke the appropriate member functions during
search. Alternatively, we can make searchbar() return a pointer to
KWebViewSearch as well to keep it as it currently is.
More information about the WebKit-devel
mailing list